Browse Source

Merge remote-tracking branch 'origin/master'

zooey 1 year ago
parent
commit
097c59d02a
5 changed files with 398 additions and 36 deletions
  1. 3 2
      app/api/__init__.py
  2. 158 28
      app/api/classes.py
  3. 118 0
      app/api/guidance.py
  4. 98 5
      app/api/news.py
  5. 21 1
      app/models/models.py

+ 3 - 2
app/api/__init__.py

@@ -3,10 +3,11 @@ from fastapi import APIRouter
 from app.api.users import users
 from app.api.classes import classes
 from app.api.news import news
+from app.api.guidance import guidance
 
 routers = APIRouter()
 
-
 routers.include_router(users, prefix="/api", tags=["登入/註冊"])
 routers.include_router(classes, prefix="/api", tags=["課程列表"])
-routers.include_router(classes, prefix="/api", tags=["最新消息"])
+routers.include_router(news, prefix="/api", tags=["最新消息"])
+routers.include_router(guidance, prefix="/api", tags=["輔導團紀錄"])

+ 158 - 28
app/api/classes.py

@@ -1,10 +1,10 @@
 from fastapi import APIRouter, Form, Depends, HTTPException, File, UploadFile
-from typing import List
+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
-from app.models.models import Class_list,Schools,Class_detail,Class_name,Registration,Group_name
+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
 from typing import Any, Dict
@@ -36,16 +36,16 @@ async def insert_school(
     location_name: str = Form(default=''),
     Lng: str = Form(default=''),
     Lat: str = Form(default=''),
-    group_id : int = Form(default=1),
-    address : str = Form(default='')
+    address : str = Form(default=''),
+    update_time : datetime = Form(default=datetime.now())
 ):
     try:
         new_school = await Schools.create(
             name=location_name,
             longitude=Lng,
             latitude=Lat,
-            group_id = group_id,
-            address = address
+            address = address,
+            update_time = update_time
         )
         
         return {"msg": "success", "code": 200, "location_id": new_school.id}
@@ -59,7 +59,8 @@ async def insert_class_name(
     category: str = Form(default=''),
     introduction: str = Form(default=''),
     organizer: str = Form(default=''),
-    cover_img_file:UploadFile = File(default='')
+    cover_img_file:UploadFile = File(default=''),
+    group_id : int = Form(default=1)
 ):    
     try:
         cover_img = ''
@@ -78,7 +79,8 @@ async def insert_class_name(
             category=category,
             introduction=introduction,
             organizer=organizer,
-            cover_img=cover_img
+            cover_img=cover_img,
+            group_id=group_id
         )
         update_location_time(location_id= location_id)
         return {"msg": "success", "code": 200, "new_class_name_id": new_class_name.id}
@@ -99,6 +101,7 @@ async def insert_event(
     people : str = Form(default=''),
     fee_method: str = Form(default=''),
     registration_way: str = Form(default=''),
+    registration_day: str = Form(default=''),
     remark : str = Form(default='')
 ):    
     try:
@@ -121,6 +124,7 @@ async def insert_event(
             people=people,
             fee_method=fee_method,
             registration_way=registration_way,
+            registration_day=registration_day,
             remark=remark
         )
 
@@ -133,15 +137,21 @@ async def insert_session(
     class_event_id : int = Form(default=0),
     start_time: datetime = Form(default=datetime.now()),
     end_time: datetime = Form(default=datetime.now()),
-    sessions: str = Form(default=0),
     content : str = Form(default='')
 ):
     try:
+        session_list = await Class_detail.filter(class_list_id=class_event_id).all()
+        session = 0
+        if session_list != []:
+            for session_obj in session_list:
+                if session < session_obj.sessions:
+                    session = session_obj.sessions
+
         new_session = await Class_detail.create(
             class_list_id=class_event_id,
             start_time=start_time,
             end_time=end_time,
-            sessions=sessions,
+            sessions=session +1,
             content = content
         )
         
@@ -155,7 +165,6 @@ async def update_school(
     location_name: str = Form(default=''),
     Lng: str = Form(default=''),
     Lat: str = Form(default=''),
-    group_id : int = Form(default=1),
     address : str = Form(default='')
 ):
     try:
