Browse Source

希望工程

Mia 1 year ago
parent
commit
e6cc67d229
6 changed files with 317 additions and 14 deletions
  1. 3 1
      app/api/__init__.py
  2. 14 3
      app/api/article.py
  3. 17 7
      app/api/classes.py
  4. 105 2
      app/api/registration.py
  5. 122 0
      app/api/tgc.py
  6. 56 1
      app/models/models.py

+ 3 - 1
app/api/__init__.py

@@ -6,6 +6,7 @@ from app.api.news import news
 from app.api.guidance import guidance
 from app.api.registration import registration
 from app.api.article import article
+from app.api.tgc import tgc
 
 routers = APIRouter()
 
@@ -14,4 +15,5 @@ routers.include_router(classes, prefix="/api", tags=["課程列表"])
 routers.include_router(news, prefix="/api", tags=["最新消息"])
 routers.include_router(guidance, prefix="/api", tags=["輔導團紀錄"])
 routers.include_router(registration, prefix="/api", tags=["報名課程"])
-routers.include_router(article, prefix="/api", tags=["文章"])
+routers.include_router(article, prefix="/api", tags=["文章"])
+routers.include_router(tgc, prefix="/api", tags=["希望工程"])

+ 14 - 3
app/api/article.py

@@ -46,6 +46,7 @@ async def get_article(
     group_sort : Optional[str] = None,
     category : Optional[str] = None,
     tags : Optional[str] = None,
+    recommend: int = Form(default=None),
     page_num : Optional[int] = None,
     page_amount : Optional[int] = None
 ):
