classes.py 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605
  1. from fastapi import APIRouter, Form, Depends, HTTPException, File, UploadFile
  2. from typing import List
  3. from fastapi.responses import FileResponse
  4. from random import randint
  5. from fastapi.security import OAuth2PasswordRequestForm
  6. from app.models.models import User,Favorite_course
  7. from app.models.models import Class_list,Schools,Class_detail,Class_name,Registration,Group_name
  8. from app.api import deps
  9. from sqlalchemy.orm import Session
  10. from typing import Any, Dict
  11. import secrets
  12. from fastapi_login.exceptions import InvalidCredentialsException
  13. from fastapi_login import LoginManager
  14. from datetime import timedelta,datetime
  15. from app.config import settings
  16. from pathlib import Path
  17. from jose import jwt
  18. from emails.template import JinjaTemplate
  19. from tortoise.queryset import Q
  20. from fastapi.responses import HTMLResponse
  21. classes = APIRouter()
  22. IMAGEDIR = "/var/www/html/ntcri/assets/"
  23. IMAGEDIR_short = "assets/"
  24. async def update_location_time(location_id: int):
  25. if location_id:
  26. school = await Schools.get(id=location_id)
  27. school.update_time = datetime.now()
  28. await school.save()
  29. return {"msg": "success", "code": 200}
  30. @classes.post("/insert_school")
  31. async def insert_school(
  32. location_name: str = Form(default=''),
  33. Lng: str = Form(default=''),
  34. Lat: str = Form(default=''),
  35. group_id : int = Form(default=1),
  36. address : str = Form(default='')
  37. ):
  38. try:
  39. new_school = await Schools.create(
  40. name=location_name,
  41. longitude=Lng,
  42. latitude=Lat,
  43. group_id = group_id,
  44. address = address
  45. )
  46. return {"msg": "success", "code": 200, "location_id": new_school.id}
  47. except Exception as e:
  48. return {"msg": str(e), "code": 500}
  49. @classes.post("/insert_class_name")
  50. async def insert_class_name(
  51. name: str = Form(default=''),
  52. location_id: int = Form(default=1),
  53. category: str = Form(default=''),
  54. introduction: str = Form(default=''),
  55. organizer: str = Form(default=''),
  56. cover_img_file:UploadFile = File(default='')
  57. ):
  58. try:
  59. cover_img = ''
  60. if cover_img_file != '':
  61. contents = await cover_img_file.read()
  62. #save the file
  63. with open(f"{IMAGEDIR}{cover_img_file.filename}", "wb") as f:
  64. f.write(contents)
  65. cover_img = f"{IMAGEDIR_short}{cover_img_file.filename}"
  66. new_class_name = await Class_name.create(
  67. name=name,
  68. school_id=location_id,
  69. category=category,
  70. introduction=introduction,
  71. organizer=organizer,
  72. cover_img=cover_img
  73. )
  74. update_location_time(location_id= location_id)
  75. return {"msg": "success", "code": 200, "new_class_name_id": new_class_name.id}
  76. except Exception as e:
  77. return {"msg": str(e), "code": 500}
  78. @classes.post("/insert_event")
  79. async def insert_event(
  80. name_id: int = Form(default=0),
  81. event: str = Form(default=''),
  82. start_time: datetime = Form(default=datetime.now()),
  83. end_time: datetime = Form(default=datetime.now()),
  84. contact: str = Form(default=''),
  85. lecturer: str = Form(default=''),
  86. location: str = Form(default=''),
  87. content: str = Form(default=''),
  88. URL: str = Form(default=''),
  89. people : str = Form(default=''),
  90. fee_method: str = Form(default=''),
  91. registration_way: str = Form(default=''),
  92. remark : str = Form(default='')
  93. ):
  94. try:
  95. # 檢查是否有該課程
  96. class_name_list = await Class_name.filter(id=name_id).all()
  97. if class_name_list == []:
  98. return {"msg": "沒有此課程", "code": 200}
  99. new_class = await Class_list.create(
  100. name_id=name_id,
  101. event =event,
  102. start_time=start_time,
  103. end_time=end_time,
  104. contact=contact,
  105. lecturer=lecturer,
  106. location=location,
  107. content=content,
  108. URL=URL,
  109. people=people,
  110. fee_method=fee_method,
  111. registration_way=registration_way,
  112. remark=remark
  113. )
  114. return {"msg": "success", "code": 200, "class_id": new_class.id}
  115. except Exception as e:
  116. return {"msg": str(e), "code": 500}
  117. @classes.post("/insert_session")
  118. async def insert_session(
  119. class_event_id : int = Form(default=0),
  120. start_time: datetime = Form(default=datetime.now()),
  121. end_time: datetime = Form(default=datetime.now()),
  122. sessions: str = Form(default=0),
  123. content : str = Form(default='')
  124. ):
  125. try:
  126. new_session = await Class_detail.create(
  127. class_list_id=class_event_id,
  128. start_time=start_time,
  129. end_time=end_time,
  130. sessions=sessions,
  131. content = content
  132. )
  133. return {"msg": "success", "code": 200, "new_session_id": new_session.id}
  134. except Exception as e:
  135. return {"msg": str(e), "code": 500}
  136. @classes.post("/update_school")
  137. async def update_school(
  138. location_id: int = Form(default=0),
  139. location_name: str = Form(default=''),
  140. Lng: str = Form(default=''),
  141. Lat: str = Form(default=''),
  142. group_id : int = Form(default=1),
  143. address : str = Form(default='')
  144. ):
  145. try:
  146. school = await Schools.get(id=location_id)
  147. if location_name.strip() != '':
  148. school.name = location_name
  149. if Lng != '':
  150. school.longitude = Lng
  151. if Lat.strip() != '':
  152. school.latitude = Lat
  153. if group_id != 1 :
  154. school.group_id = group_id
  155. if address.strip() != '':
  156. school.address = address
  157. await school.save()
  158. update_location_time(location_id= location_id)
  159. return {"msg": "success", "code": 200}
  160. except Exception as e:
  161. return {"msg": str(e), "code": 500}
  162. @classes.post("/update_class_name")
  163. async def update_class_name(
  164. class_name_id: int = Form(default=0),
  165. name: str = Form(default=''),
  166. location_id: int = Form(default=''),
  167. category: str = Form(default=''),
  168. introduction: str = Form(default=''),
  169. organizer: str = Form(default=''),
  170. cover_img_file:UploadFile = File(default='')
  171. ):
  172. try:
  173. class_name = await Class_name.get(id=class_name_id)
  174. if name.strip() != '':
  175. class_name.name = name
  176. if location_id != '':
  177. class_name.school_id = location_id
  178. if category.strip() != '':
  179. class_name.category = category
  180. if introduction.strip() != '':
  181. class_name.introduction = introduction
  182. if organizer.strip() != '':
  183. class_name.organizer = organizer
  184. if cover_img_file != '':
  185. contents = await cover_img_file.read()
  186. with open(f"{IMAGEDIR}{cover_img_file.filename}", "wb") as f:
  187. f.write(contents)
  188. class_name.cover_img = f"{IMAGEDIR_short}{cover_img_file.filename}"
  189. await class_name.save()
  190. update_location_time(location_id= location_id)
  191. return {"msg": "success", "code": 200}
  192. except Exception as e:
  193. return {"msg": str(e), "code": 500}
  194. @classes.post("/update_event")
  195. async def update_class(
  196. id: int = Form(default=0),
  197. name_id: str = Form(default=0),
  198. event: str = Form(default=''),
  199. start_time: datetime = Form(default=datetime.now()),
  200. end_time: datetime = Form(default=datetime.now()),
  201. contact: str = Form(default=''),
  202. lecturer: str = Form(default=''),
  203. content: str = Form(default=''),
  204. URL: str = Form(default=''),
  205. people : str = Form(default=''),
  206. fee_method: str = Form(default=''),
  207. registration_way: str = Form(default=''),
  208. remark : str = Form(default='')
  209. ):
  210. try:
  211. class_obj = await Class_list.get(id=id)
  212. if name_id != 0:
  213. class_obj.name_id = name_id
  214. if event.strip() != '':
  215. class_obj.event = event
  216. if start_time:
  217. class_obj.start_time = start_time
  218. if end_time:
  219. class_obj.end_time = end_time
  220. if lecturer.strip() != '':
  221. class_obj.lecturer = lecturer
  222. if contact.strip() != '':
  223. class_obj.contact = contact
  224. if content.strip() != '':
  225. class_obj.content = content
  226. if URL.strip() != '':
  227. class_obj.URL = URL
  228. if people.strip() != '':
  229. class_obj.people = people
  230. if fee_method.strip() != '':
  231. class_obj.fee_method = fee_method
  232. if registration_way.strip() != '':
  233. class_obj.registration_way = registration_way
  234. if remark.strip() != '':
  235. class_obj.remark = remark
  236. await class_obj.save()
  237. return {"msg": "success", "code": 200}
  238. except Exception as e:
  239. return {"msg": str(e), "code": 500}
  240. @classes.post("/update_session")
  241. async def update_session(
  242. session_id : int = Form(default=0),
  243. class_event_id : int = Form(default=0),
  244. start_time: datetime = Form(default=datetime.now()),
  245. end_time: datetime = Form(default=datetime.now()),
  246. sessions: str = Form(default=0),
  247. content : str = Form(default='')
  248. ):
  249. try:
  250. class_session_obj = await Class_detail.get(id=session_id)
  251. if class_event_id != 0:
  252. class_session_obj.class_list_id = class_event_id
  253. if start_time != '':
  254. class_session_obj.start_time = start_time
  255. if end_time != '':
  256. class_session_obj.end_time = end_time
  257. if sessions.strip() != '':
  258. class_session_obj.sessions = sessions
  259. if content.strip() != '':
  260. class_session_obj.content = content
  261. await class_session_obj.save()
  262. return {"msg": "success", "code": 200}
  263. except Exception as e:
  264. return {"msg": str(e), "code": 500}
  265. @classes.post("/delete_school")
  266. async def delete_school(location_id: int):
  267. if location_id:
  268. await Schools.filter(id=location_id).delete()
  269. return {"msg": "success", "code": 200}
  270. @classes.post("/delete_session")
  271. async def delete_session(id: int):
  272. if id:
  273. await Class_detail.filter(id=id).delete()
  274. return {"msg": "success", "code": 200}
  275. @classes.post("/delete_event")
  276. async def delete(id: int):
  277. if id:
  278. await Class_detail.filter(class_list_id=id).delete()
  279. await Class_list.filter(id=id).delete()
  280. return {"msg": "success", "code": 200}
  281. @classes.post("/delete_class_name")
  282. async def delete(id: int):
  283. if id:
  284. class_event_list = await Class_list.filter(name_id=id).all()
  285. for class_event_obj in class_event_list:
  286. await Class_detail.filter(class_list_id=class_event_obj.id).delete()
  287. await Class_list.filter(name_id=id).delete()
  288. await Class_name.filter(id=id).delete()
  289. return {"msg": "success", "code": 200}
  290. @classes.get("/get_event")
  291. async def search_event(class_name_id: int = 0):
  292. try:
  293. class_list = await Class_list.filter(name_id=class_name_id).all()
  294. class_name_obj = await Class_name.get(id=class_name_id)
  295. class_name = class_name_obj.name
  296. classes = []
  297. for class_obj in class_list:
  298. class_data = {
  299. "class_name" : class_name,
  300. "event_id": class_obj.id,
  301. "name_id": class_obj.name_id,
  302. "event": class_obj.event,
  303. "start_time": class_obj.start_time,
  304. "end_time": class_obj.end_time,
  305. "location": class_obj.location,
  306. "lecturer": class_obj.lecturer,
  307. "contact": class_obj.contact,
  308. "content": class_obj.content,
  309. "URL": class_obj.URL,
  310. "people": class_obj.people,
  311. "fee_method": class_obj.fee_method,
  312. "registration_way": class_obj.registration_way,
  313. "remark": class_obj.remark
  314. }
  315. classes.append(class_data)
  316. return {"msg": "success", "code": 200, "classes": classes}
  317. except Exception as e:
  318. return {"msg": str(e), "code": 500}
  319. @classes.get("/get_school")
  320. async def get_school():
  321. try:
  322. school_list = await Schools.all()
  323. schools = []
  324. for school_obj in school_list:
  325. school_data = {
  326. "location_id": school_obj.id,
  327. "location_name": school_obj.name,
  328. "Lng": school_obj.longitude,
  329. "Lat": school_obj.latitude,
  330. "group_id": school_obj.group_id,
  331. "address": school_obj.address,
  332. "update_time":school_obj.update_time
  333. }
  334. schools.append(school_data)
  335. return {"msg": "success", "code": 200, "schools": schools}
  336. except Exception as e:
  337. return {"msg": str(e), "code": 500}
  338. @classes.get("/get_group_name")
  339. async def get_school_group():
  340. try:
  341. school_group_list = await Group_name.all()
  342. school_groups = []
  343. for school_obj in school_group_list:
  344. school_data = {
  345. "group_id": school_obj.id,
  346. "group_name": school_obj.group_name
  347. }
  348. school_groups.append(school_data)
  349. return {"msg": "success", "code": 200, "school_groups": school_groups}
  350. except Exception as e:
  351. return {"msg": str(e), "code": 500}
  352. @classes.get("/get_class_name")
  353. async def get_class_name(
  354. location_id : int = 0 ,
  355. class_name_id : int = 0
  356. ):
  357. try:
  358. if location_id == 0:
  359. if class_name_id == 0 :
  360. class_name_list = await Class_name.all()
  361. else :
  362. class_name_list = await Class_name.filter(id = class_name_id).all()
  363. else:
  364. class_name_list = await Class_name.filter(school_id = location_id).all()
  365. classes_name = []
  366. for class_name_obj in class_name_list:
  367. school_obj = await Schools.filter(id=class_name_obj.school_id).all()
  368. school_name = ""
  369. if school_obj == []:
  370. school_name = "未設定據點"
  371. else :
  372. school_obj = await Schools.get(id=class_name_obj.school_id)
  373. school_name = school_obj.name
  374. class_data = {
  375. "class_name_id": class_name_obj.id,
  376. "name": class_name_obj.name,
  377. "school":school_name,
  378. "category": class_name_obj.category,
  379. "introduction": class_name_obj.introduction,
  380. "organizer": class_name_obj.organizer,
  381. "cover_img": class_name_obj.cover_img
  382. }
  383. classes_name.append(class_data)
  384. return {"msg": "success", "code": 200, "classes": classes_name}
  385. except Exception as e:
  386. return {"msg": str(e), "code": 500}
  387. @classes.get("/get_session")
  388. async def get_session(
  389. event_id : int = 0
  390. ):
  391. try:
  392. class_session_list = await Class_detail.filter(class_list_id=event_id).all()
  393. classe_sessions = []
  394. for class_session_obj in class_session_list:
  395. class_session_data = {
  396. "session_id": class_session_obj.id,
  397. "class_event_id": class_session_obj.class_list_id,
  398. "start_time": class_session_obj.start_time,
  399. "end_time": class_session_obj.end_time,
  400. "sessions": class_session_obj.sessions,
  401. "content": class_session_obj.content
  402. }
  403. classe_sessions.append(class_session_data)
  404. return {"msg": "success", "code": 200, "classe_sessions": classe_sessions}
  405. except Exception as e:
  406. return {"msg": str(e), "code": 500}
  407. @classes.get("/search_class_like")
  408. async def search_class_like(keyword: str):
  409. try:
  410. class_list = await Class_list.filter(Q(lecturer__icontains=keyword)).all()
  411. classes = []
  412. for class_obj in class_list:
  413. class_name = await Class_name.get(id=class_obj.name_id)
  414. school_obj = await Schools.get(id=class_name.school_id)
  415. class_data = {
  416. "msg": "success",
  417. "code": 200,
  418. "class_id": class_obj.id,
  419. "name": class_name.name,
  420. "school":school_obj.name,
  421. "category": class_name.category,
  422. "introduction": class_name.introduction,
  423. "organizer": class_name.organizer,
  424. "cover_img": class_name.cover_img,
  425. "event": class_obj.event,
  426. "start_time": class_obj.start_time,
  427. "end_time": class_obj.end_time,
  428. "location": class_obj.location,
  429. "lecturer": class_obj.lecturer,
  430. "contact": class_obj.contact,
  431. "content": class_obj.content,
  432. "URL": class_obj.URL,
  433. "people": class_obj.people,
  434. "fee_method": class_obj.fee_method,
  435. "registration_way": class_obj.registration_way,
  436. "remark": class_obj.remark
  437. }
  438. classes.append(class_data)
  439. class_name_list = await Class_name.filter(Q(name__icontains=keyword)).all()
  440. for class_name in class_name_list:
  441. class_list = await Class_list.filter(name_id=class_name.id).all()
  442. for class_obj in class_list:
  443. school_obj = await Schools.get(id=class_name.school_id)
  444. class_data = {
  445. "msg": "success",
  446. "code": 200,
  447. "class_id": class_obj.id,
  448. "name": class_name.name,
  449. "school":school_obj.name,
  450. "category": class_name.category,
  451. "introduction": class_name.introduction,
  452. "organizer": class_name.organizer,
  453. "cover_img": class_name.cover_img,
  454. "event": class_obj.event,
  455. "start_time": class_obj.start_time,
  456. "end_time": class_obj.end_time,
  457. "location": class_obj.location,
  458. "lecturer": class_obj.lecturer,
  459. "contact": class_obj.contact,
  460. "content": class_obj.content,
  461. "URL": class_obj.URL,
  462. "people": class_obj.people,
  463. "fee_method": class_obj.fee_method,
  464. "registration_way": class_obj.registration_way,
  465. "remark": class_obj.remark
  466. }
  467. classes.append(class_data)
  468. return {"msg": "success", "code": 200, "classes": classes}
  469. except Exception as e:
  470. return {"msg": str(e), "code": 500}
  471. @classes.post("/add_favorite_class")
  472. async def add_favorite_class(
  473. class_event_id: int,
  474. user_id : int,
  475. time_stemp: datetime = datetime.now()
  476. ):
  477. try:
  478. new_favorite_class = await Favorite_course.get_or_create(
  479. class_event_id=class_event_id,
  480. user_id=user_id,
  481. defaults={'time_stemp': time_stemp}
  482. )
  483. return {"msg": "success", "code": 200,"is exist": not new_favorite_class[1],"id":new_favorite_class[0].id}
  484. except Exception as e:
  485. return {"msg": str(e), "code": 500}
  486. @classes.get("get_favorite_class")
  487. async def get_favorite_class(
  488. user_id : int
  489. ):
  490. try:
  491. class_list = await Favorite_course.filter(user_id = user_id).all()
  492. favorite_courses = []
  493. for class_obj in class_list:
  494. class_event = await Class_list.get(id = class_obj.class_event_id)
  495. class_name = await Class_name.get(id = class_event.name_id)
  496. class_data = {
  497. "id": class_obj.id,
  498. "user_id": class_obj.user_id,
  499. "class_event_id":class_obj.class_event_id,
  500. "class_name_id" : class_name.id,
  501. "time_stemp":class_obj.time_stemp
  502. }
  503. favorite_courses.append(class_data)
  504. return {"msg": "success", "code": 200, "school_groups": favorite_courses}
  505. except Exception as e:
  506. return {"msg": str(e), "code": 500}
  507. @classes.post("/delete_favorite_class")
  508. async def delete_favorite_class(
  509. class_event_id: int,
  510. user_id : int
  511. ):
  512. try:
  513. await Favorite_course.filter(class_event_id=class_event_id,user_id=user_id).delete()
  514. return {"msg": "success", "code": 200}
  515. except Exception as e:
  516. return {"msg": str(e), "code": 500}
  517. @classes.post("/uploadfiles/")
  518. async def create_upload_files(files: List[UploadFile]):
  519. return {"filenames": [file.filename for file in files]}