@@ -170,9 +179,6 @@ async def update_school(
         if  Lat.strip() != '':
             school.latitude =  Lat
 
-        if group_id != 1 :
-            school.group_id = group_id
-
         if  address.strip() != '':
             school.address =  address
 
@@ -187,11 +193,12 @@ async def update_school(
 async def update_class_name(
     class_name_id: int = Form(default=0),
     name: str = Form(default=''),
-    location_id: int = Form(default=''),
+    location_id: int = Form(default=0),
     category: str = Form(default=''),
     introduction: str = Form(default=''),
     organizer: str = Form(default=''),
-    cover_img_file:UploadFile = File(default='')
+    cover_img_file:UploadFile = File(default=''),
+    group_id : int = Form(default=0)
 ):
     try:
         class_name = await Class_name.get(id=class_name_id)
@@ -199,8 +206,9 @@ async def update_class_name(
         if name.strip() != '':
             class_name.name = name
 
-        if location_id != '':
+        if location_id != 0:
             class_name.school_id = location_id
+            update_location_time(location_id= location_id)
         
         if category.strip() != '':
             class_name.category = category
@@ -211,6 +219,9 @@ async def update_class_name(
         if organizer.strip() != '':
             class_name.organizer = organizer
 
+        if group_id != 0 :
+            class_name.group_id = group_id
+
         if cover_img_file != '':
             contents = await cover_img_file.read()
 
@@ -222,7 +233,7 @@ async def update_class_name(
 
         await class_name.save()
 
-        update_location_time(location_id= location_id)
+        
         return {"msg": "success", "code": 200}
     except Exception as e:
         return {"msg": str(e), "code": 500}
@@ -241,6 +252,7 @@ async def update_class(
     people : str = Form(default=''),
     fee_method: str = Form(default=''),
     registration_way: str = Form(default=''),
+    registration_day: str = Form(default=''),
     remark : str = Form(default='')
 ):
     try:
@@ -279,6 +291,9 @@ async def update_class(
         if registration_way.strip() != '':
             class_obj.registration_way = registration_way
 
+        if registration_day.strip() != '':
+            class_obj.registration_day = registration_day
+
         if remark.strip() != '':
             class_obj.remark = remark
         
@@ -350,15 +365,25 @@ async def delete(id: int):
         return {"msg": "success", "code": 200}
 
 @classes.get("/get_event")
-async def search_event(name_id: int = 0):
+async def search_event(
+    class_name_id: Optional[int] = None,
+    event_id : Optional[int] = None
+):
     try:
-        class_list = await Class_list.filter(name_id=name_id).all()
+        if event_id :
+            class_list = await Class_list.filter(id=event_id).all()
+        elif class_name_id:
+            class_list = await Class_list.filter(name_id=class_name_id).all()
+        else :
+            return {"msg": "please input class_name_id or event_id", "code": 200}
 
         classes = []
         for class_obj in class_list:
+            class_name_obj = await Class_name.get(id=class_obj.name_id)
+            class_name = class_name_obj.name
+
             class_data = {
-            "msg": "success",
-            "code": 200,
+            "class_name" : class_name,
             "event_id": class_obj.id,
             "name_id": class_obj.name_id,
             "event": class_obj.event,
@@ -372,6 +397,7 @@ async def search_event(name_id: int = 0):
             "people": class_obj.people,
             "fee_method": class_obj.fee_method,
             "registration_way": class_obj.registration_way,
+            "registration_day": class_obj.registration_day,
             "remark": class_obj.remark
         }
             classes.append(class_data)
@@ -381,9 +407,15 @@ async def search_event(name_id: int = 0):
         return {"msg": str(e), "code": 500}
     
 @classes.get("/get_school")
-async def get_school():
+async def get_school(
+    location_id : Optional[int] = None
+):
     try:
-        school_list = await Schools.all()
+        if location_id :
+            school_list = await Schools.filter(id = location_id).all()
+        else :
+            school_list = await Schools.all()
+        
         schools = []
         for school_obj in school_list:
             school_data = {
@@ -391,7 +423,6 @@ async def get_school():
                 "location_name": school_obj.name,
                 "Lng": school_obj.longitude,
                 "Lat": school_obj.latitude,
-                "group_id": school_obj.group_id,
                 "address": school_obj.address,
                 "update_time":school_obj.update_time
             }
@@ -429,14 +460,17 @@ async def get_class_name(
             else :
                 class_name_list = await Class_name.filter(id = class_name_id).all()
         else:
-            class_name_list = await Class_name.filter(school_id = location_id).all()
+            if class_name_id != 0 :
+                class_name_list = await Class_name.filter(school_id = location_id,id = class_name_id).all()
+            else:
+                class_name_list = await Class_name.filter(school_id = location_id).all()
 
         classes_name = []
         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 = "未設定據點"
+                school_name = "未設定據點"
             else :
                 school_obj = await Schools.get(id=class_name_obj.school_id)
                 school_name = school_obj.name
@@ -447,6 +481,7 @@ async def get_class_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
             }
             classes_name.append(class_data)
@@ -458,7 +493,7 @@ async def get_class_name(
     
 @classes.get("/get_session")
 async def get_session(
-    event_id : int = 0
+    event_id : Optional[int] = None
 ):
     try:
         class_session_list = await Class_detail.filter(class_list_id=event_id).all()
@@ -574,10 +609,13 @@ async def get_favorite_class(
         class_list = await Favorite_course.filter(user_id = user_id).all()
         favorite_courses = []
         for class_obj in class_list:
+            class_event = await Class_list.get(id = class_obj.class_event_id)
+            class_name = await Class_name.get(id = class_event.name_id)
             class_data = {
                 "id": class_obj.id,
                 "user_id": class_obj.user_id,
                 "class_event_id":class_obj.class_event_id,
+                "class_name_id" : class_name.id,
                 "time_stemp":class_obj.time_stemp
             }
             favorite_courses.append(class_data)
@@ -597,6 +635,98 @@ async def delete_favorite_class(
     except Exception as e:
         return {"msg": str(e), "code": 500}
 
+@classes.post("/insert_online_course")
+async def insert_online_course(
+    title : str = Form(default=''),
+    category : str = Form(default=''),
+    create_time :str = Form(default=datetime.now()),
+    content : str = Form(default=''),
+    vedio_url :str = Form(default='')
+):
+    try:
+        new_online_course = await Online_course.create(
+            title=title,
+            create_time=create_time,
+            category=category,
+            content=content,
+            vedio_url=vedio_url,
+            group_id = 8
+        )
+        
+        return {"msg": "success", "code": 200, "online_course_obj": new_online_course.id}
+    except Exception as e:
+        return {"msg": str(e), "code": 500}
+    
+@classes.post("/update_online_course")
+async def update_online_course(
+    id : int = Form(default=0),
+    title : str = Form(default=''),
+    category : str = Form(default=''),
+    create_time :str = Form(default=datetime.now()),
+    content : str = Form(default=''),
+    vedio_url :str = Form(default='')
+):
+    try:
+        online_course_obj = await Online_course.get(id=id)
+
+        if title.strip() != '':
+            online_course_obj.title = title
+        
+        if category.strip() != '':
+            online_course_obj.category = category
+
+        if create_time.strip() != '':
+            online_course_obj.create_time = create_time
+
+        if content.strip() != '':
+            online_course_obj.content = content
+
+        if vedio_url.strip() != '':
+            online_course_obj.vedio_url = vedio_url
+        
+        await online_course_obj.save()
+        
+        return {"msg": "success", "code": 200}
+    except Exception as e:
+        return {"msg": str(e), "code": 500}
+
+@classes.get("/get_online_courese")
+async def get_online_courese(
+    online_courese_id : Optional[int] = None
+):
+    try:
+        if online_courese_id :
+            online_courese_list = await Online_course.filter(id = online_courese_id).all()
+        else :
+            online_courese_list = await Online_course.all()
+        
+        online_coureses = []
+        for online_coures_obj in online_courese_list:
+            online_coures_data = {
+                "id": online_coures_obj.id,
+                "title": online_coures_obj.title,
+                "category":online_coures_obj.category,
+                "create_time": online_coures_obj.create_time,
+                "click_time": online_coures_obj.click_time,
+                "content": online_coures_obj.content,
+                "vedio_url":online_coures_obj.vedio_url
+            }
+            online_coureses.append(online_coures_data)
+
+        return {"msg": "success", "code": 200, "online_coures": online_coureses}
+    except Exception as e:
+        return {"msg": str(e), "code": 500}
+
+@classes.post("/delete_online_course")
+async def delete_online_course(
+    online_course_id : int 
+):
+    try:
+        await Online_course.filter(id=online_course_id).delete()
+        return {"msg": "success", "code": 200}
+    except Exception as e:
+        return {"msg": str(e), "code": 500}
+
 @classes.post("/uploadfiles/")
 async def create_upload_files(files: List[UploadFile]):
     return {"filenames": [file.filename for file in files]}

+ 118 - 0
app/api/guidance.py

@@ -0,0 +1,118 @@
+from fastapi import APIRouter, Form, Depends, HTTPException, File, UploadFile
+from typing import List,Optional,Union
+from fastapi.responses import FileResponse
+from random import randint
+from fastapi.security import OAuth2PasswordRequestForm
+from app.models.models import Guidance_group
+from app.api import deps
+from sqlalchemy.orm import Session
+from typing import Any, Dict
+import secrets
+from fastapi_login.exceptions import InvalidCredentialsException
+from fastapi_login import LoginManager
+from datetime import timedelta,datetime
+from jose import jwt
+from emails.template import JinjaTemplate
+from tortoise.queryset import Q
+from fastapi.responses import HTMLResponse
+
+guidance = APIRouter()
+
+@guidance.get("/get_guidance_group")
+async def get_guidance_group(
+    guidance_group_id : Optional[int] = None
+):
+    try:
+        if guidance_group_id :
+            news_list = await Guidance_group.filter(id=guidance_group_id).all()
+        else:    
+            news_list = await Guidance_group.all()
+
+        news_objs = []
+        for news_obj in news_list:
+            news_tmp = {
+            "guidance_group_id": news_obj.id,
+            "name": news_obj.name,
+            "contact_person": news_obj.contact_person,
+            "contact_phone" : news_obj.contact_phone,
+            "line" : news_obj.line,
+            "online_meet" : news_obj.online_meet,
+            "remark" : news_obj.remark
+        }
+            news_objs.append(news_tmp)
+
+        return {"msg": "success", "code": 200, "Guidance groups": news_objs}
+    except Exception as e:
+        return {"msg": str(e), "code": 500}
+
+@guidance.post("/insert_guidance_group")
+async def insert_news(
+    name : str = Form(default=''),
+    contact_person : str = Form(default=''),
+    contact_phone :str = Form(default=''),
+    line : int = Form(default=0),
+    online_meet : int = Form(default=0),
+    remark : str = Form(default='')
+):
+    try:
+
+        new_news = await Guidance_group.create(
+            name=name,
+            contact_person=contact_person,
+            contact_phone=contact_phone,
+            line = line,
+            online_meet = online_meet,
+            remark =remark
+        )
+        
+        return {"msg": "success", "code": 200, "new_Guidance_group": new_news.id}
+    except Exception as e:
+        return {"msg": str(e), "code": 500}
+
+@guidance.post("/update_guidance_group")
+async def update_news(
+    guidance_group_id : int = Form(default=None),
+    name : str = Form(default=''),
+    contact_person : str = Form(default=''),
+    contact_phone :str = Form(default=''),
+    line : int = Form(default=None),
+    online_meet : int = Form(default=None),
+    remark : str = Form(default='')
+):
+    try:
+        if not guidance_group_id :
+            return {"msg": "no ID"}
+        
+        news_obj = await Guidance_group.get(id=guidance_group_id)
+
+        if name.strip() != '':
+            news_obj.name = name
+        
+        if contact_person.strip() != '':
+            news_obj.contact_person = contact_person
+
+        if contact_phone.strip() != '':
+            news_obj.contact_phone = contact_phone
+
+        if line != None:
+            news_obj.line = line
+
+        if online_meet != None:
+            news_obj.online_meet = online_meet
+
+        if remark.strip() != '':
+            news_obj.remark = remark
+        
+        await news_obj.save()
+        
+        return {"msg": "success", "code": 200}
+    except Exception as e:
+        return {"msg": str(e), "code": 500}
+
+@guidance.post("/delete_guidance_group")
+async def delete_guidance_group(guidance_group_id: Optional[int] = None):
+    if guidance_group_id :
+        await Guidance_group.filter(id=guidance_group_id).delete()
+        return {"msg": "success", "code": 200}
+    else :
+        return {"msg": "please input ID", "code": 200}

+ 98 - 5
app/api/news.py

@@ -1,5 +1,5 @@
 from fastapi import APIRouter, Form, Depends, HTTPException, File, UploadFile
-from typing import List
+from typing import List,Optional,Union
 from fastapi.responses import FileResponse
 from random import randint
 from fastapi.security import OAuth2PasswordRequestForm
@@ -18,6 +18,9 @@ from fastapi.responses import HTMLResponse
 
 news = APIRouter()
 
+IMAGEDIR = "/var/www/html/ntcri/assets/news_files/"
+IMAGEDIR_short = "assets/news_files/"
+
 @news.get("/get_news")
 async def search_news(
     news_id : int = None
@@ -47,8 +50,98 @@ async def search_news(
     except Exception as e:
         return {"msg": str(e), "code": 500}
     
-# @news.post("/insert_news")
-# async def insert_news(
 
-# ):
-    
+async def create_upload_files(files:Optional[List[UploadFile]] = File(None)):
+    files_url = {}
+    if files :
+        file_num = 1
+        print(file_num)
+        for file in files:
+            contents = await file.read()
+
+            #save the file
+            with open(f"{IMAGEDIR}{file.filename}", "wb") as f:
+                f.write(contents)
+                file_name = "file" + str(file_num)
+                print(file_name)
+                files_url[file_name]=f"{IMAGEDIR_short}{file.filename}"       
+                file_num=file_num+1 
+
+    return files_url
+
+@news.post("/insert_news")
+async def insert_news(
+    title : str = Form(default=''),
+    category : str = Form(default=''),
+    create_time :str = Form(default=datetime.now()),
+    content : str = Form(default=''),
+    URL :str = Form(default=''),
+    tags : str = Form(default=''),
+    files_url = Depends(create_upload_files)
+):
+    try:
+
+        new_news = await News.create(
+            title=title,
+            category=category,
+            create_time=create_time,
+            content=content,
+            files = str(files_url),
+            URL = URL,
+            tags = tags
+        )
+        
+        return {"msg": "success", "code": 200, "new_news": new_news.id}
+    except Exception as e:
+        return {"msg": str(e), "code": 500}
+
+@news.post("/update_news")
+async def update_news(
+    news_id : int = Form(default=0),
+    title : str = Form(default=''),
+    category : str = Form(default=''),
+    create_time :str = Form(default=datetime.now()),
+    content : str = Form(default=''),
+    URL :str = Form(default=''),
+    tags : str = Form(default=''),
+    files_url = Depends(create_upload_files)
+):
+    try:
+        if news_id == 0 :
+            return {"msg": "no ID"}
+        
+        news_obj = await News.get(id=news_id)
+
+        if title.strip() != '':
+            news_obj.title = title
+        
+        if category.strip() != '':
+            news_obj.category = category
+
+        if create_time.strip() != '':
+            news_obj.create_time = create_time
+
+        if content.strip() != '':
+            news_obj.content = content
+
+        if URL.strip() != '':
+            news_obj.URL = URL
+
+        if tags.strip() != '':
+            news_obj.tags = tags
+        
+        news_obj.files = str(files_url)
+        
+        await news_obj.save()
+        
+        return {"msg": "success", "code": 200}
+    except Exception as e:
+        return {"msg": str(e), "code": 500}
+
+@news.post("/delete_news")
+async def delete_news(id: int = 0):
+    if id != 0:
+        await News.filter(id=id).delete()
+        return {"msg": "success", "code": 200}
+    else :
+        return {"msg": "please input ID", "code": 200}

+ 21 - 1
app/models/models.py

@@ -29,7 +29,6 @@ class Schools(Model):
     name = fields.CharField(max_length=45, description="學校名稱")
     longitude = fields.CharField(max_length=100, description="經度")
     latitude = fields.CharField(max_length=100, description="緯度")
-    group_id = fields.IntField(description="學群")
     address = fields.CharField(max_length=128,description="地址")
     update_time = fields.DatetimeField(description="更新時間")
 
@@ -45,6 +44,7 @@ class Class_name(Model):
     introduction = fields.TextField(description="簡介")
     organizer = fields.CharField(max_length=45, description="主辦單位")
     cover_img = fields.CharField(max_length=255, description="封面圖片")
+    group_id = fields.IntField(description="學群")
 
 
 class Class_list(Model):
@@ -62,6 +62,7 @@ class Class_list(Model):
     fee_method = fields.CharField(max_length=255, description="收費方式")
     registration_way = fields.CharField(max_length=255, description="報名方式")
     remark = fields.TextField(description="備註")
+    registration_day = fields.CharField(max_length=255, description="報名時間")
 
 
 class Class_detail(Model):
@@ -114,3 +115,22 @@ class Article_list(Model):
     click_time = fields.IntField(description="點擊次數")
     content = fields.TextField(description="內容")
     is_del = fields.IntField(description="是否刪除")
+
+class Online_course(Model):
+    id = fields.IntField(pk=True)
+    title = fields.CharField(max_length=45, description="標題")
+    category = fields.CharField(max_length=45, description="類別")
+    create_time = fields.DatetimeField(description="發布時間")
+    click_time = fields.IntField(description="點擊次數")
+    content = fields.TextField(description="發布時間")
+    vedio_url = fields.TextField(description="影片連結")
+    group_id = fields.IntField(description="學群")
+
+class Guidance_group(Model):
+    id = fields.IntField(pk=True)
+    name = fields.CharField(max_length=125, description="協會(團體)名稱")
+    contact_person = fields.CharField(max_length=125, description="聯絡人")
+    contact_phone = fields.CharField(max_length=125, description="聯絡電話")
+    line = fields.IntField(description="LINE (0:沒有、1:有)")
+    online_meet = fields.IntField(description="線上會議 (0:沒有、1:有)")
+    remark = fields.TextField(description="備註")