classes.py 79 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227
  1. from email.policy import default
  2. from fastapi import APIRouter, Form, Depends, HTTPException, File, UploadFile,Request
  3. from typing import List,Optional
  4. from fastapi.responses import FileResponse
  5. from random import randint
  6. from fastapi.security import OAuth2PasswordRequestForm
  7. from app.models.models import User,User_information,Favorite_course,Article_list,Class_date,Attend_record,One_day_class,Outter_class_list
  8. from app.models.models import Class_list,Schools,Class_detail,Class_name,Registration,Group_name,Online_course,User_resume,User_point,Point_exchange_record
  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. from emails.template import JinjaTemplate
  20. from tortoise.queryset import Q
  21. from fastapi.responses import HTMLResponse
  22. import requests
  23. import json
  24. from itertools import chain
  25. from tortoise import fields
  26. import random
  27. from app.log import my_log
  28. import rpyc
  29. import emails
  30. from emails.template import JinjaTemplate
  31. from email.mime.text import MIMEText
  32. classes = APIRouter()
  33. # logging.basicConfig(
  34. # filename='app-basic.log',
  35. # level=logging.INFO,
  36. # format='%(asctime)s - %(name)s - %(levelname)s - %(message)s',
  37. # datefmt='%Y-%m-%d %H:%M:%S'
  38. # )
  39. # logger = logging.getLogger(__name__)
  40. def send_email(
  41. email_to: str,
  42. token: str,
  43. subject_template: str = "",
  44. html_template: str = "",
  45. environment: Dict[str, Any] = {},
  46. ):
  47. # message = emails.Message(
  48. # subject=JinjaTemplate(subject_template),
  49. # html=JinjaTemplate(html_template),
  50. # mail_from=(settings.EMAILS_FROM_NAME, settings.EMAILS_FROM_EMAIL),
  51. # )
  52. subject=subject_template
  53. html=html_template
  54. mailobj={}
  55. mailobj['toaddr']=email_to
  56. mailobj['title']=subject
  57. mailobj['totext']=html
  58. conn = rpyc.connect("192.168.192.80", 12345)
  59. conn.root.mailto(mailobj)
  60. return {"message":f"send email"}
  61. IMAGEDIR = "/var/www/ntcri/assets/"
  62. IMAGEDIR_short = "assets/"
  63. encode_set = {
  64. "樹藝" : "ARB",
  65. "漆藝" : "LAC",
  66. "藍染" : "AIZ",
  67. "蠟雕" : "WAX",
  68. "竹工藝籃" :"BAM",
  69. "金工/飾品" :"MWT",
  70. "蠟燭/香氛/調香" : "CAN" ,
  71. "編織/羊毛氈/縫紉" : "KNI" ,
  72. "植栽/花藝" : "PLA" ,
  73. "陶藝/玻璃" : "CER" ,
  74. "皮件/皮革" : "LEA" ,
  75. "插畫/繪畫/寫字" : "Ill",
  76. "木工/竹藝" :"WOO",
  77. "安心活動" : "HER"
  78. }
  79. async def create_upload_files(files:Optional[List[UploadFile]] = File(None)):
  80. files_url = {}
  81. if files :
  82. file_num = 1
  83. print(file_num)
  84. for file in files:
  85. contents = await file.read()
  86. words = file.filename.split('.')
  87. if words[len(words)-1] != ("png" or "jpg" or "pdf" or "jpeg"):
  88. return {"msg":"wrong filetype"}
  89. #save the file
  90. with open(f"{IMAGEDIR}{file.filename}", "wb") as f:
  91. f.write(contents)
  92. file_name = "file" + str(file_num)
  93. print(file_name)
  94. files_url[file_name]=f"{IMAGEDIR_short}{file.filename}"
  95. file_num=file_num+1
  96. return files_url
  97. async def check_token(access_token: str):
  98. result = await User.get_or_none(token=access_token)
  99. if not result:
  100. print("no access")
  101. return None
  102. user_id = result.id
  103. return user_id
  104. async def update_location_time(location_id: int):
  105. if location_id:
  106. school = await Schools.get(id=location_id)
  107. school.update_time = datetime.now()
  108. await school.save()
  109. return {"msg": "success", "code": 200}
  110. @classes.post("/change_class_img")
  111. async def change_class_img(
  112. category: str ,
  113. files:Optional[List[UploadFile]] = File(None)
  114. ):
  115. try:
  116. files_url = {}
  117. file_num = 0
  118. for file in files:
  119. contents = await file.read()
  120. #save the file
  121. with open(f"{IMAGEDIR}{file.filename}", "wb") as f:
  122. f.write(contents)
  123. file_name = "file" + str(file_num)
  124. files_url[file_name]=f"{IMAGEDIR_short}{file.filename}"
  125. file_num=file_num+1
  126. class_name_list = await Class_name.filter(Q(category__icontains=category)& Q(is_inner = 0)).all()
  127. for class_name_obj in class_name_list:
  128. x = random.randrange(4)
  129. file_name = "file" + str(x)
  130. class_name_obj.cover_img = files_url[file_name]
  131. await class_name_obj.save()
  132. return {"msg": "success", "code": 200}
  133. except Exception as e:
  134. return {"msg": str(e), "code": 500}
  135. class resume():
  136. imgs = UploadFile
  137. teacher_name : str
  138. work_type : str
  139. experience : str
  140. expertise : str
  141. license : str
  142. media : str
  143. introduction: str
  144. @classes.post("/insert_school")
  145. async def insert_school(
  146. request: Request,
  147. location_name: str = Form(default=''),
  148. Lng: str = Form(default=''),
  149. Lat: str = Form(default=''),
  150. address : str = Form(default=''),
  151. school_introduction : str = Form(default=''),
  152. email : str = Form(default=''),
  153. phone : str = Form(default=''),
  154. access_token:str = Form(default=None),
  155. teachers_list :str = Form(default=None),
  156. is_pass_proposal : int = Form(default=0),
  157. principal_user_email : str = Form(default=None),
  158. ):
  159. try:
  160. user_id = None
  161. if access_token:
  162. user_id = await check_token(access_token)
  163. if user_id == None:
  164. return {"msg": "沒有權限", "code": 500}
  165. # teachers = []
  166. # for teacher in teachers_list:
  167. # try:
  168. # teacher_info = await User.get(email=teacher,is_avtive=1)
  169. # teachers.append(teacher_info.id)
  170. # except:
  171. # my_log("info",__name__,f"no this teacher")
  172. principal_user_id =None
  173. if principal_user_email:
  174. try:
  175. principal_user = await User.get(email=principal_user_email,is_avtive=1)
  176. principal_user_id = principal_user.id
  177. except:
  178. my_log("info",__name__,f"no this teacher")
  179. new_school = await Schools.create(
  180. name=location_name,
  181. longitude=Lng,
  182. latitude=Lat,
  183. address = address,
  184. update_time = datetime.now(),
  185. introduction = school_introduction ,
  186. email= email,
  187. phone = phone,
  188. create_user_id = user_id,
  189. is_delete = 0,
  190. is_pass_proposal = is_pass_proposal,
  191. principal_user_id = principal_user_id,
  192. teachers = teachers_list
  193. )
  194. client_ip = request.client.host
  195. my_log("info",__name__,f"Client IP: {client_ip} - new school:{new_school.id}")
  196. return {"msg": "success", "code": 200, "location_id": new_school.id}
  197. except Exception as e:
  198. return {"msg": str(e), "code": 500}
  199. @classes.post("/insert_class_name")
  200. async def insert_class_name(
  201. name: str = Form(default=''),
  202. location_id: int = Form(default=1),
  203. category: str = Form(default=''),
  204. introduction: str = Form(default=''),
  205. organizer: str = Form(default=''),
  206. cover_img_file:UploadFile = File(default=''),
  207. group_id : int = Form(default=1),
  208. group_sort :str = Form(default=''),
  209. recommend: int = Form(default=0),
  210. special_class_list_name : str = Form(default=None),
  211. is_inner : int = Form(default=0),
  212. is_check : int = Form(default=0),
  213. access_token:str = Form(default=None),
  214. teachers_resume : str = Form(default=None)
  215. ):
  216. try:
  217. cover_img = ''
  218. if cover_img_file != '':
  219. contents = await cover_img_file.read()
  220. #save the file
  221. with open(f"{IMAGEDIR}{cover_img_file.filename}", "wb") as f:
  222. f.write(contents)
  223. cover_img = f"{IMAGEDIR_short}{cover_img_file.filename}"
  224. user_id = None
  225. if access_token:
  226. user_id = await check_token(access_token)
  227. if user_id == None:
  228. return {"msg": "沒有權限", "code": 500}
  229. # 課程編碼
  230. encode = ""
  231. if encode_set.__contains__(category) :
  232. encode = encode_set[category]
  233. else:
  234. encode = "OTH"
  235. now = datetime.now()
  236. encode += now.strftime("%Y%m%d")
  237. new_class_name = await Class_name.create(
  238. name=name,
  239. school_id=location_id,
  240. category=category,
  241. introduction=introduction,
  242. organizer=organizer,
  243. cover_img=cover_img,
  244. group_id=group_id,
  245. group_sort=group_sort,
  246. recommend = recommend,
  247. special_class_list_name = special_class_list_name,
  248. is_inner = is_inner,
  249. is_check = is_check,
  250. create_user_id = user_id,
  251. create_time = datetime.now(),
  252. is_delete = 0,
  253. is_record_point =0,
  254. teachers_resume = teachers_resume
  255. )
  256. encode += str(new_class_name.id)
  257. new_class_name.encode = encode
  258. await new_class_name.save()
  259. update_location_time(location_id= location_id)
  260. return {"msg": "success", "code": 200, "new_class_name_id": new_class_name.id}
  261. except Exception as e:
  262. return {"msg": str(e), "code": 500}
  263. # @classes.get("/insert_encode")
  264. # async def insert_encode():
  265. # try:
  266. # class_name = await Class_name.all()
  267. # for classes in class_name:
  268. # encode = ""
  269. # if encode_set.__contains__(classes.category) :
  270. # encode = encode_set[classes.category]
  271. # else:
  272. # encode = "OTH"
  273. # now = classes.create_time
  274. # encode += now.strftime("%Y%m%d")
  275. # encode += str(classes.id)
  276. # classes.encode = encode
  277. # await classes.save()
  278. # except Exception as e:
  279. # return {"msg": str(e), "code": 500}
  280. # 創建場次
  281. @classes.post("/insert_event")
  282. async def insert_event(
  283. request : Request,
  284. name_id: int = Form(default=0),
  285. event: str = Form(default=''),
  286. start_time: datetime = Form(default=None),
  287. end_time: datetime = Form(default=None),
  288. contact: str = Form(default=''),
  289. lecturer: str = Form(default=''),
  290. location: str = Form(default=''),
  291. content: str = Form(default=''),
  292. URL: str = Form(default=''),
  293. people : str = Form(default=''),
  294. fee_method: str = Form(default=''),
  295. registration_way: str = Form(default=''),
  296. registration_start: datetime = Form(default=None),
  297. registration_end: datetime = Form(default=None),
  298. number_limit: int = Form(default=None),
  299. remark : str = Form(default=''),
  300. ATM_address: str = Form(default=''),
  301. access_token:str = Form(default=None),
  302. fee_payment: str = Form(default=''),
  303. number_minimum : int = Form(default=None),
  304. files_url = Depends(create_upload_files)
  305. ):
  306. try:
  307. user_id = None
  308. if access_token:
  309. user_id = await check_token(access_token)
  310. if user_id == None:
  311. return {"msg": "沒有權限", "code": 500}
  312. # 檢查是否有該課程
  313. class_name_list = await Class_name.filter(id=name_id).all()
  314. if class_name_list == []:
  315. return {"msg": "沒有此課程", "code": 500}
  316. if files_url:
  317. if files_url.__contains__("msg"):
  318. return {"msg": files_url["msg"], "code": 500}
  319. # 判斷時間合法
  320. if start_time and end_time :
  321. if start_time >= end_time :
  322. return {"msg": "時間輸入錯誤", "code": 500}
  323. new_class = await Class_list.create(
  324. name_id=name_id,
  325. event =event,
  326. start_time=start_time,
  327. end_time=end_time,
  328. contact=contact,
  329. lecturer=lecturer,
  330. location=location,
  331. content=content,
  332. URL=URL,
  333. people=people,
  334. fee_method=fee_method,
  335. registration_way=registration_way,
  336. remark=remark,
  337. ATM_address=ATM_address,
  338. create_user_id = user_id,
  339. fee_payment = fee_payment,
  340. event_create_time = datetime.now(),
  341. files=files_url
  342. )
  343. client_ip = request.client.host
  344. try:
  345. if (registration_start and registration_end and number_limit) or number_minimum:
  346. await Class_date.create(
  347. class_list_id = new_class.id,
  348. registration_start = registration_start,
  349. registration_end = registration_end,
  350. number_limit = number_limit,
  351. amount_left = number_limit,
  352. number_minimum = number_minimum
  353. )
  354. except:
  355. print("input class_date fail")
  356. # 寄開課信
  357. try :
  358. if user_id:
  359. try:
  360. try :
  361. user = await User_resume.get(user_id = user_id)
  362. except:
  363. my_log("info",__name__,f"Client IP: {client_ip} - {user_id} has no user resume")
  364. return {"msg": "請去建立工藝家履歷", "code": 500}
  365. email = user.email
  366. subject = "創建課程通知"
  367. message = f"親愛的工藝家{user.teacher_name}您好,<br>\
  368. 感謝您埋下工藝種子!<br>\
  369. 您創建的課程由管理員進行審核中,將於3-7個工作天內e-mail通知您審核結果。<br>\
  370. 若7天後尚未收到課程審核通知,請將後台畫面、聯絡資訊等截圖寄送至客服信箱:<br>\
  371. craftology@ntcri.gov.tw,以便客服為您查詢。<br>\
  372. 註:此封信件為系統自動發送,請勿回信,謝謝。"
  373. send_email(email,"",subject,message)
  374. except:
  375. print("have no email")
  376. except:
  377. print("no this user")
  378. return {"msg": "success", "code": 200, "class_id": new_class.id}
  379. except Exception as e:
  380. return {"msg": str(e), "code": 500}
  381. @classes.post("/auto_create_session")
  382. async def auto_create_session(
  383. class_event_id : int = Form(default=0),
  384. week_day_str : str = Form(default="[]"),
  385. start_week_time : str = Form(default="[]"),
  386. end_week_time : str = Form(default="[]"),
  387. ):
  388. try:
  389. week_day = eval(week_day_str)
  390. start_week_time= eval(start_week_time)
  391. end_week_time= eval(end_week_time)
  392. #print(week_day)
  393. class_obj = await Class_list.get_or_none(id = class_event_id)
  394. if class_obj is None :
  395. return {"msg": "no this class", "code": 500}
  396. time_stemp = class_obj.start_time
  397. session = 1
  398. session_list = await Class_detail.filter(class_list_id=class_event_id).delete()
  399. while time_stemp <= class_obj.end_time:
  400. if week_day[time_stemp.weekday()]:
  401. s_start_time = time_stemp.date().strftime("%Y-%m-%d")+" "+start_week_time[time_stemp.weekday()]
  402. s_end_time = time_stemp.date().strftime("%Y-%m-%d")+" "+end_week_time[time_stemp.weekday()]
  403. #time_del = class_obj.end_time.hour - time_stemp.hour
  404. #time_del_minutes = class_obj.end_time.minute - time_stemp.minute
  405. #time_end = time_stemp + timedelta(hours=time_del,minutes=time_del_minutes)
  406. #print(time_end,class_obj.end_time.hour)
  407. day1 = datetime.strptime(s_start_time, '%Y-%m-%d %H:%M:%S')
  408. day2 = datetime.strptime(s_end_time, '%Y-%m-%d %H:%M:%S')
  409. time_difference = day2 - day1
  410. total_minutes = int(time_difference.total_seconds() // 60)
  411. hour=total_minutes//60 + round((total_minutes%60)/60,1)
  412. new_session = await Class_detail.create(
  413. class_list_id=class_event_id,
  414. #start_time=time_stemp,
  415. #end_time=time_end,
  416. start_time=s_start_time,
  417. end_time=s_end_time,
  418. hour = hour,
  419. sessions=session,
  420. content = ""
  421. )
  422. session+=1
  423. time_stemp = time_stemp + timedelta(days=1)
  424. return {"msg": "success", "code": 200}
  425. except Exception as e:
  426. return {"msg": str(e), "code": 500}
  427. @classes.post("/insert_session")
  428. async def insert_session(
  429. class_event_id : int = Form(default=0),
  430. start_time: datetime = Form(default=datetime.now()),
  431. end_time: datetime = Form(default=datetime.now()),
  432. content : str = Form(default='')
  433. ):
  434. try:
  435. session_list = await Class_detail.filter(class_list_id=class_event_id).all()
  436. session = 0
  437. if session_list != []:
  438. for session_obj in session_list:
  439. if session < session_obj.sessions:
  440. session = session_obj.sessions
  441. time_difference = end_time - start_time
  442. total_minutes = int(time_difference.total_seconds() / 60)
  443. hour=total_minutes//60 + round((total_minutes%60)/60,1)
  444. print(round((total_minutes%60)/60,1))
  445. new_session = await Class_detail.create(
  446. class_list_id=class_event_id,
  447. start_time=start_time,
  448. end_time=end_time,
  449. sessions=session +1,
  450. content = content,
  451. hour = hour
  452. )
  453. return {"msg": "success", "code": 200, "new_session_id": new_session.id}
  454. except Exception as e:
  455. return {"msg": str(e), "code": 500}
  456. @classes.post("/update_school")
  457. async def update_school(
  458. location_id: int = Form(default=0),
  459. location_name: str = Form(default=''),
  460. Lng: str = Form(default=''),
  461. Lat: str = Form(default=''),
  462. address : str = Form(default=''),
  463. school_introduction : str = Form(default=None),
  464. email : str = Form(default=None),
  465. phone : str = Form(default=None),
  466. teachers_list : List[str] = Form(default=[]),
  467. is_pass_proposal : int = Form(default=None),
  468. principal_user_email : str = Form(default=None)
  469. ):
  470. try:
  471. school = await Schools.get(id=location_id)
  472. if location_name.strip() != '':
  473. school.name = location_name
  474. if Lng != '':
  475. school.longitude = Lng
  476. if Lat.strip() != '':
  477. school.latitude = Lat
  478. if address.strip() != '':
  479. school.address = address
  480. if school_introduction:
  481. school.introduction = school_introduction
  482. if email:
  483. school.email = email
  484. if phone:
  485. school.phone = phone
  486. if is_pass_proposal is not None:
  487. # if is_pass_proposal == 0 and school.is_pass_proposal == 2:
  488. # # 寄開課信
  489. # try :
  490. # if user_id:
  491. # try:
  492. # try :
  493. # user = await User_resume.get(user_id = user_id)
  494. # except:
  495. # my_log("info",__name__,f"Client IP: {client_ip} - {user_id} has no user resume")
  496. # return {"msg": "請去建立工藝家履歷", "code": 500}
  497. # email = user.email
  498. # subject = "創建課程通知"
  499. # message = f"親愛的工藝家{user.teacher_name}您好,<br>\
  500. # 感謝您埋下工藝種子!<br>\
  501. # 您創建的課程由管理員進行審核中,將於3-7個工作天內e-mail通知您審核結果。<br>\
  502. # 若7天後尚未收到課程審核通知,請將後台畫面、聯絡資訊等截圖寄送至客服信箱:<br>\
  503. # craftology@ntcri.gov.tw,以便客服為您查詢。<br>\
  504. # 註:此封信件為系統自動發送,請勿回信,謝謝。"
  505. # send_email(email,"",subject,message)
  506. # except:
  507. # print("have no email")
  508. # except:
  509. # print("no this user")
  510. school.is_pass_proposal = is_pass_proposal
  511. if principal_user_email:
  512. try:
  513. principal_user = await User.get(email=principal_user_email,is_avtive=1)
  514. school.principal_user_id = principal_user.id
  515. except:
  516. my_log("info",__name__,f"no this teacher")
  517. if teachers_list != []:
  518. teachers = []
  519. for teacher in teachers_list:
  520. try:
  521. teacher_info = await User.get(email=teacher,is_avtive=1)
  522. teachers.append(teacher_info.id)
  523. except:
  524. my_log("info",__name__,f"no this teacher")
  525. school.teachers = str(teachers)
  526. await school.save()
  527. update_location_time(location_id= location_id)
  528. return {"msg": "success", "code": 200}
  529. except Exception as e:
  530. return {"msg": str(e), "code": 500}
  531. @classes.post("/update_class_name")
  532. async def update_class_name(
  533. request : Request,
  534. class_name_id: int = Form(default=0),
  535. name: str = Form(default=None),
  536. location_id: int = Form(default=None),
  537. category: str = Form(default=None),
  538. introduction: str = Form(default=None),
  539. organizer: str = Form(default=None),
  540. cover_img_file:UploadFile = File(default=""),
  541. group_id : int = Form(default=None),
  542. group_sort : str = Form(default=None),
  543. recommend: int = Form(default=None),
  544. special_class_list_name : str = Form(default=None),
  545. is_inner : int = Form(default=None),
  546. is_check : int = Form(default=None),
  547. teachers_resume : str = Form(default=None)
  548. ):
  549. try:
  550. class_name = await Class_name.get(id=class_name_id)
  551. if name is not None:
  552. class_name.name = name
  553. if location_id is not None:
  554. class_name.school_id = location_id
  555. update_location_time(location_id= location_id)
  556. if category is not None:
  557. class_name.category = category
  558. if introduction is not None:
  559. class_name.introduction = introduction
  560. if organizer is not None:
  561. class_name.organizer = organizer
  562. if group_id is not None :
  563. class_name.group_id = group_id
  564. if is_inner is not None:
  565. class_name.is_inner = is_inner
  566. if teachers_resume is not None:
  567. class_name.teachers_resume = teachers_resume
  568. if cover_img_file != "":
  569. contents = await cover_img_file.read()
  570. with open(f"{IMAGEDIR}{cover_img_file.filename}", "wb") as f:
  571. f.write(contents)
  572. class_name.cover_img = f"{IMAGEDIR_short}{cover_img_file.filename}"
  573. if group_sort is not None:
  574. class_name.group_sort = group_sort
  575. if recommend is not None:
  576. class_name.recommend = recommend
  577. client_ip = request.client.host
  578. if is_check is not None:
  579. if class_name.is_check == 0 and is_check ==1:
  580. user_id = class_name.create_user_id
  581. if user_id:
  582. try:
  583. user = await User_resume.get(user_id = user_id)
  584. except:
  585. # my_log(type,name,msg)
  586. my_log("info",__name__,f"Client IP: {client_ip} - {user_id} has no user resume")
  587. return {"msg": "請去建立工藝家履歷", "code": 500}
  588. email = user.email
  589. subject = "課程核准通知"
  590. message = f"親愛的工藝家{user.teacher_name}您好,<br>\
  591. 恭喜您埋下工藝種子已成功發芽,讓我們一起期待它的成長茁壯!<br>\
  592. 您創建的課程已由管理員審核通過並上架成功!<br>\
  593. 您可透過「會員專區」→「我的開課」檢視跟管理學員報名狀況。<br>\
  594. 註:此封信件為系統自動發送,請勿回信,謝謝。"
  595. try:
  596. send_email(email,"",subject,message)
  597. except:
  598. my_log("error",__name__,f"Client IP: {client_ip} - send email fail")
  599. class_name.is_check = is_check
  600. if special_class_list_name:
  601. class_name.special_class_list_name = special_class_list_name
  602. await class_name.save()
  603. return {"msg": "success", "code": 200}
  604. except Exception as e:
  605. return {"msg": str(e), "code": 500}
  606. @classes.post("/cancel_class_check")
  607. async def cancel_class_check(
  608. request: Request,
  609. class_name_id: int = Form(default=0),
  610. access_token:str = Form(default=None),
  611. message:str = Form(default=None)
  612. ):
  613. try:
  614. user_id = None
  615. if access_token:
  616. user_id = await check_token(access_token)
  617. if user_id:
  618. user = await User.get(id=user_id)
  619. else :
  620. return {"msg": "no access", "code": 200}
  621. if user.is_superuser != 2:
  622. return {"msg": "no access", "code": 200}
  623. # 檢查是否有該課程
  624. class_name_list = await Class_name.filter(id=class_name_id).all()
  625. if class_name_list == []:
  626. my_log("info",__name__,f"Client IP: {client_ip} - no this class_name_id:{class_name_id}")
  627. return {"msg": "沒有此課程", "code": 200}
  628. class_name = await Class_name.get(id=class_name_id)
  629. class_name.is_check = 2
  630. await class_name.save()
  631. if class_name.create_user_id:
  632. creater = await User.get(id=class_name.create_user_id)
  633. email = creater.email
  634. subject = '開課駁回通知'
  635. email_message = f'親愛的工藝家{creater.username}您好,<br>\
  636. 很遺憾您埋下的工藝種子未能成功發芽。<br>\
  637. 您創建的課程經管理員審核,因{message}未能通過審核,<br>\
  638. 請別灰心!只要修正完善內容再次提交即有機會讓您的工藝種子發芽。<br>\
  639. 若對於審核結果有疑慮,請將後台畫面、聯絡資訊等截圖寄送至客服信箱:<br>\
  640. craftology@ntcri.gov.tw,以便客服為您查詢。<br>\
  641. 註:此封信件為系統自動發送,請勿回信,謝謝。'
  642. send_email(email,"",subject,email_message)
  643. else :
  644. print("no creater")
  645. client_ip = request.client.host
  646. my_log("info",__name__,f"{client_ip} - class_name_id:{class_name_id} change is_check to 2")
  647. return {"msg": "success", "code": 200}
  648. except Exception as e:
  649. client_ip = request.client.host
  650. my_log("error",__name__,f"{client_ip} - An exception occurred: {e} \n Request : {request}")
  651. return {"msg": str(e), "code": 500}
  652. @classes.post("/update_event")
  653. async def update_event(
  654. id: int = Form(default=0),
  655. name_id: int = Form(default=None),
  656. event: str = Form(default=None),
  657. start_time: datetime = Form(default=None),
  658. end_time: datetime = Form(default=None),
  659. contact: str = Form(default=None),
  660. lecturer: str = Form(default=None),
  661. location: str = Form(default=None),
  662. content: str = Form(default=None),
  663. URL: str = Form(default=None),
  664. people : str = Form(default=None),
  665. fee_method: str = Form(default=None),
  666. registration_way: str = Form(default=None),
  667. registration_start: datetime = Form(default=None),
  668. registration_end: datetime = Form(default=None),
  669. number_limit: int = Form(default==None),
  670. remark : str = Form(default==None),
  671. ATM_address :str = Form(default==None),
  672. fee_payment : str = Form(default==None),
  673. number_minimum: int = Form(default=None),
  674. files_url = Depends(create_upload_files)
  675. ):
  676. try:
  677. class_obj = await Class_list.get_or_none(id=id)
  678. if class_obj is None :
  679. return {"msg": "no this event", "code": 500}
  680. if name_id :
  681. class_obj.name_id = name_id
  682. if event:
  683. class_obj.event = event
  684. if start_time:
  685. class_obj.start_time = start_time
  686. if end_time:
  687. class_obj.end_time = end_time
  688. if lecturer:
  689. class_obj.lecturer = lecturer
  690. if location:
  691. class_obj.location = location
  692. if contact:
  693. class_obj.contact = contact
  694. if content:
  695. class_obj.content = content
  696. if URL:
  697. class_obj.URL = URL
  698. if people:
  699. class_obj.people = people
  700. if fee_method:
  701. class_obj.fee_method = fee_method
  702. if registration_way:
  703. class_obj.registration_way = registration_way
  704. if remark:
  705. class_obj.remark = remark
  706. if ATM_address:
  707. class_obj.ATM_address = ATM_address
  708. if fee_payment:
  709. class_obj.fee_payment = fee_payment
  710. if files_url:
  711. if files_url.__contains__("msg"):
  712. return {"msg": files_url["msg"], "code": 500}
  713. class_obj.files_url = files_url
  714. class_date_obj,created = await Class_date.get_or_create(
  715. class_list_id=id,
  716. defaults={
  717. "registration_start" : registration_start,
  718. "registration_end" : registration_end,
  719. "number_limit" : number_limit,
  720. "amount_left" : number_limit,
  721. "number_minimum" : number_minimum
  722. }
  723. )
  724. if not created :
  725. if registration_start != datetime.now():
  726. class_date_obj.registration_start = registration_start
  727. if registration_end != datetime.now():
  728. class_date_obj.registration_end = registration_end
  729. if number_limit != 0:
  730. class_date_obj.number_limit = number_limit
  731. if number_minimum != None:
  732. class_date_obj.number_minimum = number_minimum
  733. await class_date_obj.save()
  734. await class_obj.save()
  735. return {"msg": "success", "code": 200}
  736. except Exception as e:
  737. return {"msg": str(e), "code": 500}
  738. @classes.post("/update_session")
  739. async def update_session(
  740. session_id : int = Form(default=0),
  741. class_event_id : int = Form(default=0),
  742. start_time: datetime = Form(default=datetime.now()),
  743. end_time: datetime = Form(default=datetime.now()),
  744. sessions: str = Form(default=0),
  745. content : str = Form(default='')
  746. ):
  747. try:
  748. class_session_obj = await Class_detail.get(id=session_id)
  749. if class_event_id != 0:
  750. class_session_obj.class_list_id = class_event_id
  751. if start_time != '':
  752. class_session_obj.start_time = start_time
  753. if end_time != '':
  754. class_session_obj.end_time = end_time
  755. if sessions.strip() != '':
  756. class_session_obj.sessions = sessions
  757. if content.strip() != '':
  758. class_session_obj.content = content
  759. await class_session_obj.save()
  760. return {"msg": "success", "code": 200}
  761. except Exception as e:
  762. return {"msg": str(e), "code": 500}
  763. @classes.post("/delete_school")
  764. async def delete_school(location_id: int):
  765. if location_id:
  766. try:
  767. school = await Schools.get(id=location_id)
  768. except:
  769. return {"msg": "無法找到據點", "code": 500}
  770. school.is_delete = (school.is_delete+1)%2
  771. await school.save()
  772. return {"msg": "success", "code": 200}
  773. @classes.post("/delete_session")
  774. async def delete_session(id: int):
  775. if id:
  776. await Class_detail.filter(id=id).delete()
  777. return {"msg": "success", "code": 200}
  778. @classes.post("/delete_event")
  779. async def delete(id: int):
  780. if id:
  781. await Class_detail.filter(class_list_id=id).delete()
  782. await Class_list.filter(id=id).delete()
  783. await Class_date.filter(class_list_id=id).delete()
  784. return {"msg": "success", "code": 200}
  785. @classes.post("/delete_class_name")
  786. async def delete(id: int):
  787. if id:
  788. try:
  789. class_name = await Class_name.get(id=id)
  790. except:
  791. return {"msg": "無法找到課程", "code": 500}
  792. class_name.is_delete = (class_name.is_delete+1)%2 # 相反狀態(如果本來被刪除就恢復)
  793. await class_name.save()
  794. # class_event_list = await Class_list.filter(name_id=id).all()
  795. # for class_event_obj in class_event_list:
  796. # await Class_detail.filter(class_list_id=class_event_obj.id).delete()
  797. # await Class_date.filter(class_list_id=class_event_obj.id).delete()
  798. # await Class_list.filter(name_id=id).delete()
  799. # await Class_name.filter(id=id).delete()
  800. return {"msg": "success", "code": 200}
  801. @classes.get("/get_class_state")
  802. async def check_date_state(
  803. class_name_id : Optional[int] = None,
  804. class_event_id : Optional[int] = None,
  805. special_class_list_name : Optional[str] = None,
  806. ):
  807. if class_name_id:
  808. Q_word = Q(name_id=class_name_id)
  809. elif class_event_id:
  810. Q_word = Q(id=class_event_id)
  811. else:
  812. return {"msg": 'please input ID', "code": 500}
  813. if special_class_list_name == "one_day_class":
  814. class_list = await One_day_class.filter(Q_word).all()
  815. elif special_class_list_name == "outter_class_list":
  816. class_list = await Outter_class_list.filter(Q_word).all()
  817. else :
  818. class_list = await Class_list.filter(Q_word).all()
  819. result = {"state": "尚未開放報名"}
  820. try:
  821. for class_obj in class_list:
  822. try:
  823. class_name = await Class_name.get_or_none(id = class_obj.name_id)
  824. if class_name.is_check == 0 :
  825. result["state"] = "課程等待審核"
  826. break
  827. if class_name:
  828. print(class_name.name)
  829. school = await Schools.get_or_none(id = class_name.school_id)
  830. print(class_name.school_id)
  831. if school :
  832. print(school.is_pass_proposal)
  833. if school.is_pass_proposal == 0 :
  834. result["state"] = "課程正在提案階段"
  835. break
  836. if class_name.is_record_point == 1 :
  837. result["state"] = "課程已關閉"
  838. break
  839. if class_obj.start_time and class_obj.end_time:
  840. if class_obj.start_time.replace(tzinfo=None) <= datetime.now() and class_obj.end_time.replace(tzinfo=None) >= datetime.now():
  841. result["state"] = "開課中"
  842. break
  843. elif class_obj.end_time.replace(tzinfo=None) < datetime.now():
  844. result["state"] = "課程已結束"
  845. else:
  846. pass
  847. else :
  848. result["state"] = "尚未創建課程"
  849. except Exception as e:
  850. pass
  851. if special_class_list_name == "one_day_class":
  852. if class_obj.reg_deadline.replace(tzinfo=None) >= datetime.now() :
  853. result["state"] = "報名中"
  854. break
  855. elif class_obj.reg_deadline.replace(tzinfo=None) < datetime.now():
  856. result["state"] = "報名截止(報名額滿)"
  857. break
  858. else :
  859. try:
  860. class_date_obj = await Class_date.get(class_list_id=class_obj.id)
  861. if class_date_obj.registration_start.replace(tzinfo=None) <= datetime.now() and class_date_obj.registration_end.replace(tzinfo=None) >= datetime.now() :
  862. if class_date_obj.amount_left == 0:
  863. result["state"] = "報名截止(報名額滿)"
  864. break
  865. else:
  866. result["state"] = "報名中"
  867. break
  868. elif class_date_obj.registration_end.replace(tzinfo=None) < datetime.now():
  869. result["state"] = "報名截止(人數已滿)"
  870. break
  871. except Exception as e:
  872. pass
  873. return {"msg": "success", "code": 200, "result": result}
  874. except Exception as e:
  875. return {"msg": str(e), "code": 500}
  876. @classes.get("/get_event")
  877. async def search_event(
  878. class_name_id: Optional[int] = None,
  879. event_id : Optional[int] = None,
  880. access_token: Optional[str] = None
  881. ):
  882. try:
  883. try :
  884. class_name_obj = await Class_name.get(id=class_name_id)
  885. except:
  886. return {"msg": "no this class id", "code": 500}
  887. special_class_list_name = class_name_obj.special_class_list_name
  888. Q_word = Q()
  889. if class_name_id:
  890. Q_word = Q_word | Q(name_id = class_name_id)
  891. elif event_id:
  892. Q_word = Q_word | Q(id = event_id)
  893. else :
  894. return {"msg": "please input class_name_id or event_id", "code": 500}
  895. user_id = None
  896. if access_token:
  897. user_id = await check_token(access_token)
  898. if user_id:
  899. Q_word = Q_word & Q(create_user_id = user_id)
  900. model_fields =[]
  901. state = {}
  902. if special_class_list_name==None:
  903. class_list = Class_list.filter(Q_word).all().order_by("-start_time")
  904. elif special_class_list_name=='one_day_class':
  905. class_list = One_day_class.filter(Q_word).all().order_by("-start_time")
  906. elif special_class_list_name=='outter_class_list':
  907. class_list = Outter_class_list.filter(Q_word).all().order_by("-start_time")
  908. else:
  909. class_list = Class_list.filter(Q_word).all().order_by("-start_time")
  910. class_list = await class_list.all()
  911. classes = []
  912. for class_obj in class_list:
  913. class_name_obj = await Class_name.get(id=class_obj.name_id)
  914. class_name = class_name_obj.name
  915. try :
  916. class_data = class_obj.show_data()
  917. class_data["class_name"] = class_name
  918. state = await check_date_state(class_event_id=class_obj.id,special_class_list_name=special_class_list_name)
  919. class_data["state"] = state["result"]["state"]
  920. try:
  921. class_date_obj = await Class_date.get(class_list_id=class_obj.id)
  922. class_data["registration_start"] = class_date_obj.registration_start
  923. class_data["registration_end"] = class_date_obj.registration_end
  924. class_data["number_limit"] = class_date_obj.number_limit
  925. class_data["amount_left"] = class_date_obj.amount_left
  926. class_data["number_minimum"] = class_date_obj.number_minimum
  927. model_fields.append("registration_start","registration_end","number_limit","amount_left")
  928. except:
  929. print("沒有報名時間&人數限制的資料")
  930. except:
  931. class_data = {
  932. "msg" : "fail to get data"
  933. }
  934. classes.append(class_data)
  935. return {"msg": "success", "code": 200, "classes": classes}
  936. except Exception as e:
  937. return {"msg": str(e), "code": 500}
  938. @classes.get("/get_school")
  939. async def get_school(
  940. location_id : Optional[int] = None,
  941. keyword : Optional[str] = None,
  942. location_keyword : Optional[str] = None,
  943. page_num : Optional[int] = None,
  944. page_amount : Optional[int] = None,
  945. category : Optional[str] = None,
  946. access_token: Optional[str] = None,
  947. is_delete: Optional[int] = None,
  948. is_pass_proposal : Optional[int] = None,
  949. principal_user_email : Optional[str] = None
  950. ):
  951. try:
  952. my_log("info",__name__,"get_school")
  953. school_list = Schools.all()
  954. if location_id :
  955. school_list = school_list.filter(id = location_id).all()
  956. if keyword :
  957. school_list = school_list.filter(Q(name__icontains=keyword)).all()
  958. if location_keyword :
  959. school_list = school_list.filter(Q(address__icontains=location_keyword)).all()
  960. if is_pass_proposal is not None :
  961. if is_pass_proposal == 2:
  962. school_list = school_list.all()
  963. else:
  964. school_list = school_list.filter(Q(is_pass_proposal=is_pass_proposal)).all()
  965. else :
  966. school_list = school_list.filter(Q(is_pass_proposal=1)).all()
  967. if principal_user_email :
  968. try:
  969. principal_user = await User.get(email=principal_user_email,is_avtive=1)
  970. except:
  971. my_log("info",__name__,f"no this teacher")
  972. school_list = school_list.filter(Q(principal_user_id=principal_user.id)).all()
  973. if is_delete is not None:
  974. school_list = school_list.filter(Q(is_delete=is_delete)).all()
  975. else :
  976. school_list = school_list.filter(Q(is_delete=0)).all()
  977. user_id = None
  978. if access_token:
  979. user_id = await check_token(access_token)
  980. if user_id:
  981. school_list = school_list.filter(Q(create_user_id = user_id)).all()
  982. Q_word = Q()
  983. if category:
  984. for tmp_word in category.split(",") :
  985. Q_word = Q_word | Q(category__icontains=tmp_word)
  986. school_list_tmp = await school_list.all()
  987. for school_obj in school_list_tmp:
  988. class_list = await Class_name.filter(Q(school_id = school_obj.id) & Q_word)
  989. if class_list == []:
  990. school_list = school_list.exclude(id = school_obj.id)
  991. count = await school_list.all().count()
  992. if page_num and page_amount:
  993. school_list = school_list.offset((page_num-1)*page_amount).limit(page_amount)
  994. school_list = await school_list.all().order_by("-update_time")
  995. schools = []
  996. for school_obj in school_list:
  997. try :
  998. school_data = school_obj.show_data()
  999. schools.append(school_data)
  1000. except:
  1001. schools.append({"msg : data wrong"})
  1002. return {"msg": "success", "code": 200, "total_num" : count,"schools": schools}
  1003. except Exception as e:
  1004. return {"msg": str(e), "code": 500}
  1005. @classes.get("/get_group_name")
  1006. async def get_school_group(
  1007. id : Optional[int] = 0
  1008. ):
  1009. try:
  1010. if id==0:
  1011. school_group_list = await Group_name.all()
  1012. print(school_group_list)
  1013. else:
  1014. school_group_list = [await Group_name.get(id=id)]
  1015. print(school_group_list)
  1016. school_groups = []
  1017. for school_obj in school_group_list:
  1018. school_data = {
  1019. "group_id": school_obj.id,
  1020. "group_name": school_obj.group_name,
  1021. "describe": school_obj.describe
  1022. }
  1023. school_groups.append(school_data)
  1024. return {"msg": "success", "code": 200, "school_groups": school_groups}
  1025. except Exception as e:
  1026. return {"msg": str(e), "code": 500}
  1027. @classes.post("/update_group_name")
  1028. async def update_school_group(
  1029. id : int = Form(default=0),
  1030. group_name : str = Form(default=''),
  1031. describe : str = Form(default=''),
  1032. ):
  1033. try:
  1034. group_name_obj = await Group_name.get(id=id)
  1035. if group_name.strip() != '':
  1036. group_name_obj.group_name = group_name
  1037. if describe.strip() != '':
  1038. group_name_obj.describe = describe
  1039. await group_name_obj.save()
  1040. return {"msg": "success", "code": 200}
  1041. except Exception as e:
  1042. return {"msg": str(e), "code": 500}
  1043. @classes.get("/get_class_name")
  1044. async def get_class_name(
  1045. location_id : str = None ,
  1046. class_name_id : Optional[int] = None,
  1047. group_id : Optional[int] = None,
  1048. group_sort :Optional[str] = None,
  1049. exclude_word: Optional[str] = None,
  1050. category :Optional[str] = None,
  1051. page_num : Optional[int] = None,
  1052. page_amount : Optional[int] = None,
  1053. recommend : Optional[int] = None,
  1054. is_inner : Optional[int] = None,
  1055. is_check : Optional[int] = None,
  1056. access_token: Optional[str] = None,
  1057. is_delete: Optional[int] = None,
  1058. keyword: Optional[str] = None,
  1059. has_user : Optional[int] = None,
  1060. is_record_point : Optional[int] = None,
  1061. location_keyword : Optional[str] = None,
  1062. encode : Optional[str] = None
  1063. ):
  1064. try:
  1065. class_name_list = Class_name.all()
  1066. Q_word = Q()
  1067. if location_keyword:
  1068. school_list = await Schools.filter(Q(address__icontains=location_keyword)).all()
  1069. schools = []
  1070. for school in school_list:
  1071. schools.append(school.id)
  1072. Q_word = Q_word & Q(school_id__in = schools)
  1073. if group_id:
  1074. Q_word = Q_word & Q(group_id = group_id)
  1075. if group_sort:
  1076. Q_word = Q_word & Q(group_sort = group_sort)
  1077. if encode:
  1078. Q_word = Q_word & Q(encode = encode)
  1079. if encode:
  1080. Q_word = Q_word & Q(encode = encode)
  1081. if category:
  1082. for tmp_word in category.split(",") :
  1083. Q_word = Q_word | Q(category__icontains=tmp_word)
  1084. if location_id :
  1085. location_id_list = eval(location_id)
  1086. if not isinstance(location_id_list, list):
  1087. location_id_list = [location_id_list]
  1088. Q_word = Q_word & Q(school_id__in = location_id_list)
  1089. if class_name_id :
  1090. Q_word = Q_word & Q(id = class_name_id)
  1091. if recommend :
  1092. Q_word = Q_word & Q(recommend = recommend)
  1093. if is_inner!=None:
  1094. Q_word = Q_word & Q(is_inner = is_inner)
  1095. if is_check!=None:
  1096. Q_word = Q_word & Q(is_check = is_check)
  1097. if is_delete is not None:
  1098. Q_word = Q_word & Q(is_delete = is_delete)
  1099. else :
  1100. Q_word = Q_word & Q(is_delete = 0)
  1101. if keyword:
  1102. Q_word = Q_word & ( Q(name__icontains=keyword)|
  1103. Q(category__icontains=keyword)|
  1104. Q(introduction__icontains=keyword)|
  1105. Q(organizer__icontains=keyword)|
  1106. Q(group_sort__icontains=keyword) )
  1107. if is_record_point :
  1108. Q_word = Q_word & Q(is_record_point =is_record_point)
  1109. user_id = None
  1110. if access_token:
  1111. user_id = await check_token(access_token)
  1112. if user_id:
  1113. Q_word = Q_word & Q(create_user_id = user_id)
  1114. else :
  1115. return {"msg": "no access", "code": 500}
  1116. if has_user==1:
  1117. Q_word = Q_word & Q(create_user_id__isnull=False)
  1118. class_name_list = class_name_list.filter(Q_word).all()
  1119. if exclude_word:
  1120. for tmp_word in exclude_word.split(",") :
  1121. # print(tmp_word)
  1122. class_name_list = class_name_list.exclude(Q(category__icontains=tmp_word)|Q(group_sort__icontains=tmp_word)).all()
  1123. count = await class_name_list.all().count()
  1124. if page_num and page_amount:
  1125. class_name_list = class_name_list.offset((page_num-1)*page_amount).limit(page_amount)
  1126. class_name_list = await class_name_list.all().order_by("-id")
  1127. classes_name = []
  1128. state = {}
  1129. special_class_list_name = None
  1130. for class_name_obj in class_name_list:
  1131. try:
  1132. school_obj = await Schools.get(id=class_name_obj.school_id)
  1133. school_obj_id = school_obj.id
  1134. except:
  1135. school_obj_id = 0
  1136. try:
  1137. special_class_list_name = class_name_obj.special_class_list_name
  1138. if special_class_list_name:
  1139. state = await check_date_state(class_name_id=class_name_obj.id,special_class_list_name=special_class_list_name)
  1140. else:
  1141. state = await check_date_state(class_name_id=class_name_obj.id)
  1142. class_data = class_name_obj.show_data()
  1143. if school_obj_id:
  1144. for key, item in school_obj.show_data().items():
  1145. class_data[key] = item
  1146. class_data["state"]=state["result"]["state"]
  1147. except Exception as e:
  1148. class_data = {
  1149. "msg" : str(e)
  1150. }
  1151. classes_name.append(class_data)
  1152. return {"msg": "success", "code": 200,"total_num" : count,"classes": classes_name}
  1153. except Exception as e:
  1154. return {"msg": str(e), "code": 500}
  1155. @classes.get("/get_session")
  1156. async def get_session(
  1157. event_id : Optional[int] = None
  1158. ):
  1159. try:
  1160. if not event_id:
  1161. return {"msg": "please input event_id", "code": 500}
  1162. class_session_list = await Class_detail.filter(class_list_id=event_id).all().order_by("start_time")
  1163. classe_sessions = []
  1164. for class_session_obj in class_session_list:
  1165. class_session_data = {
  1166. "session_id": class_session_obj.id,
  1167. "class_event_id": class_session_obj.class_list_id,
  1168. "start_time": class_session_obj.start_time,
  1169. "end_time": class_session_obj.end_time,
  1170. "sessions": class_session_obj.sessions,
  1171. "content": class_session_obj.content
  1172. }
  1173. classe_sessions.append(class_session_data)
  1174. return {"msg": "success", "code": 200, "classe_sessions": classe_sessions}
  1175. except Exception as e:
  1176. return {"msg": str(e), "code": 500}
  1177. @classes.get("/search_class_like")
  1178. async def search_class_like(
  1179. keyword: str,
  1180. location_id : Optional[int] = None ,
  1181. group_id : Optional[int] = None,
  1182. group_sort :Optional[str] = None,
  1183. exclude_word: Optional[str] = None,
  1184. category :Optional[str] = None,
  1185. page_num : Optional[int] = None,
  1186. page_amount : Optional[int] = None,
  1187. recommend : Optional[int] = None,
  1188. is_inner : Optional[int] = None,
  1189. is_check : Optional[int] = None
  1190. ):
  1191. try:
  1192. Q_word = Q()
  1193. if group_id:
  1194. Q_word = Q_word & Q(group_id = group_id)
  1195. if group_sort:
  1196. Q_word = Q_word & Q(group_sort = group_sort)
  1197. if category:
  1198. for tmp_word in category.split(",") :
  1199. Q_word = Q_word | Q(category__icontains=tmp_word)
  1200. if location_id :
  1201. Q_word = Q_word & Q(school_id = location_id)
  1202. if recommend :
  1203. Q_word = Q_word & Q(recommend = recommend)
  1204. if is_inner!=None:
  1205. Q_word = Q_word & Q(is_inner = is_inner)
  1206. if is_check!=None:
  1207. Q_word = Q_word & Q(is_check = is_check)
  1208. class_name_id = []
  1209. for class_list in await Class_list.filter(Q(lecturer__icontains=keyword)):
  1210. class_name_id.append(class_list.name_id)
  1211. for class_list in await One_day_class.filter(Q(teacher__icontains=keyword)):
  1212. class_name_id.append(class_list.name_id)
  1213. if keyword :
  1214. Q_word = Q_word & ( Q(name__icontains=keyword)|
  1215. Q(category__icontains=keyword)|
  1216. Q(introduction__icontains=keyword)|
  1217. Q(organizer__icontains=keyword)|
  1218. Q(group_sort__icontains=keyword) |
  1219. Q(id__in=class_name_id))
  1220. class_name_list = Class_name.filter(Q_word).all()
  1221. count = await class_name_list.all().count()
  1222. if page_num and page_amount:
  1223. class_name_list = class_name_list.offset((page_num-1)*page_amount).limit(page_amount)
  1224. if exclude_word:
  1225. for tmp_word in exclude_word.split(",") :
  1226. # print(tmp_word)
  1227. class_name_list = class_name_list.exclude(Q(category__icontains=tmp_word)|Q(group_sort__icontains=tmp_word)).all()
  1228. class_name_list = await class_name_list.all().order_by("-id")
  1229. classes_name = []
  1230. state = {}
  1231. special_class_list_name = None
  1232. for class_name_obj in class_name_list:
  1233. try:
  1234. school_obj = await Schools.get(id=class_name_obj.school_id)
  1235. school_obj_id = school_obj.id
  1236. except:
  1237. school_obj_id = 0
  1238. try:
  1239. special_class_list_name = class_name_obj.special_class_list_name
  1240. if special_class_list_name:
  1241. state = await check_date_state(class_name_id=class_name_obj.id,special_class_list_name=special_class_list_name)
  1242. else:
  1243. state = await check_date_state(class_name_id=class_name_obj.id)
  1244. class_data = class_name_obj.show_data()
  1245. if school_obj_id:
  1246. for key, item in school_obj.show_data().items():
  1247. class_data[key] = item
  1248. class_data["state"]=state["result"]["state"]
  1249. except Exception as e:
  1250. class_data = {
  1251. "msg" : str(e)
  1252. }
  1253. classes_name.append(class_data)
  1254. return {"msg": "success", "code": 200, "total_num" : count,"classes": classes_name}
  1255. except Exception as e:
  1256. return {"msg": str(e), "code": 500}
  1257. @classes.post("/add_favorite_class")
  1258. async def add_favorite_class(
  1259. class_name_id: int,
  1260. user_id = Depends(check_token),
  1261. time_stemp: datetime = datetime.now()
  1262. ):
  1263. try:
  1264. if not user_id:
  1265. return {"msg": "no access", "code": 500}
  1266. new_favorite_class = await Favorite_course.get_or_create(
  1267. class_name_id=class_name_id,
  1268. user_id=user_id,
  1269. defaults={'time_stemp': time_stemp}
  1270. )
  1271. return {"msg": "success", "code": 200,"is exist": not new_favorite_class[1],"id":new_favorite_class[0].id}
  1272. except Exception as e:
  1273. return {"msg": str(e), "code": 500}
  1274. @classes.get("/get_favorite_class")
  1275. async def get_favorite_class(
  1276. user_id = Depends(check_token),
  1277. no_details : Optional[int] = None
  1278. ):
  1279. try:
  1280. class_list = await Favorite_course.filter(user_id = user_id).all()
  1281. favorite_courses = []
  1282. for class_obj in class_list:
  1283. if no_details:
  1284. class_data = {
  1285. "id": class_obj.id,
  1286. "user_id": class_obj.user_id,
  1287. "class_name_id" : class_obj.class_name_id,
  1288. "time_stemp":class_obj.time_stemp
  1289. }
  1290. favorite_courses.append(class_data)
  1291. else:
  1292. class_data = {
  1293. "id": class_obj.id,
  1294. "user_id": class_obj.user_id,
  1295. "class_name_id" : class_obj.class_name_id,
  1296. "time_stemp":class_obj.time_stemp
  1297. }
  1298. result = await get_class_name(class_name_id = class_obj.class_name_id)
  1299. try:
  1300. class_detail = result["classes"][0]
  1301. for key,item in class_detail.items():
  1302. class_data[key] = item
  1303. favorite_courses.append(class_data)
  1304. except:
  1305. class_data["msg"] = "this class doesn't exit"
  1306. favorite_courses.append(class_data)
  1307. return {"msg": "success", "code": 200, "favorite_courses": favorite_courses}
  1308. except Exception as e:
  1309. return {"msg": str(e), "code": 500}
  1310. @classes.post("/delete_favorite_class")
  1311. async def delete_favorite_class(
  1312. class_name_id: int,
  1313. user_id = Depends(check_token)
  1314. ):
  1315. try:
  1316. await Favorite_course.filter(class_name_id=class_name_id,user_id=user_id).delete()
  1317. return {"msg": "success", "code": 200}
  1318. except Exception as e:
  1319. return {"msg": str(e), "code": 500}
  1320. @classes.post("/insert_online_course")
  1321. async def insert_online_course(
  1322. title : str = Form(default=''),
  1323. category : str = Form(default=''),
  1324. create_time :str = Form(default=datetime.now()),
  1325. content : str = Form(default=''),
  1326. video_url :str = Form(default='')
  1327. ):
  1328. try:
  1329. new_online_course = await Online_course.create(
  1330. title=title,
  1331. create_time=create_time,
  1332. category=category,
  1333. content=content,
  1334. video_url=video_url,
  1335. group_id = 8
  1336. )
  1337. return {"msg": "success", "code": 200, "online_course_obj": new_online_course.id}
  1338. except Exception as e:
  1339. return {"msg": str(e), "code": 500}
  1340. @classes.post("/update_online_course")
  1341. async def update_online_course(
  1342. id : int = Form(default=0),
  1343. title : str = Form(default=''),
  1344. category : str = Form(default=''),
  1345. create_time :str = Form(default=datetime.now()),
  1346. content : str = Form(default=''),
  1347. video_url :str = Form(default='')
  1348. ):
  1349. try:
  1350. online_course_obj = await Online_course.get(id=id)
  1351. if title.strip() != '':
  1352. online_course_obj.title = title
  1353. if category.strip() != '':
  1354. online_course_obj.category = category
  1355. if create_time.strip() != '':
  1356. online_course_obj.create_time = create_time
  1357. if content.strip() != '':
  1358. online_course_obj.content = content
  1359. if video_url.strip() != '':
  1360. online_course_obj.video_url = video_url
  1361. await online_course_obj.save()
  1362. return {"msg": "success", "code": 200}
  1363. except Exception as e:
  1364. return {"msg": str(e), "code": 500}
  1365. @classes.get("/get_online_courese")
  1366. async def get_online_courese(
  1367. online_courese_id : Optional[int] = None,
  1368. category:Optional[str] = None,
  1369. group_id : Optional[int] = None,
  1370. page_num : Optional[int] = None,
  1371. page_amount : Optional[int] = None,
  1372. org :Optional[str] = None,
  1373. no_org:Optional[str] = None,
  1374. key_word:Optional[str] = None,
  1375. ):
  1376. try:
  1377. online_courese_list = Online_course.all()
  1378. Q_word = Q()
  1379. if group_id:
  1380. Q_word = Q_word & Q(group_id = group_id)
  1381. if online_courese_id :
  1382. Q_word = Q_word & Q(id = online_courese_id)
  1383. if org :
  1384. Q_word = Q_word & Q(org = org)
  1385. if no_org:
  1386. no_org_condition = Q(org__isnull=True) | ~Q(org=no_org)
  1387. Q_word = Q_word & no_org_condition
  1388. if category:
  1389. category_conditions = Q()
  1390. for tmp_word in category.split(",") :
  1391. category_conditions |= Q(category__icontains=tmp_word)
  1392. Q_word = Q_word & category_conditions
  1393. #Q_word = Q_word | Q(category__icontains=tmp_word)
  1394. if key_word:
  1395. key_word_condition = Q(title__icontains=key_word) | Q(category__icontains=key_word) | Q(content__icontains=key_word)
  1396. Q_word = Q_word & key_word_condition
  1397. count = await online_courese_list.all().filter(Q_word).count()
  1398. if page_num and page_amount:
  1399. online_courese_list = online_courese_list.offset((page_num-1)*page_amount).limit(page_amount)
  1400. online_courese_list = await online_courese_list.all().filter(Q_word).order_by("id")
  1401. online_coureses = []
  1402. for online_coures_obj in online_courese_list:
  1403. online_coures_data = online_coures_obj.show_data()
  1404. online_coureses.append(online_coures_data)
  1405. return {"msg": "success", "code": 200, "total_num" : count,"online_coures": online_coureses}
  1406. except Exception as e:
  1407. return {"msg": str(e), "code": 500}
  1408. @classes.post("/delete_online_course")
  1409. async def delete_online_course(
  1410. online_course_id : int
  1411. ):
  1412. try:
  1413. await Online_course.filter(id=online_course_id).delete()
  1414. return {"msg": "success", "code": 200}
  1415. except Exception as e:
  1416. return {"msg": str(e), "code": 500}
  1417. @classes.get("/get_group_classes_and_articles")
  1418. async def get_group_classes_and_articles(
  1419. group_id : int,
  1420. page_num : Optional[int] = None,
  1421. page_amount : Optional[int] = None
  1422. ):
  1423. try:
  1424. class_name_list = Class_name.filter(group_id = group_id).all().order_by("-id")
  1425. article_list = Article_list.filter(group_id = group_id).all().order_by("-id")
  1426. class_count = await class_name_list.all().count()
  1427. article_count = await article_list.all().count()
  1428. if page_num and page_amount:
  1429. class_name_list = class_name_list.offset((page_num-1)*page_amount).limit(page_amount)
  1430. article_list = article_list.offset((page_num-1)*page_amount).limit(page_amount)
  1431. class_name_list = await class_name_list.all()
  1432. article_list = await article_list.all()
  1433. article_objs = []
  1434. for article_obj in article_list:
  1435. try :
  1436. article_tmp = {
  1437. "article_id": article_obj.id,
  1438. "title": article_obj.title,
  1439. "school_id" :article_obj.school_id,
  1440. "group_sort" :article_obj.group_sort,
  1441. "group_id" :article_obj.group_id,
  1442. "category": article_obj.category,
  1443. "create_time" : article_obj.create_time,
  1444. "click_time" : article_obj.click_time,
  1445. "depiction" : article_obj.depiction,
  1446. "content" : article_obj.content,
  1447. "files" : article_obj.files,
  1448. "vedio_url" : article_obj.vedio_url,
  1449. "tags" : article_obj.tags,
  1450. "cover_img": article_obj.cover_img
  1451. }
  1452. except:
  1453. article_tmp = {
  1454. "msg" : "fail to get data"
  1455. }
  1456. article_objs.append(article_tmp)
  1457. classes_name = []
  1458. for class_name_obj in class_name_list:
  1459. try:
  1460. school_obj = await Schools.get(id=class_name_obj.school_id)
  1461. school_obj_id = school_obj.id
  1462. except:
  1463. school_obj_id = 0
  1464. try:
  1465. special_class_list_name = class_name_obj.special_class_list_name
  1466. if special_class_list_name:
  1467. state = await check_date_state(class_name_id=class_name_obj.id,special_class_list_name=special_class_list_name)
  1468. else:
  1469. state = await check_date_state(class_name_id=class_name_obj.id)
  1470. class_data = class_name_obj.show_data()
  1471. if school_obj_id:
  1472. for key, item in school_obj.show_data().items():
  1473. class_data[key] = item
  1474. class_data["state"]=state["result"]["state"]
  1475. except Exception as e:
  1476. class_data = {
  1477. "msg" : str(e)
  1478. }
  1479. classes_name.append(class_data)
  1480. return {"msg": "success", "code": 200,"class_num" : class_count,"classes": classes_name,"article_num":article_count,"articles": article_objs}
  1481. except Exception as e:
  1482. return {"msg": str(e), "code": 500}
  1483. @classes.post("/add_attend_record_by_event")
  1484. async def add_attend_record(
  1485. class_id : int = Form(default=0),
  1486. ):
  1487. try:
  1488. if not class_id:
  1489. return {"msg": "Please input right ","code":500}
  1490. try:
  1491. class_detail_obj = await Class_detail.filter(class_list_id = class_id).all()
  1492. if not isinstance(class_detail_obj, list):
  1493. class_detail_obj = [class_detail_obj]
  1494. registration_obj = await Registration.filter(event_id = class_id,is_del = 0,).all()
  1495. if not isinstance(registration_obj, list):
  1496. registration_obj = [registration_obj]
  1497. if not class_detail_obj:
  1498. return {"msg": "no this class_detail_id session","code":500}
  1499. except:
  1500. return {"msg": "get class_detail_id error","code":500}
  1501. for obj in class_detail_obj:
  1502. class_event = await Class_list.get_or_none(id = class_id)
  1503. if class_event is None:
  1504. return {"msg": "no this class","code":500}
  1505. for obj1 in registration_obj:
  1506. new_record = await Attend_record.get_or_create(
  1507. class_detail_id = obj.id,
  1508. user_id = obj1.user_id,
  1509. defaults={'class_name_id':class_event.name_id,'class_event_id':class_id,'is_attend': 1}
  1510. )
  1511. return {"msg": "success", "code": 200}
  1512. except Exception as e:
  1513. return {"msg": str(e), "code": 500}
  1514. @classes.post("/add_attend_record")
  1515. async def add_attend_record(
  1516. class_detail_id : int = Form(default=0),
  1517. user_id : int = Form(default=0),
  1518. is_attend : int = Form(default=0)
  1519. ):
  1520. try:
  1521. if not class_detail_id or not user_id:
  1522. return {"msg": "Please input right ","code":500}
  1523. try:
  1524. class_detail_obj = await Class_detail.get_or_none(id = class_detail_id)
  1525. class_list = await Class_list.get_or_none(id = class_detail_obj.class_list_id)
  1526. if not class_detail_obj or not class_list:
  1527. return {"msg": "no this class_detail_id","code":500}
  1528. except:
  1529. return {"msg": "get class_detail_id error","code":500}
  1530. msg = ""
  1531. new_record,created = await Attend_record.get_or_create(
  1532. class_detail_id = class_detail_id,
  1533. user_id = user_id,
  1534. defaults = {
  1535. "class_name_id" : class_list.name_id,
  1536. "class_list_id" : class_detail_obj.class_list_id,
  1537. "is_attend" : is_attend
  1538. }
  1539. )
  1540. if not created:
  1541. try:
  1542. new_record.is_attend = is_attend
  1543. await new_record.save()
  1544. msg = "update success"
  1545. except:
  1546. msg = "update fail"
  1547. else:
  1548. msg = "created success"
  1549. return {"msg": msg, "code": 200,"new_record_id":new_record.id}
  1550. except Exception as e:
  1551. return {"msg": str(e), "code": 500}
  1552. @classes.post("/close_class")
  1553. async def close_class(user_id:int = Depends(check_token),class_name_id : int = None,cancel:int=None):
  1554. try:
  1555. if user_id :
  1556. user = await User.get(id=user_id)
  1557. class_name = await Class_name.get_or_none(id = class_name_id)
  1558. if not class_name :
  1559. return {"msg": "no this class", "code": 500}
  1560. elif class_name.is_record_point == 1:
  1561. if cancel==1:
  1562. user_attend_record = await Attend_record.filter(class_name_id=class_name_id,is_attend = 1)
  1563. for tmp in user_attend_record:
  1564. point = await User_point.get_or_none(user_id = tmp.user_id)
  1565. class_detail = await Class_detail.get_or_none(id = tmp.class_detail_id)
  1566. point.hours -= float(class_detail.hour)
  1567. await point.save()
  1568. class_name.is_record_point = 0
  1569. await class_name.save()
  1570. return {"msg": "class closed has cancel", "code": 500}
  1571. else:
  1572. return {"msg": "class has closed", "code": 500}
  1573. else :
  1574. if class_name.create_user_id:
  1575. if class_name.create_user_id != user_id:
  1576. print(class_name.create_user_id,user_id)
  1577. return {"msg": "no access", "code": 200}
  1578. user_attend_record = await Attend_record.filter(class_name_id=class_name_id,is_attend = 1)
  1579. for tmp in user_attend_record:
  1580. point,created = await User_point.get_or_create(
  1581. user_id = tmp.user_id,
  1582. defaults = {
  1583. "hours" : 0.0,
  1584. "points" : 0.0
  1585. }
  1586. )
  1587. class_detail = await Class_detail.get_or_none(id = tmp.class_detail_id)
  1588. point.hours += float(class_detail.hour)
  1589. await point.save()
  1590. result = await count_point(tmp.user_id)
  1591. class_name.is_record_point = 1
  1592. await class_name.save()
  1593. return {"msg":"success close class and record point", "code": 200}
  1594. except Exception as e:
  1595. return {"msg": str(e), "code": 500}
  1596. async def count_point(user_id) :
  1597. point = await User_point.get_or_none(user_id = user_id)
  1598. records = await Point_exchange_record.filter(user_id = user_id)
  1599. if point:
  1600. point.points = int(point.hours/3)
  1601. for record in records:
  1602. point.points -= record.point_exchange
  1603. await point.save()
  1604. return {"msg":"success", "code": 200}
  1605. else:
  1606. return {"msg":"沒有點數資料", "code": 500}
  1607. @classes.post("/delete_attend_record")
  1608. async def delete_attend_record(
  1609. id : int = 0
  1610. ):
  1611. try :
  1612. record = await Attend_record.get(id=id)
  1613. await Attend_record.filter(id=id).delete()
  1614. return {"msg": "success", "code": 200}
  1615. except Exception as e:
  1616. return {"msg": str(e), "code": 500}
  1617. @classes.get("/update_attend_record")
  1618. async def update_attend_record(
  1619. id : int = 0,
  1620. class_detail_id : Optional[int] = None,
  1621. user_id : Optional[int] = None,
  1622. is_attend : Optional[int] = None
  1623. ):
  1624. if not id :
  1625. return {"msg":"please input id"}
  1626. try :
  1627. tmp = await Attend_record.get(id=id)
  1628. if class_detail_id!=None:
  1629. tmp.class_detail_id = class_detail_id
  1630. if user_id!=None:
  1631. tmp.user_id = user_id
  1632. if is_attend!=None:
  1633. tmp.is_attend = is_attend
  1634. await tmp.save()
  1635. return {"msg": "success", "code": 200}
  1636. except Exception as e:
  1637. return {"msg": str(e), "code": 500}
  1638. @classes.get("/get_attend_record")
  1639. async def get_attend_record(
  1640. class_event_id : Optional[int] = None,
  1641. class_detail_id : Optional[int] = None,
  1642. user_id : Optional[int] = None,
  1643. is_attend : Optional[int] = None
  1644. ):
  1645. try:
  1646. attend_record_list = Attend_record.all()
  1647. if class_event_id:
  1648. id_list = []
  1649. class_detail_list = await Class_detail.filter(class_list_id = class_event_id)
  1650. for tmp in class_detail_list :
  1651. id_list.append(tmp.id)
  1652. attend_record_list = Attend_record.filter(class_detail_id__in=id_list)
  1653. if class_detail_id:
  1654. attend_record_list = attend_record_list.filter(class_detail_id = class_detail_id)
  1655. if user_id :
  1656. attend_record_list = attend_record_list.filter(user_id = user_id)
  1657. if is_attend :
  1658. attend_record_list = attend_record_list.filter(is_attend = is_attend)
  1659. attend_record_list = await attend_record_list.all()
  1660. attend_records = []
  1661. for obj in attend_record_list:
  1662. class_detail_list = await Class_detail.filter(id = obj.class_detail_id)
  1663. #registration_list = await Registration.filter(event_id = class_detail_list[0].class_list_id,user_id =obj.user_id)
  1664. user_list = await User.filter(id = obj.user_id)
  1665. user_information_list = await User_information.filter(user_id = obj.user_id)
  1666. #if len(registration_list)==0:
  1667. # continue
  1668. data = {
  1669. "id" :obj.id,
  1670. "event_id":class_detail_list[0].class_list_id,
  1671. "class_detail_id" :obj.class_detail_id,
  1672. "user_id" :obj.user_id,
  1673. "is_attend" :obj.is_attend,
  1674. #"reg_confirm" : registration_list[0].reg_confirm,
  1675. #"payment_status": registration_list[0].payment_status,
  1676. #"five_digits": registration_list[0].five_digits,
  1677. "real_name": user_information_list[0].name,
  1678. "phone": user_information_list[0].phone,
  1679. "email": user_list[0].email
  1680. }
  1681. attend_records.append(data)
  1682. return {"msg": "success", "code": 200,"attend_record_list":attend_records}
  1683. except Exception as e:
  1684. return {"msg": str(e), "code": 500}
  1685. import pymysql
  1686. @classes.get("/copy")
  1687. async def copy(
  1688. from_id : Optional[int] = None
  1689. ):
  1690. try:
  1691. connection = pymysql.connect(
  1692. host='db.ptt.cx',
  1693. user='choozmo',
  1694. password='pAssw0rd',
  1695. database='test_copy'
  1696. )
  1697. with connection.cursor() as cursor:
  1698. sql = "SELECT * FROM class_name"
  1699. cursor.execute(sql)
  1700. rows = cursor.fetchall()
  1701. for row in rows:
  1702. # print(row)
  1703. class_name,created = await Class_name.get_or_create(
  1704. name = row[1],
  1705. defaults = {
  1706. "school_id":1,
  1707. "category" : None,
  1708. "introduction" : row[4],
  1709. "organizer" : None,
  1710. "cover_img" : None,
  1711. "group_id" :9,
  1712. "group_sort" : "希望工程",
  1713. "special_class_list_name" :None,
  1714. "recommend" : 0,
  1715. "is_inner" :1,
  1716. "is_check" :1,
  1717. "create_user_id" :None,
  1718. "create_time" : datetime.now(),
  1719. "is_delete" : 0,
  1720. "is_record_point" :0
  1721. }
  1722. )
  1723. print(class_name.id)
  1724. if created:
  1725. sql = f"SELECT * FROM schools where id = {row[2]}"
  1726. cursor.execute(sql)
  1727. school_row = cursor.fetchone()
  1728. school,school_created = await Schools.get_or_create(
  1729. name = school_row[1],
  1730. defaults = {
  1731. "longitude" : school_row[2],
  1732. "latitude" : school_row[3],
  1733. "address" :school_row[4],
  1734. "update_time" :school_row[5],
  1735. "school_introduction":None,
  1736. "email":None,
  1737. "phone":None,
  1738. "school_create_user_id" :None,
  1739. "teachers" : None,
  1740. "is_delete" : 0,
  1741. "is_pass_proposal" : 1
  1742. }
  1743. )
  1744. class_name.school_id = school.id
  1745. await class_name.save()
  1746. event,event_created = await Class_list.get_or_create(
  1747. name_id = class_name.id,
  1748. defaults = {
  1749. "event": None,
  1750. "start_time": None,
  1751. "end_time": None,
  1752. "location": None,
  1753. "lecturer": None,
  1754. "contact": None,
  1755. "content": None,
  1756. "URL": None,
  1757. "people": None,
  1758. "fee_method": None,
  1759. "registration_way": None,
  1760. "remark": None,
  1761. "ATM_address":None,
  1762. "fee_payment" :None,
  1763. "create_user_id" :None,
  1764. "event_create_time" : datetime.now(),
  1765. "files" : None
  1766. }
  1767. )
  1768. else :
  1769. class_name.introduction = row[4]
  1770. print(class_name.introduction)
  1771. await class_name.save()
  1772. cursor.close()
  1773. connection.close()
  1774. return {"msg": "success", "code": 500}
  1775. except Exception as e:
  1776. return {"msg": str(e), "code": 500}