Forráskód Böngészése

user_role_avatar (not finished)

ming 3 éve
szülő
commit
1b756a36b9

BIN
api/__pycache__/gSlide.cpython-39.pyc


BIN
api/__pycache__/mailer.cpython-39.pyc


BIN
api/__pycache__/main.cpython-39.pyc


BIN
api/__pycache__/models.cpython-39.pyc


+ 45 - 23
api/main.py

@@ -34,7 +34,7 @@ from jose import JWTError, jwt
 from fastapi_jwt_auth import AuthJWT
 from fastapi_jwt_auth.exceptions import AuthJWTException
 from fastapi.security import OAuth2PasswordBearer, OAuth2PasswordRequestForm
-import models
+import util.models
 import pymysql
 import mailer
 from moviepy.editor import VideoFileClip
@@ -180,7 +180,7 @@ async def user_profile(token: str = Depends(oauth2_scheme)):
     return str_return
 
 @app.post('/edit_profile')
-async def edit_profile(userModel : models.UserProfile ,token: str = Depends(oauth2_scheme)):
+async def edit_profile(userModel : util.models.UserProfile ,token: str = Depends(oauth2_scheme)):
     db = dataset.connect('mysql://choozmo:pAssw0rd@db.ptt.cx:3306/AI_anchor?charset=utf8mb4')
     print(token)
     user_id = get_user_id(token)
