Browse Source

修正搜尋、Outter_class_list

Mia Cheng 1 year ago
parent
commit
30b20a974f
4 changed files with 171 additions and 98 deletions
  1. 147 94
      app/api/classes.py
  2. 3 3
      app/api/registration.py
  3. 1 1
      app/api/tgc.py
  4. 20 0
      app/models/models.py

+ 147 - 94
app/api/classes.py

@@ -3,7 +3,7 @@ from typing import List,Optional
 from fastapi.responses import FileResponse
 from random import randint
 from fastapi.security import OAuth2PasswordRequestForm
-from app.models.models import User,Favorite_course,Article_list,Class_date,Attend_record,One_day_class
+from app.models.models import User,Favorite_course,Article_list,Class_date,Attend_record,One_day_class,Outter_class_list
 from app.models.models import Class_list,Schools,Class_detail,Class_name,Registration,Group_name,Online_course
 from app.api import deps
 from sqlalchemy.orm import Session
@@ -531,10 +531,13 @@ async def check_date_state(
     
     if special_class_list_name == "one_day_class":
         class_list = await One_day_class.filter(Q_word).all()
+    elif special_class_list_name == "outter_class_list":
+        class_list = await Outter_class_list.filter(Q_word).all()
     else :
         class_list = await Class_list.filter(Q_word).all()
     
-    result = {"state": "尚未開放報名"}
+    
+    result = {"state": "尚未開放報名(詳情請見官網)"}
     try:
         for class_obj in class_list:
             try:
@@ -621,6 +624,15 @@ async def search_event(
                 state["result"] = {
                     "state" : "fail to get data"
                 }
+        elif  special_class_list_name=='outter_class_list':
+            class_list = Outter_class_list.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()
@@ -793,13 +805,11 @@ async def get_class_name(
         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()
-            school_name = ""
-            if school_obj == []:
-                school_name = "未設定該據點"
-            else :
+            try:    
                 school_obj = await Schools.get(id=class_name_obj.school_id)
-                school_name = school_obj.name
+                school_obj_id = school_obj.id
+            except:
+                school_obj_id  = 0
             
             try:
         
@@ -811,7 +821,10 @@ async def get_class_name(
                     state = await check_date_state(class_name_id=class_name_obj.id)
                 
                 class_data = class_name_obj.show_data()
-                class_data["school"]=school_name  
+                if school_obj_id:
+                    for key, item in school_obj.show_data().items():
+                        class_data[key] = item
+                
                 class_data["state"]=state["result"]["state"]
             except Exception as e:
                 class_data = {
@@ -853,74 +866,108 @@ async def get_session(
         return {"msg": str(e), "code": 500}
 
 @classes.get("/search_class_like")
-async def search_class_like(keyword: str):
+async def search_class_like(
+    keyword: str,
+    location_id : Optional[int] = None ,
+    group_id : Optional[int] = None,
+    group_sort :Optional[str] = None,
+    exclude_word: Optional[str] = None,
+    category :Optional[str] = None,
+    page_num : Optional[int] = None,
+    page_amount : Optional[int] = None,
+    recommend : Optional[int] = None,
+    is_inner : Optional[int] = None,
+    is_check : Optional[int] = None
+):
     try:
-        class_list = await Class_list.filter(Q(lecturer__icontains=keyword)).all()
+        Q_word = Q()
 
-        classes = []
-        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)
+        if group_id:
+            Q_word = Q_word & Q(group_id = group_id)
+
+        if 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)
+
+        if recommend :
+            Q_word = Q_word & Q(recommend = recommend)
+
+        if is_inner!=None:
+            Q_word = Q_word & Q(is_inner = is_inner)
+
+        if is_check!=None:
+            Q_word = Q_word & Q(is_check = is_check)
             
-            class_data = {
-                "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)
+        class_name_id = []
+
+        for class_list in await Class_list.filter(Q(lecturer__icontains=keyword)):
+            class_name_id.append(class_list.name_id)
+
+        for class_list in await One_day_class.filter(Q(teacher__icontains=keyword)):
+            class_name_id.append(class_list.name_id)
+
+        if keyword :
+            Q_word = Q_word & ( Q(name__icontains=keyword)|
+                                Q(category__icontains=keyword)|
+                                Q(introduction__icontains=keyword)|
+                                Q(organizer__icontains=keyword)|
+                                Q(group_sort__icontains=keyword) |
+                                Q(id__in=class_name_id))
 
-        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:
-            class_list = await Class_list.filter(name_id=class_name.id).all()
-            for class_obj in class_list:
-                school_obj = await Schools.get(id=class_name.school_id)
+        class_name_list = Class_name.filter(Q_word).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)
+
+        if exclude_word:        
+            for tmp_word in exclude_word.split(",") :
+                # print(tmp_word)
+                class_name_list = class_name_list.exclude(Q(category__icontains=tmp_word)|Q(group_sort__icontains=tmp_word)).all()
+
+        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:
+            try:    
+                school_obj = await Schools.get(id=class_name_obj.school_id)
+                school_obj_id = school_obj.id
+            except:
+                school_obj_id  = 0
+            
+            try:
+        
+                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()
+                if school_obj_id:
+                    for key, item in school_obj.show_data().items():
+                        class_data[key] = item
+                
+                class_data["state"]=state["result"]["state"]
+            except Exception as e:
                 class_data = {
-                    "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
+                    "msg" : str(e)
+                } 
+            classes_name.append(class_data)
 
-                }
-                if class_data not in classes:
-                    classes.append(class_data)
+        return {"msg": "success", "code": 200, "total_num" : count,"classes": classes_name}
 
-        return {"msg": "success", "code": 200, "classes": classes}
     except Exception as e:
         return {"msg": str(e), "code": 500}
 
@@ -969,10 +1016,15 @@ async def get_favorite_class(
                 }
 
                 result = await get_class_name(class_name_id = class_obj.class_name_id)
-                class_detail = result["classes"][0]
-                for class_tmp in class_detail.items():
-                    class_data[class_tmp[0]] = class_tmp[1]
-                favorite_courses.append(class_data)        
+                try:
+                    class_detail = result["classes"][0]
+                    for key,item in class_detail.items():
+                        class_data[key] = item
+                    favorite_courses.append(class_data)  
+                except:
+                    class_data["msg"] = "this class doesn't exit"
+                    favorite_courses.append(class_data) 
+                      
 
         return {"msg": "success", "code": 200, "favorite_courses": favorite_courses}
     except Exception as e:
@@ -1154,31 +1206,32 @@ async def get_group_classes_and_articles(
 
         
         for class_name_obj in class_name_list:
-            school_obj = await Schools.filter(id=class_name_obj.school_id).all()
-            school_name = ""
-            if school_obj == []:
-                school_name = "未設定該據點"
-            else :
+            try:    
                 school_obj = await Schools.get(id=class_name_obj.school_id)
-                school_name = school_obj.name
+                school_obj_id = school_obj.id
+            except:
+                school_obj_id  = 0
+            
             try:
-                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
-                    }
+        
+                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)
                 
-            except:
-                class_data ={
-                    "msg" : "fail to get data"
+                class_data = class_name_obj.show_data()
+                if school_obj_id:
+                    for key, item in school_obj.show_data().items():
+                        class_data[key] = item
+                
+                class_data["state"]=state["result"]["state"]
+            except Exception as e:
+                class_data = {
+                    "msg" : str(e)
                 } 
-            
+                
             classes_name.append(class_data)
                     
 

+ 3 - 3
app/api/registration.py

@@ -28,7 +28,7 @@ IMAGEDIR_short = "assets/resume_pic/"
 
 
 @registration.post("/upload_user_resume_imgs")
-async def create_upload_files(files:Optional[List[UploadFile]] = File(None)):
+async def upload_user_resume_imgs(files:Optional[List[UploadFile]] = File(None)):
     files_url = []
     if files :
         for file in files:
@@ -438,13 +438,13 @@ async def delete_registration(
 @registration.post("/input_user_resume")
 async def input_user_resume(
     user_id = Depends(check_token),
+    imgs = Depends(upload_user_resume_imgs),
     teacher_name : str = Form(default=''),
     work_type : str = Form(default=''),
     experience : str = Form(default=''),
     expertise : str = Form(default=''),
     license : str = Form(default=''),
     media : str = Form(default=''),
-    imgs : str = Form(default='[]'),
     introduction: str = Form(default='')
 ):
     try:
@@ -484,7 +484,7 @@ async def input_user_resume(
             if media.strip() != '' :
                 user_resume.media= media
 
-            if imgs | imgs.strip() != '[]' :
+            if imgs  != '[]' :
                 user_resume.imgs= imgs
 
             if introduction.strip() != '' :

+ 1 - 1
app/api/tgc.py

@@ -117,6 +117,6 @@ async def get_tgc_img(
         for obj in tgc_pic_list:
             result.append(obj.show_data())
 
-        return {"msg": "success", "code": 200, "tgc_pic": result }
+        return {"msg": "success", "code": 200, "total_num":count,"tgc_pic": result }
     except Exception as e:
         return {"msg": str(e), "code": 500}

+ 20 - 0
app/models/models.py

@@ -317,4 +317,24 @@ class Tgc_report(Model):
             "title": self.title,
             "create_time": self.create_time,
             "url": self.url
+        }
+    
+class Outter_class_list(Model):
+    id = fields.IntField(pk=True)
+    name_id = fields.IntField(description="課程名稱")
+    start_time = fields.DatetimeField(description="開始時間", null=True)
+    end_time = fields.DatetimeField(description="結束時間", null=True)
+    imgs = fields.TextField(description="圖片", null=True)
+    price = fields.CharField(max_length=45, description="價錢", null=True)
+    URL = fields.TextField(description="連結", null=True)
+
+    def show_data(self):
+        return {
+            "id" : self.id,
+            "name_id": self.name_id,
+            "start_time": self.start_time,
+            "end_time": self.end_time,
+            "imgs": self.imgs,
+            "price": self.price,
+            "URL": self.URL
         }