Эх сурвалжийг харах

Merge remote-tracking branch 'origin/master'

# Conflicts:
#	app/models/models.py
zooey 2 жил өмнө
parent
commit
83e4a15d42

+ 68 - 59
app/api/article.py

@@ -18,7 +18,7 @@ from fastapi.responses import HTMLResponse
 
 
 article = APIRouter()
 article = APIRouter()
 
 
-IMAGEDIR = "/var/www/ntcri/ntcri/assets/article_files/"
+IMAGEDIR = "/var/www/ntcri/assets/article_files/"
 IMAGEDIR_short = "assets/article_files/"
 IMAGEDIR_short = "assets/article_files/"
 
 
 async def create_upload_files(files:Optional[List[UploadFile]] = File(None)):
 async def create_upload_files(files:Optional[List[UploadFile]] = File(None)):
@@ -67,37 +67,39 @@ async def get_article(
         if group_id :
         if group_id :
             article_list = article_list.filter(group_id = group_id).all()
             article_list = article_list.filter(group_id = group_id).all()
 
 
-        article_list = await article_list.all()
+        count = await article_list.all().count()
+
+        if page_num and page_amount:
+            article_list = article_list.offset((page_num-1)*page_amount).limit(page_amount)
+
+        article_list = await article_list.all().order_by("-create_time")
 
 
         article_objs = []
         article_objs = []
-        count = 0
+        
         for article_obj in article_list:
         for article_obj in article_list:
-            article_tmp = {
-            "article_id": article_obj.id,
-            "title": article_obj.title,
-            "school_id" :article_obj.school_id,
-            "group_sort" :article_obj.group_sort,
-            "group_id" :article_obj.group_id,
-            "category": article_obj.category,
-            "create_time" : article_obj.create_time,
-            "click_time" : article_obj.click_time,
-            "depiction" : article_obj.depiction,
-            "content" : article_obj.content,
-            "files" : article_obj.files,
-            "vedio_url" : article_obj.vedio_url,
-            "tags" : article_obj.tags,
-            "cover_img": article_obj.cover_img,
-            "url" : article_obj.url
-            }
-            if page_num and page_amount:
-                if count < page_num*page_amount and count >= (page_num-1)*page_amount :
-                    article_objs.append(article_tmp)
-                    count += 1
-                elif  count >= page_num*page_amount: count += 1
-                else : count += 1
-            else :
-                article_objs.append(article_tmp)
-                count += 1
+            try:
+                article_tmp = {
+                    "article_id": article_obj.id,
+                    "title": article_obj.title,
+                    "school_id" :article_obj.school_id,
+                    "group_sort" :article_obj.group_sort,
+                    "group_id" :article_obj.group_id,
+                    "category": article_obj.category,
+                    "create_time" : article_obj.create_time,
+                    "click_time" : article_obj.click_time,
+                    "depiction" : article_obj.depiction,
+                    "content" : article_obj.content,
+                    "files" : article_obj.files,
+                    "video_url" : article_obj.vedio_url,
+                    "tags" : article_obj.tags,
+                    "cover_img": article_obj.cover_img,
+                    "url" : article_obj.url
+                }
+            except:
+                article_tmp = {"msg":"data wrong"}
+            
+            article_objs.append(article_tmp)
+                
 
 
         return {"msg": "success", "code": 200, "total_num":count,"articles": article_objs}
         return {"msg": "success", "code": 200, "total_num":count,"articles": article_objs}
     except Exception as e:
     except Exception as e:
@@ -213,7 +215,7 @@ async def update_article(
         if tags != '[]':
         if tags != '[]':
             article_obj.tags = tags
             article_obj.tags = tags
 
 
-        if url != '[]':
+        if url != '':
             article_obj.url = url
             article_obj.url = url
 
 
         
         
@@ -235,7 +237,11 @@ async def update_article(
 @article.post("/delete_article")
 @article.post("/delete_article")
 async def delete_article(id: int = 0):
 async def delete_article(id: int = 0):
     if id != 0:
     if id != 0:
-        await Article_list.filter(id=id).delete()
+        article_obj = await Article_list.get(id=id)
+
+        article_obj.is_del = 1
+
+        await article_obj.save()
         return {"msg": "success", "code": 200}
         return {"msg": "success", "code": 200}
     else :
     else :
         return {"msg": "please input ID", "code": 200}
         return {"msg": "please input ID", "code": 200}
@@ -244,7 +250,7 @@ async def delete_article(id: int = 0):
 async def search_article_like(keyword: str,page_num : Optional[int] = None,
 async def search_article_like(keyword: str,page_num : Optional[int] = None,
     page_amount : Optional[int] = None):
     page_amount : Optional[int] = None):
     try:
     try:
-        article_list = await Article_list.filter(
+        article_list = Article_list.filter(
             Q(title__icontains=keyword)|
             Q(title__icontains=keyword)|
             Q(category__icontains=keyword)|
             Q(category__icontains=keyword)|
             Q(content__icontains=keyword)|
             Q(content__icontains=keyword)|
@@ -252,35 +258,38 @@ async def search_article_like(keyword: str,page_num : Optional[int] = None,
             Q(tags__icontains=keyword)
             Q(tags__icontains=keyword)
                 ).all()
                 ).all()
         
         
+        count = await article_list.all().count()
+
+        if page_num and page_amount:
+            article_list = article_list.offset((page_num-1)*page_amount).limit(page_amount)
+
+        article_list = await article_list.all().order_by("-create_time")
+        
         article_objs = []
         article_objs = []
-        count = 0
+        
         for article_obj in article_list:
         for article_obj in article_list:
-            article_tmp = {
-            "article_id": article_obj.id,
-            "title": article_obj.title,
-            "school_id" :article_obj.school_id,
-            "group_sort" :article_obj.group_sort,
-            "group_id" :article_obj.group_id,
-            "category": article_obj.category,
-            "create_time" : article_obj.create_time,
-            "click_time" : article_obj.click_time,
-            "depiction" : article_obj.depiction,
-            "content" : article_obj.content,
-            "files" : article_obj.files,
-            "vedio_url" : article_obj.vedio_url,
-            "tags" : article_obj.tags,
-            "cover_img": article_obj.cover_img,
-            "url" : article_obj.url
-        }
-            if page_num and page_amount:
-                if count < page_num*page_amount and count >= (page_num-1)*page_amount :
-                    article_objs.append(article_tmp)
-                    count += 1
-                elif  count >= page_num*page_amount: count += 1
-                else : count += 1
-            else :
-                article_objs.append(article_tmp)
-                count += 1
+            try:
+                article_tmp = {
+                    "article_id": article_obj.id,
+                    "title": article_obj.title,
+                    "school_id" :article_obj.school_id,
+                    "group_sort" :article_obj.group_sort,
+                    "group_id" :article_obj.group_id,
+                    "category": article_obj.category,
+                    "create_time" : article_obj.create_time,
+                    "click_time" : article_obj.click_time,
+                    "depiction" : article_obj.depiction,
+                    "content" : article_obj.content,
+                    "files" : article_obj.files,
+                    "video_url" : article_obj.vedio_url,
+                    "tags" : article_obj.tags,
+                    "cover_img": article_obj.cover_img,
+                    "url" : article_obj.url
+                }
+            except:
+                article_tmp = {"msg":"data wrong"}
+            
+            article_objs.append(article_tmp)
 
 
         return {"msg": "success", "code": 200, "total_num":count,"article": article_objs}
         return {"msg": "success", "code": 200, "total_num":count,"article": article_objs}
     except Exception as e:
     except Exception as e:

+ 457 - 156
app/api/classes.py

@@ -3,7 +3,7 @@ from typing import List,Optional
 from fastapi.responses import FileResponse
 from fastapi.responses import FileResponse
 from random import randint
 from random import randint
 from fastapi.security import OAuth2PasswordRequestForm
 from fastapi.security import OAuth2PasswordRequestForm
-from app.models.models import User,Favorite_course,Article_list
+from app.models.models import User,Favorite_course,Article_list,Class_date,Attend_record
 from app.models.models import Class_list,Schools,Class_detail,Class_name,Registration,Group_name,Online_course
 from app.models.models import Class_list,Schools,Class_detail,Class_name,Registration,Group_name,Online_course
 from app.api import deps
 from app.api import deps
 from sqlalchemy.orm import Session
 from sqlalchemy.orm import Session
@@ -20,6 +20,7 @@ from tortoise.queryset import Q
 from fastapi.responses import HTMLResponse
 from fastapi.responses import HTMLResponse
 import requests
 import requests
 import json
 import json
+from itertools import chain
 
 
 classes = APIRouter()
 classes = APIRouter()
 
 
@@ -35,7 +36,7 @@ async def check_token(access_token: str):
 
 
     return user_id
     return user_id
 
 
-IMAGEDIR = "/var/www/ntcri/ntcri/assets/"
+IMAGEDIR = "/var/www/ntcri/assets/"
 IMAGEDIR_short = "assets/"
 IMAGEDIR_short = "assets/"
 
 
 async def update_location_time(location_id: int):
 async def update_location_time(location_id: int):
@@ -50,8 +51,7 @@ async def insert_school(
     location_name: str = Form(default=''),
     location_name: str = Form(default=''),
     Lng: str = Form(default=''),
     Lng: str = Form(default=''),
     Lat: str = Form(default=''),
     Lat: str = Form(default=''),
-    address : str = Form(default=''),
-    update_time : datetime = Form(default=datetime.now())
+    address : str = Form(default='')
 ):
 ):
     try:
     try:
         new_school = await Schools.create(
         new_school = await Schools.create(
@@ -59,7 +59,7 @@ async def insert_school(
             longitude=Lng,
             longitude=Lng,
             latitude=Lat,
             latitude=Lat,
             address = address,
             address = address,
-            update_time = update_time
+            update_time = datetime.now()
         )
         )
         
         
         return {"msg": "success", "code": 200, "location_id": new_school.id}
         return {"msg": "success", "code": 200, "location_id": new_school.id}
@@ -82,7 +82,7 @@ async def insert_class_name(
         if cover_img_file != '':
         if cover_img_file != '':
             contents = await cover_img_file.read()
             contents = await cover_img_file.read()
 
 
-        #save the file
+            #save the file
             with open(f"{IMAGEDIR}{cover_img_file.filename}", "wb") as f:
             with open(f"{IMAGEDIR}{cover_img_file.filename}", "wb") as f:
                 f.write(contents)
                 f.write(contents)
         
         
@@ -117,7 +117,9 @@ async def insert_event(
     people : str = Form(default=''),
     people : str = Form(default=''),
     fee_method: str = Form(default=''),
     fee_method: str = Form(default=''),
     registration_way: str = Form(default=''),
     registration_way: str = Form(default=''),
-    registration_day: str = Form(default=''),
+    registration_start:  datetime = Form(default=datetime.now()),
+    registration_end:  datetime = Form(default=datetime.now()),
+    number_limit: int = Form(default=0),
     remark : str = Form(default='')
     remark : str = Form(default='')
 ):    
 ):    
     try:
     try:
@@ -140,14 +142,63 @@ async def insert_event(
             people=people,
             people=people,
             fee_method=fee_method,
             fee_method=fee_method,
             registration_way=registration_way,
             registration_way=registration_way,
-            registration_day=registration_day,
             remark=remark
             remark=remark
         )
         )
 
 
+        await Class_date.create(
+            class_list_id = new_class.id,
+            registration_start = registration_start,
+            registration_end = registration_end,
+            number_limit = number_limit,
+            amount_left = number_limit
+        )
+
         return {"msg": "success", "code": 200, "class_id": new_class.id}
         return {"msg": "success", "code": 200, "class_id": new_class.id}
     except Exception as e:
     except Exception as e:
         return {"msg": str(e), "code": 500}
         return {"msg": str(e), "code": 500}
-    
+
+@classes.post("/auto_create_session")
+async def auto_create_session(
+    class_event_id : int = Form(default=0),
+    week_day_str : str = Form(default="[]")
+):
+    try:
+        week_day = eval(week_day_str)
+
+        #print(week_day)
+        
+        class_obj = await Class_list.get(id = class_event_id)
+        time_stemp = class_obj.start_time
+        
+        while time_stemp <= class_obj.end_time:
+            if week_day[time_stemp.weekday()]:
+                time_del =  class_obj.end_time.hour - time_stemp.hour
+                time_del_minutes =  class_obj.end_time.minute - time_stemp.minute
+                time_end =  time_stemp + timedelta(hours=time_del,minutes=time_del_minutes)
+                #print(time_end,class_obj.end_time.hour)
+
+                session_list = await Class_detail.filter(class_list_id=class_event_id).all()
+                session = 0
+                if session_list != []:
+                    for session_obj in session_list:
+                        if session < session_obj.sessions:
+                            session = session_obj.sessions
+
+                new_session = await Class_detail.create(
+                    class_list_id=class_event_id,
+                    start_time=time_stemp,
+                    end_time=time_end,
+                    sessions=session +1,
+                    content = ""
+                ) 
+
+            time_stemp = time_stemp + timedelta(days=1) 
+
+        return {"msg": "success", "code": 200}
+    except Exception as e:
+        return {"msg": str(e), "code": 500}
+        
+
 @classes.post("/insert_session")
 @classes.post("/insert_session")
 async def insert_session(
 async def insert_session(
     class_event_id : int = Form(default=0),
     class_event_id : int = Form(default=0),
@@ -272,7 +323,9 @@ async def update_event(
     people : str = Form(default=''),
     people : str = Form(default=''),
     fee_method: str = Form(default=''),
     fee_method: str = Form(default=''),
     registration_way: str = Form(default=''),
     registration_way: str = Form(default=''),
-    registration_day:  str = Form(default=''),
+    registration_start:  datetime = Form(default=datetime.now()),
+    registration_end:  datetime = Form(default=datetime.now()),
+    number_limit: int = Form(default=0),
     remark :  str = Form(default='')
     remark :  str = Form(default='')
 ):
 ):
     try:
     try:
@@ -314,13 +367,36 @@ async def update_event(
         if registration_way.strip() != '':
         if registration_way.strip() != '':
             class_obj.registration_way = registration_way
             class_obj.registration_way = registration_way
 
 
-        if registration_day.strip() != '':
-            class_obj.registration_day = registration_day
-
         if remark.strip() != '':
         if remark.strip() != '':
             class_obj.remark = remark
             class_obj.remark = remark
+
+        try :
+            class_date_obj = await Class_date.get(class_list_id=id)
+
+            if registration_start != datetime.now():
+                class_date_obj.registration_start = registration_start
+
+            if registration_end != datetime.now():
+                class_date_obj.registration_end = registration_end
+
+            if number_limit != 0:
+                class_date_obj.number_limit = number_limit
+
+            await class_date_obj.save()
+        
+        except:
+            await Class_date.create(
+                class_list_id = id,
+                registration_start = registration_start,
+                registration_end = registration_end,
+                number_limit = number_limit,
+                amount_left = number_limit
+            )
+
         
         
         await class_obj.save()
         await class_obj.save()
+        
+
         return {"msg": "success", "code": 200}
         return {"msg": "success", "code": 200}
     except Exception as e:
     except Exception as e:
         return {"msg": str(e), "code": 500}
         return {"msg": str(e), "code": 500}
@@ -374,6 +450,7 @@ async def delete(id: int):
     if id:
     if id:
         await Class_detail.filter(class_list_id=id).delete()
         await Class_detail.filter(class_list_id=id).delete()
         await Class_list.filter(id=id).delete()
         await Class_list.filter(id=id).delete()
+        await Class_date.filter(class_list_id=id).delete()
         return {"msg": "success", "code": 200}
         return {"msg": "success", "code": 200}
     
     
 @classes.post("/delete_class_name")
 @classes.post("/delete_class_name")
@@ -382,11 +459,59 @@ async def delete(id: int):
         class_event_list = await Class_list.filter(name_id=id).all()
         class_event_list = await Class_list.filter(name_id=id).all()
         for class_event_obj in class_event_list:
         for class_event_obj in class_event_list:
             await Class_detail.filter(class_list_id=class_event_obj.id).delete()
             await Class_detail.filter(class_list_id=class_event_obj.id).delete()
+            await Class_date.filter(class_list_id=class_event_obj.id).delete()
 
 
         await Class_list.filter(name_id=id).delete()
         await Class_list.filter(name_id=id).delete()
         await Class_name.filter(id=id).delete()
         await Class_name.filter(id=id).delete()
+        
         return {"msg": "success", "code": 200}
         return {"msg": "success", "code": 200}
 
 
+@classes.get("/get_class_state")
+async def check_date_state(
+    class_name_id : Optional[int] = None,
+    class_event_id : Optional[int] = None
+):
+    if class_name_id: 
+        class_list = await Class_list.filter(name_id=class_name_id).all()
+    elif class_event_id:
+        class_list = await Class_list.filter(id=class_event_id).all()
+    else:
+        return {"msg": 'please input ID', "code": 500}
+    
+    result = {"reg": "尚未開放報名", "start_class":"課程尚未開始"}
+    class_check = True
+    reg_check = True
+    try:
+        for class_obj in class_list:
+            if class_check:
+                try:
+                    if class_obj.start_time.replace(tzinfo=None) <= datetime.now() and class_obj.end_time.replace(tzinfo=None) >= datetime.now():
+                        result["start_class"] = "開課中"
+                        class_check = False
+                    elif class_obj.end_time.replace(tzinfo=None) < datetime.now():
+                        result["start_class"] = "課程已結束"
+                except Exception as e:
+                    result["start_class"] = "尚未確認開課時間"
+            
+            if reg_check:
+                try:
+                    class_date_obj = await Class_date.get(class_list_id=class_obj.id)
+                    if class_date_obj.registration_start.replace(tzinfo=None) <= datetime.now() and class_date_obj.registration_end.replace(tzinfo=None) >= datetime.now() :
+                        if class_date_obj.amount_left == 0:
+                            result["reg"] = "報名已額滿"
+                        else:
+                            result["reg"] = "開放報名中"
+
+                        reg_check = False
+                    elif class_date_obj.registration_end.replace(tzinfo=None) < datetime.now():
+                        result["reg"] = "報名已結束"
+                except Exception as e:
+                    result["reg"] = "尚未確認報名時間"
+
+        return {"msg": "success", "code": 200, "result": result}
+    except Exception as e:
+        return {"msg": str(e), "code": 500}
+
 @classes.get("/get_event")
 @classes.get("/get_event")
 async def search_event(
 async def search_event(
     class_name_id: Optional[int] = None,
     class_name_id: Optional[int] = None,
@@ -394,9 +519,9 @@ async def search_event(
 ):
 ):
     try:
     try:
         if event_id :
         if event_id :
-            class_list = await Class_list.filter(id=event_id).all()
+            class_list = await Class_list.filter(id=event_id).all().order_by("-start_time")
         elif class_name_id:
         elif class_name_id:
-            class_list = await Class_list.filter(name_id=class_name_id).all()
+            class_list = await Class_list.filter(name_id=class_name_id).all().order_by("-start_time")
         else :
         else :
             return {"msg": "please input class_name_id or event_id", "code": 200}
             return {"msg": "please input class_name_id or event_id", "code": 200}
 
 
@@ -405,24 +530,42 @@ async def search_event(
             class_name_obj = await Class_name.get(id=class_obj.name_id)
             class_name_obj = await Class_name.get(id=class_obj.name_id)
             class_name = class_name_obj.name
             class_name = class_name_obj.name
 
 
-            class_data = {
-            "class_name" : class_name,
-            "event_id": class_obj.id,
-            "name_id": class_obj.name_id,
-            "event": class_obj.event,
-            "start_time": class_obj.start_time,
-            "end_time": class_obj.end_time,
-            "location": class_obj.location,
-            "lecturer": class_obj.lecturer,
-            "contact": class_obj.contact,
-            "content": class_obj.content,
-            "URL": class_obj.URL,
-            "people": class_obj.people,
-            "fee_method": class_obj.fee_method,
-            "registration_way": class_obj.registration_way,
-            "registration_day": class_obj.registration_day,
-            "remark": class_obj.remark
-        }
+            try : 
+                state = await check_date_state(class_event_id=class_obj.id)
+                class_data = {
+                    "class_name" : class_name,
+                    "event_id": class_obj.id,
+                    "name_id": class_obj.name_id,
+                    "event": class_obj.event,
+                    "start_time": class_obj.start_time,
+                    "end_time": class_obj.end_time,
+                    "location": class_obj.location,
+                    "lecturer": class_obj.lecturer,
+                    "contact": class_obj.contact,
+                    "content": class_obj.content,
+                    "URL": class_obj.URL,
+                    "people": class_obj.people,
+                    "fee_method": class_obj.fee_method,
+                    "registration_way": class_obj.registration_way,
+                    "remark": class_obj.remark,
+                    "state": state["result"]
+                }
+
+                try:
+                    class_date_obj = await Class_date.get(class_list_id=class_obj.id)
+                    class_data["registration_start"] = class_date_obj.registration_start
+                    class_data["registration_end"] = class_date_obj.registration_end
+                    class_data["number_limit"] = class_date_obj.number_limit
+                    class_data["amount_left"] = class_date_obj.amount_left
+                
+                except:
+                    pass
+
+            except:
+                class_data = {
+                    "msg" : "fail to get data"
+                }
+            
             classes.append(class_data)
             classes.append(class_data)
 
 
         return {"msg": "success", "code": 200, "classes": classes}
         return {"msg": "success", "code": 200, "classes": classes}
@@ -431,27 +574,51 @@ async def search_event(
     
     
 @classes.get("/get_school")
 @classes.get("/get_school")
 async def get_school(
 async def get_school(
-    location_id : Optional[int] = None
+    location_id : Optional[int] = None,
+    keyword : Optional[str] = None, 
+    location_keyword : Optional[str] = None, 
+    page_num : Optional[int] = None,
+    page_amount : Optional[int] = None
 ):
 ):
     try:
     try:
+        school_list = Schools.all()
+
         if location_id :
         if location_id :
-            school_list = await Schools.filter(id = location_id).all()
-        else :
-            school_list = await Schools.all()
+            school_list = school_list.filter(id = location_id).all()
+        
+        if keyword :
+            school_list = school_list.filter(Q(name__icontains=keyword)).all()
+
+        if location_keyword :
+            school_list = school_list.filter(Q(address__icontains=location_keyword)).all()
+        
+        count = await school_list.all().count()
+
+        if page_num and page_amount:
+            school_list = school_list.offset((page_num-1)*page_amount).limit(page_amount)
+        
+        school_list = await school_list.all().order_by("-update_time")
         
         
         schools = []
         schools = []
+
         for school_obj in school_list:
         for school_obj in school_list:
-            school_data = {
-                "location_id": school_obj.id,
-                "location_name": school_obj.name,
-                "Lng": school_obj.longitude,
-                "Lat": school_obj.latitude,
-                "address": school_obj.address,
-                "update_time":school_obj.update_time
-            }
-            schools.append(school_data)
+            try :
+                school_data = {
+                    "location_id": school_obj.id,
+                    "location_name": school_obj.name,
+                    "Lng": school_obj.longitude,
+                    "Lat": school_obj.latitude,
+                    "address": school_obj.address,
+                    "update_time":school_obj.update_time
+                }
+            
+                schools.append(school_data)
+
+            except:
+                schools.append({"msg : data wrong"})
+            
 
 
-        return {"msg": "success", "code": 200, "schools": schools}
+        return {"msg": "success", "code": 200, "total_num" : count,"schools": schools}
     except Exception as e:
     except Exception as e:
         return {"msg": str(e), "code": 500}
         return {"msg": str(e), "code": 500}
     
     
@@ -484,6 +651,9 @@ async def get_class_name(
     try:
     try:
         class_name_list = Class_name.all()
         class_name_list = Class_name.all()
 
 
+        if group_id:
+            class_name_list = class_name_list.filter(group_id = group_id).all()
+
         if group_sort:
         if group_sort:
             class_name_list = class_name_list.filter(group_sort = group_sort).all()
             class_name_list = class_name_list.filter(group_sort = group_sort).all()
         
         
@@ -496,10 +666,15 @@ async def get_class_name(
         if class_name_id :
         if class_name_id :
             class_name_list = class_name_list.filter(id = class_name_id).all()
             class_name_list = class_name_list.filter(id = class_name_id).all()
 
 
-        class_name_list = await class_name_list.all()
+        count = await class_name_list.all().count()
+
+        if page_num and page_amount:
+            class_name_list = class_name_list.offset((page_num-1)*page_amount).limit(page_amount)
+        
+        class_name_list = await class_name_list.all().order_by("-id")
         classes_name = []
         classes_name = []
 
 
-        count = 0
+        
         for class_name_obj in class_name_list:
         for class_name_obj in class_name_list:
             school_obj = await Schools.filter(id=class_name_obj.school_id).all()
             school_obj = await Schools.filter(id=class_name_obj.school_id).all()
             school_name = ""
             school_name = ""
@@ -508,27 +683,28 @@ async def get_class_name(
             else :
             else :
                 school_obj = await Schools.get(id=class_name_obj.school_id)
                 school_obj = await Schools.get(id=class_name_obj.school_id)
                 school_name = school_obj.name
                 school_name = school_obj.name
-            if not group_id or class_name_obj.group_id==group_id:
+            
+            try:
+                state = await check_date_state(class_name_id=class_name_obj.id)
                 class_data = {
                 class_data = {
-                    "class_name_id": class_name_obj.id,
-                    "name": class_name_obj.name,
-                    "school":school_name,
-                    "category": class_name_obj.category,
-                    "introduction": class_name_obj.introduction,
-                    "organizer": class_name_obj.organizer,
-                    "group_id": class_name_obj.group_id,
-                    "cover_img": class_name_obj.cover_img,
-                    "group_sort":class_name_obj.group_sort
-                    }
-                if page_num and page_amount:
-                    if count < page_num*page_amount and count >= (page_num-1)*page_amount :
-                        classes_name.append(class_data)
-                        count += 1
-                    elif  count >= page_num*page_amount: count += 1
-                    else : count += 1
-                else :
-                    classes_name.append(class_data)
-                    count += 1
+                        "class_name_id": class_name_obj.id,
+                        "name": class_name_obj.name,
+                        "school":school_name,
+                        "category": class_name_obj.category,
+                        "introduction": class_name_obj.introduction,
+                        "organizer": class_name_obj.organizer,
+                        "group_id": class_name_obj.group_id,
+                        "cover_img": class_name_obj.cover_img,
+                        "group_sort":class_name_obj.group_sort,
+                        "state": state["result"]
+                        }
+            except:
+                class_data = {
+                    "msg" : "fail to get data"
+                } 
+                
+            classes_name.append(class_data)
+                    
 
 
         return {"msg": "success", "code": 200,"total_num" : count,"classes": classes_name}
         return {"msg": "success", "code": 200,"total_num" : count,"classes": classes_name}
     
     
@@ -540,7 +716,10 @@ async def get_session(
     event_id : Optional[int] = None
     event_id : Optional[int] = None
 ):
 ):
     try:
     try:
-        class_session_list = await Class_detail.filter(class_list_id=event_id).all()
+        if not event_id:
+            return {"msg": "please input event_id", "code": 500}
+        
+        class_session_list = await Class_detail.filter(class_list_id=event_id).all().order_by("start_time")
         
         
         classe_sessions = []
         classe_sessions = []
         for class_session_obj in class_session_list:
         for class_session_obj in class_session_list:
@@ -567,63 +746,64 @@ async def search_class_like(keyword: str):
         for class_obj in class_list:
         for class_obj in class_list:
             class_name = await Class_name.get(id=class_obj.name_id)
             class_name = await Class_name.get(id=class_obj.name_id)
             school_obj = await Schools.get(id=class_name.school_id)
             school_obj = await Schools.get(id=class_name.school_id)
+            
             class_data = {
             class_data = {
-                "msg": "success",
-            "code": 200,
-            "class_id": class_obj.id,
-            "name": class_name.name,
-            "school":school_obj.name,
-            "category": class_name.category,
-            "introduction": class_name.introduction,
-            "organizer": class_name.organizer,
-            "cover_img": class_name.cover_img,
-            "event": class_obj.event,
-            "start_time": class_obj.start_time,
-            "end_time": class_obj.end_time,
-            "location": class_obj.location,
-            "lecturer": class_obj.lecturer,
-            "contact": class_obj.contact,
-            "content": class_obj.content,
-            "URL": class_obj.URL,
-            "people": class_obj.people,
-            "fee_method": class_obj.fee_method,
-            "registration_way": class_obj.registration_way,
-            "remark": class_obj.remark
-
+                "class_id": class_obj.id,
+                "name": class_name.name,
+                "school":school_obj.name,
+                "category": class_name.category,
+                "introduction": class_name.introduction,
+                "organizer": class_name.organizer,
+                "cover_img": class_name.cover_img,
+                "event": class_obj.event,
+                "start_time": class_obj.start_time,
+                "end_time": class_obj.end_time,
+                "location": class_obj.location,
+                "lecturer": class_obj.lecturer,
+                "contact": class_obj.contact,
+                "content": class_obj.content,
+                "URL": class_obj.URL,
+                "people": class_obj.people,
+                "fee_method": class_obj.fee_method,
+                "registration_way": class_obj.registration_way,
+                "remark": class_obj.remark
             }
             }
             classes.append(class_data)
             classes.append(class_data)
 
 
-        class_name_list = await Class_name.filter(Q(name__icontains=keyword)|Q(group_sort__icontains=keyword)).all()
+        class_name_list = await Class_name.filter(
+            Q(name__icontains=keyword)|
+            Q(group_sort__icontains=keyword)|
+            Q(category__icontains=keyword)|
+            Q(organizer__icontains=keyword)).all()
 
 
         for class_name in class_name_list:
         for class_name in class_name_list:
             class_list = await Class_list.filter(name_id=class_name.id).all()
             class_list = await Class_list.filter(name_id=class_name.id).all()
             for class_obj in class_list:
             for class_obj in class_list:
                 school_obj = await Schools.get(id=class_name.school_id)
                 school_obj = await Schools.get(id=class_name.school_id)
                 class_data = {
                 class_data = {
-                "msg": "success",
-            "code": 200,
-            "class_id": class_obj.id,
-            "name": class_name.name,
-            "school":school_obj.name,
-            "category": class_name.category,
-            "introduction": class_name.introduction,
-            "organizer": class_name.organizer,
-            "cover_img": class_name.cover_img,
-            "event": class_obj.event,
-            "start_time": class_obj.start_time,
-            "end_time": class_obj.end_time,
-            "location": class_obj.location,
-            "lecturer": class_obj.lecturer,
-            "contact": class_obj.contact,
-            "content": class_obj.content,
-            "URL": class_obj.URL,
-            "people": class_obj.people,
-            "fee_method": class_obj.fee_method,
-            "registration_way": class_obj.registration_way,
-            "remark": class_obj.remark
+                    "class_id": class_obj.id,
+                    "name": class_name.name,
+                    "school":school_obj.name,
+                    "category": class_name.category,
+                    "introduction": class_name.introduction,
+                    "organizer": class_name.organizer,
+                    "cover_img": class_name.cover_img,
+                    "event": class_obj.event,
+                    "start_time": class_obj.start_time,
+                    "end_time": class_obj.end_time,
+                    "location": class_obj.location,
+                    "lecturer": class_obj.lecturer,
+                    "contact": class_obj.contact,
+                    "content": class_obj.content,
+                    "URL": class_obj.URL,
+                    "people": class_obj.people,
+                    "fee_method": class_obj.fee_method,
+                    "registration_way": class_obj.registration_way,
+                    "remark": class_obj.remark
 
 
-            }
-                classes.append(class_data)
+                }
+                if class_data not in classes:
+                    classes.append(class_data)
 
 
         return {"msg": "success", "code": 200, "classes": classes}
         return {"msg": "success", "code": 200, "classes": classes}
     except Exception as e:
     except Exception as e:
@@ -793,41 +973,51 @@ async def get_group_classes_and_articles(
     page_amount : Optional[int] = None
     page_amount : Optional[int] = None
 ):
 ):
     try:
     try:
-        class_name_list = await Class_name.filter(group_id = group_id).all()
-        article_list = await Article_list.filter(group_id = group_id).all()
+        class_name_list = Class_name.filter(group_id = group_id).all().order_by("-id")
+        article_list = Article_list.filter(group_id = group_id).all().order_by("-id")
+
+        class_count = await class_name_list.all().count()
+        article_count = await article_list.all().count()
+
+        if page_num and page_amount:
+            class_name_list = class_name_list.offset((page_num-1)*page_amount).limit(page_amount)
+            article_list = article_list.offset((page_num-1)*page_amount).limit(page_amount)
+        
+        
+        class_name_list = await class_name_list.all()
+        article_list = await article_list.all()
 
 
         article_objs = []
         article_objs = []
-        article_count = 0
+        
         for article_obj in article_list:
         for article_obj in article_list:
-            article_tmp = {
-                "article_id": article_obj.id,
-                "title": article_obj.title,
-                "school_id" :article_obj.school_id,
-                "group_sort" :article_obj.group_sort,
-                "group_id" :article_obj.group_id,
-                "category": article_obj.category,
-                "create_time" : article_obj.create_time,
-                "click_time" : article_obj.click_time,
-                "depiction" : article_obj.depiction,
-                "content" : article_obj.content,
-                "files" : article_obj.files,
-                "vedio_url" : article_obj.vedio_url,
-                "tags" : article_obj.tags,
-                "cover_img": article_obj.cover_img
-            }
-            if page_num and page_amount:
-                if article_count < page_num*page_amount and article_count >= (page_num-1)*page_amount :
-                    article_objs.append(article_tmp)
-                    article_count += 1
-                elif  article_count >= page_num*page_amount: article_count += 1
-                else : article_count += 1
-            else :
-                article_objs.append(article_tmp)
-                article_count += 1
+            try :
+                article_tmp = {
+                    "article_id": article_obj.id,
+                    "title": article_obj.title,
+                    "school_id" :article_obj.school_id,
+                    "group_sort" :article_obj.group_sort,
+                    "group_id" :article_obj.group_id,
+                    "category": article_obj.category,
+                    "create_time" : article_obj.create_time,
+                    "click_time" : article_obj.click_time,
+                    "depiction" : article_obj.depiction,
+                    "content" : article_obj.content,
+                    "files" : article_obj.files,
+                    "vedio_url" : article_obj.vedio_url,
+                    "tags" : article_obj.tags,
+                    "cover_img": article_obj.cover_img
+                }
+            except:
+                article_tmp = {
+                    "msg" : "fail to get data"
+                } 
+                
+            article_objs.append(article_tmp)
+            
 
 
         classes_name = []
         classes_name = []
 
 
-        class_count = 0
+        
         for class_name_obj in class_name_list:
         for class_name_obj in class_name_list:
             school_obj = await Schools.filter(id=class_name_obj.school_id).all()
             school_obj = await Schools.filter(id=class_name_obj.school_id).all()
             school_name = ""
             school_name = ""
@@ -836,7 +1026,7 @@ async def get_group_classes_and_articles(
             else :
             else :
                 school_obj = await Schools.get(id=class_name_obj.school_id)
                 school_obj = await Schools.get(id=class_name_obj.school_id)
                 school_name = school_obj.name
                 school_name = school_obj.name
-            if not group_id or class_name_obj.group_id==group_id:
+            try:
                 class_data = {
                 class_data = {
                     "class_name_id": class_name_obj.id,
                     "class_name_id": class_name_obj.id,
                     "name": class_name_obj.name,
                     "name": class_name_obj.name,
@@ -848,17 +1038,128 @@ async def get_group_classes_and_articles(
                     "cover_img": class_name_obj.cover_img,
                     "cover_img": class_name_obj.cover_img,
                     "group_sort":class_name_obj.group_sort
                     "group_sort":class_name_obj.group_sort
                     }
                     }
-                if page_num and page_amount:
-                    if class_count < page_num*page_amount and class_count >= (page_num-1)*page_amount :
-                        classes_name.append(class_data)
-                        class_count += 1
-                    elif  class_count >= page_num*page_amount: class_count += 1
-                    else : class_count += 1
-                else :
-                    classes_name.append(class_data)
-                    class_count += 1
+                
+            except:
+                class_data ={
+                    "msg" : "fail to get data"
+                } 
+            
+            classes_name.append(class_data)
+                    
 
 
         return {"msg": "success", "code": 200,"class_num" : class_count,"classes": classes_name,"article_num":article_count,"articles": article_objs}
         return {"msg": "success", "code": 200,"class_num" : class_count,"classes": classes_name,"article_num":article_count,"articles": article_objs}
     
     
     except Exception as e:
     except Exception as e:
-        return {"msg": str(e), "code": 500}    
+        return {"msg": str(e), "code": 500}    
+    
+@classes.post("/add_attend_record")
+async def add_attend_record(
+    class_detail_id : int = Form(default=0),
+    user_id : int =  Form(default=0),
+    is_attend : int = Form(default=0)
+):
+    try:
+        if not class_detail_id or not user_id:
+            return {"msg": "Please input right ","code":500}
+        
+        try:
+            class_detail_obj = await Class_detail.filter(id = class_detail_id).all()
+            if not class_detail_obj:
+                return {"msg": "no this class_detail_id","code":500}
+        except:
+            return {"msg": "get class_detail_id error","code":500}
+        
+        new_record = await Attend_record.get_or_create(
+            class_detail_id = class_detail_id,
+            user_id = user_id,
+            defaults = {
+                "is_attend" : is_attend
+            }
+        )
+
+        return {"msg": "success", "code": 200,"new_record_id":new_record[0].id}
+
+    except Exception as e:
+        return {"msg": str(e), "code": 500} 
+    
+@classes.post("/delete_attend_record")
+async def delete_attend_record(
+    id : int = 0
+):
+    try :
+        await Attend_record.filter(id=id).delete()
+        return {"msg": "success", "code": 200}
+    except Exception as e:
+        return {"msg": str(e), "code": 500} 
+    
+@classes.get("/update_attend_record")
+async def update_attend_record(
+    id : int = 0,
+    class_detail_id : Optional[int] = None,
+    user_id : Optional[int] = None,
+    is_attend : Optional[int] = None
+):
+    if not id :
+        return {"msg":"please input id"}
+    
+    try :
+        tmp = await Attend_record.get(id=id)
+
+        if class_detail_id!=None:
+            tmp.class_detail_id = class_detail_id
+
+        if user_id!=None:
+            tmp.user_id = user_id
+
+        if is_attend!=None:
+            tmp.is_attend = is_attend
+
+        await tmp.save()
+
+        return {"msg": "success", "code": 200}
+    except Exception as e:
+        return {"msg": str(e), "code": 500}   
+    
+    
+@classes.get("/get_attend_record")
+async def get_attend_record(
+    class_event_id : Optional[int] = None,
+    class_detail_id : Optional[int] = None,
+    user_id : Optional[int] = None,
+    is_attend : Optional[int] = None
+):
+    try:
+        attend_record_list = Attend_record.all()
+
+        if class_event_id:
+            id_list = []
+            class_detail_list = await Class_detail.filter(class_list_id = class_event_id)
+            for tmp in class_detail_list :
+                id_list.append(tmp.id)
+            attend_record_list = Attend_record.filter(class_detail_id__in=id_list)
+                
+
+        if class_detail_id:
+            attend_record_list = attend_record_list.filter(class_detail_id = class_detail_id)
+
+        if user_id :
+            attend_record_list = attend_record_list.filter(user_id = user_id)
+
+        if is_attend :
+            attend_record_list = attend_record_list.filter(is_attend = is_attend)
+
+        attend_record_list = await attend_record_list.all()
+        attend_records = []
+
+        for obj in attend_record_list:
+            data = {
+                "id" :obj.id,
+                "class_detail_id" :obj.class_detail_id,
+                "user_id" :obj.user_id,
+                "is_attend" :obj.is_attend
+            }
+            attend_records.append(data)
+
+        return {"msg": "success", "code": 200,"attend_record_list":attend_records}
+    except Exception as e:
+        return {"msg": str(e), "code": 500} 

+ 34 - 18
app/api/news.py

@@ -18,36 +18,52 @@ from fastapi.responses import HTMLResponse
 
 
 news = APIRouter()
 news = APIRouter()
 
 
-IMAGEDIR = "/var/www/ntcri/ntcri/assets/news_files/"
+IMAGEDIR = "/var/www/ntcri/assets/news_files/"
 IMAGEDIR_short = "assets/news_files/"
 IMAGEDIR_short = "assets/news_files/"
 
 
 @news.get("/get_news")
 @news.get("/get_news")
 async def search_news(
 async def search_news(
-    news_id : int = None
+    news_id : int = None,
+    category :Optional[str] = None,
+    page_num : Optional[int] = None,
+    page_amount : Optional[int] = None
 ):
 ):
     try:
     try:
+        news_list = News.all()
         if news_id :
         if news_id :
-            news_list = await News.filter(id=news_id).all()
-        else:    
-            news_list = await News.all()
+            news_list = news_list.filter(id=news_id).all()
+        
+        if category:
+            news_list = news_list.filter(category=category).all()
+
+        count = await news_list.all().count()
+
+        if page_num and page_amount:
+            news_list = news_list.offset((page_num-1)*page_amount).limit(page_amount)
+        
+        news_list = await news_list.all().order_by("-create_time")
 
 
         news_objs = []
         news_objs = []
         for news_obj in news_list:
         for news_obj in news_list:
-            news_tmp = {
-            "news_id": news_obj.id,
-            "title": news_obj.title,
-            "category": news_obj.category,
-            "create_time" : news_obj.create_time,
-            "click_time" : news_obj.click_time,
-            "content" : news_obj.content,
-            "files" : news_obj.files,
-            "URL" : news_obj.URL,
-            "tags" : news_obj.tags,
-            "cover_img": news_obj.cover_img
-        }
+            try:
+                news_tmp = {
+                    "news_id": news_obj.id,
+                    "title": news_obj.title,
+                    "category": news_obj.category,
+                    "create_time" : news_obj.create_time,
+                    "click_time" : news_obj.click_time,
+                    "content" : news_obj.content,
+                    "files" : news_obj.files,
+                    "URL" : news_obj.URL,
+                    "tags" : news_obj.tags,
+                    "cover_img": news_obj.cover_img
+                }
+            except:
+                news_tmp = {"msg":"data wrong"}
+                
             news_objs.append(news_tmp)
             news_objs.append(news_tmp)
 
 
-        return {"msg": "success", "code": 200, "news": news_objs}
+        return {"msg": "success", "code": 200, "total_num" : count,"news": news_objs}
     except Exception as e:
     except Exception as e:
         return {"msg": str(e), "code": 500}
         return {"msg": str(e), "code": 500}
     
     

+ 260 - 74
app/api/registration.py

@@ -4,14 +4,14 @@ from typing import List,Optional,Union
 from fastapi.responses import FileResponse
 from fastapi.responses import FileResponse
 from random import randint
 from random import randint
 from fastapi.security import OAuth2PasswordRequestForm
 from fastapi.security import OAuth2PasswordRequestForm
-from app.models.models import Registration,User,User_information,Class_list
+from app.models.models import Registration,User,User_information,Class_list,Class_name,Schools,Class_date
 from app.api import deps
 from app.api import deps
 from sqlalchemy.orm import Session
 from sqlalchemy.orm import Session
 from typing import Any, Dict
 from typing import Any, Dict
 import secrets
 import secrets
 from fastapi_login.exceptions import InvalidCredentialsException
 from fastapi_login.exceptions import InvalidCredentialsException
 from fastapi_login import LoginManager
 from fastapi_login import LoginManager
-from datetime import timedelta,datetime
+from datetime import timedelta,datetime,date
 from jose import jwt
 from jose import jwt
 from emails.template import JinjaTemplate
 from emails.template import JinjaTemplate
 from tortoise.queryset import Q
 from tortoise.queryset import Q
@@ -33,16 +33,6 @@ async def check_token(access_token: str):
 
 
     return user_id
     return user_id
 
 
-async def check_if_id_exeit(
-    table_name : str,
-    id : int      
-):
-    exec('check_list = await {}.filter(id=id).all()'.format(table_name))
-    if check_list == []:
-        return True
-    else:
-        False
-
 async def check_permissions(user_id):
 async def check_permissions(user_id):
     user = await User.get(id=user_id)
     user = await User.get(id=user_id)
     if user.is_superuser:
     if user.is_superuser:
@@ -70,39 +60,65 @@ async def get_registration(
             return  {"msg": "please log in", "code": 200}
             return  {"msg": "please log in", "code": 200}
         
         
         if get_all:
         if get_all:
-            inform_list = await User_information.all()
+            inform_list = Registration.all()
+        else:
+            inform_list = Registration.filter(user_id=user_id).all()
+
+        if event_id:
+            inform_list = inform_list.filter(event_id=event_id)
+
+        if is_check != None:
+            inform_list = inform_list.filter(reg_confirm=is_check)
+
+        if registration_id:
+            reg_list_tmp = await inform_list.filter(id=registration_id,is_del=0).all().order_by("-event_id","create_time")
         else:
         else:
-            inform_list = await User_information.filter(user_id=user_id).all()
+            reg_list_tmp = await inform_list.filter(is_del=0).all().order_by("-event_id","create_time")
+        
 
 
         reg_list = []
         reg_list = []
 
 
-        for infor in inform_list:
-            if registration_id:
-                reg_list_tmp = await Registration.filter(id=registration_id,user_inform_id=infor.id,is_del=0).all()
-            else:
-                reg_list_tmp = await Registration.filter(user_inform_id=infor.id,is_del=0).all()
+        for infor in reg_list_tmp:
 
 
-            for reg_obj in reg_list_tmp:
+            try : 
+                
+                reg_data = {
+                    "Registration_id" : infor.id,
+                    "event_id" : infor.event_id,
+                    "user_id" : infor.user_id,
+                    "reg_confirm" : infor.reg_confirm,
+                    "create_time" : infor.create_time
+                }
+            except:
                 reg_data = {
                 reg_data = {
-                    "Registration_id" : reg_obj.id,
-                    "event_id" : reg_obj.event_id,
-                    "user_inform_id" : reg_obj.user_inform_id,
-                    "reg_confirm" : reg_obj.reg_confirm,
-                    "create_time" : reg_obj.create_time
+                    "msg" : "fail to get data"
                 }
                 }
-                if event_id and reg_data["event_id"] == event_id :
-                    if is_check != None :
-                        if reg_obj.reg_confirm == is_check :
-                            reg_list.append(reg_data)
-                    else :
-                        reg_list.append(reg_data)
-                elif not event_id:
-                    if is_check != None :
-                        if reg_obj.reg_confirm == is_check :
-                            reg_list.append(reg_data)
-                    else :
-                        reg_list.append(reg_data)
 
 
+            try :
+                class_obj = await Class_list.get(id = infor.event_id)
+                class_name_obj = await Class_name.get(id = class_obj.name_id)
+                school_obj = await Schools.get(id = class_name_obj.school_id)
+                reg_data["school_name"] = school_obj.name
+                reg_data["class_name"] = class_name_obj.name
+                reg_data["class_event"] = class_obj.event
+                reg_data["start_time"] = str(class_obj.start_time) 
+                reg_data["end_time"] =str(class_obj.end_time)
+
+            except Exception as e:
+                reg_data["class_data"] = str(e)
+            
+            try:
+                user = await User.get(id=infor.user_id)
+                inform = await User_information.get(user_id=infor.user_id)
+                reg_data["real_name"] = inform.name
+                reg_data["phone"] = inform.phone
+                reg_data["email"] = user.email
+
+            except Exception as e:
+                reg_data["user_data"] = str(e)
+
+            reg_list.append(reg_data)
+                
         
         
         return {"msg": "success", "code": 200,"registrations":reg_list}
         return {"msg": "success", "code": 200,"registrations":reg_list}
     except Exception as e:
     except Exception as e:
@@ -110,68 +126,200 @@ async def get_registration(
 
 
 @registration.post("/input_information")
 @registration.post("/input_information")
 async def input_information(
 async def input_information(
-    user_id = Depends(check_token),
     name : str = Form(default=''),
     name : str = Form(default=''),
+    user_name : str = Form(default=''),
+    birthday : date = Form(default=datetime.now().date()),
     gender : str = Form(default=''),
     gender : str = Form(default=''),
     phone : str = Form(default=''),
     phone : str = Form(default=''),
-    email : str = Form(default=''),
-    is_default : int = Form(default=0)
+    address : str = Form(default=''),
+    user_id = Depends(check_token)
 ):
 ):
     try :
     try :
         if not user_id :
         if not user_id :
             return  {"msg": "no access", "code": 200}
             return  {"msg": "no access", "code": 200}
         
         
-        if is_default:
-            inform = await User_information.get_or_create(
-                user_id=user_id,
-                is_default = is_default,
-                defaults={
-                    'name': name,
-                    'gender': gender,
-                    'phone': phone,
-                    'email': email
+        
+        inform = await User_information.get_or_create(
+        user_id=user_id,
+            defaults={
+                'name': name,
+                'birthday' :birthday,
+                'gender': gender,
+                'phone': phone,
+                'address': address
+            }
+        )
+
+        if user_name != '':
+            user = await User.get(id = user_id)
+            user.username = user_name 
+            await user.save()
+            
+        
+
+        return {"msg": "success", "code": 200, "user_inform_id": inform[0].id,"is_exist":not inform[1]}
+    except Exception as e:
+        return {"msg": str(e), "code": 500}
+    
+@registration.post("/update_information")
+async def update_information(
+    user_name : str = Form(default=''),
+    name : str = Form(default=''),
+    birthday : date = Form(default=datetime.now().date()),
+    gender : str = Form(default=''),
+    phone : str = Form(default=''),
+    address : str = Form(default=''),
+    user_id = Depends(check_token)
+):
+    try :
+        if not user_id :
+            return  {"msg": "no access", "code": 200}
+        
+        infor = await User_information.get(user_id = user_id)
+        user = await User.get(id = user_id)
+
+        if name != '':
+            infor.name = name
+
+        if birthday != datetime.now().date():
+            infor.birthday = birthday
+
+        if gender != '':
+            infor.gender = gender
+
+        if phone != '':
+            infor.phone = phone
+
+        if address != '':
+            infor.address = address
+
+        if user_name != '':
+            user.username = user_name
+        
+        await infor.save()
+        await user.save()
+
+        return {"msg": "success", "code": 200, "user_inform_id": infor.id}
+    except Exception as e:
+        return {"msg": str(e), "code": 500}
+    
+@registration.get("/get_user_information")
+async def get_user_information(
+    user_id = Depends(check_token),
+    get_all : int = 0,
+    get_detail_information : int = 1
+):
+    try: 
+        if not user_id :
+            return  {"msg": "no access", "code": 200}
+        
+        try:
+            if get_all:
+                user_list = await User.all()
+            else:
+                user_list = await User.filter(id = user_id)
+        except:
+            return  {"msg": "user table run fail", "code": 500}
+
+        user_inform_list = []
+        for user_obj in user_list:
+            user_inform = {
+                    "user_id" : user_obj.id,
+                    "user_name" : user_obj.username,
+                    "email" : user_obj.email
                 }
                 }
-            )
-            new_inform = inform[0]
-        else :
-            new_inform = await User_information.create(
-                user_id = user_id,
-                name = name ,
-                gender = gender,
-                phone = phone,
-                email = email,
-                is_default = is_default
-            )
-
-        return {"msg": "success", "code": 200, "user_inform_id": new_inform.id}
+
+            if get_detail_information:
+                try :
+                    inform = await User_information.get(user_id=user_obj.id)
+                    user_inform["name"]  = inform.name
+                    user_inform["birthday"]  = inform.birthday
+                    user_inform["gender"]  = inform.gender
+                    user_inform["phone"]  = inform.phone
+                    user_inform["address"]  = inform.address
+                    user_inform["msg"] = "user information exist"
+                    user_inform["exist"] = True
+                    
+                except:
+                    user_inform["msg"] = "no user information"
+                    user_inform["exist"] = False
+
+            user_inform_list.append(user_inform)
+
+
+        return {"msg":"success","code":200,"user_inform": user_inform_list}
+    except Exception as e:
+        return {"msg": str(e), "code": 500}
+
+@registration.get("/change_class_reg_number")
+async def change_class_reg_number(
+    event_id: int = 0,
+    reduce_number : int = 1
+):
+    try:
+        if event_id:
+            try:
+                await Class_list.get(id = event_id)
+            except Exception as e:
+                return {"msg": "no this event", "code": 200}
+            try:
+                class_date = await Class_date.get(class_list_id = event_id)
+            except Exception as e:
+                return {"msg": "no this class' number limit", "code": 200}
+            
+            if class_date.amount_left ==0 and reduce_number>0:
+                return {"msg": "class is full", "code": 200,"amount_left":-1}
+            elif class_date.amount_left == class_date.number_limit and reduce_number<0:
+                return {"msg": "class is empty", "code": 200,"amount_left":class_date.amount_left }
+            else:
+                class_date.amount_left = class_date.amount_left-reduce_number
+                await class_date.save()
+    
+        return {"msg": "success", "code": 200,"amount_left":class_date.amount_left}
     except Exception as e:
     except Exception as e:
         return {"msg": str(e), "code": 500}
         return {"msg": str(e), "code": 500}
 
 
 @registration.post("/input_registration")
 @registration.post("/input_registration")
 async def input_registration(
 async def input_registration(
-    user_id = Depends(check_token),
-    user_inform_id : int= Form(default=0),
-    event_id : int = Form(default=0)
+    event_id : int = Form(default=0),
+    user_id = Depends(check_token)
 ): 
 ): 
     try :
     try :
         if not user_id :
         if not user_id :
             return  {"msg": "please log in", "code": 200}
             return  {"msg": "please log in", "code": 200}
+        
+        try:
+            await Class_list.get(id = event_id)
+        except Exception as e:
+            return {"msg": "no this event", "code": 200}
 
 
         # if check_if_id_exeit(User_information,user_inform_id):
         # if check_if_id_exeit(User_information,user_inform_id):
         #     return {"msg": "no user information", "code": 200}
         #     return {"msg": "no user information", "code": 200}
         
         
         # if check_if_id_exeit(Class_list,event_id):
         # if check_if_id_exeit(Class_list,event_id):
         #     return {"msg": "no class list", "code": 200}
         #     return {"msg": "no class list", "code": 200}
+        try:
+            await User_information.get(user_id=user_id)
+        except:
+            return  {"msg": "no user information", "code": 200}
         
         
-        new_registration = await Registration.create(
+        new_registration = await Registration.get_or_create(
             event_id = event_id,
             event_id = event_id,
-            user_inform_id = user_inform_id,
-            reg_confirm = 0,
-            is_del = 0 ,
-            create_time = datetime.now()
+            user_id = user_id,
+            defaults = {
+                "reg_confirm" : 0,
+                "is_del" : 0 ,
+                "create_time" : datetime.now()
+            }
         )
         )
 
 
-        return {"msg": "success", "code": 200,"new_registration_id":new_registration.id}
+        if new_registration[1]:
+            amount_left_obj = await change_class_reg_number(event_id=event_id)
+            msg = amount_left_obj["msg"]
+        else:
+            msg = "already registrate"
+
+        return {"msg": msg, "code": 200,"new_registration_id":new_registration[0].id,"is_already_exist":not new_registration[1]}
     except Exception as e:
     except Exception as e:
         return {"msg": str(e), "code": 500}
         return {"msg": str(e), "code": 500}
     
     
@@ -191,17 +339,55 @@ async def confirm_reg(
     except Exception as e:
     except Exception as e:
         return {"msg": str(e), "code": 500}
         return {"msg": str(e), "code": 500}
 
 
+@registration.post("/recover_registration")
+async def delete_registration(
+    user_id = Depends(check_token),
+    event_id : int = 0
+):
+    try:
+
+        if not user_id :
+            return  {"msg": "please log in", "code": 200}
+        
+        registration_obj = await Registration.get(event_id=event_id,user_id=user_id)
+
+        amount_left_obj = await change_class_reg_number(event_id=registration_obj.event_id)
+        msg = amount_left_obj["msg"]
+
+        if msg == "class is full":
+            return {"msg": msg+" cannot recover registration", "code": 200}
+
+        registration_obj.is_del = 0
+
+        await registration_obj.save()
+
+        return {"msg": msg, "code": 200}
+    except Exception as e:
+        return {"msg": str(e), "code": 500}
+
 @registration.post("/delete_registration")
 @registration.post("/delete_registration")
 async def delete_registration(
 async def delete_registration(
-    registration_id : int 
+    user_id = Depends(check_token),
+    super_ad_input_user_id : int = 0,
+    event_id : int = 0
 ):
 ):
     try:
     try:
-        registration_obj = await Registration.get(id=registration_id)
+
+        if not user_id :
+            return  {"msg": "please log in", "code": 200}
+        
+        if super_ad_input_user_id:
+            registration_obj = await Registration.get(event_id=event_id,user_id=super_ad_input_user_id)
+        else:
+            registration_obj = await Registration.get(event_id=event_id,user_id=user_id)
 
 
         registration_obj.is_del = 1
         registration_obj.is_del = 1
 
 
+        amount_left_obj = await change_class_reg_number(event_id=registration_obj.event_id,reduce_number=-1)
+        msg = amount_left_obj["msg"]
+
         await registration_obj.save()
         await registration_obj.save()
 
 
-        return {"msg": "success", "code": 200}
+        return {"msg": msg , "code": 200}
     except Exception as e:
     except Exception as e:
         return {"msg": str(e), "code": 500}
         return {"msg": str(e), "code": 500}

+ 17 - 3
app/models/models.py

@@ -68,7 +68,6 @@ class Class_list(Model):
     fee_method = fields.CharField(max_length=255, description="收費方式")
     fee_method = fields.CharField(max_length=255, description="收費方式")
     registration_way = fields.CharField(max_length=255, description="報名方式")
     registration_way = fields.CharField(max_length=255, description="報名方式")
     remark = fields.TextField(description="備註")
     remark = fields.TextField(description="備註")
-    registration_day = fields.CharField(max_length=255, description="報名時間")
 
 
 
 
 class Class_detail(Model):
 class Class_detail(Model):
@@ -82,7 +81,7 @@ class Class_detail(Model):
 class Registration(Model):
 class Registration(Model):
     id = fields.IntField(pk=True)
     id = fields.IntField(pk=True)
     event_id = fields.IntField(description="課程ID")
     event_id = fields.IntField(description="課程ID")
-    user_inform_id = fields.IntField(description="使用者ID")
+    user_id = fields.IntField(description="使用者ID")
     reg_confirm = fields.IntField(description="報名確認(1:報名成功 0:單純報名)")
     reg_confirm = fields.IntField(description="報名確認(1:報名成功 0:單純報名)")
     is_del = fields.IntField(description="是否取消(1:yes ,0:no)")
     is_del = fields.IntField(description="是否取消(1:yes ,0:no)")
     create_time = fields.DatetimeField(description="創建時間")
     create_time = fields.DatetimeField(description="創建時間")
@@ -155,7 +154,22 @@ class User_information(Model):
     id = fields.IntField(pk=True)
     id = fields.IntField(pk=True)
     user_id = fields.IntField(description="使用者ID")
     user_id = fields.IntField(description="使用者ID")
     name = fields.CharField(max_length=45, description="姓名")
     name = fields.CharField(max_length=45, description="姓名")
+    birthday = fields.DateField(description="生日")
     gender = fields.CharField(max_length=45, description="性別")
     gender = fields.CharField(max_length=45, description="性別")
     phone = fields.CharField(max_length=45, description="電話")
     phone = fields.CharField(max_length=45, description="電話")
-    email = fields.CharField(max_length=45, description="信箱")
+    address = fields.TextField(description="地址")
     is_default = fields.IntField(description="是否為預設")
     is_default = fields.IntField(description="是否為預設")
+
+class Class_date(Model):
+    id = fields.IntField(pk=True)
+    class_list_id = fields.IntField(description="場次ID")
+    registration_start = fields.DatetimeField(description="報名時間開始")
+    registration_end = fields.DatetimeField(description="報名時間結束")
+    number_limit = fields.IntField(description="名額")
+    amount_left = fields.IntField(description="剩餘名額")
+
+class Attend_record(Model):
+    id = fields.IntField(pk=True)
+    class_detail_id = fields.IntField(description="課堂ID")
+    user_id = fields.IntField(description="使用者ID")
+    is_attend = fields.IntField(description="是否已出席(1:是、0:否)")