classes.py 9.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310
  1. from fastapi import APIRouter, Form, Depends, HTTPException, File, UploadFile
  2. from fastapi.responses import FileResponse
  3. import os
  4. from random import randint
  5. import uuid
  6. from fastapi.security import OAuth2PasswordRequestForm
  7. from app.models.models import User
  8. from app.models.models import Class_list
  9. from app.api import deps
  10. from sqlalchemy.orm import Session
  11. from typing import Any, Dict
  12. import secrets
  13. from fastapi_login.exceptions import InvalidCredentialsException
  14. from fastapi_login import LoginManager
  15. from datetime import timedelta,datetime
  16. from app.config import settings
  17. from pathlib import Path
  18. from jose import jwt
  19. import emails
  20. from emails.template import JinjaTemplate
  21. import logging
  22. from tortoise.queryset import Q
  23. classes = APIRouter()
  24. IMAGEDIR = "/var/www/html/ntcri/assets/"
  25. IMAGEDIR_short = "assets/"
  26. # SECRET: str = secrets.token_urlsafe(32)
  27. # manager = LoginManager(SECRET, '/login',default_expiry=timedelta(hours=72))
  28. # @manager.user_loader()
  29. # async def query_user(user_id: str):
  30. # """
  31. # Get a user from the db
  32. # :param user_id: E-Mail of the user
  33. # :return: None or the user object
  34. # """
  35. # result = await User.filter(username=user_id).first()
  36. # if not result:
  37. # print('[]')
  38. # return []
  39. # return result
  40. # # return DB['users'].get(user_id)
  41. @classes.post("/insert_class")
  42. async def insert_class(
  43. id: int = Form(default=0),
  44. name: str = Form(default=''),
  45. start_time: datetime = Form(default=datetime.now()),
  46. end_time: datetime = Form(default=datetime.now()),
  47. location: str = Form(default=''),
  48. lecturer: str = Form(default=''),
  49. organizer: str = Form(default=''),
  50. contact: str = Form(default=''),
  51. introduction: str = Form(default=''),
  52. content: str = Form(default=''),
  53. cover_img: str = Form(default=''),
  54. cover_img_file:UploadFile = File(default='')
  55. ):
  56. try:
  57. contents = await cover_img_file.read()
  58. if cover_img.strip() != '':
  59. cover_img = f"{IMAGEDIR}{cover_img}"
  60. else:
  61. cover_img = f"{IMAGEDIR}{cover_img_file.filename}"
  62. #save the file
  63. with open(cover_img, "wb") as f:
  64. f.write(contents)
  65. cover_img = f"{IMAGEDIR_short}{cover_img_file.filename}"
  66. new_class = await Class_list.create(
  67. id=id,
  68. name=name,
  69. start_time=start_time,
  70. end_time=end_time,
  71. location=location,
  72. lecturer=lecturer,
  73. organizer=organizer,
  74. contact=contact,
  75. introduction=introduction,
  76. content=content,
  77. cover_img=cover_img
  78. )
  79. return {"msg": "success", "code": 200, "class_id": new_class.id}
  80. except Exception as e:
  81. return {"msg": str(e), "code": 500}
  82. # @classes.post("/update_class")
  83. # async def update_class(
  84. # id: int = Form(default=0),
  85. # name: str = Form(default=''),
  86. # start_time: datetime = Form(default=datetime.now()),
  87. # end_time: datetime = Form(default=datetime.now()),
  88. # location: str = Form(default=''),
  89. # lecturer: str = Form(default=''),
  90. # organizer: str = Form(default=''),
  91. # contact: str = Form(default=''),
  92. # introduction: str = Form(default=''),
  93. # content: str = Form(default='')
  94. # ):
  95. # try:
  96. # await Class_list.filter(id=id).update(
  97. # name=name,
  98. # start_time=start_time,
  99. # end_time=end_time,
  100. # location=location,
  101. # lecturer=lecturer,
  102. # organizer=organizer,
  103. # contact=contact,
  104. # introduction=introduction,
  105. # content=content
  106. # )
  107. # return {"msg": "success", "code": 200}
  108. # except Exception as e:
  109. # return {"msg": str(e), "code": 500}
  110. @classes.post("/update_class")
  111. async def update_class(
  112. id: int = Form(default=0),
  113. name: str = Form(default=''),
  114. start_time: datetime = Form(default=datetime.now()),
  115. end_time: datetime = Form(default=datetime.now()),
  116. location: str = Form(default=''),
  117. lecturer: str = Form(default=''),
  118. organizer: str = Form(default=''),
  119. contact: str = Form(default=''),
  120. introduction: str = Form(default=''),
  121. content: str = Form(default=''),
  122. cover_img: str = Form(default=''),
  123. cover_img_file:UploadFile = File(default='')
  124. ):
  125. try:
  126. class_obj = await Class_list.get(id=id)
  127. if name.strip() != '':
  128. class_obj.name = name
  129. if start_time:
  130. class_obj.start_time = start_time
  131. if end_time:
  132. class_obj.end_time = end_time
  133. if location.strip() != '':
  134. class_obj.location = location
  135. if lecturer.strip() != '':
  136. class_obj.lecturer = lecturer
  137. if organizer.strip() != '':
  138. class_obj.organizer = organizer
  139. if contact.strip() != '':
  140. class_obj.contact = contact
  141. if introduction.strip() != '':
  142. class_obj.introduction = introduction
  143. if content.strip() != '':
  144. class_obj.content = content
  145. if cover_img.strip() != '':
  146. if cover_img_file.strip() != '':
  147. class_obj.cover_img = f"{IMAGEDIR}{cover_img}"
  148. contents = await cover_img_file.read()
  149. with open(class_obj.cover_img, "wb") as f:
  150. f.write(contents)
  151. class_obj.cover_img = f"{IMAGEDIR_short}{cover_img_file.filename}"
  152. else:
  153. os.rename(class_obj.cover_img, f"{IMAGEDIR}{cover_img}")
  154. class_obj.cover_img = f"{IMAGEDIR}{cover_img}"
  155. else:
  156. if cover_img_file != '':
  157. class_obj.cover_img =f"{IMAGEDIR}{cover_img_file.filename}"
  158. contents = await cover_img_file.read()
  159. with open(class_obj.cover_img, "wb") as f:
  160. f.write(contents)
  161. class_obj.cover_img = f"{IMAGEDIR_short}{cover_img_file.filename}"
  162. await class_obj.save()
  163. return {"msg": "success", "code": 200}
  164. except Exception as e:
  165. return {"msg": str(e), "code": 500}
  166. @classes.post("/delete_class")
  167. async def delete(id: int):
  168. if id:
  169. await Class_list.filter(id=id).delete()
  170. return {"msg": "success", "code": 200}
  171. @classes.get("/search_class")
  172. async def search_class(id: int):
  173. try:
  174. class_obj = await Class_list.get(id=id)
  175. return {
  176. "msg": "success",
  177. "code": 200,
  178. "class_id": class_obj.id,
  179. "name": class_obj.name,
  180. "start_time": class_obj.start_time,
  181. "end_time": class_obj.end_time,
  182. "location": class_obj.location,
  183. "lecturer": class_obj.lecturer,
  184. "organizer": class_obj.organizer,
  185. "contact": class_obj.contact,
  186. "introduction": class_obj.introduction,
  187. "content": class_obj.content,
  188. "cover_img": class_obj.cover_img,
  189. }
  190. except Exception as e:
  191. return {"msg": str(e), "code": 500}
  192. @classes.get("/get_class")
  193. async def get_class():
  194. try:
  195. class_list = await Class_list.all()
  196. classes = []
  197. for class_obj in class_list:
  198. class_data = {
  199. "class_id": class_obj.id,
  200. "name": class_obj.name,
  201. "start_time": class_obj.start_time,
  202. "end_time": class_obj.end_time,
  203. "location": class_obj.location,
  204. "lecturer": class_obj.lecturer,
  205. "organizer": class_obj.organizer,
  206. "contact": class_obj.contact,
  207. "introduction": class_obj.introduction,
  208. "content": class_obj.content,
  209. "cover_img": class_obj.cover_img
  210. }
  211. classes.append(class_data)
  212. return {"msg": "success", "code": 200, "classes": classes}
  213. except Exception as e:
  214. return {"msg": str(e), "code": 500}
  215. @classes.get("/search_class_like")
  216. async def search_class_like(keyword: str):
  217. try:
  218. class_list = await Class_list.filter(
  219. Q(name__icontains=keyword) | Q(lecturer__icontains=keyword)
  220. ).all()
  221. classes = []
  222. for class_obj in class_list:
  223. class_data = {
  224. "class_id": class_obj.id,
  225. "name": class_obj.name,
  226. "start_time": class_obj.start_time,
  227. "end_time": class_obj.end_time,
  228. "location": class_obj.location,
  229. "lecturer": class_obj.lecturer,
  230. "organizer": class_obj.organizer,
  231. "contact": class_obj.contact,
  232. "introduction": class_obj.introduction,
  233. "content": class_obj.content,
  234. "cover_img": class_obj.cover_img
  235. }
  236. classes.append(class_data)
  237. return {"msg": "success", "code": 200, "classes": classes}
  238. except Exception as e:
  239. return {"msg": str(e), "code": 500}
  240. @classes.post("/upload/")
  241. async def create_upload_file(file: UploadFile = File(...)):
  242. #file.filename = f"{uuid.uuid4()}.jpeg"
  243. contents = await file.read()
  244. #save the file
  245. with open(f"{IMAGEDIR}{file.filename}", "wb") as f:
  246. f.write(contents)
  247. return {"filename": file.filename}
  248. #"/var/www/ntcri/app/api/images/test.jpeg"
  249. async def read_image_file():
  250. # get random file from the image directory
  251. files = os.listdir(IMAGEDIR)
  252. random_index = randint(0, len(files) - 1)
  253. path = f"{IMAGEDIR}{files[random_index]}"
  254. return FileResponse(path)