|  | @@ -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
 | 
	
		
			
				|  |  | +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.api import deps
 | 
	
		
			
				|  |  |  from sqlalchemy.orm import Session
 | 
	
	
		
			
				|  | @@ -20,6 +20,7 @@ from tortoise.queryset import Q
 | 
	
		
			
				|  |  |  from fastapi.responses import HTMLResponse
 | 
	
		
			
				|  |  |  import requests
 | 
	
		
			
				|  |  |  import json
 | 
	
		
			
				|  |  | +from itertools import chain
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  classes = APIRouter()
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -583,15 +584,30 @@ async def search_event(
 | 
	
		
			
				|  |  |      
 | 
	
		
			
				|  |  |  @classes.get("/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:
 | 
	
		
			
				|  |  | +        school_list = Schools.all()
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |          if location_id :
 | 
	
		
			
				|  |  | -            school_list = await Schools.filter(id = location_id).all().order_by("-update_time")
 | 
	
		
			
				|  |  | -        else :
 | 
	
		
			
				|  |  | -            school_list = await Schools.all().order_by("-update_time")
 | 
	
		
			
				|  |  | +            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()
 | 
	
		
			
				|  |  | +        
 | 
	
		
			
				|  |  | +        
 | 
	
		
			
				|  |  | +        school_list = await school_list.all().order_by("-update_time")
 | 
	
		
			
				|  |  |          
 | 
	
		
			
				|  |  |          schools = []
 | 
	
		
			
				|  |  | +        count = 0
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |          for school_obj in school_list:
 | 
	
		
			
				|  |  |              school_data = {
 | 
	
		
			
				|  |  |                  "location_id": school_obj.id,
 | 
	
	
		
			
				|  | @@ -601,9 +617,17 @@ async def get_school(
 | 
	
		
			
				|  |  |                  "address": school_obj.address,
 | 
	
		
			
				|  |  |                  "update_time":school_obj.update_time
 | 
	
		
			
				|  |  |              }
 | 
	
		
			
				|  |  | -            schools.append(school_data)
 | 
	
		
			
				|  |  | +            if page_num and page_amount:
 | 
	
		
			
				|  |  | +                if count < page_num*page_amount and count >= (page_num-1)*page_amount :
 | 
	
		
			
				|  |  | +                    schools.append(school_data)
 | 
	
		
			
				|  |  | +                    count += 1
 | 
	
		
			
				|  |  | +                else : count += 1
 | 
	
		
			
				|  |  | +            else :
 | 
	
		
			
				|  |  | +                schools.append(school_data)
 | 
	
		
			
				|  |  | +                count += 1
 | 
	
		
			
				|  |  | +            
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -        return {"msg": "success", "code": 200, "schools": schools}
 | 
	
		
			
				|  |  | +        return {"msg": "success", "code": 200, "total_num" : count,"schools": schools}
 | 
	
		
			
				|  |  |      except Exception as e:
 | 
	
		
			
				|  |  |          return {"msg": str(e), "code": 500}
 | 
	
		
			
				|  |  |      
 | 
	
	
		
			
				|  | @@ -693,6 +717,9 @@ async def get_session(
 | 
	
		
			
				|  |  |      event_id : Optional[int] = None
 | 
	
		
			
				|  |  |  ):
 | 
	
		
			
				|  |  |      try:
 | 
	
		
			
				|  |  | +        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 = []
 | 
	
	
		
			
				|  | @@ -722,62 +749,62 @@ async def search_class_like(keyword: str):
 | 
	
		
			
				|  |  |              school_obj = await Schools.get(id=class_name.school_id)
 | 
	
		
			
				|  |  |              
 | 
	
		
			
				|  |  |              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)
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -        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:
 | 
	
		
			
				|  |  |              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_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}
 | 
	
		
			
				|  |  |      except Exception as e:
 | 
	
	
		
			
				|  | @@ -1015,4 +1042,116 @@ async def get_group_classes_and_articles(
 | 
	
		
			
				|  |  |          return {"msg": "success", "code": 200,"class_num" : class_count,"classes": classes_name,"article_num":article_count,"articles": article_objs}
 | 
	
		
			
				|  |  |      
 | 
	
		
			
				|  |  |      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} 
 |