bugfix getallapps

This commit is contained in:
2024-12-17 19:56:29 +09:00
parent 51e15287f5
commit c2a7ead1e3
9 changed files with 121 additions and 40 deletions

View File

@@ -1,6 +1,7 @@
from fastapi import Form
from fastapi.security import OAuth2PasswordBearer, OAuth2PasswordRequestForm
from fastapi import Request
from fastapi.responses import JSONResponse
from fastapi.security import OAuth2PasswordRequestForm
from fastapi import APIRouter, Depends, HTTPException, status
from datetime import timedelta
@@ -13,7 +14,7 @@ auth_router = r = APIRouter()
@r.post("/token")
async def login(db:Session= Depends(get_db) ,form_data: OAuth2PasswordRequestForm = Depends()):
async def login(request: Request,db:Session= Depends(get_db) ,form_data: OAuth2PasswordRequestForm = Depends()):
if not db :
raise HTTPException(
status_code=status.HTTP_401_UNAUTHORIZED,
@@ -45,9 +46,10 @@ async def login(db:Session= Depends(get_db) ,form_data: OAuth2PasswordRequestFor
data={"sub": user.id,"roles":roles,"permissions": permissions,"tenant":user.tenantid,},
expires_delta=access_token_expires,
)
return {"access_token": access_token, "token_type": "bearer","user_name":user.first_name + " " + user.last_name}
return JSONResponse(
status_code=200,
content={"access_token": access_token, "token_type": "bearer","user_name":user.first_name + " " + user.last_name}
)
@r.post("/signup")
async def signup(

View File

@@ -16,18 +16,18 @@ from app.db.cruddb import domainService
kinton_router = r = APIRouter()
def getkintoneenv(user = Depends(get_current_user)):
db = get_db(user.tenantid) #SessionLocal()
def getkintoneenv(user = Depends(get_current_user),db = Depends(get_db)):
#db = SessionLocal()
domain = domainService.get_default_domain(db,user.id) #get_activedomain(db, user.id)
db.close()
#db.close()
kintoneevn = config.KINTONE_ENV(domain)
return kintoneevn
def getkintoneformat(user = Depends(get_current_user)):
db = get_db(user.tenantid)#SessionLocal()
def getkintoneformat(user = Depends(get_current_user),db = Depends(get_db)):
#db = SessionLocal()
formats = get_kintoneformat(db)
db.close()
#db.close()
return formats

View File

@@ -0,0 +1,52 @@
from fastapi import Request
from starlette.middleware.base import BaseHTTPMiddleware
from sqlalchemy.orm import Session
from app.db.models import OperationLog,User
from functools import wraps
from fastapi import Request
def log_operation(func):
"""自定义装饰器用于记录操作日志"""
@wraps(func)
async def wrapper(*args, **kwargs):
if 'request' in kwargs and isinstance(kwargs['request'], Request):
request: Request = kwargs['request']
method = request.method
url = str(request.url)
client_ip = request.client.host
headers = dict(request.headers)
user_agent = headers.get("user-agent", "")
if 'db' in kwargs and isinstance(kwargs['db'], Session):
db = kwargs['db']
if 'user' in kwargs and isinstance(kwargs['user'], User):
user = kwargs['user']
user_id = user.id
tenant_id = user.tenantid
else:
user_id = None
tenant_id = None
try:
response = await func(*args, **kwargs)
if db:
db_operation = OperationLog(tenantid =tenant_id,
clientip =client_ip,
useragent =user_agent,
userid = user_id,
operation = method,
function = url,
response = f"status_code:{response.status_code }" )
db.add(db_operation)
db.commit()
except Exception as e:
raise e
return response
return wrapper

View File

@@ -98,6 +98,7 @@ class dbapp(crudbase):
db_app = self.get_app(db,domainurl,newversion.appid)
if db_app:
db_app.version = dbappversion.get_app_latestversion(db,domainurl,newversion.appid)+1
db_app.updateuserid = userid,
appversion = models.AppVersion(
domainurl = db_app.domainurl,
appid=db_app.appid,
@@ -139,6 +140,7 @@ class dbapp(crudbase):
if not db_appversion:
return None
db_app.version = version
db_app.versionname = db_appversion.versionname
db_app.updateuserid = userid
db.add(db_app)

View File

@@ -67,6 +67,7 @@ class App(Base):
appname = mapped_column(String(200), nullable=False)
appid = mapped_column(String(100), index=True, nullable=False)
version = mapped_column(Integer)
versionname = mapped_column(String(200), nullable=False)
createuserid = mapped_column(Integer,ForeignKey("user.id"))
updateuserid = mapped_column(Integer,ForeignKey("user.id"))
createuser = relationship('User',foreign_keys=[createuserid])
@@ -87,6 +88,7 @@ class AppVersion(Base):
updateuser = relationship('User',foreign_keys=[updateuserid])
class AppSetting(Base):
__tablename__ = "appsetting"
@@ -225,11 +227,12 @@ class OperationLog(Base):
__tablename__ = "operationlog"
tenantid = mapped_column(String(100))
domainurl = mapped_column(String(200))
clientip = mapped_column(String(200))
useragent = mapped_column(String(200))
userid = mapped_column(Integer,ForeignKey("user.id"))
operation = mapped_column(String(200))
function = mapped_column(String(200))
detail = mapped_column(String(200))
response = mapped_column(String(200))
user = relationship('User')
class KintoneFormat(Base):

View File

@@ -83,8 +83,11 @@ class AppList(Base):
domainurl: str
appname: str
appid:str
updateuser: UserOut
version:int
versionname: t.Optional[str] = None
updateuser: UserOut
createuser: UserOut
class AppVersion(BaseModel):
domainurl: str

View File

@@ -70,7 +70,7 @@ def password():
return "password"
@pytest.fixture(scope="session")
def user(password,test_tenant_id):
def user(test_db,password,test_tenant_id):
user = models.User(
email = "user@test.com",
first_name = "user",
@@ -80,10 +80,13 @@ def user(password,test_tenant_id):
is_superuser = False,
tenantid = test_tenant_id
)
return user
test_db.add(user)
test_db.commit()
test_db.refresh(user)
return user.__dict__
@pytest.fixture(scope="session")
def admin(password,test_tenant_id):
def admin(test_db,password,test_tenant_id):
user = models.User(
email = "admin@test.com",
first_name = "admin",
@@ -93,22 +96,25 @@ def admin(password,test_tenant_id):
is_superuser = True,
tenantid =test_tenant_id
)
return user
@pytest.fixture(scope="session")
def login_user(test_db,test_client,user,password):
test_db.add(user)
test_db.commit()
test_db.refresh(user)
response = test_client.post("/api/token", data={"username": user.email, "password":password })
return user.__dict__
@pytest.fixture(scope="session")
def login_user(test_db,test_client,user,password):
# test_db.add(user)
# test_db.commit()
#test_db.refresh(user)
response = test_client.post("/api/token", data={"username": user["email"], "password":password })
return response.json()["access_token"]
@pytest.fixture(scope="session")
def login_admin(test_db,test_client,admin,password):
test_db.add(admin)
test_db.commit()
test_db.refresh(admin)
response = test_client.post("/api/token", data={"username": admin.email, "password":password })
# test_db.add(admin)
# test_db.commit()
#test_db.refresh(admin)
response = test_client.post("/api/token", data={"username": admin["email"], "password":password })
return response.json()["access_token"]
@pytest.fixture(scope="session")

View File

@@ -1,4 +1,5 @@
import logging
def test_users_list(test_client,login_user):
response = test_client.get("/api/v1/users", headers={"Authorization": "Bearer " + login_user})
@@ -12,7 +13,7 @@ def test_users_list_for_admin(test_client,login_admin):
assert response.status_code == 200
data = response.json()
assert "data" in data
assert len(data["data"]) == 3
assert len(data["data"]) == 3
def test_user_create(test_client,login_user):
user_data = {
@@ -24,8 +25,9 @@ def test_user_create(test_client,login_user):
"is_superuser": False
}
response = test_client.post("/api/v1/users", json=user_data, headers={"Authorization": "Bearer " + login_user})
assert response.status_code == 200
data = response.json()
logging.error(data)
assert response.status_code == 200
assert "data" in data
assert data["data"] is not None
assert data["data"]["id"] > 0
@@ -59,8 +61,9 @@ def test_admin_create_for_admin(test_client,login_admin):
"is_superuser": True
}
response = test_client.post("/api/v1/users", json=user_data, headers={"Authorization": "Bearer " + login_admin})
assert response.status_code == 200
data = response.json()
logging.error(data)
assert response.status_code == 200
assert "data" in data
assert data["data"] is not None
assert data["data"]["id"] > 0
@@ -70,22 +73,23 @@ def test_admin_create_for_admin(test_client,login_admin):
assert data["data"]["is_active"] == user_data["is_active"]
assert data["data"]["is_superuser"] == user_data["is_superuser"]
def test_user_details(test_client, login_user_id, login_user,user):
def test_user_details(test_client,login_user_id, login_user,user):
id = login_user_id
response = test_client.get("/api/v1/users/"+ str(id), headers={"Authorization": "Bearer " + login_user})
assert response.status_code == 200
data = response.json()
assert data["data"]["email"] ==user.email
assert data["data"]["first_name"] == user.first_name
assert data["data"]["last_name"] == user.last_name
assert data["data"]["is_active"] == user.is_active
assert data["data"]["is_superuser"] == user.is_superuser
logging.error(data)
assert response.status_code == 200
assert data["data"]["email"] == user["email"]
assert data["data"]["first_name"] == user["first_name"]
assert data["data"]["last_name"] == user["last_name"]
assert data["data"]["is_active"] == user["is_active"]
assert data["data"]["is_superuser"] == user["is_superuser"]
assert data["data"]["id"] == id
def test_user_edit(test_client, login_user_id,login_user,user):
id = login_user_id
user_data = {
"email": user.email,
"email": user["email"],
"first_name": "Updated",
"last_name": "test",
"is_active": True,
@@ -95,10 +99,10 @@ def test_user_edit(test_client, login_user_id,login_user,user):
assert response.status_code == 200
data = response.json()
assert data["data"]["email"] == user.email
assert data["data"]["email"] == user["email"]
assert data["data"]["first_name"] == user_data["first_name"]
assert data["data"]["last_name"] == user_data["last_name"]
assert data["data"]["is_active"] == user.is_active
assert data["data"]["is_active"] == user["is_active"]
assert data["data"]["id"] == id
def test_user_delete(test_client, login_user):

View File

@@ -0,0 +1,9 @@
import logging
def test_get_allapps(test_client,test_domain,login_user):
response = test_client.get("/api/v1/allapps", headers={"Authorization": "Bearer " + login_user})
data = response.json()
logging.error(data)
assert response.status_code == 200
assert "apps" in data
assert data["apps"] is not None
assert len(data["apps"]) > 0