classes.py 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519
  1. from fastapi import APIRouter, Form, Depends, HTTPException, File, UploadFile
  2. from fastapi.responses import FileResponse
  3. import os
  4. from random import randint
  5. import uuid
  6. from fastapi.security import OAuth2PasswordRequestForm
  7. from app.models.models import User
  8. from app.models.models import Class_list,Schools,Class_detail,Class_name,Registration
  9. from app.api import deps
  10. from sqlalchemy.orm import Session
  11. from typing import Any, Dict
  12. import secrets
  13. from fastapi_login.exceptions import InvalidCredentialsException
  14. from fastapi_login import LoginManager
  15. from datetime import timedelta,datetime
  16. from app.config import settings
  17. from pathlib import Path
  18. from jose import jwt
  19. import emails
  20. from emails.template import JinjaTemplate
  21. import logging
  22. from tortoise.queryset import Q
  23. classes = APIRouter()
  24. IMAGEDIR = "/var/www/html/ntcri/assets/"
  25. IMAGEDIR_short = "assets/"
  26. @classes.post("/insert_school")
  27. async def insert_school(
  28. id: int = Form(default=0),
  29. name: str = Form(default=''),
  30. longitude: str = Form(default=''),
  31. latitude: str = Form(default='')
  32. ):
  33. try:
  34. new_school = await Schools.create(
  35. id=id,
  36. name=name,
  37. longitude=longitude,
  38. latitude=latitude
  39. )
  40. return {"msg": "success", "code": 200, "class_id": new_school.id}
  41. except Exception as e:
  42. return {"msg": str(e), "code": 500}
  43. @classes.post("/insert_class")
  44. async def insert_class(
  45. id: int = Form(default=0),
  46. name: str = Form(default=''),
  47. school_id: int = Form(default=1),
  48. category: str = Form(default=''),
  49. introduction: str = Form(default=''),
  50. organizer: str = Form(default=''),
  51. cover_img_file:UploadFile = File(default=''),
  52. event: str = Form(default=''),
  53. start_time: datetime = Form(default=datetime.now()),
  54. end_time: datetime = Form(default=datetime.now()),
  55. contact: str = Form(default=''),
  56. lecturer: str = Form(default=''),
  57. location: str = Form(default=''),
  58. content: str = Form(default=''),
  59. URL: str = Form(default=''),
  60. people : str = Form(default=''),
  61. fee_method: str = Form(default=''),
  62. registration_way: str = Form(default=''),
  63. remark : str = Form(default='')
  64. ):
  65. try:
  66. cover_img = ''
  67. if cover_img_file != '':
  68. contents = await cover_img_file.read()
  69. #save the file
  70. with open(f"{IMAGEDIR}{cover_img_file.filename}", "wb") as f:
  71. f.write(contents)
  72. cover_img = f"{IMAGEDIR_short}{cover_img_file.filename}"
  73. else:
  74. cover_img = ''
  75. # class_obj = ''
  76. # class_obj = await Class_name.get(name=name)
  77. # if class_obj != '':
  78. # return {"msg": "此課程名稱已被使用", "code": 500}
  79. new_class_name = await Class_name.get_or_create(
  80. name=name,
  81. defaults={
  82. 'school_id': school_id,
  83. 'category': category,
  84. 'introduction': introduction,
  85. 'organizer': organizer,
  86. 'cover_img': cover_img
  87. }
  88. )
  89. class_obj = await Class_name.get(name=name)
  90. new_class = await Class_list.create(
  91. id=id,
  92. name_id=class_obj.id,
  93. event =event ,
  94. start_time=start_time,
  95. end_time=end_time,
  96. contact=contact,
  97. lecturer=lecturer,
  98. location=location,
  99. content=content,
  100. URL=URL,
  101. people=people,
  102. fee_method=fee_method,
  103. registration_way=registration_way,
  104. remark=remark
  105. )
  106. return {"msg": "success", "code": 200, "class_id": new_class.id}
  107. except Exception as e:
  108. return {"msg": str(e), "code": 500}
  109. @classes.post("/insert_event")
  110. async def insert_event(
  111. id: int = Form(default=0),
  112. name_id: int = Form(default=''),
  113. event: str = Form(default=''),
  114. start_time: datetime = Form(default=datetime.now()),
  115. end_time: datetime = Form(default=datetime.now()),
  116. contact: str = Form(default=''),
  117. lecturer: str = Form(default=''),
  118. location: str = Form(default=''),
  119. content: str = Form(default=''),
  120. URL: str = Form(default=''),
  121. people : str = Form(default=''),
  122. fee_method: str = Form(default=''),
  123. registration_way: str = Form(default=''),
  124. remark : str = Form(default='')
  125. ):
  126. try:
  127. new_class = await Class_list.create(
  128. id=id,
  129. name_id=name_id,
  130. event =event,
  131. start_time=start_time,
  132. end_time=end_time,
  133. contact=contact,
  134. lecturer=lecturer,
  135. location=location,
  136. content=content,
  137. URL=URL,
  138. people=people,
  139. fee_method=fee_method,
  140. registration_way=registration_way,
  141. remark=remark
  142. )
  143. return {"msg": "success", "code": 200, "class_id": new_class.id}
  144. except Exception as e:
  145. return {"msg": str(e), "code": 500}
  146. @classes.post("/update_class_name")
  147. async def update_class_name(
  148. id: int = Form(default=0),
  149. name: str = Form(default=''),
  150. school_id: int = Form(default=''),
  151. category: str = Form(default=''),
  152. introduction: str = Form(default=''),
  153. organizer: str = Form(default=''),
  154. cover_img_file:UploadFile = File(default='')
  155. ):
  156. try:
  157. class_name = await Class_name.get(id=id)
  158. if name.strip() != '':
  159. class_name.name = name
  160. if school_id != '':
  161. class_name.school_id = school_id
  162. if category.strip() != '':
  163. class_name.category = category
  164. if introduction.strip() != '':
  165. class_name.introduction = introduction
  166. if organizer.strip() != '':
  167. class_name.organizer = organizer
  168. if cover_img_file != '':
  169. contents = await cover_img_file.read()
  170. with open(f"{IMAGEDIR}{cover_img_file.filename}", "wb") as f:
  171. f.write(contents)
  172. class_name.cover_img = f"{IMAGEDIR_short}{cover_img_file.filename}"
  173. await class_name.save()
  174. return {"msg": "success", "code": 200}
  175. except Exception as e:
  176. return {"msg": str(e), "code": 500}
  177. @classes.post("/update_class")
  178. async def update_class(
  179. id: int = Form(default=0),
  180. name: str = Form(default=''),
  181. school_id: int = Form(default=''),
  182. category: str = Form(default=''),
  183. introduction: str = Form(default=''),
  184. organizer: str = Form(default=''),
  185. cover_img_file:UploadFile = File(default=''),
  186. event: str = Form(default=''),
  187. start_time: datetime = Form(default=datetime.now()),
  188. end_time: datetime = Form(default=datetime.now()),
  189. contact: str = Form(default=''),
  190. lecturer: str = Form(default=''),
  191. location: str = Form(default=''),
  192. content: str = Form(default=''),
  193. URL: str = Form(default=''),
  194. people : str = Form(default=''),
  195. fee_method: str = Form(default=''),
  196. registration_way: str = Form(default=''),
  197. remark : str = Form(default='')
  198. ):
  199. try:
  200. class_obj = await Class_list.get(id=id)
  201. class_name = await Class_name.get(id=class_obj.name_id)
  202. if name != '':
  203. class_name.name = name
  204. if school_id != '':
  205. class_name.school_id = school_id
  206. if category != '':
  207. class_name.category = category
  208. if introduction != '':
  209. class_name.introduction = introduction
  210. if organizer != '':
  211. class_name.organizer = organizer
  212. if cover_img_file != '':
  213. contents = await cover_img_file.read()
  214. with open(f"{IMAGEDIR}{cover_img_file.filename}", "wb") as f:
  215. f.write(contents)
  216. class_name.cover_img = f"{IMAGEDIR_short}{cover_img_file.filename}"
  217. if event.strip() != '':
  218. class_obj.event = event
  219. if start_time:
  220. class_obj.start_time = start_time
  221. if end_time:
  222. class_obj.end_time = end_time
  223. if location.strip() != '':
  224. class_obj.location = location
  225. if lecturer.strip() != '':
  226. class_obj.lecturer = lecturer
  227. if contact.strip() != '':
  228. class_obj.contact = contact
  229. if content.strip() != '':
  230. class_obj.content = content
  231. if URL.strip() != '':
  232. class_obj.URL = URL
  233. if people.strip() != '':
  234. class_obj.people = people
  235. if fee_method.strip() != '':
  236. class_obj.fee_method = fee_method
  237. if registration_way.strip() != '':
  238. class_obj.registration_way = registration_way
  239. if remark.strip() != '':
  240. class_obj.remark = remark
  241. await class_obj.save()
  242. await class_name.save()
  243. return {"msg": "success", "code": 200}
  244. except Exception as e:
  245. return {"msg": str(e), "code": 500}
  246. @classes.post("/delete_class")
  247. async def delete(id: int):
  248. if id:
  249. await Class_list.filter(id=id).delete()
  250. return {"msg": "success", "code": 200}
  251. @classes.post("/delete_class_name")
  252. async def delete(id: int):
  253. if id:
  254. await Class_list.filter(name_id=id).delete()
  255. await Class_name.filter(id=id).delete()
  256. return {"msg": "success", "code": 200}
  257. @classes.get("/search_class")
  258. async def search_class(id: int):
  259. try:
  260. class_obj = await Class_list.get(id=id)
  261. class_name = await Class_name.get(id=class_obj.name_id)
  262. school_obj = await Schools.get(id=class_name.school_id)
  263. return {
  264. "msg": "success",
  265. "code": 200,
  266. "class_id": class_obj.id,
  267. "name": class_name.name,
  268. "school":school_obj.name,
  269. "category": class_name.category,
  270. "introduction": class_name.introduction,
  271. "organizer": class_name.organizer,
  272. "cover_img": class_name.cover_img,
  273. "event": class_obj.event,
  274. "start_time": class_obj.start_time,
  275. "end_time": class_obj.end_time,
  276. "location": class_obj.location,
  277. "lecturer": class_obj.lecturer,
  278. "contact": class_obj.contact,
  279. "content": class_obj.content,
  280. "URL": class_obj.URL,
  281. "people": class_obj.people,
  282. "fee_method": class_obj.fee_method,
  283. "registration_way": class_obj.registration_way,
  284. "remark": class_obj.remark
  285. }
  286. except Exception as e:
  287. return {"msg": str(e), "code": 500}
  288. @classes.get("/get_school")
  289. async def get_school():
  290. try:
  291. school_list = await Schools.all()
  292. schools = []
  293. for school_obj in school_list:
  294. school_data = {
  295. "school_id": school_obj.id,
  296. "name": school_obj.name,
  297. "longitude": school_obj.longitude,
  298. "latitude": school_obj.latitude,
  299. }
  300. schools.append(school_data)
  301. return {"msg": "success", "code": 200, "schools": schools}
  302. except Exception as e:
  303. return {"msg": str(e), "code": 500}
  304. @classes.get("/get_class_name")
  305. async def get_class_name():
  306. try:
  307. class_name_list = await Class_name.all()
  308. classes_name = []
  309. for class_name_obj in class_name_list:
  310. school_obj = await Schools.get(id=class_name_obj.school_id)
  311. class_data = {
  312. "msg": "success",
  313. "code": 200,
  314. "id": class_name_obj.id,
  315. "name": class_name_obj.name,
  316. "school":school_obj.name,
  317. "category": class_name_obj.category,
  318. "introduction": class_name_obj.introduction,
  319. "organizer": class_name_obj.organizer,
  320. "cover_img": class_name_obj.cover_img,
  321. }
  322. classes_name.append(class_data)
  323. return {"msg": "success", "code": 200, "classes": classes_name}
  324. except Exception as e:
  325. return {"msg": str(e), "code": 500}
  326. @classes.get("/get_class")
  327. async def get_class():
  328. try:
  329. class_list = await Class_list.all()
  330. classes = []
  331. for class_obj in class_list:
  332. class_name = await Class_name.get(id=class_obj.name_id)
  333. print(class_obj.name_id)
  334. print(class_name.school_id)
  335. school_obj = await Schools.get(id=class_name.school_id)
  336. class_data = {
  337. "msg": "success",
  338. "code": 200,
  339. "class_id": class_obj.id,
  340. "name": class_name.name,
  341. "school":school_obj.name,
  342. "category": class_name.category,
  343. "introduction": class_name.introduction,
  344. "organizer": class_name.organizer,
  345. "cover_img": class_name.cover_img,
  346. "event": class_obj.event,
  347. "start_time": class_obj.start_time,
  348. "end_time": class_obj.end_time,
  349. "location": class_obj.location,
  350. "lecturer": class_obj.lecturer,
  351. "contact": class_obj.contact,
  352. "content": class_obj.content,
  353. "URL": class_obj.URL,
  354. "people": class_obj.people,
  355. "fee_method": class_obj.fee_method,
  356. "registration_way": class_obj.registration_way,
  357. "remark": class_obj.remark
  358. }
  359. classes.append(class_data)
  360. return {"msg": "success", "code": 200, "classes": classes}
  361. except Exception as e:
  362. return {"msg": str(e), "code": 500}
  363. @classes.get("/search_class_like")
  364. async def search_class_like(keyword: str):
  365. try:
  366. class_list = await Class_list.filter(Q(lecturer__icontains=keyword)).all()
  367. classes = []
  368. for class_obj in class_list:
  369. class_name = await Class_name.get(id=class_obj.name_id)
  370. school_obj = await Schools.get(id=class_name.school_id)
  371. class_data = {
  372. "msg": "success",
  373. "code": 200,
  374. "class_id": class_obj.id,
  375. "name": class_name.name,
  376. "school":school_obj.name,
  377. "category": class_name.category,
  378. "introduction": class_name.introduction,
  379. "organizer": class_name.organizer,
  380. "cover_img": class_name.cover_img,
  381. "event": class_obj.event,
  382. "start_time": class_obj.start_time,
  383. "end_time": class_obj.end_time,
  384. "location": class_obj.location,
  385. "lecturer": class_obj.lecturer,
  386. "contact": class_obj.contact,
  387. "content": class_obj.content,
  388. "URL": class_obj.URL,
  389. "people": class_obj.people,
  390. "fee_method": class_obj.fee_method,
  391. "registration_way": class_obj.registration_way,
  392. "remark": class_obj.remark
  393. }
  394. classes.append(class_data)
  395. class_name_list = await Class_name.filter(Q(name__icontains=keyword)).all()
  396. for class_name in class_name_list:
  397. class_list = await Class_list.filter(name_id=class_name.id).all()
  398. for class_obj in class_list:
  399. school_obj = await Schools.get(id=class_name.school_id)
  400. class_data = {
  401. "msg": "success",
  402. "code": 200,
  403. "class_id": class_obj.id,
  404. "name": class_name.name,
  405. "school":school_obj.name,
  406. "category": class_name.category,
  407. "introduction": class_name.introduction,
  408. "organizer": class_name.organizer,
  409. "cover_img": class_name.cover_img,
  410. "event": class_obj.event,
  411. "start_time": class_obj.start_time,
  412. "end_time": class_obj.end_time,
  413. "location": class_obj.location,
  414. "lecturer": class_obj.lecturer,
  415. "contact": class_obj.contact,
  416. "content": class_obj.content,
  417. "URL": class_obj.URL,
  418. "people": class_obj.people,
  419. "fee_method": class_obj.fee_method,
  420. "registration_way": class_obj.registration_way,
  421. "remark": class_obj.remark
  422. }
  423. classes.append(class_data)
  424. return {"msg": "success", "code": 200, "classes": classes}
  425. except Exception as e:
  426. return {"msg": str(e), "code": 500}
  427. @classes.post("/upload/")
  428. async def create_upload_file(file: UploadFile = File(...)):
  429. #file.filename = f"{uuid.uuid4()}.jpeg"
  430. contents = await file.read()
  431. #save the file
  432. with open(f"{IMAGEDIR}{file.filename}", "wb") as f:
  433. f.write(contents)
  434. return {"filename": file.filename}
  435. #"/var/www/ntcri/app/api/images/test.jpeg"
  436. async def read_image_file():
  437. # get random file from the image directory
  438. files = os.listdir(IMAGEDIR)
  439. random_index = randint(0, len(files) - 1)
  440. path = f"{IMAGEDIR}{files[random_index]}"
  441. return FileResponse(path)