Browse Source

課程報名、開課狀態

MIA 1 year ago
parent
commit
3b12e43cfb
1 changed files with 77 additions and 12 deletions
  1. 77 12
      app/api/classes.py

+ 77 - 12
app/api/classes.py

@@ -328,19 +328,32 @@ async def update_event(
         if remark.strip() != '':
             class_obj.remark = remark
 
-        class_date_obj = await Class_date.get(class_list_id=id)
+        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_start != datetime.now():
+                class_date_obj.registration_start = registration_start
 
-        if registration_end != datetime.now():
-            class_date_obj.registration_end = registration_end
+            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
+            )
 
-        if number_limit != 0:
-            class_date_obj.number_limit = number_limit
         
         await class_obj.save()
-        await class_date_obj.save()
+        
 
         return {"msg": "success", "code": 200}
     except Exception as e:
@@ -411,6 +424,52 @@ async def delete(id: int):
         
         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")
 async def search_event(
     class_name_id: Optional[int] = None,
@@ -431,6 +490,7 @@ async def search_event(
 
             try:
                 class_date_obj = await Class_date.get(class_list_id=class_obj.id)
+                state = await check_date_state(class_event_id=class_obj.id)
                 class_data = {
                     "class_name" : class_name,
                     "event_id": class_obj.id,
@@ -450,11 +510,12 @@ async def search_event(
                     "registration_end": class_date_obj.registration_end,
                     "number_limit": class_date_obj.number_limit,
                     "amount_left": class_date_obj.amount_left,
-                    "remark": class_obj.remark
+                    "remark": class_obj.remark,
+                    "state": state["result"]
                 }
                 classes.append(class_data)
             except:
-
+                state = await check_date_state(class_event_id=class_obj.id)
                 class_data = {
                     "class_name" : class_name,
                     "event_id": class_obj.id,
@@ -470,7 +531,8 @@ async def search_event(
                     "people": class_obj.people,
                     "fee_method": class_obj.fee_method,
                     "registration_way": class_obj.registration_way,
-                    "remark": class_obj.remark
+                    "remark": class_obj.remark,
+                    "state": state["result"]
                 }
                 classes.append(class_data)
 
@@ -558,6 +620,7 @@ async def get_class_name(
                 school_obj = await Schools.get(id=class_name_obj.school_id)
                 school_name = school_obj.name
             if not group_id or class_name_obj.group_id==group_id:
+                state = await check_date_state(class_name_id=class_name_obj.id)
                 class_data = {
                     "class_name_id": class_name_obj.id,
                     "name": class_name_obj.name,
@@ -567,7 +630,8 @@ async def get_class_name(
                     "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
+                    "group_sort":class_name_obj.group_sort,
+                    "state": state["result"]
                     }
                 if page_num and page_amount:
                     if count < page_num*page_amount and count >= (page_num-1)*page_amount :
@@ -616,6 +680,7 @@ async def search_class_like(keyword: str):
         for class_obj in class_list:
             class_name = await Class_name.get(id=class_obj.name_id)
             school_obj = await Schools.get(id=class_name.school_id)
+            
             class_data = {
                 "msg": "success",
             "code": 200,