classes.py 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529
  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,Schools,Class_detail,Class_name,Registration,School_group
  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. async def update_location_time(location_id: int):
  27. if location_id:
  28. school = await Schools.get(id=location_id)
  29. school.update_time = datetime.now()
  30. await school.save()
  31. return {"msg": "success", "code": 200}
  32. @classes.post("/insert_school")
  33. async def insert_school(
  34. location_name: str = Form(default=''),
  35. Lng: str = Form(default=''),
  36. Lat: str = Form(default=''),
  37. group_id : int = Form(default=1),
  38. address : str = Form(default='')
  39. ):
  40. try:
  41. new_school = await Schools.create(
  42. name=location_name,
  43. longitude=Lng,
  44. latitude=Lat,
  45. group_id = group_id,
  46. address = address
  47. )
  48. return {"msg": "success", "code": 200, "location_id": new_school.id}
  49. except Exception as e:
  50. return {"msg": str(e), "code": 500}
  51. @classes.post("/insert_class_name")
  52. async def insert_class_name(
  53. name: str = Form(default=''),
  54. location_id: int = Form(default=1),
  55. category: str = Form(default=''),
  56. introduction: str = Form(default=''),
  57. organizer: str = Form(default=''),
  58. cover_img_file:UploadFile = File(default='')
  59. ):
  60. try:
  61. cover_img = ''
  62. if cover_img_file != '':
  63. contents = await cover_img_file.read()
  64. #save the file
  65. with open(f"{IMAGEDIR}{cover_img_file.filename}", "wb") as f:
  66. f.write(contents)
  67. cover_img = f"{IMAGEDIR_short}{cover_img_file.filename}"
  68. new_class_name = await Class_name.create(
  69. name=name,
  70. school_id=location_id,
  71. category=category,
  72. introduction=introduction,
  73. organizer=organizer,
  74. cover_img=cover_img
  75. )
  76. update_location_time(location_id= location_id)
  77. return {"msg": "success", "code": 200, "new_class_name_id": new_class_name.id}
  78. except Exception as e:
  79. return {"msg": str(e), "code": 500}
  80. @classes.post("/insert_event")
  81. async def insert_event(
  82. name_id: int = Form(default=''),
  83. event: str = Form(default=''),
  84. start_time: datetime = Form(default=datetime.now()),
  85. end_time: datetime = Form(default=datetime.now()),
  86. contact: str = Form(default=''),
  87. lecturer: str = Form(default=''),
  88. location: str = Form(default=''),
  89. content: str = Form(default=''),
  90. URL: str = Form(default=''),
  91. people : str = Form(default=''),
  92. fee_method: str = Form(default=''),
  93. registration_way: str = Form(default=''),
  94. remark : str = Form(default='')
  95. ):
  96. try:
  97. new_class = await Class_list.create(
  98. name_id=name_id,
  99. event =event,
  100. start_time=start_time,
  101. end_time=end_time,
  102. contact=contact,
  103. lecturer=lecturer,
  104. location=location,
  105. content=content,
  106. URL=URL,
  107. people=people,
  108. fee_method=fee_method,
  109. registration_way=registration_way,
  110. remark=remark
  111. )
  112. return {"msg": "success", "code": 200, "class_id": new_class.id}
  113. except Exception as e:
  114. return {"msg": str(e), "code": 500}
  115. @classes.post("/insert_session")
  116. async def insert_session(
  117. class_event_id : int = Form(default=0),
  118. start_time: datetime = Form(default=datetime.now()),
  119. end_time: datetime = Form(default=datetime.now()),
  120. sessions: str = Form(default=0),
  121. content : str = Form(default='')
  122. ):
  123. try:
  124. new_session = await Class_detail.create(
  125. class_list_id=class_event_id,
  126. start_time=start_time,
  127. end_time=end_time,
  128. sessions=sessions,
  129. content = content
  130. )
  131. return {"msg": "success", "code": 200, "new_session_id": new_session.id}
  132. except Exception as e:
  133. return {"msg": str(e), "code": 500}
  134. @classes.post("/update_school")
  135. async def update_school(
  136. location_id: int = Form(default=0),
  137. location_name: str = Form(default=''),
  138. Lng: str = Form(default=''),
  139. Lat: str = Form(default=''),
  140. group_id : int = Form(default=1),
  141. address : str = Form(default='')
  142. ):
  143. try:
  144. school = await Schools.get(id=location_id)
  145. if location_name.strip() != '':
  146. school.name = location_name
  147. if Lng != '':
  148. school.longitude = Lng
  149. if Lat.strip() != '':
  150. school.latitude = Lat
  151. if group_id != 1 :
  152. school.group_id = group_id
  153. if address.strip() != '':
  154. school.address = address
  155. await school.save()
  156. update_location_time(location_id= location_id)
  157. return {"msg": "success", "code": 200}
  158. except Exception as e:
  159. return {"msg": str(e), "code": 500}
  160. @classes.post("/update_class_name")
  161. async def update_class_name(
  162. class_name_id: int = Form(default=0),
  163. name: str = Form(default=''),
  164. location_id: int = Form(default=''),
  165. category: str = Form(default=''),
  166. introduction: str = Form(default=''),
  167. organizer: str = Form(default=''),
  168. cover_img_file:UploadFile = File(default='')
  169. ):
  170. try:
  171. class_name = await Class_name.get(id=class_name_id)
  172. if name.strip() != '':
  173. class_name.name = name
  174. if location_id != '':
  175. class_name.school_id = location_id
  176. if category.strip() != '':
  177. class_name.category = category
  178. if introduction.strip() != '':
  179. class_name.introduction = introduction
  180. if organizer.strip() != '':
  181. class_name.organizer = organizer
  182. if cover_img_file != '':
  183. contents = await cover_img_file.read()
  184. with open(f"{IMAGEDIR}{cover_img_file.filename}", "wb") as f:
  185. f.write(contents)
  186. class_name.cover_img = f"{IMAGEDIR_short}{cover_img_file.filename}"
  187. await class_name.save()
  188. update_location_time(location_id= location_id)
  189. return {"msg": "success", "code": 200}
  190. except Exception as e:
  191. return {"msg": str(e), "code": 500}
  192. @classes.post("/update_event")
  193. async def update_class(
  194. id: int = Form(default=0),
  195. name_id: str = Form(default=0),
  196. event: str = Form(default=''),
  197. start_time: datetime = Form(default=datetime.now()),
  198. end_time: datetime = Form(default=datetime.now()),
  199. contact: str = Form(default=''),
  200. lecturer: str = Form(default=''),
  201. content: str = Form(default=''),
  202. URL: str = Form(default=''),
  203. people : str = Form(default=''),
  204. fee_method: str = Form(default=''),
  205. registration_way: str = Form(default=''),
  206. remark : str = Form(default='')
  207. ):
  208. try:
  209. class_obj = await Class_list.get(id=id)
  210. if name_id != 0:
  211. class_obj.name_id = name_id
  212. if event.strip() != '':
  213. class_obj.event = event
  214. if start_time:
  215. class_obj.start_time = start_time
  216. if end_time:
  217. class_obj.end_time = end_time
  218. if lecturer.strip() != '':
  219. class_obj.lecturer = lecturer
  220. if contact.strip() != '':
  221. class_obj.contact = contact
  222. if content.strip() != '':
  223. class_obj.content = content
  224. if URL.strip() != '':
  225. class_obj.URL = URL
  226. if people.strip() != '':
  227. class_obj.people = people
  228. if fee_method.strip() != '':
  229. class_obj.fee_method = fee_method
  230. if registration_way.strip() != '':
  231. class_obj.registration_way = registration_way
  232. if remark.strip() != '':
  233. class_obj.remark = remark
  234. await class_obj.save()
  235. return {"msg": "success", "code": 200}
  236. except Exception as e:
  237. return {"msg": str(e), "code": 500}
  238. @classes.post("/update_session")
  239. async def update_session(
  240. session_id : int = Form(default=0),
  241. class_event_id : int = Form(default=0),
  242. start_time: datetime = Form(default=datetime.now()),
  243. end_time: datetime = Form(default=datetime.now()),
  244. sessions: str = Form(default=0),
  245. content : str = Form(default='')
  246. ):
  247. try:
  248. class_session_obj = await Class_detail.get(id=session_id)
  249. if class_event_id != 0:
  250. class_session_obj.class_list_id = class_event_id
  251. if start_time != '':
  252. class_session_obj.start_time = start_time
  253. if end_time != '':
  254. class_session_obj.end_time = end_time
  255. if sessions.strip() != '':
  256. class_session_obj.sessions = sessions
  257. if content.strip() != '':
  258. class_session_obj.content = content
  259. await class_session_obj.save()
  260. return {"msg": "success", "code": 200}
  261. except Exception as e:
  262. return {"msg": str(e), "code": 500}
  263. @classes.post("/delete_school")
  264. async def delete_school(location_id: int):
  265. if location_id:
  266. await Schools.filter(id=location_id).delete()
  267. return {"msg": "success", "code": 200}
  268. @classes.post("/delete_class")
  269. async def delete(id: int):
  270. if id:
  271. await Class_list.filter(id=id).delete()
  272. return {"msg": "success", "code": 200}
  273. @classes.post("/delete_class_name")
  274. async def delete(id: int):
  275. if id:
  276. await Class_list.filter(name_id=id).delete()
  277. await Class_name.filter(id=id).delete()
  278. return {"msg": "success", "code": 200}
  279. @classes.get("/get_event")
  280. async def search_event(name_id: int = 0):
  281. try:
  282. class_list = await Class_list.filter(name_id=name_id).all()
  283. classes = []
  284. for class_obj in class_list:
  285. class_data = {
  286. "msg": "success",
  287. "code": 200,
  288. "event_id": class_obj.id,
  289. "name_id": class_obj.name_id,
  290. "event": class_obj.event,
  291. "start_time": class_obj.start_time,
  292. "end_time": class_obj.end_time,
  293. "location": class_obj.location,
  294. "lecturer": class_obj.lecturer,
  295. "contact": class_obj.contact,
  296. "content": class_obj.content,
  297. "URL": class_obj.URL,
  298. "people": class_obj.people,
  299. "fee_method": class_obj.fee_method,
  300. "registration_way": class_obj.registration_way,
  301. "remark": class_obj.remark
  302. }
  303. classes.append(class_data)
  304. return {"msg": "success", "code": 200, "classes": classes}
  305. except Exception as e:
  306. return {"msg": str(e), "code": 500}
  307. @classes.get("/get_school")
  308. async def get_school():
  309. try:
  310. school_list = await Schools.all()
  311. schools = []
  312. for school_obj in school_list:
  313. school_data = {
  314. "location_id": school_obj.id,
  315. "location_name": school_obj.name,
  316. "Lng": school_obj.longitude,
  317. "Lat": school_obj.latitude,
  318. "group_id": school_obj.group_id,
  319. "address": school_obj.address,
  320. "update_time":school_obj.update_time
  321. }
  322. schools.append(school_data)
  323. return {"msg": "success", "code": 200, "schools": schools}
  324. except Exception as e:
  325. return {"msg": str(e), "code": 500}
  326. @classes.get("/get_school_group")
  327. async def get_school_group():
  328. try:
  329. school_group_list = await School_group.all()
  330. school_groups = []
  331. for school_obj in school_group_list:
  332. school_data = {
  333. "group_id": school_obj.id,
  334. "group_name": school_obj.group_name
  335. }
  336. school_groups.append(school_data)
  337. return {"msg": "success", "code": 200, "school_groups": school_groups}
  338. except Exception as e:
  339. return {"msg": str(e), "code": 500}
  340. @classes.get("/get_class_name")
  341. async def get_class_name(
  342. location_id : int = 0 ,
  343. class_name_id : int = 0
  344. ):
  345. try:
  346. if location_id == 0:
  347. if class_name_id == 0 :
  348. class_name_list = await Class_name.all()
  349. else :
  350. class_name_list = await Class_name.filter(id = class_name_id).all()
  351. else:
  352. class_name_list = await Class_name.filter(school_id = location_id).all()
  353. classes_name = []
  354. for class_name_obj in class_name_list:
  355. school_obj = await Schools.get(id=class_name_obj.school_id)
  356. class_data = {
  357. "class_name_id": class_name_obj.id,
  358. "name": class_name_obj.name,
  359. "school":school_obj.name,
  360. "category": class_name_obj.category,
  361. "introduction": class_name_obj.introduction,
  362. "organizer": class_name_obj.organizer,
  363. "cover_img": class_name_obj.cover_img
  364. }
  365. classes_name.append(class_data)
  366. return {"msg": "success", "code": 200, "classes": classes_name}
  367. except Exception as e:
  368. return {"msg": str(e), "code": 500}
  369. @classes.get("/get_session")
  370. async def get_session(
  371. event_id : int = 0
  372. ):
  373. try:
  374. class_session_list = await Class_detail.filter(class_list_id=event_id).all()
  375. classe_sessions = []
  376. for class_session_obj in class_session_list:
  377. class_session_data = {
  378. "session_id": class_session_obj.id,
  379. "class_event_id": class_session_obj.class_list_id,
  380. "start_time": class_session_obj.start_time,
  381. "end_time": class_session_obj.end_time,
  382. "sessions": class_session_obj.sessions,
  383. "content": class_session_obj.content
  384. }
  385. classe_sessions.append(class_session_data)
  386. return {"msg": "success", "code": 200, "classe_sessions": classe_sessions}
  387. except Exception as e:
  388. return {"msg": str(e), "code": 500}
  389. @classes.get("/search_class_like")
  390. async def search_class_like(keyword: str):
  391. try:
  392. class_list = await Class_list.filter(Q(lecturer__icontains=keyword)).all()
  393. classes = []
  394. for class_obj in class_list:
  395. class_name = await Class_name.get(id=class_obj.name_id)
  396. school_obj = await Schools.get(id=class_name.school_id)
  397. class_data = {
  398. "msg": "success",
  399. "code": 200,
  400. "class_id": class_obj.id,
  401. "name": class_name.name,
  402. "school":school_obj.name,
  403. "category": class_name.category,
  404. "introduction": class_name.introduction,
  405. "organizer": class_name.organizer,
  406. "cover_img": class_name.cover_img,
  407. "event": class_obj.event,
  408. "start_time": class_obj.start_time,
  409. "end_time": class_obj.end_time,
  410. "location": class_obj.location,
  411. "lecturer": class_obj.lecturer,
  412. "contact": class_obj.contact,
  413. "content": class_obj.content,
  414. "URL": class_obj.URL,
  415. "people": class_obj.people,
  416. "fee_method": class_obj.fee_method,
  417. "registration_way": class_obj.registration_way,
  418. "remark": class_obj.remark
  419. }
  420. classes.append(class_data)
  421. class_name_list = await Class_name.filter(Q(name__icontains=keyword)).all()
  422. for class_name in class_name_list:
  423. class_list = await Class_list.filter(name_id=class_name.id).all()
  424. for class_obj in class_list:
  425. school_obj = await Schools.get(id=class_name.school_id)
  426. class_data = {
  427. "msg": "success",
  428. "code": 200,
  429. "class_id": class_obj.id,
  430. "name": class_name.name,
  431. "school":school_obj.name,
  432. "category": class_name.category,
  433. "introduction": class_name.introduction,
  434. "organizer": class_name.organizer,
  435. "cover_img": class_name.cover_img,
  436. "event": class_obj.event,
  437. "start_time": class_obj.start_time,
  438. "end_time": class_obj.end_time,
  439. "location": class_obj.location,
  440. "lecturer": class_obj.lecturer,
  441. "contact": class_obj.contact,
  442. "content": class_obj.content,
  443. "URL": class_obj.URL,
  444. "people": class_obj.people,
  445. "fee_method": class_obj.fee_method,
  446. "registration_way": class_obj.registration_way,
  447. "remark": class_obj.remark
  448. }
  449. classes.append(class_data)
  450. return {"msg": "success", "code": 200, "classes": classes}
  451. except Exception as e:
  452. return {"msg": str(e), "code": 500}