registration.py 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496
  1. from fastapi_login import LoginManager
  2. from fastapi import APIRouter, Form, Depends, HTTPException, File, UploadFile
  3. from typing import List,Optional,Union
  4. from fastapi.responses import FileResponse
  5. from random import randint
  6. from fastapi.security import OAuth2PasswordRequestForm
  7. from app.models.models import Registration,User,User_information,Class_list,Class_name,Schools,Class_date,User_resume
  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,date
  15. from jose import jwt
  16. from emails.template import JinjaTemplate
  17. from tortoise.queryset import Q
  18. from fastapi.responses import HTMLResponse
  19. from app.api.users import manager
  20. registration = APIRouter()
  21. IMAGEDIR = "/var/www/ntcri/assets/resume_pic/"
  22. IMAGEDIR_short = "assets/resume_pic/"
  23. @registration.post("/upload_user_resume_imgs")
  24. async def create_upload_files(files:Optional[List[UploadFile]] = File(None)):
  25. files_url = []
  26. if files :
  27. for file in files:
  28. contents = await file.read()
  29. #save the file
  30. with open(f"{IMAGEDIR}{file.filename}", "wb") as f:
  31. f.write(contents)
  32. files_url.append(f"{IMAGEDIR_short}{file.filename}" )
  33. return files_url
  34. async def check_token(access_token: str):
  35. result = await User.filter(token=access_token).first()
  36. if not result:
  37. print("no access")
  38. return None
  39. user_id = result.id
  40. return user_id
  41. async def check_permissions(user_id):
  42. user = await User.get(id=user_id)
  43. if user.is_superuser:
  44. return True
  45. else:
  46. return False
  47. # @registration.get("/protected")
  48. # def protected_route(user_id=Depends(check_token)):
  49. # if not user_id:
  50. # return {"message": "no access"}
  51. # return {'user': user_id}
  52. @registration.get("/get_registration")
  53. async def get_registration(
  54. user_id = Depends(check_token),
  55. get_all : Optional[int] = None,
  56. event_id : Optional[int] = None,
  57. registration_id : Optional[int] = None,
  58. is_check : Optional[int] = None
  59. ):
  60. try :
  61. if not user_id :
  62. return {"msg": "please log in", "code": 200}
  63. if get_all:
  64. inform_list = Registration.all()
  65. else:
  66. inform_list = Registration.filter(user_id=user_id).all()
  67. if event_id:
  68. inform_list = inform_list.filter(event_id=event_id)
  69. if is_check != None:
  70. inform_list = inform_list.filter(reg_confirm=is_check)
  71. if registration_id:
  72. reg_list_tmp = await inform_list.filter(id=registration_id,is_del=0).all().order_by("-event_id","create_time")
  73. else:
  74. reg_list_tmp = await inform_list.filter(is_del=0).all().order_by("-event_id","create_time")
  75. reg_list = []
  76. for infor in reg_list_tmp:
  77. try :
  78. reg_data = {
  79. "Registration_id" : infor.id,
  80. "event_id" : infor.event_id,
  81. "user_id" : infor.user_id,
  82. "reg_confirm" : infor.reg_confirm,
  83. "create_time" : infor.create_time
  84. }
  85. except:
  86. reg_data = {
  87. "msg" : "fail to get data"
  88. }
  89. try :
  90. class_obj = await Class_list.get(id = infor.event_id)
  91. class_name_obj = await Class_name.get(id = class_obj.name_id)
  92. school_obj = await Schools.get(id = class_name_obj.school_id)
  93. reg_data["school_name"] = school_obj.name
  94. reg_data["class_name"] = class_name_obj.name
  95. reg_data["class_event"] = class_obj.event
  96. reg_data["start_time"] = str(class_obj.start_time)
  97. reg_data["end_time"] =str(class_obj.end_time)
  98. except Exception as e:
  99. reg_data["class_data"] = str(e)
  100. try:
  101. user = await User.get(id=infor.user_id)
  102. inform = await User_information.get(user_id=infor.user_id)
  103. reg_data["real_name"] = inform.name
  104. reg_data["phone"] = inform.phone
  105. reg_data["email"] = user.email
  106. except Exception as e:
  107. reg_data["user_data"] = str(e)
  108. reg_list.append(reg_data)
  109. return {"msg": "success", "code": 200,"registrations":reg_list}
  110. except Exception as e:
  111. return {"msg": str(e), "code": 500}
  112. @registration.post("/input_information")
  113. async def input_information(
  114. name : str = Form(default=''),
  115. user_name : str = Form(default=''),
  116. birthday : date = Form(default=datetime.now().date()),
  117. gender : str = Form(default=''),
  118. phone : str = Form(default=''),
  119. address : str = Form(default=''),
  120. user_id = Depends(check_token)
  121. ):
  122. try :
  123. if not user_id :
  124. return {"msg": "no access", "code": 200}
  125. inform = await User_information.get_or_create(
  126. user_id=user_id,
  127. defaults={
  128. 'name': name,
  129. 'birthday' :birthday,
  130. 'gender': gender,
  131. 'phone': phone,
  132. 'address': address
  133. }
  134. )
  135. if user_name != '':
  136. user = await User.get(id = user_id)
  137. user.username = user_name
  138. await user.save()
  139. return {"msg": "success", "code": 200, "user_inform_id": inform[0].id,"is_exist":not inform[1]}
  140. except Exception as e:
  141. return {"msg": str(e), "code": 500}
  142. @registration.post("/update_information")
  143. async def update_information(
  144. user_name : str = Form(default=''),
  145. name : str = Form(default=''),
  146. birthday : date = Form(default=datetime.now().date()),
  147. gender : str = Form(default=''),
  148. phone : str = Form(default=''),
  149. address : str = Form(default=''),
  150. user_id = Depends(check_token)
  151. ):
  152. try :
  153. if not user_id :
  154. return {"msg": "no access", "code": 200}
  155. infor = await User_information.get(user_id = user_id)
  156. user = await User.get(id = user_id)
  157. if name != '':
  158. infor.name = name
  159. if birthday != datetime.now().date():
  160. infor.birthday = birthday
  161. if gender != '':
  162. infor.gender = gender
  163. if phone != '':
  164. infor.phone = phone
  165. if address != '':
  166. infor.address = address
  167. if user_name != '':
  168. user.username = user_name
  169. await infor.save()
  170. await user.save()
  171. return {"msg": "success", "code": 200, "user_inform_id": infor.id}
  172. except Exception as e:
  173. return {"msg": str(e), "code": 500}
  174. @registration.get("/get_user_information")
  175. async def get_user_information(
  176. user_id = Depends(check_token),
  177. get_all : int = 0,
  178. get_detail_information : int = 1
  179. ):
  180. try:
  181. if not user_id :
  182. return {"msg": "no access", "code": 200}
  183. try:
  184. if get_all:
  185. user_list = await User.all()
  186. else:
  187. user_list = await User.filter(id = user_id)
  188. except:
  189. return {"msg": "user table run fail", "code": 500}
  190. user_inform_list = []
  191. for user_obj in user_list:
  192. user_inform = {
  193. "user_id" : user_obj.id,
  194. "user_name" : user_obj.username,
  195. "email" : user_obj.email
  196. }
  197. if get_detail_information:
  198. try :
  199. inform = await User_information.get(user_id=user_obj.id)
  200. user_inform["name"] = inform.name
  201. user_inform["birthday"] = inform.birthday
  202. user_inform["gender"] = inform.gender
  203. user_inform["phone"] = inform.phone
  204. user_inform["address"] = inform.address
  205. user_inform["msg"] = "user information exist"
  206. user_inform["exist"] = True
  207. except:
  208. user_inform["msg"] = "no user information"
  209. user_inform["exist"] = False
  210. user_inform_list.append(user_inform)
  211. return {"msg":"success","code":200,"user_inform": user_inform_list}
  212. except Exception as e:
  213. return {"msg": str(e), "code": 500}
  214. @registration.get("/change_class_reg_number")
  215. async def change_class_reg_number(
  216. event_id: int = 0,
  217. reduce_number : int = 1
  218. ):
  219. try:
  220. if event_id:
  221. try:
  222. await Class_list.get(id = event_id)
  223. except Exception as e:
  224. return {"msg": "no this event", "code": 200}
  225. try:
  226. class_date = await Class_date.get(class_list_id = event_id)
  227. except Exception as e:
  228. return {"msg": "no this class' number limit", "code": 200}
  229. if class_date.amount_left ==0 and reduce_number>0:
  230. return {"msg": "class is full", "code": 200,"amount_left":-1}
  231. elif class_date.amount_left == class_date.number_limit and reduce_number<0:
  232. return {"msg": "class is empty", "code": 200,"amount_left":class_date.amount_left }
  233. else:
  234. class_date.amount_left = class_date.amount_left-reduce_number
  235. await class_date.save()
  236. return {"msg": "success", "code": 200,"amount_left":class_date.amount_left}
  237. except Exception as e:
  238. return {"msg": str(e), "code": 500}
  239. @registration.post("/input_registration")
  240. async def input_registration(
  241. event_id : int = Form(default=0),
  242. user_id = Depends(check_token)
  243. ):
  244. try :
  245. if not user_id :
  246. return {"msg": "please log in", "code": 500}
  247. try:
  248. await Class_list.get(id = event_id)
  249. except Exception as e:
  250. return {"msg": "no this event", "code": 500}
  251. # if check_if_id_exeit(User_information,user_inform_id):
  252. # return {"msg": "no user information", "code": 200}
  253. # if check_if_id_exeit(Class_list,event_id):
  254. # return {"msg": "no class list", "code": 200}
  255. try:
  256. await User_information.get(user_id=user_id)
  257. except:
  258. return {"msg": "no user information", "code": 500}
  259. new_registration = await Registration.get_or_create(
  260. event_id = event_id,
  261. user_id = user_id,
  262. defaults = {
  263. "reg_confirm" : 0,
  264. "is_del" : 0 ,
  265. "create_time" : datetime.now()
  266. }
  267. )
  268. if new_registration[1]:
  269. amount_left_obj = await change_class_reg_number(event_id=event_id)
  270. msg = amount_left_obj["msg"]
  271. else:
  272. msg = "already registrate"
  273. return {"msg": msg, "code": 200,"new_registration_id":new_registration[0].id,"is_already_exist":not new_registration[1]}
  274. except Exception as e:
  275. return {"msg": str(e), "code": 500}
  276. @registration.post("/confirm_reg")
  277. async def confirm_reg(
  278. #user_id = Depends(check_token),
  279. registration_id : int
  280. ):
  281. try:
  282. registration_obj = await Registration.get(id=registration_id)
  283. registration_obj.reg_confirm = 1
  284. await registration_obj.save()
  285. return {"msg": "success", "code": 200,"registration_id":registration_obj.id}
  286. except Exception as e:
  287. return {"msg": str(e), "code": 500}
  288. @registration.post("/recover_registration")
  289. async def delete_registration(
  290. user_id = Depends(check_token),
  291. event_id : int = 0
  292. ):
  293. try:
  294. if not user_id :
  295. return {"msg": "please log in", "code": 200}
  296. registration_obj = await Registration.get(event_id=event_id,user_id=user_id)
  297. amount_left_obj = await change_class_reg_number(event_id=registration_obj.event_id)
  298. msg = amount_left_obj["msg"]
  299. if msg == "class is full":
  300. return {"msg": msg+" cannot recover registration", "code": 200}
  301. registration_obj.is_del = 0
  302. await registration_obj.save()
  303. return {"msg": msg, "code": 200}
  304. except Exception as e:
  305. return {"msg": str(e), "code": 500}
  306. @registration.post("/delete_registration")
  307. async def delete_registration(
  308. user_id = Depends(check_token),
  309. super_ad_input_user_id : int = 0,
  310. event_id : int = 0
  311. ):
  312. try:
  313. if not user_id :
  314. return {"msg": "please log in", "code": 200}
  315. if super_ad_input_user_id:
  316. registration_obj = await Registration.get(event_id=event_id,user_id=super_ad_input_user_id)
  317. else:
  318. registration_obj = await Registration.get(event_id=event_id,user_id=user_id)
  319. registration_obj.is_del = 1
  320. amount_left_obj = await change_class_reg_number(event_id=registration_obj.event_id,reduce_number=-1)
  321. msg = amount_left_obj["msg"]
  322. await registration_obj.save()
  323. return {"msg": msg , "code": 200}
  324. except Exception as e:
  325. return {"msg": str(e), "code": 500}
  326. @registration.post("/input_user_resume")
  327. async def input_user_resume(
  328. user_id = Depends(check_token),
  329. teacher_name : str = Form(default=''),
  330. work_type : str = Form(default=''),
  331. experience : str = Form(default=''),
  332. expertise : str = Form(default=''),
  333. license : str = Form(default=''),
  334. media : str = Form(default=''),
  335. imgs : str = Form(default='[]'),
  336. introduction: str = Form(default='')
  337. ):
  338. try:
  339. if not user_id :
  340. return {"msg": "please log in", "code": 200}
  341. msg = ''
  342. user_resume, created = await User_resume.get_or_create(
  343. user_id = user_id,
  344. defaults = {
  345. "teacher_name": teacher_name,
  346. "work_type": work_type,
  347. "experience": experience,
  348. "expertise": expertise,
  349. "license": license,
  350. "media": media,
  351. "imgs": imgs,
  352. "introduction": introduction
  353. }
  354. )
  355. if not created:
  356. if teacher_name.strip() != '' :
  357. user_resume.teacher_name = teacher_name
  358. if work_type.strip() != '' :
  359. user_resume.work_type= work_type
  360. if experience.strip() != '' :
  361. user_resume.experience= experience
  362. if license.strip() != '' :
  363. user_resume.license= license
  364. if media.strip() != '' :
  365. user_resume.media= media
  366. if imgs | imgs.strip() != '[]' :
  367. user_resume.imgs= imgs
  368. if introduction.strip() != '' :
  369. user_resume.introduction= introduction
  370. await user_resume.save()
  371. msg = "Update success"
  372. else :
  373. msg = "input success"
  374. return {"msg": msg , "code": 200}
  375. except Exception as e:
  376. return {"msg": str(e), "code": 500}
  377. @registration.get("/get_user_resume")
  378. async def get_user_resume(
  379. user_id = Depends(check_token)
  380. ):
  381. try:
  382. if not user_id :
  383. return {"msg": "please log in", "code": 200}
  384. user_resume = await User_resume.get(user_id = user_id)
  385. data = user_resume.show_data()
  386. return {"msg": "success" , "code": 200,"user_resume":data}
  387. except Exception as e:
  388. return {"msg": str(e), "code": 500}