浏览代码

課程狀態 更改

Mia Cheng 1 年之前
父节点
当前提交
b75600d911
共有 2 个文件被更改,包括 97 次插入47 次删除
  1. 93 46
      app/api/classes.py
  2. 4 1
      app/models/models.py

+ 93 - 46
app/api/classes.py

@@ -21,6 +21,7 @@ from fastapi.responses import HTMLResponse
 import requests
 import json
 from itertools import chain
+from tortoise import fields
 
 classes = APIRouter()
 
@@ -77,7 +78,8 @@ async def insert_class_name(
     group_id : int = Form(default=1),
     group_sort :str = Form(default='詳細 請至觀看課程資訊 查看'),
     recommend: int = Form(default=0),
-    special_class_list_name : str = Form(default=None)
+    special_class_list_name : str = Form(default=None),
+    is_inner : int = Form(default=1)
 ):    
     try:
         cover_img = ''
@@ -100,7 +102,8 @@ async def insert_class_name(
             group_id=group_id,
             group_sort=group_sort,
             recommend = recommend,
-            special_class_list_name = special_class_list_name
+            special_class_list_name = special_class_list_name,
+            is_inner = is_inner
         )
         update_location_time(location_id= location_id)
         return {"msg": "success", "code": 200, "new_class_name_id": new_class_name.id}
@@ -271,8 +274,8 @@ async def update_class_name(
     group_id : int = Form(default=0),
     group_sort : str = Form(default=''),
     recommend: int = Form(default=None),
-    special_class_list_name : str = Form(default=None)
-
+    special_class_list_name : str = Form(default=None),
+    is_inner : int = Form(default=None)
 ):
     try:
         class_name = await Class_name.get(id=class_name_id)
