classes.py 40 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152
  1. from fastapi import APIRouter, Form, Depends, HTTPException, File, UploadFile
  2. from typing import List,Optional
  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,Article_list,Class_date,Attend_record
  7. from app.models.models import Class_list,Schools,Class_detail,Class_name,Registration,Group_name,Online_course
  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. import requests
  22. import json
  23. from itertools import chain
  24. classes = APIRouter()
  25. async def check_token(access_token: str):
  26. result = await User.filter(token=access_token).first()
  27. if not result:
  28. print("no access")
  29. return None
  30. user_id = result.id
  31. return user_id
  32. IMAGEDIR = "/var/www/ntcri/assets/"
  33. IMAGEDIR_short = "assets/"
  34. async def update_location_time(location_id: int):
  35. if location_id:
  36. school = await Schools.get(id=location_id)
  37. school.update_time = datetime.now()
  38. await school.save()
  39. return {"msg": "success", "code": 200}
  40. @classes.post("/insert_school")
  41. async def insert_school(
  42. location_name: str = Form(default=''),
  43. Lng: str = Form(default=''),
  44. Lat: str = Form(default=''),
  45. address : str = Form(default='')
  46. ):
  47. try:
  48. new_school = await Schools.create(
  49. name=location_name,
  50. longitude=Lng,
  51. latitude=Lat,
  52. address = address,
  53. update_time = datetime.now()
  54. )
  55. return {"msg": "success", "code": 200, "location_id": new_school.id}
  56. except Exception as e:
  57. return {"msg": str(e), "code": 500}
  58. @classes.post("/insert_class_name")
  59. async def insert_class_name(
  60. name: str = Form(default=''),
  61. location_id: int = Form(default=1),
  62. category: str = Form(default=''),
  63. introduction: str = Form(default=''),
  64. organizer: str = Form(default=''),
  65. cover_img_file:UploadFile = File(default=''),
  66. group_id : int = Form(default=1),
  67. group_sort :str = Form(default='')
  68. ):
  69. try:
  70. cover_img = ''
  71. if cover_img_file != '':
  72. contents = await cover_img_file.read()
  73. #save the file
  74. with open(f"{IMAGEDIR}{cover_img_file.filename}", "wb") as f:
  75. f.write(contents)
  76. cover_img = f"{IMAGEDIR_short}{cover_img_file.filename}"
  77. new_class_name = await Class_name.create(
  78. name=name,
  79. school_id=location_id,
  80. category=category,
  81. introduction=introduction,
  82. organizer=organizer,
  83. cover_img=cover_img,
  84. group_id=group_id,
  85. group_sort=group_sort
  86. )
  87. update_location_time(location_id= location_id)
  88. return {"msg": "success", "code": 200, "new_class_name_id": new_class_name.id}
  89. except Exception as e:
  90. return {"msg": str(e), "code": 500}
  91. @classes.post("/insert_event")
  92. async def insert_event(
  93. name_id: int = Form(default=0),
  94. event: str = Form(default=''),
  95. start_time: datetime = Form(default=datetime.now()),
  96. end_time: datetime = Form(default=datetime.now()),
  97. contact: str = Form(default=''),
  98. lecturer: str = Form(default=''),
  99. location: str = Form(default=''),
  100. content: str = Form(default=''),
  101. URL: str = Form(default=''),
  102. people : str = Form(default=''),
  103. fee_method: str = Form(default=''),
  104. registration_way: str = Form(default=''),
  105. registration_start: datetime = Form(default=datetime.now()),
  106. registration_end: datetime = Form(default=datetime.now()),
  107. number_limit: int = Form(default=0),
  108. remark : str = Form(default='')
  109. ):
  110. try:
  111. # 檢查是否有該課程
  112. class_name_list = await Class_name.filter(id=name_id).all()
  113. if class_name_list == []:
  114. return {"msg": "沒有此課程", "code": 200}
  115. new_class = await Class_list.create(
  116. name_id=name_id,
  117. event =event,
  118. start_time=start_time,
  119. end_time=end_time,
  120. contact=contact,
  121. lecturer=lecturer,
  122. location=location,
  123. content=content,
  124. URL=URL,
  125. people=people,
  126. fee_method=fee_method,
  127. registration_way=registration_way,
  128. remark=remark
  129. )
  130. await Class_date.create(
  131. class_list_id = new_class.id,
  132. registration_start = registration_start,
  133. registration_end = registration_end,
  134. number_limit = number_limit,
  135. amount_left = number_limit
  136. )
  137. return {"msg": "success", "code": 200, "class_id": new_class.id}
  138. except Exception as e:
  139. return {"msg": str(e), "code": 500}
  140. @classes.post("/auto_create_session")
  141. async def auto_create_session(
  142. class_event_id : int = Form(default=0),
  143. week_day_str : str = Form(default="[]")
  144. ):
  145. try:
  146. week_day = eval(week_day_str)
  147. #print(week_day)
  148. class_obj = await Class_list.get(id = class_event_id)
  149. time_stemp = class_obj.start_time
  150. while time_stemp <= class_obj.end_time:
  151. if week_day[time_stemp.weekday()]:
  152. time_del = class_obj.end_time.hour - time_stemp.hour
  153. time_del_minutes = class_obj.end_time.minute - time_stemp.minute
  154. time_end = time_stemp + timedelta(hours=time_del,minutes=time_del_minutes)
  155. #print(time_end,class_obj.end_time.hour)
  156. session_list = await Class_detail.filter(class_list_id=class_event_id).all()
  157. session = 0
  158. if session_list != []:
  159. for session_obj in session_list:
  160. if session < session_obj.sessions:
  161. session = session_obj.sessions
  162. new_session = await Class_detail.create(
  163. class_list_id=class_event_id,
  164. start_time=time_stemp,
  165. end_time=time_end,
  166. sessions=session +1,
  167. content = ""
  168. )
  169. time_stemp = time_stemp + timedelta(days=1)
  170. return {"msg": "success", "code": 200}
  171. except Exception as e:
  172. return {"msg": str(e), "code": 500}
  173. @classes.post("/insert_session")
  174. async def insert_session(
  175. class_event_id : int = Form(default=0),
  176. start_time: datetime = Form(default=datetime.now()),
  177. end_time: datetime = Form(default=datetime.now()),
  178. content : str = Form(default='')
  179. ):
  180. try:
  181. session_list = await Class_detail.filter(class_list_id=class_event_id).all()
  182. session = 0
  183. if session_list != []:
  184. for session_obj in session_list:
  185. if session < session_obj.sessions:
  186. session = session_obj.sessions
  187. new_session = await Class_detail.create(
  188. class_list_id=class_event_id,
  189. start_time=start_time,
  190. end_time=end_time,
  191. sessions=session +1,
  192. content = content
  193. )
  194. return {"msg": "success", "code": 200, "new_session_id": new_session.id}
  195. except Exception as e:
  196. return {"msg": str(e), "code": 500}
  197. @classes.post("/update_school")
  198. async def update_school(
  199. location_id: int = Form(default=0),
  200. location_name: str = Form(default=''),
  201. Lng: str = Form(default=''),
  202. Lat: str = Form(default=''),
  203. address : str = Form(default='')
  204. ):
  205. try:
  206. school = await Schools.get(id=location_id)
  207. if location_name.strip() != '':
  208. school.name = location_name
  209. if Lng != '':
  210. school.longitude = Lng
  211. if Lat.strip() != '':
  212. school.latitude = Lat
  213. if address.strip() != '':
  214. school.address = address
  215. await school.save()
  216. update_location_time(location_id= location_id)
  217. return {"msg": "success", "code": 200}
  218. except Exception as e:
  219. return {"msg": str(e), "code": 500}
  220. @classes.post("/update_class_name")
  221. async def update_class_name(
  222. class_name_id: int = Form(default=0),
  223. name: str = Form(default=''),
  224. location_id: int = Form(default=0),
  225. category: str = Form(default=''),
  226. introduction: str = Form(default=''),
  227. organizer: str = Form(default=''),
  228. cover_img_file:UploadFile = File(default=''),
  229. group_id : int = Form(default=0),
  230. group_sort : str = Form(default='')
  231. ):
  232. try:
  233. class_name = await Class_name.get(id=class_name_id)
  234. if name.strip() != '':
  235. class_name.name = name
  236. if location_id != 0:
  237. class_name.school_id = location_id
  238. update_location_time(location_id= location_id)
  239. if category.strip() != '':
  240. class_name.category = category
  241. if introduction.strip() != '':
  242. class_name.introduction = introduction
  243. if organizer.strip() != '':
  244. class_name.organizer = organizer
  245. if group_id != 0 :
  246. class_name.group_id = group_id
  247. if cover_img_file != '':
  248. contents = await cover_img_file.read()
  249. with open(f"{IMAGEDIR}{cover_img_file.filename}", "wb") as f:
  250. f.write(contents)
  251. class_name.cover_img = f"{IMAGEDIR_short}{cover_img_file.filename}"
  252. if group_sort != '':
  253. class_name.group_sort = group_sort
  254. await class_name.save()
  255. return {"msg": "success", "code": 200}
  256. except Exception as e:
  257. return {"msg": str(e), "code": 500}
  258. @classes.post("/update_event")
  259. async def update_event(
  260. id: int = Form(default=0),
  261. name_id: int = Form(default=0),
  262. event: str = Form(default=''),
  263. start_time: datetime = Form(default=datetime.now()),
  264. end_time: datetime = Form(default=datetime.now()),
  265. contact: str = Form(default=''),
  266. lecturer: str = Form(default=''),
  267. location: str = Form(default=''),
  268. content: str = Form(default=''),
  269. URL: str = Form(default=''),
  270. people : str = Form(default=''),
  271. fee_method: str = Form(default=''),
  272. registration_way: str = Form(default=''),
  273. registration_start: datetime = Form(default=datetime.now()),
  274. registration_end: datetime = Form(default=datetime.now()),
  275. number_limit: int = Form(default=0),
  276. remark : str = Form(default='')
  277. ):
  278. try:
  279. class_obj = await Class_list.get(id=id)
  280. if name_id != 0:
  281. class_obj.name_id = name_id
  282. if event.strip() != '':
  283. class_obj.event = event
  284. if start_time:
  285. class_obj.start_time = start_time
  286. if end_time:
  287. class_obj.end_time = end_time
  288. if lecturer.strip() != '':
  289. class_obj.lecturer = lecturer
  290. if location.strip() != '':
  291. class_obj.location = location
  292. if contact.strip() != '':
  293. class_obj.contact = contact
  294. if content.strip() != '':
  295. class_obj.content = content
  296. if URL.strip() != '':
  297. class_obj.URL = URL
  298. if people.strip() != '':
  299. class_obj.people = people
  300. if fee_method.strip() != '':
  301. class_obj.fee_method = fee_method
  302. if registration_way.strip() != '':
  303. class_obj.registration_way = registration_way
  304. if remark.strip() != '':
  305. class_obj.remark = remark
  306. try :
  307. class_date_obj = await Class_date.get(class_list_id=id)
  308. if registration_start != datetime.now():
  309. class_date_obj.registration_start = registration_start
  310. if registration_end != datetime.now():
  311. class_date_obj.registration_end = registration_end
  312. if number_limit != 0:
  313. class_date_obj.number_limit = number_limit
  314. await class_date_obj.save()
  315. except:
  316. await Class_date.create(
  317. class_list_id = id,
  318. registration_start = registration_start,
  319. registration_end = registration_end,
  320. number_limit = number_limit,
  321. amount_left = number_limit
  322. )
  323. await class_obj.save()
  324. return {"msg": "success", "code": 200}
  325. except Exception as e:
  326. return {"msg": str(e), "code": 500}
  327. @classes.post("/update_session")
  328. async def update_session(
  329. session_id : int = Form(default=0),
  330. class_event_id : int = Form(default=0),
  331. start_time: datetime = Form(default=datetime.now()),
  332. end_time: datetime = Form(default=datetime.now()),
  333. sessions: str = Form(default=0),
  334. content : str = Form(default='')
  335. ):
  336. try:
  337. class_session_obj = await Class_detail.get(id=session_id)
  338. if class_event_id != 0:
  339. class_session_obj.class_list_id = class_event_id
  340. if start_time != '':
  341. class_session_obj.start_time = start_time
  342. if end_time != '':
  343. class_session_obj.end_time = end_time
  344. if sessions.strip() != '':
  345. class_session_obj.sessions = sessions
  346. if content.strip() != '':
  347. class_session_obj.content = content
  348. await class_session_obj.save()
  349. return {"msg": "success", "code": 200}
  350. except Exception as e:
  351. return {"msg": str(e), "code": 500}
  352. @classes.post("/delete_school")
  353. async def delete_school(location_id: int):
  354. if location_id:
  355. await Schools.filter(id=location_id).delete()
  356. return {"msg": "success", "code": 200}
  357. @classes.post("/delete_session")
  358. async def delete_session(id: int):
  359. if id:
  360. await Class_detail.filter(id=id).delete()
  361. return {"msg": "success", "code": 200}
  362. @classes.post("/delete_event")
  363. async def delete(id: int):
  364. if id:
  365. await Class_detail.filter(class_list_id=id).delete()
  366. await Class_list.filter(id=id).delete()
  367. await Class_date.filter(class_list_id=id).delete()
  368. return {"msg": "success", "code": 200}
  369. @classes.post("/delete_class_name")
  370. async def delete(id: int):
  371. if id:
  372. class_event_list = await Class_list.filter(name_id=id).all()
  373. for class_event_obj in class_event_list:
  374. await Class_detail.filter(class_list_id=class_event_obj.id).delete()
  375. await Class_date.filter(class_list_id=class_event_obj.id).delete()
  376. await Class_list.filter(name_id=id).delete()
  377. await Class_name.filter(id=id).delete()
  378. return {"msg": "success", "code": 200}
  379. @classes.get("/get_class_state")
  380. async def check_date_state(
  381. class_name_id : Optional[int] = None,
  382. class_event_id : Optional[int] = None
  383. ):
  384. if class_name_id:
  385. class_list = await Class_list.filter(name_id=class_name_id).all()
  386. elif class_event_id:
  387. class_list = await Class_list.filter(id=class_event_id).all()
  388. else:
  389. return {"msg": 'please input ID', "code": 500}
  390. result = {"reg": "尚未開放報名", "start_class":"課程尚未開始"}
  391. class_check = True
  392. reg_check = True
  393. try:
  394. for class_obj in class_list:
  395. if class_check:
  396. try:
  397. if class_obj.start_time.replace(tzinfo=None) <= datetime.now() and class_obj.end_time.replace(tzinfo=None) >= datetime.now():
  398. result["start_class"] = "開課中"
  399. class_check = False
  400. elif class_obj.end_time.replace(tzinfo=None) < datetime.now():
  401. result["start_class"] = "課程已結束"
  402. except Exception as e:
  403. result["start_class"] = "尚未確認開課時間"
  404. if reg_check:
  405. try:
  406. class_date_obj = await Class_date.get(class_list_id=class_obj.id)
  407. if class_date_obj.registration_start.replace(tzinfo=None) <= datetime.now() and class_date_obj.registration_end.replace(tzinfo=None) >= datetime.now() :
  408. if class_date_obj.amount_left == 0:
  409. result["reg"] = "報名已額滿"
  410. else:
  411. result["reg"] = "開放報名中"
  412. reg_check = False
  413. elif class_date_obj.registration_end.replace(tzinfo=None) < datetime.now():
  414. result["reg"] = "報名已結束"
  415. except Exception as e:
  416. result["reg"] = "尚未確認報名時間"
  417. return {"msg": "success", "code": 200, "result": result}
  418. except Exception as e:
  419. return {"msg": str(e), "code": 500}
  420. @classes.get("/get_event")
  421. async def search_event(
  422. class_name_id: Optional[int] = None,
  423. event_id : Optional[int] = None
  424. ):
  425. try:
  426. if event_id :
  427. class_list = await Class_list.filter(id=event_id).all().order_by("-start_time")
  428. elif class_name_id:
  429. class_list = await Class_list.filter(name_id=class_name_id).all().order_by("-start_time")
  430. else :
  431. return {"msg": "please input class_name_id or event_id", "code": 200}
  432. classes = []
  433. for class_obj in class_list:
  434. class_name_obj = await Class_name.get(id=class_obj.name_id)
  435. class_name = class_name_obj.name
  436. try :
  437. state = await check_date_state(class_event_id=class_obj.id)
  438. class_data = {
  439. "class_name" : class_name,
  440. "event_id": class_obj.id,
  441. "name_id": class_obj.name_id,
  442. "event": class_obj.event,
  443. "start_time": class_obj.start_time,
  444. "end_time": class_obj.end_time,
  445. "location": class_obj.location,
  446. "lecturer": class_obj.lecturer,
  447. "contact": class_obj.contact,
  448. "content": class_obj.content,
  449. "URL": class_obj.URL,
  450. "people": class_obj.people,
  451. "fee_method": class_obj.fee_method,
  452. "registration_way": class_obj.registration_way,
  453. "remark": class_obj.remark,
  454. "state": state["result"]
  455. }
  456. try:
  457. class_date_obj = await Class_date.get(class_list_id=class_obj.id)
  458. class_data["registration_start"] = class_date_obj.registration_start
  459. class_data["registration_end"] = class_date_obj.registration_end
  460. class_data["number_limit"] = class_date_obj.number_limit
  461. class_data["amount_left"] = class_date_obj.amount_left
  462. except:
  463. pass
  464. except:
  465. class_data = {
  466. "msg" : "fail to get data"
  467. }
  468. classes.append(class_data)
  469. return {"msg": "success", "code": 200, "classes": classes}
  470. except Exception as e:
  471. return {"msg": str(e), "code": 500}
  472. @classes.get("/get_school")
  473. async def get_school(
  474. location_id : Optional[int] = None,
  475. keyword : Optional[str] = None,
  476. location_keyword : Optional[str] = None,
  477. page_num : Optional[int] = None,
  478. page_amount : Optional[int] = None
  479. ):
  480. try:
  481. school_list = Schools.all()
  482. if location_id :
  483. school_list = school_list.filter(id = location_id).all()
  484. if keyword :
  485. school_list = school_list.filter(Q(name__icontains=keyword)).all()
  486. if location_keyword :
  487. school_list = school_list.filter(Q(address__icontains=location_keyword)).all()
  488. school_list = await school_list.all().order_by("-update_time")
  489. schools = []
  490. count = 0
  491. for school_obj in school_list:
  492. school_data = {
  493. "location_id": school_obj.id,
  494. "location_name": school_obj.name,
  495. "Lng": school_obj.longitude,
  496. "Lat": school_obj.latitude,
  497. "address": school_obj.address,
  498. "update_time":school_obj.update_time
  499. }
  500. if page_num and page_amount:
  501. if count < page_num*page_amount and count >= (page_num-1)*page_amount :
  502. schools.append(school_data)
  503. count += 1
  504. else : count += 1
  505. else :
  506. schools.append(school_data)
  507. count += 1
  508. return {"msg": "success", "code": 200, "total_num" : count,"schools": schools}
  509. except Exception as e:
  510. return {"msg": str(e), "code": 500}
  511. @classes.get("/get_group_name")
  512. async def get_school_group():
  513. try:
  514. school_group_list = await Group_name.all()
  515. school_groups = []
  516. for school_obj in school_group_list:
  517. school_data = {
  518. "group_id": school_obj.id,
  519. "group_name": school_obj.group_name
  520. }
  521. school_groups.append(school_data)
  522. return {"msg": "success", "code": 200, "school_groups": school_groups}
  523. except Exception as e:
  524. return {"msg": str(e), "code": 500}
  525. @classes.get("/get_class_name")
  526. async def get_class_name(
  527. location_id : Optional[int] = None ,
  528. class_name_id : Optional[int] = None,
  529. group_id : Optional[int] = None,
  530. group_sort :Optional[str] = None,
  531. category :Optional[str] = None,
  532. page_num : Optional[int] = None,
  533. page_amount : Optional[int] = None
  534. ):
  535. try:
  536. class_name_list = Class_name.all()
  537. if group_sort:
  538. class_name_list = class_name_list.filter(group_sort = group_sort).all()
  539. if category:
  540. class_name_list = class_name_list.filter(Q(category__icontains=category)).all()
  541. if location_id :
  542. class_name_list = class_name_list.filter(school_id = location_id).all()
  543. if class_name_id :
  544. class_name_list = class_name_list.filter(id = class_name_id).all()
  545. class_name_list = await class_name_list.all().order_by("-id")
  546. classes_name = []
  547. count = 0
  548. for class_name_obj in class_name_list:
  549. school_obj = await Schools.filter(id=class_name_obj.school_id).all()
  550. school_name = ""
  551. if school_obj == []:
  552. school_name = "未設定該據點"
  553. else :
  554. school_obj = await Schools.get(id=class_name_obj.school_id)
  555. school_name = school_obj.name
  556. if not group_id or class_name_obj.group_id==group_id:
  557. try:
  558. state = await check_date_state(class_name_id=class_name_obj.id)
  559. class_data = {
  560. "class_name_id": class_name_obj.id,
  561. "name": class_name_obj.name,
  562. "school":school_name,
  563. "category": class_name_obj.category,
  564. "introduction": class_name_obj.introduction,
  565. "organizer": class_name_obj.organizer,
  566. "group_id": class_name_obj.group_id,
  567. "cover_img": class_name_obj.cover_img,
  568. "group_sort":class_name_obj.group_sort,
  569. "state": state["result"]
  570. }
  571. except:
  572. class_data = {
  573. "msg" : "fail to get data"
  574. }
  575. if page_num and page_amount:
  576. if count < page_num*page_amount and count >= (page_num-1)*page_amount :
  577. classes_name.append(class_data)
  578. count += 1
  579. else : count += 1
  580. else :
  581. classes_name.append(class_data)
  582. count += 1
  583. return {"msg": "success", "code": 200,"total_num" : count,"classes": classes_name}
  584. except Exception as e:
  585. return {"msg": str(e), "code": 500}
  586. @classes.get("/get_session")
  587. async def get_session(
  588. event_id : Optional[int] = None
  589. ):
  590. try:
  591. if not event_id:
  592. return {"msg": "please input event_id", "code": 500}
  593. class_session_list = await Class_detail.filter(class_list_id=event_id).all().order_by("start_time")
  594. classe_sessions = []
  595. for class_session_obj in class_session_list:
  596. class_session_data = {
  597. "session_id": class_session_obj.id,
  598. "class_event_id": class_session_obj.class_list_id,
  599. "start_time": class_session_obj.start_time,
  600. "end_time": class_session_obj.end_time,
  601. "sessions": class_session_obj.sessions,
  602. "content": class_session_obj.content
  603. }
  604. classe_sessions.append(class_session_data)
  605. return {"msg": "success", "code": 200, "classe_sessions": classe_sessions}
  606. except Exception as e:
  607. return {"msg": str(e), "code": 500}
  608. @classes.get("/search_class_like")
  609. async def search_class_like(keyword: str):
  610. try:
  611. class_list = await Class_list.filter(Q(lecturer__icontains=keyword)).all()
  612. classes = []
  613. for class_obj in class_list:
  614. class_name = await Class_name.get(id=class_obj.name_id)
  615. school_obj = await Schools.get(id=class_name.school_id)
  616. class_data = {
  617. "class_id": class_obj.id,
  618. "name": class_name.name,
  619. "school":school_obj.name,
  620. "category": class_name.category,
  621. "introduction": class_name.introduction,
  622. "organizer": class_name.organizer,
  623. "cover_img": class_name.cover_img,
  624. "event": class_obj.event,
  625. "start_time": class_obj.start_time,
  626. "end_time": class_obj.end_time,
  627. "location": class_obj.location,
  628. "lecturer": class_obj.lecturer,
  629. "contact": class_obj.contact,
  630. "content": class_obj.content,
  631. "URL": class_obj.URL,
  632. "people": class_obj.people,
  633. "fee_method": class_obj.fee_method,
  634. "registration_way": class_obj.registration_way,
  635. "remark": class_obj.remark
  636. }
  637. classes.append(class_data)
  638. class_name_list = await Class_name.filter(
  639. Q(name__icontains=keyword)|
  640. Q(group_sort__icontains=keyword)|
  641. Q(category__icontains=keyword)|
  642. Q(organizer__icontains=keyword)).all()
  643. for class_name in class_name_list:
  644. class_list = await Class_list.filter(name_id=class_name.id).all()
  645. for class_obj in class_list:
  646. school_obj = await Schools.get(id=class_name.school_id)
  647. class_data = {
  648. "class_id": class_obj.id,
  649. "name": class_name.name,
  650. "school":school_obj.name,
  651. "category": class_name.category,
  652. "introduction": class_name.introduction,
  653. "organizer": class_name.organizer,
  654. "cover_img": class_name.cover_img,
  655. "event": class_obj.event,
  656. "start_time": class_obj.start_time,
  657. "end_time": class_obj.end_time,
  658. "location": class_obj.location,
  659. "lecturer": class_obj.lecturer,
  660. "contact": class_obj.contact,
  661. "content": class_obj.content,
  662. "URL": class_obj.URL,
  663. "people": class_obj.people,
  664. "fee_method": class_obj.fee_method,
  665. "registration_way": class_obj.registration_way,
  666. "remark": class_obj.remark
  667. }
  668. if class_data not in classes:
  669. classes.append(class_data)
  670. return {"msg": "success", "code": 200, "classes": classes}
  671. except Exception as e:
  672. return {"msg": str(e), "code": 500}
  673. @classes.post("/add_favorite_class")
  674. async def add_favorite_class(
  675. class_name_id: int,
  676. user_id = Depends(check_token),
  677. time_stemp: datetime = datetime.now()
  678. ):
  679. try:
  680. if not user_id:
  681. return {"msg": "no access", "code": 500}
  682. new_favorite_class = await Favorite_course.get_or_create(
  683. class_name_id=class_name_id,
  684. user_id=user_id,
  685. defaults={'time_stemp': time_stemp}
  686. )
  687. return {"msg": "success", "code": 200,"is exist": not new_favorite_class[1],"id":new_favorite_class[0].id}
  688. except Exception as e:
  689. return {"msg": str(e), "code": 500}
  690. @classes.get("/get_favorite_class")
  691. async def get_favorite_class(
  692. user_id = Depends(check_token),
  693. no_details : Optional[int] = None
  694. ):
  695. try:
  696. class_list = await Favorite_course.filter(user_id = user_id).all()
  697. favorite_courses = []
  698. for class_obj in class_list:
  699. if no_details:
  700. class_data = {
  701. "id": class_obj.id,
  702. "user_id": class_obj.user_id,
  703. "class_name_id" : class_obj.class_name_id,
  704. "time_stemp":class_obj.time_stemp
  705. }
  706. favorite_courses.append(class_data)
  707. else:
  708. class_data = {
  709. "id": class_obj.id,
  710. "user_id": class_obj.user_id,
  711. "class_name_id" : class_obj.class_name_id,
  712. "time_stemp":class_obj.time_stemp
  713. }
  714. result = await get_class_name(class_name_id = class_obj.class_name_id)
  715. class_detail = result["classes"][0]
  716. for class_tmp in class_detail.items():
  717. class_data[class_tmp[0]] = class_tmp[1]
  718. favorite_courses.append(class_data)
  719. return {"msg": "success", "code": 200, "favorite_courses": favorite_courses}
  720. except Exception as e:
  721. return {"msg": str(e), "code": 500}
  722. @classes.post("/delete_favorite_class")
  723. async def delete_favorite_class(
  724. class_name_id: int,
  725. user_id = Depends(check_token)
  726. ):
  727. try:
  728. await Favorite_course.filter(class_name_id=class_name_id,user_id=user_id).delete()
  729. return {"msg": "success", "code": 200}
  730. except Exception as e:
  731. return {"msg": str(e), "code": 500}
  732. @classes.post("/insert_online_course")
  733. async def insert_online_course(
  734. title : str = Form(default=''),
  735. category : str = Form(default=''),
  736. create_time :str = Form(default=datetime.now()),
  737. content : str = Form(default=''),
  738. vedio_url :str = Form(default='')
  739. ):
  740. try:
  741. new_online_course = await Online_course.create(
  742. title=title,
  743. create_time=create_time,
  744. category=category,
  745. content=content,
  746. vedio_url=vedio_url,
  747. group_id = 8
  748. )
  749. return {"msg": "success", "code": 200, "online_course_obj": new_online_course.id}
  750. except Exception as e:
  751. return {"msg": str(e), "code": 500}
  752. @classes.post("/update_online_course")
  753. async def update_online_course(
  754. id : int = Form(default=0),
  755. title : str = Form(default=''),
  756. category : str = Form(default=''),
  757. create_time :str = Form(default=datetime.now()),
  758. content : str = Form(default=''),
  759. vedio_url :str = Form(default='')
  760. ):
  761. try:
  762. online_course_obj = await Online_course.get(id=id)
  763. if title.strip() != '':
  764. online_course_obj.title = title
  765. if category.strip() != '':
  766. online_course_obj.category = category
  767. if create_time.strip() != '':
  768. online_course_obj.create_time = create_time
  769. if content.strip() != '':
  770. online_course_obj.content = content
  771. if vedio_url.strip() != '':
  772. online_course_obj.vedio_url = vedio_url
  773. await online_course_obj.save()
  774. return {"msg": "success", "code": 200}
  775. except Exception as e:
  776. return {"msg": str(e), "code": 500}
  777. @classes.get("/get_online_courese")
  778. async def get_online_courese(
  779. online_courese_id : Optional[int] = None
  780. ):
  781. try:
  782. if online_courese_id :
  783. online_courese_list = await Online_course.filter(id = online_courese_id).all()
  784. else :
  785. online_courese_list = await Online_course.all()
  786. online_coureses = []
  787. for online_coures_obj in online_courese_list:
  788. online_coures_data = {
  789. "id": online_coures_obj.id,
  790. "title": online_coures_obj.title,
  791. "category":online_coures_obj.category,
  792. "create_time": online_coures_obj.create_time,
  793. "click_time": online_coures_obj.click_time,
  794. "content": online_coures_obj.content,
  795. "vedio_url":online_coures_obj.vedio_url
  796. }
  797. online_coureses.append(online_coures_data)
  798. return {"msg": "success", "code": 200, "online_coures": online_coureses}
  799. except Exception as e:
  800. return {"msg": str(e), "code": 500}
  801. @classes.post("/delete_online_course")
  802. async def delete_online_course(
  803. online_course_id : int
  804. ):
  805. try:
  806. await Online_course.filter(id=online_course_id).delete()
  807. return {"msg": "success", "code": 200}
  808. except Exception as e:
  809. return {"msg": str(e), "code": 500}
  810. @classes.get("/get_group_classes_and_articles")
  811. async def get_group_classes_and_articles(
  812. group_id : int,
  813. page_num : Optional[int] = None,
  814. page_amount : Optional[int] = None
  815. ):
  816. try:
  817. class_name_list = await Class_name.filter(group_id = group_id).all()
  818. article_list = await Article_list.filter(group_id = group_id).all()
  819. article_objs = []
  820. article_count = 0
  821. for article_obj in article_list:
  822. article_tmp = {
  823. "article_id": article_obj.id,
  824. "title": article_obj.title,
  825. "school_id" :article_obj.school_id,
  826. "group_sort" :article_obj.group_sort,
  827. "group_id" :article_obj.group_id,
  828. "category": article_obj.category,
  829. "create_time" : article_obj.create_time,
  830. "click_time" : article_obj.click_time,
  831. "depiction" : article_obj.depiction,
  832. "content" : article_obj.content,
  833. "files" : article_obj.files,
  834. "vedio_url" : article_obj.vedio_url,
  835. "tags" : article_obj.tags,
  836. "cover_img": article_obj.cover_img
  837. }
  838. if page_num and page_amount:
  839. if article_count < page_num*page_amount and article_count >= (page_num-1)*page_amount :
  840. article_objs.append(article_tmp)
  841. article_count += 1
  842. elif article_count >= page_num*page_amount: article_count += 1
  843. else : article_count += 1
  844. else :
  845. article_objs.append(article_tmp)
  846. article_count += 1
  847. classes_name = []
  848. class_count = 0
  849. for class_name_obj in class_name_list:
  850. school_obj = await Schools.filter(id=class_name_obj.school_id).all()
  851. school_name = ""
  852. if school_obj == []:
  853. school_name = "未設定該據點"
  854. else :
  855. school_obj = await Schools.get(id=class_name_obj.school_id)
  856. school_name = school_obj.name
  857. if not group_id or class_name_obj.group_id==group_id:
  858. class_data = {
  859. "class_name_id": class_name_obj.id,
  860. "name": class_name_obj.name,
  861. "school":school_name,
  862. "category": class_name_obj.category,
  863. "introduction": class_name_obj.introduction,
  864. "organizer": class_name_obj.organizer,
  865. "group_id": class_name_obj.group_id,
  866. "cover_img": class_name_obj.cover_img,
  867. "group_sort":class_name_obj.group_sort
  868. }
  869. if page_num and page_amount:
  870. if class_count < page_num*page_amount and class_count >= (page_num-1)*page_amount :
  871. classes_name.append(class_data)
  872. class_count += 1
  873. elif class_count >= page_num*page_amount: class_count += 1
  874. else : class_count += 1
  875. else :
  876. classes_name.append(class_data)
  877. class_count += 1
  878. return {"msg": "success", "code": 200,"class_num" : class_count,"classes": classes_name,"article_num":article_count,"articles": article_objs}
  879. except Exception as e:
  880. return {"msg": str(e), "code": 500}
  881. @classes.post("/add_attend_record")
  882. async def add_attend_record(
  883. class_detail_id : int = Form(default=0),
  884. user_id : int = Form(default=0),
  885. is_attend : int = Form(default=0)
  886. ):
  887. try:
  888. if not class_detail_id or not user_id:
  889. return {"msg": "Please input right ","code":500}
  890. try:
  891. class_detail_obj = await Class_detail.filter(id = class_detail_id).all()
  892. if not class_detail_obj:
  893. return {"msg": "no this class_detail_id","code":500}
  894. except:
  895. return {"msg": "get class_detail_id error","code":500}
  896. new_record = await Attend_record.get_or_create(
  897. class_detail_id = class_detail_id,
  898. user_id = user_id,
  899. defaults = {
  900. "is_attend" : is_attend
  901. }
  902. )
  903. return {"msg": "success", "code": 200,"new_record_id":new_record[0].id}
  904. except Exception as e:
  905. return {"msg": str(e), "code": 500}
  906. @classes.post("/delete_attend_record")
  907. async def delete_attend_record(
  908. id : int = 0
  909. ):
  910. try :
  911. await Attend_record.filter(id=id).delete()
  912. return {"msg": "success", "code": 200}
  913. except Exception as e:
  914. return {"msg": str(e), "code": 500}
  915. @classes.get("/update_attend_record")
  916. async def update_attend_record(
  917. id : int = 0,
  918. class_detail_id : Optional[int] = None,
  919. user_id : Optional[int] = None,
  920. is_attend : Optional[int] = None
  921. ):
  922. if not id :
  923. return {"msg":"please input id"}
  924. try :
  925. tmp = await Attend_record.get(id=id)
  926. if class_detail_id!=None:
  927. tmp.class_detail_id = class_detail_id
  928. if user_id!=None:
  929. tmp.user_id = user_id
  930. if is_attend!=None:
  931. tmp.is_attend = is_attend
  932. await tmp.save()
  933. return {"msg": "success", "code": 200}
  934. except Exception as e:
  935. return {"msg": str(e), "code": 500}
  936. @classes.get("/get_attend_record")
  937. async def get_attend_record(
  938. class_event_id : Optional[int] = None,
  939. class_detail_id : Optional[int] = None,
  940. user_id : Optional[int] = None,
  941. is_attend : Optional[int] = None
  942. ):
  943. try:
  944. attend_record_list = Attend_record.all()
  945. if class_event_id:
  946. id_list = []
  947. class_detail_list = await Class_detail.filter(class_list_id = class_event_id)
  948. for tmp in class_detail_list :
  949. id_list.append(tmp.id)
  950. attend_record_list = Attend_record.filter(class_detail_id__in=id_list)
  951. if class_detail_id:
  952. attend_record_list = attend_record_list.filter(class_detail_id = class_detail_id)
  953. if user_id :
  954. attend_record_list = attend_record_list.filter(user_id = user_id)
  955. if is_attend :
  956. attend_record_list = attend_record_list.filter(is_attend = is_attend)
  957. attend_record_list = await attend_record_list.all()
  958. attend_records = []
  959. for obj in attend_record_list:
  960. data = {
  961. "id" :obj.id,
  962. "class_detail_id" :obj.class_detail_id,
  963. "user_id" :obj.user_id,
  964. "is_attend" :obj.is_attend
  965. }
  966. attend_records.append(data)
  967. return {"msg": "success", "code": 200,"attend_record_list":attend_records}
  968. except Exception as e:
  969. return {"msg": str(e), "code": 500}