classes.py 44 KB

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