@@ -296,6 +299,9 @@ async def update_class_name(
         if group_id != 0 :
             class_name.group_id = group_id
 
+        if is_inner :
+            class_name.is_inner = is_inner
+
         if cover_img_file != '':
             contents = await cover_img_file.read()
 
@@ -481,45 +487,59 @@ async def delete(id: int):
 @classes.get("/get_class_state")
 async def check_date_state(
     class_name_id : Optional[int] = None,
-    class_event_id : Optional[int] = None
+    class_event_id : Optional[int] = None,
+    special_class_list_name : Optional[str] = None,
 ):
     if class_name_id: 
-        class_list = await Class_list.filter(name_id=class_name_id).all()
+        Q_word = Q(name_id=class_name_id)
     elif class_event_id:
-        class_list = await Class_list.filter(id=class_event_id).all()
+        Q_word = Q(id=class_event_id)
     else:
         return {"msg": 'please input ID', "code": 500}
     
-    result = {"reg": "尚未開放報名", "start_class":"課程尚未開始"}
-    class_check = True
-    reg_check = True
-    data= []
+    if special_class_list_name == "one_day_class":
+        class_list = await One_day_class.filter(Q_word).all()
+    else :
+        class_list = await Class_list.filter(Q_word).all()
+    
+    result = {"state": "尚未開放報名"}
     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:
+                if class_obj.start_time.replace(tzinfo=None) <= datetime.now() and class_obj.end_time.replace(tzinfo=None) >= datetime.now():
+                    result["state"] = "開課中"
+                    break
+                elif class_obj.end_time.replace(tzinfo=None) < datetime.now():
+                    result["state"] = "課程已結束"
+                    break
+                else:
+                    pass
+            except Exception as e:
+                pass
+
+            if special_class_list_name == "one_day_class":
+                if class_obj.reg_deadline.replace(tzinfo=None) >= datetime.now() :
+                    result["state"] = "報名中"
+                    break
+                elif class_obj.reg_deadline.replace(tzinfo=None) < datetime.now():
+                    result["state"] = "報名截止(人數已滿)"
+                    break
+            else :
                 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"] = "報名已額滿"
+                            result["start_class"] = "報名截止(人數已滿)"
+                            break
                         else:
-                            result["reg"] = "開放報名中"
-
-                        reg_check = False
+                            result["start_class"] = "報名中"
+                            break
                     elif class_date_obj.registration_end.replace(tzinfo=None) < datetime.now():
-                        result["reg"] = "報名已結束"
+                        result["start_class"] = "報名截止(人數已滿)"
+                        break
                 except Exception as e:
-                    result["reg"] = "尚未確認報名時間"
+                    pass
+                    
 
         return {"msg": "success", "code": 200, "result": result}
     except Exception as e:
@@ -546,13 +566,31 @@ async def search_event(
             Q_word = Q_word | Q(id = event_id)
         else :
             return {"msg": "please input class_name_id or event_id", "code": 200}
+        
+        model_fields =[]
+        state = {}
 
         if special_class_list_name==None:
             class_list = Class_list.filter(Q_word).all().order_by("-start_time")
+            # 获取模型类中的所有字段
+            model_fields = [attr for attr in dir(Class_list) if isinstance(getattr(Class_list, attr), fields.Field)]
+            try:
+                state = await check_date_state(class_event_id=class_name_id)
+            except:
+                state["result"] = {
+                    "state" : "fail to get data"
+                }
         elif  special_class_list_name=='one_day_class':
-                class_list = One_day_class.filter(Q_word).all().order_by("-start_time")
+            class_list = One_day_class.filter(Q_word).all().order_by("-start_time")
+            # model_fields = [attr for attr in dir(One_day_class) if isinstance(getattr(One_day_class, attr), fields.Field)]
+            try:
+                state = await check_date_state(class_name_id=class_name_id,special_class_list_name=special_class_list_name)
+            except:
+                state["result"] = {
+                    "state" : "fail to get data"
+                }
                 
-        
+    
         class_list = await class_list.all()
 
         classes = []
@@ -561,11 +599,9 @@ async def search_event(
             class_name = class_name_obj.name
 
             try : 
-                state = await check_date_state(class_event_id=class_obj.id)
-
                 class_data = class_obj.show_data()
                 class_data["class_name"] = class_name
-                class_data["state"] = state["result"]
+                class_data["state"] = state["result"]["state"]
 
                 try:
                     class_date_obj = await Class_date.get(class_list_id=class_obj.id)
@@ -573,6 +609,7 @@ async def search_event(
                     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
+                    model_fields.append("registration_start","registration_end","number_limit","amount_left")
                 
                 except:
                     pass
@@ -664,30 +701,34 @@ async def get_class_name(
     category :Optional[str] = None,
     page_num : Optional[int] = None,
     page_amount : Optional[int] = None,
-    recommend : Optional[int] = None
+    recommend : Optional[int] = None,
+    is_inner : Optional[int] = None
 ):
     try:
         class_name_list = Class_name.all()
         Q_word = Q()
 
         if group_id:
-            Q_word = Q_word | Q(group_id = group_id)
+            Q_word = Q_word & Q(group_id = group_id)
 
         if group_sort:
-            Q_word = Q_word | Q(group_sort = group_sort)
+            Q_word = Q_word & Q(group_sort = group_sort)
         
         if category:
             for tmp_word in category.split(",") :
                 Q_word = Q_word | Q(category__icontains=tmp_word) 
 
         if location_id :
-            Q_word = Q_word | Q(school_id = location_id)
+            Q_word = Q_word & Q(school_id = location_id)
 
         if class_name_id :
-            Q_word = Q_word | Q(id = class_name_id)
+            Q_word = Q_word & Q(id = class_name_id)
 
         if recommend :
-            Q_word = Q_word | Q(recommend = recommend)
+            Q_word = Q_word & Q(recommend = recommend)
+
+        if is_inner:
+            Q_word = Q_word & Q(is_inner = is_inner)
 
         class_name_list = class_name_list.filter(Q_word).all()
 
@@ -701,12 +742,11 @@ async def get_class_name(
 
         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 = []
-
+        state = {}
+        special_class_list_name = None
         
         for class_name_obj in class_name_list:
             school_obj = await Schools.filter(id=class_name_obj.school_id).all()
@@ -718,13 +758,20 @@ async def get_class_name(
                 school_name = school_obj.name
             
             try:
-                state = await check_date_state(class_name_id=class_name_obj.id)
+        
+                special_class_list_name = class_name_obj.special_class_list_name
+
+                if special_class_list_name:
+                    state = await check_date_state(class_name_id=class_name_obj.id,special_class_list_name=special_class_list_name)
+                else:
+                    state = await check_date_state(class_name_id=class_name_obj.id)
+                
                 class_data = class_name_obj.show_data()
                 class_data["school"]=school_name  
-                class_data["state"]=state["result"]
-            except:
+                class_data["state"]=state["result"]["state"]
+            except Exception as e:
                 class_data = {
-                    "msg" : "fail to get data"
+                    "msg" : str(e)
                 } 
                 
             classes_name.append(class_data)

+ 4 - 1
app/models/models.py

@@ -64,6 +64,7 @@ class Class_name(Model):
     group_sort = fields.CharField(max_length=45, description="學群細分")
     special_class_list_name = fields.CharField(max_length=45, description="特殊表格", null=True)
     recommend = fields.IntField(description="是否在首頁")
+    is_inner = fields.IntField(description="是否是內課")
 
     def show_data(self):
         return {
@@ -75,7 +76,9 @@ class Class_name(Model):
             "group_id": self.group_id,
             "cover_img": self.cover_img,
             "group_sort":self.group_sort,
-            "recommend" : self.recommend
+            "recommend" : self.recommend,
+            "is_inner" : self.is_inner,
+            "special_class_list_name":self.special_class_list_name
         }