from fastapi import APIRouter, Form, Depends, HTTPException, File, UploadFile from fastapi.responses import FileResponse import os from random import randint import uuid from fastapi.security import OAuth2PasswordRequestForm from app.models.models import User from app.models.models import Class_list,Schools,Class_detail,Class_name,Registration from app.api import deps from sqlalchemy.orm import Session from typing import Any, Dict import secrets from fastapi_login.exceptions import InvalidCredentialsException from fastapi_login import LoginManager from datetime import timedelta,datetime from app.config import settings from pathlib import Path from jose import jwt import emails from emails.template import JinjaTemplate import logging from tortoise.queryset import Q classes = APIRouter() IMAGEDIR = "/var/www/html/ntcri/assets/" IMAGEDIR_short = "assets/" @classes.post("/insert_school") async def insert_school( id: int = Form(default=0), name: str = Form(default=''), longitude: str = Form(default=''), latitude: str = Form(default='') ): try: new_school = await Schools.create( id=id, name=name, longitude=longitude, latitude=latitude ) return {"msg": "success", "code": 200, "class_id": new_school.id} except Exception as e: return {"msg": str(e), "code": 500} @classes.post("/insert_class") async def insert_class( id: int = Form(default=0), name: str = Form(default=''), school_id: int = Form(default=1), category: str = Form(default=''), introduction: str = Form(default=''), organizer: str = Form(default=''), cover_img_file:UploadFile = File(default=''), event: str = Form(default=''), start_time: datetime = Form(default=datetime.now()), end_time: datetime = Form(default=datetime.now()), contact: str = Form(default=''), lecturer: str = Form(default=''), location: str = Form(default=''), content: str = Form(default=''), URL: str = Form(default=''), people : str = Form(default=''), fee_method: str = Form(default=''), registration_way: str = Form(default=''), remark : str = Form(default='') ): try: cover_img = '' if cover_img_file != '': contents = await cover_img_file.read() #save the file with open(f"{IMAGEDIR}{cover_img_file.filename}", "wb") as f: f.write(contents) cover_img = f"{IMAGEDIR_short}{cover_img_file.filename}" else: cover_img = '' # class_obj = '' # class_obj = await Class_name.get(name=name) # if class_obj != '': # return {"msg": "此課程名稱已被使用", "code": 500} new_class_name = await Class_name.get_or_create( name=name, defaults={ 'school_id': school_id, 'category': category, 'introduction': introduction, 'organizer': organizer, 'cover_img': cover_img } ) class_obj = await Class_name.get(name=name) new_class = await Class_list.create( id=id, name_id=class_obj.id, event =event , start_time=start_time, end_time=end_time, contact=contact, lecturer=lecturer, location=location, content=content, URL=URL, people=people, fee_method=fee_method, registration_way=registration_way, remark=remark ) return {"msg": "success", "code": 200, "class_id": new_class.id} except Exception as e: return {"msg": str(e), "code": 500} @classes.post("/insert_event") async def insert_event( id: int = Form(default=0), name_id: int = Form(default=''), event: str = Form(default=''), start_time: datetime = Form(default=datetime.now()), end_time: datetime = Form(default=datetime.now()), contact: str = Form(default=''), lecturer: str = Form(default=''), location: str = Form(default=''), content: str = Form(default=''), URL: str = Form(default=''), people : str = Form(default=''), fee_method: str = Form(default=''), registration_way: str = Form(default=''), remark : str = Form(default='') ): try: new_class = await Class_list.create( id=id, name_id=name_id, event =event, start_time=start_time, end_time=end_time, contact=contact, lecturer=lecturer, location=location, content=content, URL=URL, people=people, fee_method=fee_method, registration_way=registration_way, remark=remark ) return {"msg": "success", "code": 200, "class_id": new_class.id} except Exception as e: return {"msg": str(e), "code": 500} @classes.post("/update_class_name") async def update_class_name( id: int = Form(default=0), name: str = Form(default=''), school_id: int = Form(default=''), category: str = Form(default=''), introduction: str = Form(default=''), organizer: str = Form(default=''), cover_img_file:UploadFile = File(default='') ): try: class_name = await Class_name.get(id=id) if name.strip() != '': class_name.name = name if school_id != '': class_name.school_id = school_id if category.strip() != '': class_name.category = category if introduction.strip() != '': class_name.introduction = introduction if organizer.strip() != '': class_name.organizer = organizer if cover_img_file != '': contents = await cover_img_file.read() with open(f"{IMAGEDIR}{cover_img_file.filename}", "wb") as f: f.write(contents) class_name.cover_img = f"{IMAGEDIR_short}{cover_img_file.filename}" await class_name.save() return {"msg": "success", "code": 200} except Exception as e: return {"msg": str(e), "code": 500} @classes.post("/update_class") async def update_class( id: int = Form(default=0), name: str = Form(default=''), school_id: int = Form(default=''), category: str = Form(default=''), introduction: str = Form(default=''), organizer: str = Form(default=''), cover_img_file:UploadFile = File(default=''), event: str = Form(default=''), start_time: datetime = Form(default=datetime.now()), end_time: datetime = Form(default=datetime.now()), contact: str = Form(default=''), lecturer: str = Form(default=''), location: str = Form(default=''), content: str = Form(default=''), URL: str = Form(default=''), people : str = Form(default=''), fee_method: str = Form(default=''), registration_way: str = Form(default=''), remark : str = Form(default='') ): try: class_obj = await Class_list.get(id=id) class_name = await Class_name.get(id=class_obj.name_id) if name != '': class_name.name = name if school_id != '': class_name.school_id = school_id if category != '': class_name.category = category if introduction != '': class_name.introduction = introduction if organizer != '': class_name.organizer = organizer if cover_img_file != '': contents = await cover_img_file.read() with open(f"{IMAGEDIR}{cover_img_file.filename}", "wb") as f: f.write(contents) class_name.cover_img = f"{IMAGEDIR_short}{cover_img_file.filename}" if event.strip() != '': class_obj.event = event if start_time: class_obj.start_time = start_time if end_time: class_obj.end_time = end_time if location.strip() != '': class_obj.location = location if lecturer.strip() != '': class_obj.lecturer = lecturer if contact.strip() != '': class_obj.contact = contact if content.strip() != '': class_obj.content = content if URL.strip() != '': class_obj.URL = URL if people.strip() != '': class_obj.people = people if fee_method.strip() != '': class_obj.fee_method = fee_method if registration_way.strip() != '': class_obj.registration_way = registration_way if remark.strip() != '': class_obj.remark = remark await class_obj.save() await class_name.save() return {"msg": "success", "code": 200} except Exception as e: return {"msg": str(e), "code": 500} @classes.post("/delete_class") async def delete(id: int): if id: await Class_list.filter(id=id).delete() return {"msg": "success", "code": 200} @classes.post("/delete_class_name") async def delete(id: int): if id: await Class_list.filter(name_id=id).delete() await Class_name.filter(id=id).delete() return {"msg": "success", "code": 200} @classes.get("/search_class") async def search_class(id: int): try: class_obj = await Class_list.get(id=id) class_name = await Class_name.get(id=class_obj.name_id) school_obj = await Schools.get(id=class_name.school_id) return { "msg": "success", "code": 200, "class_id": class_obj.id, "name": class_name.name, "school":school_obj.name, "category": class_name.category, "introduction": class_name.introduction, "organizer": class_name.organizer, "cover_img": class_name.cover_img, "event": class_obj.event, "start_time": class_obj.start_time, "end_time": class_obj.end_time, "location": class_obj.location, "lecturer": class_obj.lecturer, "contact": class_obj.contact, "content": class_obj.content, "URL": class_obj.URL, "people": class_obj.people, "fee_method": class_obj.fee_method, "registration_way": class_obj.registration_way, "remark": class_obj.remark } except Exception as e: return {"msg": str(e), "code": 500} @classes.get("/get_school") async def get_school(): try: school_list = await Schools.all() schools = [] for school_obj in school_list: school_data = { "school_id": school_obj.id, "name": school_obj.name, "longitude": school_obj.longitude, "latitude": school_obj.latitude, } schools.append(school_data) return {"msg": "success", "code": 200, "schools": schools} except Exception as e: return {"msg": str(e), "code": 500} @classes.get("/get_class_name") async def get_class_name(): try: class_name_list = await Class_name.all() classes_name = [] for class_name_obj in class_name_list: school_obj = await Schools.get(id=class_name_obj.school_id) class_data = { "msg": "success", "code": 200, "id": class_name_obj.id, "name": class_name_obj.name, "school":school_obj.name, "category": class_name_obj.category, "introduction": class_name_obj.introduction, "organizer": class_name_obj.organizer, "cover_img": class_name_obj.cover_img, } classes_name.append(class_data) return {"msg": "success", "code": 200, "classes": classes_name} except Exception as e: return {"msg": str(e), "code": 500} @classes.get("/get_class") async def get_class(): try: class_list = await Class_list.all() classes = [] for class_obj in class_list: class_name = await Class_name.get(id=class_obj.name_id) print(class_obj.name_id) print(class_name.school_id) school_obj = await Schools.get(id=class_name.school_id) class_data = { "msg": "success", "code": 200, "class_id": class_obj.id, "name": class_name.name, "school":school_obj.name, "category": class_name.category, "introduction": class_name.introduction, "organizer": class_name.organizer, "cover_img": class_name.cover_img, "event": class_obj.event, "start_time": class_obj.start_time, "end_time": class_obj.end_time, "location": class_obj.location, "lecturer": class_obj.lecturer, "contact": class_obj.contact, "content": class_obj.content, "URL": class_obj.URL, "people": class_obj.people, "fee_method": class_obj.fee_method, "registration_way": class_obj.registration_way, "remark": class_obj.remark } classes.append(class_data) return {"msg": "success", "code": 200, "classes": classes} except Exception as e: return {"msg": str(e), "code": 500} @classes.get("/search_class_like") async def search_class_like(keyword: str): try: class_list = await Class_list.filter(Q(lecturer__icontains=keyword)).all() classes = [] for class_obj in class_list: class_name = await Class_name.get(id=class_obj.name_id) school_obj = await Schools.get(id=class_name.school_id) class_data = { "msg": "success", "code": 200, "class_id": class_obj.id, "name": class_name.name, "school":school_obj.name, "category": class_name.category, "introduction": class_name.introduction, "organizer": class_name.organizer, "cover_img": class_name.cover_img, "event": class_obj.event, "start_time": class_obj.start_time, "end_time": class_obj.end_time, "location": class_obj.location, "lecturer": class_obj.lecturer, "contact": class_obj.contact, "content": class_obj.content, "URL": class_obj.URL, "people": class_obj.people, "fee_method": class_obj.fee_method, "registration_way": class_obj.registration_way, "remark": class_obj.remark } classes.append(class_data) class_name_list = await Class_name.filter(Q(name__icontains=keyword)).all() for class_name in class_name_list: class_list = await Class_list.filter(name_id=class_name.id).all() for class_obj in class_list: school_obj = await Schools.get(id=class_name.school_id) class_data = { "msg": "success", "code": 200, "class_id": class_obj.id, "name": class_name.name, "school":school_obj.name, "category": class_name.category, "introduction": class_name.introduction, "organizer": class_name.organizer, "cover_img": class_name.cover_img, "event": class_obj.event, "start_time": class_obj.start_time, "end_time": class_obj.end_time, "location": class_obj.location, "lecturer": class_obj.lecturer, "contact": class_obj.contact, "content": class_obj.content, "URL": class_obj.URL, "people": class_obj.people, "fee_method": class_obj.fee_method, "registration_way": class_obj.registration_way, "remark": class_obj.remark } classes.append(class_data) return {"msg": "success", "code": 200, "classes": classes} except Exception as e: return {"msg": str(e), "code": 500} @classes.post("/upload/") async def create_upload_file(file: UploadFile = File(...)): #file.filename = f"{uuid.uuid4()}.jpeg" contents = await file.read() #save the file with open(f"{IMAGEDIR}{file.filename}", "wb") as f: f.write(contents) return {"filename": file.filename} #"/var/www/ntcri/app/api/images/test.jpeg" async def read_image_file(): # get random file from the image directory files = os.listdir(IMAGEDIR) random_index = randint(0, len(files) - 1) path = f"{IMAGEDIR}{files[random_index]}" return FileResponse(path)