@@ -244,7 +244,7 @@ async def access_token(form_data: OAuth2PasswordRequestForm = Depends(), Authori
 @app.post("/register_old")
 async def register_old(request: Request):
     db = dataset.connect('mysql://choozmo:pAssw0rd@db.ptt.cx:3306/AI_anchor?charset=utf8mb4')
-    user = models.User(**await request.form())
+    user = util.models.User(**await request.form())
     user_obj = first(db.query('SELECT * FROM users where username ="'+str(user.username)+'"'))
     if user_obj == None:
         id = user_register(user)
@@ -261,7 +261,7 @@ async def register_old(request: Request):
         return {'msg':{'eng':user.username+' is duplicated user name try another','zh':user.username+'重複,請更改'}}
 
 @app.post("/register")
-async def register(request: models.register_req):
+async def register(request: util.models.register_req):
     db = dataset.connect('mysql://choozmo:pAssw0rd@db.ptt.cx:3306/AI_anchor?charset=utf8mb4')
     user_obj = first(db.query('SELECT * FROM users where username ="'+str(request.username)+'"'))
     
@@ -277,13 +277,33 @@ async def register(request: models.register_req):
     else:
         return {'msg':{'eng':user.username+' is duplicated user name try another','zh':user.username+'重複,請更改'}}
 
-
 @app.get('/logout')
 def logout(request: Request, Authorize: AuthJWT = Depends()):
     Authorize.jwt_required()
     Authorize.unset_jwt_cookies()
     return {"msg": "ok"}
 
+@app.post('/get_role')
+async def get_role(token: str = Depends(oauth2_scheme)):
+    db = dataset.connect('mysql://choozmo:pAssw0rd@db.ptt.cx:3306/AI_anchor?charset=utf8mb4')
+    user_id = util.user.get_user_id(token)
+    roles = util.user.get_user_role(user_id)
+    return roles
+
+@app.post('/create_role')
+async def get_role(token: str = Depends(oauth2_scheme)):
+    db = dataset.connect('mysql://choozmo:pAssw0rd@db.ptt.cx:3306/AI_anchor?charset=utf8mb4')
+    user_id = get_user_id(token)
+
+    return user_id
+
+@app.post('/get_avatar_by_role')
+async def get_role(token: str = Depends(oauth2_scheme)):
+    db = dataset.connect('mysql://choozmo:pAssw0rd@db.ptt.cx:3306/AI_anchor?charset=utf8mb4')
+    user_id = get_user_id(token)
+    
+    return user_id
+
 @app.get('/verify_email')
 async def verify_email(code):
     db = dataset.connect('mysql://choozmo:pAssw0rd@db.ptt.cx:3306/AI_anchor?charset=utf8mb4')
@@ -322,7 +342,7 @@ async def send_reset_pwd(user_id,email):
     return {'msg':'ok'}
 
 @app.post('/reset_pwd')
-async def reset_password(req :models.reset_pwd):
+async def reset_password(req :util.models.reset_pwd):
     db = dataset.connect('mysql://choozmo:pAssw0rd@db.ptt.cx:3306/AI_anchor?charset=utf8mb4')
     print(req.code)
     veri_obj = next(iter(db.query('SELECT * FROM reset_pw_code where code ="'+str(req.code)+'"')))
@@ -340,7 +360,7 @@ async def avatar():
     return FileResponse('static/gen_avatar.html')
 
 @app.post("/swapFace")
-async def swapFace(req:models.swap_req):
+async def swapFace(req:util.models.swap_req):
     if 'http' not in req.imgurl:
         req.imgurl= 'http://'+req.imgurl
     try:
@@ -389,7 +409,7 @@ async def upload_pttx(file: UploadFile = File(...)):
 
 
 @app.post("/make_anchor_video_gSlide")
-async def make_anchor_video_gSlide(req:models.gSlide_req,token: str = Depends(oauth2_scheme)):
+async def make_anchor_video_gSlide(req:util.models.gSlide_req,token: str = Depends(oauth2_scheme)):
     if req.url_type == 0:
         name, text_content, image_urls = gSlide.parse_slide_url(req.slide_url,eng=False)
     else :
@@ -419,7 +439,7 @@ async def make_anchor_video_gSlide(req:models.gSlide_req,token: str = Depends(oa
         except:
             return {'msg':{'eng':req.imgurl+'cant be proccessed','zh':"無法辨別圖片網址"+req.imgurl}}
     user_id = get_user_id(token)
-    proto_req = models.request_normal()
+    proto_req = util.models.request_normal()
     proto_req.text_content = text_content
     proto_req.name = name
     proto_req.image_urls = image_urls
@@ -431,7 +451,7 @@ async def make_anchor_video_gSlide(req:models.gSlide_req,token: str = Depends(oa
     return {"msg":"ok"} 
 
 @app.post("/make_anchor_video_long")
-async def make_anchor_video_long(req:models.request,token: str = Depends(oauth2_scheme)):
+async def make_anchor_video_long(req:util.models.request,token: str = Depends(oauth2_scheme)):
     left_tag = [m.start() for m in re.finditer('{', req.text_content[0])]
     if len(req.image_urls) != len(left_tag):
         return {'msg':{'eng':'number of subtitles and images(videos) should be the same','zh':'副標題數量、圖片(影片)數量以及台詞數量必須一致'}}
@@ -460,14 +480,16 @@ async def make_anchor_video_long(req:models.request,token: str = Depends(oauth2_
     video_id = save_history(req,name_hash,user_id)
     x = threading.Thread(target=gen_video_long_queue, args=(name_hash,req.name, req.text_content, req.image_urls,int(req.avatar),req.multiLang,video_id,user_id))
     x.start()
+    returnMsg = ''
     if first(db.query('SELECT COUNT(1) FROM video_queue'))['COUNT(1)'] >= 3:
-        return {'msg':{'eng':'There are many videos have been processing, please wait.','zh':'目前有多部影片處理中,煩請耐心等候'}}
+        returnMsg =  {'msg':{'eng':'There are many videos have been processing, please wait.','zh':'目前有多部影片處理中,煩請耐心等候'}}
     else:
-        return {'msg'{'eng':'Processing video requires a few minutes, please wait for notification','zh':'影片處理需要數分鐘,請等待通知'}}
-    return {"msg":"ok"} 
+        returnMsg =  {'msg':{'eng':'Processing video requires a few minutes, please wait for notification','zh':'影片處理需要數分鐘,請等待通知'}}
+    return returnMsg
+
 
 @app.post("/make_anchor_video")
-async def make_anchor_video(req:models.request,token: str = Depends(oauth2_scheme)):
+async def make_anchor_video(req:util.models.request,token: str = Depends(oauth2_scheme)):
     if len(req.image_urls) != len(req.text_content):
         return {'msg':{'eng':'number of subtitles and images(videos) should be the same','zh':'副標題數量、圖片(影片)數量以及台詞數量必須一致'}}
     for idx in range(len(req.image_urls)):
@@ -498,11 +520,11 @@ async def make_anchor_video(req:models.request,token: str = Depends(oauth2_schem
     if first(db.query('SELECT COUNT(1) FROM video_queue'))['COUNT(1)'] >= 3:
         return {'msg':{'eng':'There are many videos have been processing, please wait.','zh':'目前有多部影片處理中,煩請耐心等候'}}
     else:
-        return {'msg'{'eng':'Processing video requires a few minutes, please wait for notification','zh':'影片處理需要數分鐘,請等待通知'}}
+        return {'msg':{'eng':'Processing video requires a few minutes, please wait for notification','zh':'影片處理需要數分鐘,請等待通知'}}
     return {'msg':'ok'}
 
 @app.post("/make_anchor_video_eng")
-async def make_anchor_video_eng(req:models.request_eng,token: str = Depends(oauth2_scheme)):
+async def make_anchor_video_eng(req:util.models.request_eng,token: str = Depends(oauth2_scheme)):
     if len(req.image_urls) != len(req.sub_titles) or len(req.sub_titles) != len(req.text_content):
         return {'msg':{'eng':'number of subtitles and images(videos) should be the same','zh':'副標題數量、圖片(影片)數量以及台詞數量必須一致'}}
     for idx in range(len(req.image_urls)):
@@ -525,11 +547,11 @@ async def make_anchor_video_eng(req:models.request_eng,token: str = Depends(oaut
     if first(db.query('SELECT COUNT(1) FROM video_queue'))['COUNT(1)'] >= 3:
         return {'msg':{'eng':'There are many videos have been processing, please wait.','zh':'目前有多部影片處理中,煩請耐心等候'}}
     else:
-        return {'msg'{'eng':'Processing video requires a few minutes, please wait for notification','zh':'影片處理需要數分鐘,請等待通知'}}
+        return {'msg':{'eng':'Processing video requires a few minutes, please wait for notification','zh':'影片處理需要數分鐘,請等待通知'}}
     return {"msg":"ok"} 
 
 @app.post("/save_draft")
-async def save_draft(req:models.video_draft,token: str = Depends(oauth2_scheme)):
+async def save_draft(req:util.models.video_draft,token: str = Depends(oauth2_scheme)):
     db = dataset.connect('mysql://choozmo:pAssw0rd@db.ptt.cx:3306/AI_anchor?charset=utf8mb4')
     user_id = get_user_id(token)
     
@@ -566,7 +588,7 @@ async def draft_list(token: str = Depends(oauth2_scheme)):
     return logs
 
 @app.post('/del_draft')
-async def del_draft(id_obj:models.id_obj,token: str = Depends(oauth2_scheme)):
+async def del_draft(id_obj:util.models.id_obj,token: str = Depends(oauth2_scheme)):
     db = dataset.connect('mysql://choozmo:pAssw0rd@db.ptt.cx:3306/AI_anchor?charset=utf8mb4')
     user_id = get_user_id(token)
     statement = 'SELECT * FROM draft WHERE user_id="'+str(user_id)+'" and id ="'+str(id_obj.id)+'"'
@@ -610,7 +632,7 @@ async def history_input(token: str = Depends(oauth2_scheme)):
 
 @AuthJWT.load_config
 def get_config():
-    return models.Settings()
+    return util.models.Settings()
 
 @app.exception_handler(AuthJWTException)
 def authjwt_exception_handler(request: Request, exc: AuthJWTException):
@@ -631,7 +653,7 @@ def get_user_id(token):
         username: str = payload.get("sub")
         if username is None:
             raise credentials_exception
-        token_data = models.TokenData(username=username)
+        token_data = util.models.TokenData(username=username)
     except JWTError:
         raise credentials_exception
     user = get_user(username=token_data.username)
@@ -653,7 +675,7 @@ def get_user(username: str):
         return False
     user_dict = next(
         iter(db.query('SELECT * FROM AI_anchor.users where username ="'+username+'"')))
-    user = models.User(**user_dict)
+    user = util.models.User(**user_dict)
     return user
     
 def user_register(user):
@@ -672,7 +694,7 @@ def authenticate_user(username: str, password: str):
     if not check_user_exists(username):  # if user don't exist
         return False
     user_dict = next(iter(db.query('SELECT * FROM AI_anchor.users where username ="'+username+'"')))
-    user = models.User(**user_dict)
+    user = util.models.User(**user_dict)
     if not verify_password(password, user.password):
         return False
     return user

+ 34 - 0
api/role_test.py

@@ -0,0 +1,34 @@
+from fastapi import FastAPI,Cookie, Depends, Query, status,File, UploadFile,Request,Response,HTTPException
+import threading
+import rpyc
+import random
+import time
+import math
+import hashlib
+import re
+from fastapi.middleware.cors import CORSMiddleware
+import dataset
+from datetime import datetime, timedelta
+from util.swap_face import swap_face
+from fastapi.staticfiles import StaticFiles
+import io
+from first import first
+import models
+import pymysql
+import traceback
+import logging
+import util.user
+
+
+mode = 'run'
+app.add_middleware(
+    CORSMiddleware,
+    allow_origins=["*"],
+    allow_credentials=True,
+    allow_methods=["*"],
+    allow_headers=["*"],
+)
+
+pymysql.install_as_MySQLdb()
+
+app = FastAPI()

BIN
api/util/__pycache__/models.cpython-39.pyc


BIN
api/util/__pycache__/swap_face.cpython-39.pyc


BIN
api/util/__pycache__/user.cpython-39.pyc


+ 0 - 0
api/models.py → api/util/models.py


+ 51 - 10
api/util/user.py

@@ -1,5 +1,16 @@
 import dataset
+from fastapi import FastAPI,Cookie, Depends, Query, status,File, UploadFile,Request,Response,HTTPException
 from first import first
+from jose import JWTError, jwt
+from fastapi_jwt_auth import AuthJWT
+from fastapi_jwt_auth.exceptions import AuthJWTException
+from fastapi.security import OAuth2PasswordBearer, OAuth2PasswordRequestForm
+import util.models
+from passlib.context import CryptContext
+SECRET_KEY = "df2f77bd544240801a048bd4293afd8eeb7fff3cb7050e42c791db4b83ebadcd"
+ALGORITHM = "HS256"
+ACCESS_TOKEN_EXPIRE_DAYS = 5
+pwd_context = CryptContext(schemes=["bcrypt"], deprecated="auto")
 def get_user_id(token):
     db = dataset.connect('mysql://choozmo:pAssw0rd@db.ptt.cx:3306/AI_anchor?charset=utf8mb4')
     credentials_exception = HTTPException(
@@ -12,7 +23,7 @@ def get_user_id(token):
         username: str = payload.get("sub")
         if username is None:
             raise credentials_exception
-        token_data = models.TokenData(username=username)
+        token_data = uitl.models.TokenData(username=username)
     except JWTError:
         raise credentials_exception
     user = get_user(username=token_data.username)
@@ -34,7 +45,7 @@ def get_user( username: str):
         return False
     user_dict = next(
         iter(db.query('SELECT * FROM users where username ="'+username+'"')))
-    user = models.User(**user_dict)
+    user = util.models.User(**user_dict)
     return user
     
 def user_register( user):
@@ -45,37 +56,66 @@ def user_register( user):
 
 def get_password_hash( password):
     return pwd_context.hash(password)
+
 def verify_password( plain_password, hashed_password):
     return pwd_context.verify(plain_password, hashed_password)
+
 def authenticate_user( username: str, password: str):
     db = dataset.connect('mysql://choozmo:pAssw0rd@db.ptt.cx:3306/AI_anchor?charset=utf8mb4')
     if not check_user_exists(username):  # if user don't exist
         return False
     user_dict = next(iter(db.query('SELECT * FROM AI_anchor.users where username ="'+username+'"')))
-    user = models.User(**user_dict)
+    user = util.models.User(**user_dict)
     if not verify_password(password, user.password):
         return False
     return user
 
-def get_roles( username):
+def get_user_role(id):
     db = dataset.connect('mysql://choozmo:pAssw0rd@db.ptt.cx:3306/AI_anchor?charset=utf8mb4')
     state = 'SELECT * FROM user_role '\
-    'INNER JOIN users on user_role.user_id= users.id'\
+    'INNER JOIN users on user_role.user_id= users.id '\
     'INNER JOIN role on user_role.role_id = role.id '\
-    'WHERE username=username'
+    'WHERE users.id='+str(id)
     role_list = []
-    for row in db.query(statement):
+    for row in db.query(state):
+        role_list.append({'id':row['role_id'],'name':row['name']})
+    return role_list
+
+def get_user_role(id):
+    db = dataset.connect('mysql://choozmo:pAssw0rd@db.ptt.cx:3306/AI_anchor?charset=utf8mb4')
+    state = 'SELECT * FROM user_role '\
+    'INNER JOIN users on user_role.user_id= users.id '\
+    'INNER JOIN role on user_role.role_id = role.id '\
+    'WHERE username="ming"'
+    role_list = []
+    for row in db.query(state):
         role_list.append({'id':row['role_id'],'name':row['name']})
     return role_list
-    
 #def add_role( username,role_id):
     #db = dataset.connect('mysql://choozmo:pAssw0rd@db.ptt.cx:3306/AI_anchor?charset=utf8mb4')
     #user_role_table = db['user_role']
     #user_role_table.insert({'user_id':,'role_id':role_id})
 
-def get_user_id( username):
+def get_user_id(token):
     db = dataset.connect('mysql://choozmo:pAssw0rd@db.ptt.cx:3306/AI_anchor?charset=utf8mb4')
-    return str(first(db.query('SELECT COUNT(*) FROM history_input WHERE user_id ='+str(user_obj['id'])))['COUNT(*)'])
+    credentials_exception = HTTPException(
+        status_code=status.HTTP_401_UNAUTHORIZED,
+        detail="Could not validate credentials",
+        headers={"WWW-Authenticate": "Bearer"},
+    )
+    try:
+        payload = jwt.decode(token, SECRET_KEY, algorithms=[ALGORITHM])
+        username: str = payload.get("sub")
+        if username is None:
+            raise credentials_exception
+        token_data = util.models.TokenData(username=username)
+    except JWTError:
+        raise credentials_exception
+    user = get_user(username=token_data.username)
+    if user is None:
+        raise credentials_exception
+    user_id = first(db.query('SELECT * FROM users where username="' + user.username+'"'))['id']
+    return user_id
     
 def get_id_by_email(email):
     db = dataset.connect('mysql://choozmo:pAssw0rd@db.ptt.cx:3306/AI_anchor?charset=utf8mb4')
@@ -90,3 +130,4 @@ def email_veri_pass(name):
         return True
     else:
         return False
+