@@ -60,6 +61,9 @@ async def get_article(
 
         if tags:
             article_list = article_list.filter(Q(tags__icontains=category)).all()
+
+        if recommend:
+            article_list = article_list.filter(Q(recommend=recommend)).all()
         
         if article_id :
             article_list = article_list.filter(id = article_id).all()
@@ -93,6 +97,7 @@ async def get_article(
                     "video_url" : article_obj.vedio_url,
                     "tags" : article_obj.tags,
                     "cover_img": article_obj.cover_img,
+                    "recommend" :article_obj.recommend,
                     "url" : article_obj.url
                 }
             except:
@@ -129,7 +134,8 @@ async def insert_article(
     vedio_url :str = Form(default=''),
     files : str = Form(default='{}'),
     cover_img_file:UploadFile = File(default=''),
-    url : str = Form(default='')
+    url : str = Form(default=''),
+    recommend: int = Form(default=0)
 ):
     try:
         cover_img = ''
@@ -160,7 +166,8 @@ async def insert_article(
             click_time = 0,
             is_del = 0,
             url = url ,
-            files = files
+            files = files,
+            recommend = recommend
         )
         
         return {"msg": "success", "code": 200, "new_article": new_article.id}
@@ -180,7 +187,8 @@ async def update_article(
     depiction :str = Form(default=''),
     vedio_url :str = Form(default=''),
     url :str = Form(default=''),
-    cover_img_file:UploadFile = File(default='')
+    cover_img_file:UploadFile = File(default=''),
+    recommend: int = Form(default=0)
 ):
     try:
         if article_id == 0 :
@@ -218,6 +226,9 @@ async def update_article(
 
         if url != '':
             article_obj.url = url
+        
+        if recommend:
+            article_obj.recommend = recommend
 
         
         if cover_img_file != '':

+ 17 - 7
app/api/classes.py

@@ -85,7 +85,8 @@ async def insert_class_name(
     group_sort :str = Form(default='詳細 請至觀看課程資訊 查看'),
     recommend: int = Form(default=0),
     special_class_list_name : str = Form(default=None),
-    is_inner : int = Form(default=1)
+    is_inner : int = Form(default=1),
+    is_check : int = Form(default=1)
 ):    
     try:
         cover_img = ''
@@ -109,7 +110,8 @@ async def insert_class_name(
             group_sort=group_sort,
             recommend = recommend,
             special_class_list_name = special_class_list_name,
-            is_inner = is_inner
+            is_inner = is_inner,
+            is_check = is_check
         )
         update_location_time(location_id= location_id)
         return {"msg": "success", "code": 200, "new_class_name_id": new_class_name.id}
@@ -297,7 +299,8 @@ async def update_class_name(
     group_sort : str = Form(default=''),
     recommend: int = Form(default=None),
     special_class_list_name : str = Form(default=None),
-    is_inner : int = Form(default=None)
+    is_inner : int = Form(default=None),
+    is_check : int = Form(default=None)
 ):
     try:
         class_name = await Class_name.get(id=class_name_id)
@@ -338,6 +341,9 @@ async def update_class_name(
         if recommend:
             class_name.recommend = recommend
 
+        if is_check:
+            class_name.is_check = is_check
+
         if special_class_list_name:
             class_name.special_class_list_name = special_class_list_name
 
@@ -736,7 +742,8 @@ async def get_class_name(
     page_num : Optional[int] = None,
     page_amount : Optional[int] = None,
     recommend : Optional[int] = None,
-    is_inner : Optional[int] = None
+    is_inner : Optional[int] = None,
+    is_check : Optional[int] = None
 ):
     try:
         class_name_list = Class_name.all()
@@ -764,11 +771,14 @@ async def get_class_name(
         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_name_list = class_name_list.filter(Q_word).all()
 
         if exclude_word:        
             for tmp_word in exclude_word.split(",") :
-                print(tmp_word)
+                # print(tmp_word)
                 class_name_list = class_name_list.exclude(Q(category__icontains=tmp_word)|Q(group_sort__icontains=tmp_word)).all()
         
 
@@ -1245,7 +1255,6 @@ async def update_attend_record(
     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,
@@ -1287,4 +1296,5 @@ async def get_attend_record(
 
         return {"msg": "success", "code": 200,"attend_record_list":attend_records}
     except Exception as e:
-        return {"msg": str(e), "code": 500} 
+        return {"msg": str(e), "code": 500} 
+   

+ 105 - 2
app/api/registration.py

@@ -4,7 +4,7 @@ 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 Registration,User,User_information,Class_list,Class_name,Schools,Class_date
+from app.models.models import Registration,User,User_information,Class_list,Class_name,Schools,Class_date,User_resume
 from app.api import deps
 from sqlalchemy.orm import Session
 from typing import Any, Dict
@@ -21,6 +21,24 @@ from app.api.users import manager
 
 registration = APIRouter()
 
+IMAGEDIR = "/var/www/ntcri/assets/resume_pic/"
+IMAGEDIR_short = "assets/resume_pic/"
+
+
+@registration.post("/upload_user_resume_imgs")
+async def create_upload_files(files:Optional[List[UploadFile]] = File(None)):
+    files_url = []
+    if files :
+        for file in files:
+            contents = await file.read()
+
+            #save the file
+            with open(f"{IMAGEDIR}{file.filename}", "wb") as f:
+                f.write(contents)
+                files_url.append(f"{IMAGEDIR_short}{file.filename}" )      
+
+    return files_url
+
 async def check_token(access_token: str):
 
     result = await User.filter(token=access_token).first()
@@ -390,4 +408,89 @@ async def delete_registration(
 
         return {"msg": msg , "code": 200}
     except Exception as e:
-        return {"msg": str(e), "code": 500}
+        return {"msg": str(e), "code": 500}
+    
+@registration.post("/input_user_resume")
+async def input_user_resume(
+    user_id = Depends(check_token),
+    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:
+        if not user_id :
+            return  {"msg": "please log in", "code": 200}
+        
+        msg = ''
+        
+        user_resume, created  = await User_resume.get_or_create(
+            user_id = user_id,
+            defaults = {
+                "teacher_name": teacher_name,
+                "work_type": work_type,
+                "experience": experience,
+                "expertise": expertise,
+                "license": license,
+                "media": media,
+                "imgs": imgs,
+                "introduction": introduction
+            }
+        )
+
+        if not created:
+
+            if teacher_name.strip() != '' :
+                user_resume.teacher_name = teacher_name
+
+            if work_type.strip() != '' :
+                user_resume.work_type= work_type
+
+            if experience.strip() != '' :
+                user_resume.experience= experience
+
+            if license.strip() != '' :
+                user_resume.license= license
+
+            if media.strip() != '' :
+                user_resume.media= media
+
+            if imgs | imgs.strip() != '[]' :
+                user_resume.imgs= imgs
+
+            if introduction.strip() != '' :
+                user_resume.introduction= introduction
+            
+            await user_resume.save() 
+
+            msg = "Update success"
+
+        else :
+            msg = "input success"
+
+
+        
+        return {"msg": msg , "code": 200}
+    except Exception as e:
+        return {"msg": str(e), "code": 500}    
+    
+
+@registration.get("/get_user_resume")
+async def get_user_resume(
+    user_id = Depends(check_token)
+):
+    try:
+        if not user_id :
+            return  {"msg": "please log in", "code": 200}
+        
+        user_resume  = await User_resume.get(user_id = user_id)
+
+        data = user_resume.show_data()
+        
+        return {"msg": "success" , "code": 200,"user_resume":data}
+    except Exception as e:
+        return {"msg": str(e), "code": 500} 

+ 122 - 0
app/api/tgc.py

@@ -0,0 +1,122 @@
+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 Tgc_pic,Tgc_report
+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
+
+tgc = APIRouter()
+
+IMAGEDIR = "/var/www/ntcri/assets/tgc_files/"
+IMAGEDIR_short = "assets/tgc_files/"
+
+
+@tgc.post("/upload_tgc_pic")
+async def create_upload_files(files:Optional[List[UploadFile]] = File(None)):
+    files_url = []
+    if files :
+        for file in files:
+            contents = await file.read()
+
+            #save the file
+            with open(f"{IMAGEDIR}{file.filename}", "wb") as f:
+                f.write(contents)
+                files_url.append(f"{IMAGEDIR_short}{file.filename}")       
+
+    return files_url
+
+@tgc.get("/get_tgc_report")
+async def get_tgc_report(
+    id : Optional[int] = None,
+    keyword : Optional[str] = None,
+    page_num : Optional[int] = None,
+    page_amount : Optional[int] = None
+):
+    try:
+        report_list = Tgc_report.all()
+
+        if id :
+            report_list = report_list.filter(id = id).all()
+
+        if keyword:
+            for word in keyword.split(","):
+                report_list = report_list.filter(title__icontains = word).all()
+
+
+        count = await report_list.all().count()
+
+        if page_num and page_amount:
+            report_list = report_list.offset((page_num-1)*page_amount).limit(page_amount)
+
+        report_list = await report_list.all().order_by("-create_time")
+
+        result = []
+
+        for report_obj in report_list:
+            try :
+                result.append(report_obj.show_data())
+            except Exception as e:
+                result.append({"msg": str(e)})
+
+        return {"msg": "success", "code": 200, "total_num":count,"tgc_report": result }
+    except Exception as e:
+        return {"msg": str(e), "code": 500}
+    
+@tgc.post("/input_tgc_report")
+async def input_tgc_report(
+    title : str = Form(default=''),
+    create_time : str = Form(default=datetime.now()),
+    url : str = Form(default='')
+):
+    try:
+        new_report = await Tgc_report.create(
+            title = title,
+            create_time = create_time,
+            url = url
+        )
+
+        return {"msg": "success", "code": 200, "new_report": new_report.id}
+    except Exception as e:
+        return {"msg": str(e), "code": 500}
+    
+@tgc.get("/get_tgc_img")
+async def get_tgc_img(
+    id : Optional[int] = None,
+    page_num : Optional[int] = None,
+    page_amount : Optional[int] = None
+):
+    try:
+        tgc_pic_list = Tgc_pic.all()
+
+        Q_word=Q()
+        
+        if id :
+            Q_word = Q(id=id)
+
+        tgc_pic_list = tgc_pic_list.filter(Q_word)  
+
+        count = await tgc_pic_list.all().count()
+
+        if page_num and page_amount:
+            tgc_pic_list = tgc_pic_list.offset((page_num-1)*page_amount).limit(page_amount)
+
+        tgc_pic_list= await tgc_pic_list.all()
+        result = []
+
+        for obj in tgc_pic_list:
+            result.append(obj.show_data())
+
+        return {"msg": "success", "code": 200, "tgc_pic": result }
+    except Exception as e:
+        return {"msg": str(e), "code": 500}

+ 56 - 1
app/models/models.py

@@ -6,6 +6,7 @@ from tortoise import fields
 from tortoise.models import Model
 from pydantic import BaseModel
 from datetime import datetime
+
 class User(Model):
     id = fields.IntField(pk=True)
     username = fields.CharField(max_length=30, unique=True, description="帳號")
@@ -71,6 +72,7 @@ class Class_name(Model):
     special_class_list_name = fields.CharField(max_length=45, description="特殊表格", null=True)
     recommend = fields.IntField(description="是否在首頁")
     is_inner = fields.IntField(description="是否是內課")
+    is_check = fields.IntField(description="是否確認")
 
     def show_data(self):
         return {
@@ -84,6 +86,7 @@ class Class_name(Model):
             "group_sort":self.group_sort,
             "recommend" : self.recommend,
             "is_inner" : self.is_inner,
+            "is_check" :self.is_check,
             "special_class_list_name":self.special_class_list_name
         }
 
@@ -179,6 +182,7 @@ class Article_list(Model):
     is_del = fields.IntField(description="是否刪除")
     files = fields.TextField(description="附件", null=True)
     url = fields.TextField(description="文章連結", null=True)
+    recommend = fields.IntField(description="是否在首頁")
 
 class Online_course(Model):
     id = fields.IntField(pk=True)
@@ -261,4 +265,55 @@ class One_day_class(Model):
             "tools": self.tools,
             "number_limit": self.number_limit
         }
-    
+    
+class User_resume(Model):
+    id = fields.IntField(pk=True)
+    user_id = fields.IntField(description="使用者編號")
+    teacher_name = fields.CharField(max_length=45,description="老師名字")
+    work_type = fields.CharField(max_length=45, description="工作性質", null=True)
+    experience = fields.CharField(max_length=100, description="教學經驗", null=True)
+    expertise = fields.TextField(description="專業工藝技能", null=True)
+    license = fields.TextField(description="相關證照", null=True)
+    media = fields.TextField(description="社群媒體", null=True)
+    imgs = fields.TextField(description="作品集", null=True)
+    introduction = fields.TextField(description="自我介紹", null=True)
+
+    def show_data(self):
+        return {
+            "id" : self.id,
+            "user_id": self.user_id,
+            "teacher_name": self.teacher_name,
+            "work_type": self.work_type,
+            "experience": self.experience,
+            "expertise": self.expertise,
+            "license": self.license,
+            "media": self.media,
+            "imgs": self.imgs,
+            "introduction": self.introduction
+        }
+    
+class Tgc_pic(Model):
+    id = fields.IntField(pk=True)
+    pic_name = fields.TextField(description="照片名稱", null=True)
+    pic_url = fields.TextField(description="照片連結", null=True)
+
+    def show_data(self):
+        return {
+            "id" : self.id,
+            "pic_name": self.pic_name,
+            "pic_url": self.pic_url
+        }
+    
+class Tgc_report(Model):
+    id = fields.IntField(pk=True)
+    title = fields.CharField(max_length=100,description="標題", null=True)
+    create_time = fields.DatetimeField(description="創建時間", null=True)
+    url = fields.TextField(description="連結", null=True)
+
+    def show_data(self):
+        return {
+            "id" : self.id,
+            "title": self.title,
+            "create_time": self.create_time,
+            "url": self.url
+        }