|
@@ -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)
|