classes.py 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349
  1. from fastapi import APIRouter, Form, Depends, HTTPException
  2. from fastapi.security import OAuth2PasswordRequestForm
  3. from app.models.models import User
  4. from app.models.models import Class_list
  5. from app.api import deps
  6. from sqlalchemy.orm import Session
  7. from typing import Any, Dict
  8. import secrets
  9. from fastapi_login.exceptions import InvalidCredentialsException
  10. from fastapi_login import LoginManager
  11. from datetime import timedelta,datetime
  12. from app.config import settings
  13. from pathlib import Path
  14. from jose import jwt
  15. import emails
  16. from emails.template import JinjaTemplate
  17. import logging
  18. from tortoise.queryset import Q
  19. classes = APIRouter()
  20. # SECRET: str = secrets.token_urlsafe(32)
  21. # manager = LoginManager(SECRET, '/login',default_expiry=timedelta(hours=72))
  22. # @manager.user_loader()
  23. # async def query_user(user_id: str):
  24. # """
  25. # Get a user from the db
  26. # :param user_id: E-Mail of the user
  27. # :return: None or the user object
  28. # """
  29. # result = await User.filter(username=user_id).first()
  30. # if not result:
  31. # print('[]')
  32. # return []
  33. # return result
  34. # # return DB['users'].get(user_id)
  35. @classes.post("/insert_class")
  36. async def insert_class(
  37. id: int = Form(default=0),
  38. name: str = Form(default=''),
  39. start_time: datetime = Form(default=datetime.now()),
  40. end_time: datetime = Form(default=datetime.now()),
  41. location: str = Form(default=''),
  42. lecturer: str = Form(default=''),
  43. organizer: str = Form(default=''),
  44. contact: str = Form(default=''),
  45. introduction: str = Form(default=''),
  46. content: str = Form(default=''),
  47. cover_img: str = Form(default='')
  48. ):
  49. try:
  50. new_class = await Class_list.create(
  51. id=id,
  52. name=name,
  53. start_time=start_time,
  54. end_time=end_time,
  55. location=location,
  56. lecturer=lecturer,
  57. organizer=organizer,
  58. contact=contact,
  59. introduction=introduction,
  60. content=content,
  61. cover_img=cover_img
  62. )
  63. return {"msg": "success", "code": 200, "class_id": new_class.id}
  64. except Exception as e:
  65. return {"msg": str(e), "code": 500}
  66. # @classes.post("/update_class")
  67. # async def update_class(
  68. # id: int = Form(default=0),
  69. # name: str = Form(default=''),
  70. # start_time: datetime = Form(default=datetime.now()),
  71. # end_time: datetime = Form(default=datetime.now()),
  72. # location: str = Form(default=''),
  73. # lecturer: str = Form(default=''),
  74. # organizer: str = Form(default=''),
  75. # contact: str = Form(default=''),
  76. # introduction: str = Form(default=''),
  77. # content: str = Form(default='')
  78. # ):
  79. # try:
  80. # await Class_list.filter(id=id).update(
  81. # name=name,
  82. # start_time=start_time,
  83. # end_time=end_time,
  84. # location=location,
  85. # lecturer=lecturer,
  86. # organizer=organizer,
  87. # contact=contact,
  88. # introduction=introduction,
  89. # content=content
  90. # )
  91. # return {"msg": "success", "code": 200}
  92. # except Exception as e:
  93. # return {"msg": str(e), "code": 500}
  94. @classes.post("/update_class")
  95. async def update_class(
  96. id: int = Form(default=0),
  97. name: str = Form(default=''),
  98. start_time: datetime = Form(default=datetime.now()),
  99. end_time: datetime = Form(default=datetime.now()),
  100. location: str = Form(default=''),
  101. lecturer: str = Form(default=''),
  102. organizer: str = Form(default=''),
  103. contact: str = Form(default=''),
  104. introduction: str = Form(default=''),
  105. content: str = Form(default=''),
  106. cover_img: str = Form(default=''),
  107. ):
  108. try:
  109. class_obj = await Class_list.get(id=id)
  110. if name.strip() != '':
  111. class_obj.name = name
  112. if start_time:
  113. class_obj.start_time = start_time
  114. if end_time:
  115. class_obj.end_time = end_time
  116. if location.strip() != '':
  117. class_obj.location = location
  118. if lecturer.strip() != '':
  119. class_obj.lecturer = lecturer
  120. if organizer.strip() != '':
  121. class_obj.organizer = organizer
  122. if contact.strip() != '':
  123. class_obj.contact = contact
  124. if introduction.strip() != '':
  125. class_obj.introduction = introduction
  126. if content.strip() != '':
  127. class_obj.content = content
  128. if cover_img.strip() != '':
  129. class_obj.cover_img = cover_img
  130. await class_obj.save()
  131. return {"msg": "success", "code": 200}
  132. except Exception as e:
  133. return {"msg": str(e), "code": 500}
  134. @classes.post("/delete_class")
  135. async def delete(id: int):
  136. if id:
  137. await Class_list.filter(id=id).delete()
  138. return {"msg": "success", "code": 200}
  139. @classes.get("/search_class")
  140. async def search_class(id: int):
  141. try:
  142. class_obj = await Class_list.get(id=id)
  143. return {
  144. "msg": "success",
  145. "code": 200,
  146. "class_id": class_obj.id,
  147. "name": class_obj.name,
  148. "start_time": class_obj.start_time,
  149. "end_time": class_obj.end_time,
  150. "location": class_obj.location,
  151. "lecturer": class_obj.lecturer,
  152. "organizer": class_obj.organizer,
  153. "contact": class_obj.contact,
  154. "introduction": class_obj.introduction,
  155. "content": class_obj.content,
  156. "cover_img": class_obj.cover_img,
  157. }
  158. except Exception as e:
  159. return {"msg": str(e), "code": 500}
  160. @classes.get("/get_class")
  161. async def get_class():
  162. try:
  163. class_list = await Class_list.all()
  164. classes = []
  165. for class_obj in class_list:
  166. class_data = {
  167. "class_id": class_obj.id,
  168. "name": class_obj.name,
  169. "start_time": class_obj.start_time,
  170. "end_time": class_obj.end_time,
  171. "location": class_obj.location,
  172. "lecturer": class_obj.lecturer,
  173. "organizer": class_obj.organizer,
  174. "contact": class_obj.contact,
  175. "introduction": class_obj.introduction,
  176. "content": class_obj.content,
  177. "cover_img": class_obj.cover_img
  178. }
  179. classes.append(class_data)
  180. return {"msg": "success", "code": 200, "classes": classes}
  181. except Exception as e:
  182. return {"msg": str(e), "code": 500}
  183. @classes.get("/search_class_like")
  184. async def search_class_like(keyword: str):
  185. try:
  186. class_list = await Class_list.filter(
  187. Q(name__icontains=keyword) | Q(lecturer__icontains=keyword)
  188. ).all()
  189. classes = []
  190. for class_obj in class_list:
  191. class_data = {
  192. "class_id": class_obj.id,
  193. "name": class_obj.name,
  194. "start_time": class_obj.start_time,
  195. "end_time": class_obj.end_time,
  196. "location": class_obj.location,
  197. "lecturer": class_obj.lecturer,
  198. "organizer": class_obj.organizer,
  199. "contact": class_obj.contact,
  200. "introduction": class_obj.introduction,
  201. "content": class_obj.content,
  202. "cover_img": class_obj.cover_img
  203. }
  204. classes.append(class_data)
  205. return {"msg": "success", "code": 200, "classes": classes}
  206. except Exception as e:
  207. return {"msg": str(e), "code": 500}
  208. # @classes.post("/login")
  209. # async def login(data: OAuth2PasswordRequestForm = Depends()):
  210. # username = data.username
  211. # password = data.password
  212. # user = await query_user(username)
  213. # print(user)
  214. # if not user:
  215. # # you can return any response or error of your choice
  216. # raise InvalidCredentialsException
  217. # elif password != user.password:
  218. # raise InvalidCredentialsException
  219. # access_token = manager.create_access_token(
  220. # data={'sub': username}
  221. # )
  222. # return {'access_token': access_token}
  223. # @classes.post("/logout")
  224. # async def logout():
  225. # return {"msg":"logout success","code":200}
  226. # @classes.post("/add")
  227. # async def add(username: str = Form(default=''), password: str = Form(default=''), email: str = Form(default='')):
  228. # if username and password and email:
  229. # u = await User.create(username=username, password=password, email=email)
  230. # if u:
  231. # send_email()
  232. # return {"msg": "已寄送認證信", "code": 200}
  233. # return {"msg": "create user failed", "code": 403}
  234. # def generate_password_reset_token(email: str) -> str:
  235. # delta = timedelta(hours=settings.EMAIL_RESET_TOKEN_EXPIRE_HOURS)
  236. # now = datetime.utcnow()
  237. # expires = now + delta
  238. # exp = expires.timestamp()
  239. # encoded_jwt = jwt.encode(
  240. # {"exp": exp, "nbf": now, "sub": email}, settings.SECRET_KEY, algorithm="HS256",
  241. # )
  242. # return encoded_jwt
  243. # def send_email(
  244. # email_to: str,
  245. # subject_template: str = "",
  246. # html_template: str = "",
  247. # environment: Dict[str, Any] = {},
  248. # ) -> None:
  249. # # assert settings.EMAILS_ENABLED, "no provided configuration for email variables"
  250. # message = emails.Message(
  251. # subject=JinjaTemplate(subject_template),
  252. # html=JinjaTemplate(html_template),
  253. # mail_from=(settings.EMAILS_FROM_NAME, settings.EMAILS_FROM_EMAIL),
  254. # )
  255. # smtp_options = {"host": settings.SMTP_HOST, "port": settings.SMTP_PORT}
  256. # if settings.SMTP_TLS:
  257. # smtp_options["tls"] = True
  258. # if settings.SMTP_USER:
  259. # smtp_options["user"] = settings.SMTP_USER
  260. # if settings.SMTP_PASSWORD:
  261. # smtp_options["password"] = settings.SMTP_PASSWORD
  262. # response = message.send(to=email_to, render=environment, smtp=smtp_options)
  263. # logging.info(f"send email result: {response}")
  264. # def send_reset_password_email(email_to: str, email: str, token: str) -> None:
  265. # subject = f"Password recovery for user {email}"
  266. # with open(Path(settings.EMAIL_TEMPLATES_DIR) / "reset_password.html") as f:
  267. # template_str = f.read()
  268. # server_host = settings.SERVER_HOST
  269. # link = f"{server_host}/reset-password?token={token}"
  270. # send_email(
  271. # email_to=email_to,
  272. # subject_template=subject,
  273. # html_template=template_str,
  274. # environment={
  275. # # "project_name": settings.PROJECT_NAME,
  276. # "username": email,
  277. # "email": email_to,
  278. # "valid_hours": settings.EMAIL_RESET_TOKEN_EXPIRE_HOURS,
  279. # "link": link,
  280. # },
  281. # )
  282. # @users.post("/password-recovery/{email}")
  283. # async def recover_password(email:str):
  284. # user = await User.filter(email=email).first()
  285. # if not user:
  286. # raise HTTPException(
  287. # status_code=404,
  288. # detail="The user with this username does not exist in the system.",
  289. # )
  290. # password_reset_token = generate_password_reset_token(email=email)
  291. # send_reset_password_email(
  292. # email_to=user.email, email=email, token=password_reset_token
  293. # )
  294. # return {"msg": "Password recovery email sent"}
  295. # @users.get("/delete_user/{id}")
  296. # async def delete(id: int):
  297. # if id:
  298. # await User.filter(id=id).delete()
  299. # return {"msg": "success", "code": 200}
  300. # return {"msg": "failed", "code": 400}