bugfix getallapps
This commit is contained in:
@@ -1,6 +1,7 @@
|
|||||||
|
|
||||||
from fastapi import Form
|
from fastapi import Request
|
||||||
from fastapi.security import OAuth2PasswordBearer, OAuth2PasswordRequestForm
|
from fastapi.responses import JSONResponse
|
||||||
|
from fastapi.security import OAuth2PasswordRequestForm
|
||||||
from fastapi import APIRouter, Depends, HTTPException, status
|
from fastapi import APIRouter, Depends, HTTPException, status
|
||||||
from datetime import timedelta
|
from datetime import timedelta
|
||||||
|
|
||||||
@@ -13,7 +14,7 @@ auth_router = r = APIRouter()
|
|||||||
|
|
||||||
|
|
||||||
@r.post("/token")
|
@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 :
|
if not db :
|
||||||
raise HTTPException(
|
raise HTTPException(
|
||||||
status_code=status.HTTP_401_UNAUTHORIZED,
|
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,},
|
data={"sub": user.id,"roles":roles,"permissions": permissions,"tenant":user.tenantid,},
|
||||||
expires_delta=access_token_expires,
|
expires_delta=access_token_expires,
|
||||||
)
|
)
|
||||||
|
return JSONResponse(
|
||||||
return {"access_token": access_token, "token_type": "bearer","user_name":user.first_name + " " + user.last_name}
|
status_code=200,
|
||||||
|
content={"access_token": access_token, "token_type": "bearer","user_name":user.first_name + " " + user.last_name}
|
||||||
|
)
|
||||||
|
|
||||||
@r.post("/signup")
|
@r.post("/signup")
|
||||||
async def signup(
|
async def signup(
|
||||||
|
|||||||
@@ -16,18 +16,18 @@ from app.db.cruddb import domainService
|
|||||||
|
|
||||||
kinton_router = r = APIRouter()
|
kinton_router = r = APIRouter()
|
||||||
|
|
||||||
def getkintoneenv(user = Depends(get_current_user)):
|
def getkintoneenv(user = Depends(get_current_user),db = Depends(get_db)):
|
||||||
db = get_db(user.tenantid) #SessionLocal()
|
#db = SessionLocal()
|
||||||
domain = domainService.get_default_domain(db,user.id) #get_activedomain(db, user.id)
|
domain = domainService.get_default_domain(db,user.id) #get_activedomain(db, user.id)
|
||||||
db.close()
|
#db.close()
|
||||||
kintoneevn = config.KINTONE_ENV(domain)
|
kintoneevn = config.KINTONE_ENV(domain)
|
||||||
return kintoneevn
|
return kintoneevn
|
||||||
|
|
||||||
|
|
||||||
def getkintoneformat(user = Depends(get_current_user)):
|
def getkintoneformat(user = Depends(get_current_user),db = Depends(get_db)):
|
||||||
db = get_db(user.tenantid)#SessionLocal()
|
#db = SessionLocal()
|
||||||
formats = get_kintoneformat(db)
|
formats = get_kintoneformat(db)
|
||||||
db.close()
|
#db.close()
|
||||||
return formats
|
return formats
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
52
backend/app/core/operation.py
Normal file
52
backend/app/core/operation.py
Normal 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
|
||||||
|
|
||||||
@@ -98,6 +98,7 @@ class dbapp(crudbase):
|
|||||||
db_app = self.get_app(db,domainurl,newversion.appid)
|
db_app = self.get_app(db,domainurl,newversion.appid)
|
||||||
if db_app:
|
if db_app:
|
||||||
db_app.version = dbappversion.get_app_latestversion(db,domainurl,newversion.appid)+1
|
db_app.version = dbappversion.get_app_latestversion(db,domainurl,newversion.appid)+1
|
||||||
|
db_app.updateuserid = userid,
|
||||||
appversion = models.AppVersion(
|
appversion = models.AppVersion(
|
||||||
domainurl = db_app.domainurl,
|
domainurl = db_app.domainurl,
|
||||||
appid=db_app.appid,
|
appid=db_app.appid,
|
||||||
@@ -139,6 +140,7 @@ class dbapp(crudbase):
|
|||||||
if not db_appversion:
|
if not db_appversion:
|
||||||
return None
|
return None
|
||||||
db_app.version = version
|
db_app.version = version
|
||||||
|
db_app.versionname = db_appversion.versionname
|
||||||
db_app.updateuserid = userid
|
db_app.updateuserid = userid
|
||||||
db.add(db_app)
|
db.add(db_app)
|
||||||
|
|
||||||
|
|||||||
@@ -67,6 +67,7 @@ class App(Base):
|
|||||||
appname = mapped_column(String(200), nullable=False)
|
appname = mapped_column(String(200), nullable=False)
|
||||||
appid = mapped_column(String(100), index=True, nullable=False)
|
appid = mapped_column(String(100), index=True, nullable=False)
|
||||||
version = mapped_column(Integer)
|
version = mapped_column(Integer)
|
||||||
|
versionname = mapped_column(String(200), nullable=False)
|
||||||
createuserid = mapped_column(Integer,ForeignKey("user.id"))
|
createuserid = mapped_column(Integer,ForeignKey("user.id"))
|
||||||
updateuserid = mapped_column(Integer,ForeignKey("user.id"))
|
updateuserid = mapped_column(Integer,ForeignKey("user.id"))
|
||||||
createuser = relationship('User',foreign_keys=[createuserid])
|
createuser = relationship('User',foreign_keys=[createuserid])
|
||||||
@@ -87,6 +88,7 @@ class AppVersion(Base):
|
|||||||
updateuser = relationship('User',foreign_keys=[updateuserid])
|
updateuser = relationship('User',foreign_keys=[updateuserid])
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
class AppSetting(Base):
|
class AppSetting(Base):
|
||||||
__tablename__ = "appsetting"
|
__tablename__ = "appsetting"
|
||||||
|
|
||||||
@@ -225,11 +227,12 @@ class OperationLog(Base):
|
|||||||
__tablename__ = "operationlog"
|
__tablename__ = "operationlog"
|
||||||
|
|
||||||
tenantid = mapped_column(String(100))
|
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"))
|
userid = mapped_column(Integer,ForeignKey("user.id"))
|
||||||
operation = mapped_column(String(200))
|
operation = mapped_column(String(200))
|
||||||
function = mapped_column(String(200))
|
function = mapped_column(String(200))
|
||||||
detail = mapped_column(String(200))
|
response = mapped_column(String(200))
|
||||||
user = relationship('User')
|
user = relationship('User')
|
||||||
|
|
||||||
class KintoneFormat(Base):
|
class KintoneFormat(Base):
|
||||||
|
|||||||
@@ -83,8 +83,11 @@ class AppList(Base):
|
|||||||
domainurl: str
|
domainurl: str
|
||||||
appname: str
|
appname: str
|
||||||
appid:str
|
appid:str
|
||||||
updateuser: UserOut
|
|
||||||
version:int
|
version:int
|
||||||
|
versionname: t.Optional[str] = None
|
||||||
|
updateuser: UserOut
|
||||||
|
createuser: UserOut
|
||||||
|
|
||||||
|
|
||||||
class AppVersion(BaseModel):
|
class AppVersion(BaseModel):
|
||||||
domainurl: str
|
domainurl: str
|
||||||
|
|||||||
@@ -70,7 +70,7 @@ def password():
|
|||||||
return "password"
|
return "password"
|
||||||
|
|
||||||
@pytest.fixture(scope="session")
|
@pytest.fixture(scope="session")
|
||||||
def user(password,test_tenant_id):
|
def user(test_db,password,test_tenant_id):
|
||||||
user = models.User(
|
user = models.User(
|
||||||
email = "user@test.com",
|
email = "user@test.com",
|
||||||
first_name = "user",
|
first_name = "user",
|
||||||
@@ -80,10 +80,13 @@ def user(password,test_tenant_id):
|
|||||||
is_superuser = False,
|
is_superuser = False,
|
||||||
tenantid = test_tenant_id
|
tenantid = test_tenant_id
|
||||||
)
|
)
|
||||||
return user
|
test_db.add(user)
|
||||||
|
test_db.commit()
|
||||||
|
test_db.refresh(user)
|
||||||
|
return user.__dict__
|
||||||
|
|
||||||
@pytest.fixture(scope="session")
|
@pytest.fixture(scope="session")
|
||||||
def admin(password,test_tenant_id):
|
def admin(test_db,password,test_tenant_id):
|
||||||
user = models.User(
|
user = models.User(
|
||||||
email = "admin@test.com",
|
email = "admin@test.com",
|
||||||
first_name = "admin",
|
first_name = "admin",
|
||||||
@@ -93,22 +96,25 @@ def admin(password,test_tenant_id):
|
|||||||
is_superuser = True,
|
is_superuser = True,
|
||||||
tenantid =test_tenant_id
|
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.add(user)
|
||||||
test_db.commit()
|
test_db.commit()
|
||||||
test_db.refresh(user)
|
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"]
|
return response.json()["access_token"]
|
||||||
|
|
||||||
@pytest.fixture(scope="session")
|
@pytest.fixture(scope="session")
|
||||||
def login_admin(test_db,test_client,admin,password):
|
def login_admin(test_db,test_client,admin,password):
|
||||||
test_db.add(admin)
|
# test_db.add(admin)
|
||||||
test_db.commit()
|
# test_db.commit()
|
||||||
test_db.refresh(admin)
|
#test_db.refresh(admin)
|
||||||
response = test_client.post("/api/token", data={"username": admin.email, "password":password })
|
response = test_client.post("/api/token", data={"username": admin["email"], "password":password })
|
||||||
return response.json()["access_token"]
|
return response.json()["access_token"]
|
||||||
|
|
||||||
@pytest.fixture(scope="session")
|
@pytest.fixture(scope="session")
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
|
|
||||||
|
import logging
|
||||||
def test_users_list(test_client,login_user):
|
def test_users_list(test_client,login_user):
|
||||||
|
|
||||||
response = test_client.get("/api/v1/users", headers={"Authorization": "Bearer " + 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
|
assert response.status_code == 200
|
||||||
data = response.json()
|
data = response.json()
|
||||||
assert "data" in data
|
assert "data" in data
|
||||||
assert len(data["data"]) == 3
|
assert len(data["data"]) == 3
|
||||||
|
|
||||||
def test_user_create(test_client,login_user):
|
def test_user_create(test_client,login_user):
|
||||||
user_data = {
|
user_data = {
|
||||||
@@ -24,8 +25,9 @@ def test_user_create(test_client,login_user):
|
|||||||
"is_superuser": False
|
"is_superuser": False
|
||||||
}
|
}
|
||||||
response = test_client.post("/api/v1/users", json=user_data, headers={"Authorization": "Bearer " + login_user})
|
response = test_client.post("/api/v1/users", json=user_data, headers={"Authorization": "Bearer " + login_user})
|
||||||
assert response.status_code == 200
|
|
||||||
data = response.json()
|
data = response.json()
|
||||||
|
logging.error(data)
|
||||||
|
assert response.status_code == 200
|
||||||
assert "data" in data
|
assert "data" in data
|
||||||
assert data["data"] is not None
|
assert data["data"] is not None
|
||||||
assert data["data"]["id"] > 0
|
assert data["data"]["id"] > 0
|
||||||
@@ -59,8 +61,9 @@ def test_admin_create_for_admin(test_client,login_admin):
|
|||||||
"is_superuser": True
|
"is_superuser": True
|
||||||
}
|
}
|
||||||
response = test_client.post("/api/v1/users", json=user_data, headers={"Authorization": "Bearer " + login_admin})
|
response = test_client.post("/api/v1/users", json=user_data, headers={"Authorization": "Bearer " + login_admin})
|
||||||
assert response.status_code == 200
|
|
||||||
data = response.json()
|
data = response.json()
|
||||||
|
logging.error(data)
|
||||||
|
assert response.status_code == 200
|
||||||
assert "data" in data
|
assert "data" in data
|
||||||
assert data["data"] is not None
|
assert data["data"] is not None
|
||||||
assert data["data"]["id"] > 0
|
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_active"] == user_data["is_active"]
|
||||||
assert data["data"]["is_superuser"] == user_data["is_superuser"]
|
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
|
id = login_user_id
|
||||||
response = test_client.get("/api/v1/users/"+ str(id), headers={"Authorization": "Bearer " + login_user})
|
response = test_client.get("/api/v1/users/"+ str(id), headers={"Authorization": "Bearer " + login_user})
|
||||||
assert response.status_code == 200
|
|
||||||
data = response.json()
|
data = response.json()
|
||||||
assert data["data"]["email"] ==user.email
|
logging.error(data)
|
||||||
assert data["data"]["first_name"] == user.first_name
|
assert response.status_code == 200
|
||||||
assert data["data"]["last_name"] == user.last_name
|
assert data["data"]["email"] == user["email"]
|
||||||
assert data["data"]["is_active"] == user.is_active
|
assert data["data"]["first_name"] == user["first_name"]
|
||||||
assert data["data"]["is_superuser"] == user.is_superuser
|
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
|
assert data["data"]["id"] == id
|
||||||
|
|
||||||
def test_user_edit(test_client, login_user_id,login_user,user):
|
def test_user_edit(test_client, login_user_id,login_user,user):
|
||||||
id = login_user_id
|
id = login_user_id
|
||||||
user_data = {
|
user_data = {
|
||||||
"email": user.email,
|
"email": user["email"],
|
||||||
"first_name": "Updated",
|
"first_name": "Updated",
|
||||||
"last_name": "test",
|
"last_name": "test",
|
||||||
"is_active": True,
|
"is_active": True,
|
||||||
@@ -95,10 +99,10 @@ def test_user_edit(test_client, login_user_id,login_user,user):
|
|||||||
|
|
||||||
assert response.status_code == 200
|
assert response.status_code == 200
|
||||||
data = response.json()
|
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"]["first_name"] == user_data["first_name"]
|
||||||
assert data["data"]["last_name"] == user_data["last_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
|
assert data["data"]["id"] == id
|
||||||
|
|
||||||
def test_user_delete(test_client, login_user):
|
def test_user_delete(test_client, login_user):
|
||||||
|
|||||||
9
backend/app/tests/test_user_kintone.py
Normal file
9
backend/app/tests/test_user_kintone.py
Normal 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
|
||||||
Reference in New Issue
Block a user