Add File
This commit is contained in:
227
backend/apps/system/api/workspace.py
Normal file
227
backend/apps/system/api/workspace.py
Normal file
@@ -0,0 +1,227 @@
|
|||||||
|
from typing import Optional
|
||||||
|
from fastapi import APIRouter, HTTPException, Query
|
||||||
|
from sqlmodel import exists, or_, select, delete as sqlmodel_delete
|
||||||
|
from apps.system.crud.user import clean_user_cache
|
||||||
|
from apps.system.crud.workspace import reset_single_user_oid, reset_user_oid
|
||||||
|
from apps.system.models.system_model import UserWsModel, WorkspaceBase, WorkspaceEditor, WorkspaceModel
|
||||||
|
from apps.system.models.user import UserModel
|
||||||
|
from apps.system.schemas.system_schema import UserWsBase, UserWsDTO, UserWsEditor, UserWsOption, WorkspaceUser
|
||||||
|
from common.core.deps import CurrentUser, SessionDep, Trans
|
||||||
|
from common.core.pagination import Paginator
|
||||||
|
from common.core.schemas import PaginatedResponse, PaginationParams
|
||||||
|
from common.utils.time import get_timestamp
|
||||||
|
|
||||||
|
router = APIRouter(tags=["system/workspace"], prefix="/system/workspace")
|
||||||
|
|
||||||
|
@router.get("/uws/option/pager/{pageNum}/{pageSize}", response_model=PaginatedResponse[UserWsOption])
|
||||||
|
async def option_pager(
|
||||||
|
session: SessionDep,
|
||||||
|
current_user: CurrentUser,
|
||||||
|
trans: Trans,
|
||||||
|
pageNum: int,
|
||||||
|
pageSize: int,
|
||||||
|
oid: int = Query(description="空间ID"),
|
||||||
|
keyword: Optional[str] = Query(None, description="搜索关键字(可选)"),
|
||||||
|
):
|
||||||
|
if not current_user.isAdmin:
|
||||||
|
raise Exception(trans('i18n_permission.no_permission', url = ", ", msg = trans('i18n_permission.only_admin')))
|
||||||
|
if not oid:
|
||||||
|
raise Exception(trans('i18n_miss_args', key = '[oid]'))
|
||||||
|
pagination = PaginationParams(page=pageNum, size=pageSize)
|
||||||
|
paginator = Paginator(session)
|
||||||
|
stmt = select(UserModel.id, UserModel.account, UserModel.name).where(
|
||||||
|
~exists().where(UserWsModel.uid == UserModel.id, UserWsModel.oid == oid),
|
||||||
|
UserModel.id != 1
|
||||||
|
).order_by(UserModel.account, UserModel.create_time)
|
||||||
|
|
||||||
|
if keyword:
|
||||||
|
keyword_pattern = f"%{keyword}%"
|
||||||
|
stmt = stmt.where(
|
||||||
|
or_(
|
||||||
|
UserModel.account.ilike(keyword_pattern),
|
||||||
|
UserModel.name.ilike(keyword_pattern),
|
||||||
|
)
|
||||||
|
)
|
||||||
|
return await paginator.get_paginated_response(
|
||||||
|
stmt=stmt,
|
||||||
|
pagination=pagination,
|
||||||
|
)
|
||||||
|
|
||||||
|
@router.get("/uws/option", response_model=UserWsOption | None)
|
||||||
|
async def option_user(
|
||||||
|
session: SessionDep,
|
||||||
|
current_user: CurrentUser,
|
||||||
|
trans: Trans,
|
||||||
|
keyword: str = Query(description="搜索关键字")
|
||||||
|
):
|
||||||
|
if not keyword:
|
||||||
|
raise Exception(trans('i18n_miss_args', key = '[keyword]'))
|
||||||
|
if (not current_user.isAdmin) and current_user.weight == 0:
|
||||||
|
raise Exception(trans('i18n_permission.no_permission', url = '', msg = ''))
|
||||||
|
oid = current_user.oid
|
||||||
|
|
||||||
|
stmt = select(UserModel.id, UserModel.account, UserModel.name).where(
|
||||||
|
~exists().where(UserWsModel.uid == UserModel.id, UserWsModel.oid == oid),
|
||||||
|
UserModel.id != 1
|
||||||
|
)
|
||||||
|
|
||||||
|
if keyword:
|
||||||
|
stmt = stmt.where(
|
||||||
|
or_(
|
||||||
|
UserModel.account == keyword,
|
||||||
|
UserModel.name == keyword,
|
||||||
|
)
|
||||||
|
)
|
||||||
|
return session.exec(stmt).first()
|
||||||
|
|
||||||
|
@router.get("/uws/pager/{pageNum}/{pageSize}", response_model=PaginatedResponse[WorkspaceUser])
|
||||||
|
async def pager(
|
||||||
|
session: SessionDep,
|
||||||
|
current_user: CurrentUser,
|
||||||
|
trans: Trans,
|
||||||
|
pageNum: int,
|
||||||
|
pageSize: int,
|
||||||
|
keyword: Optional[str] = Query(None, description="搜索关键字(可选)"),
|
||||||
|
oid: Optional[int] = Query(None, description="空间ID(仅admin用户生效)"),
|
||||||
|
):
|
||||||
|
if not current_user.isAdmin and current_user.weight == 0:
|
||||||
|
raise Exception(trans('i18n_permission.no_permission', url = '', msg = ''))
|
||||||
|
if current_user.isAdmin:
|
||||||
|
workspace_id = oid if oid else current_user.oid
|
||||||
|
else:
|
||||||
|
workspace_id = current_user.oid
|
||||||
|
pagination = PaginationParams(page=pageNum, size=pageSize)
|
||||||
|
paginator = Paginator(session)
|
||||||
|
stmt = select(UserModel.id, UserModel.account, UserModel.name, UserModel.email, UserModel.status, UserModel.create_time, UserModel.oid, UserWsModel.weight).join(
|
||||||
|
UserWsModel, UserModel.id == UserWsModel.uid
|
||||||
|
).where(
|
||||||
|
UserWsModel.oid == workspace_id,
|
||||||
|
UserModel.id != 1
|
||||||
|
).order_by(UserModel.account, UserModel.create_time)
|
||||||
|
|
||||||
|
if keyword:
|
||||||
|
keyword_pattern = f"%{keyword}%"
|
||||||
|
stmt = stmt.where(
|
||||||
|
or_(
|
||||||
|
UserModel.account.ilike(keyword_pattern),
|
||||||
|
UserModel.name.ilike(keyword_pattern),
|
||||||
|
UserModel.email.ilike(keyword_pattern)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
return await paginator.get_paginated_response(
|
||||||
|
stmt=stmt,
|
||||||
|
pagination=pagination,
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
@router.post("/uws")
|
||||||
|
async def create(session: SessionDep, current_user: CurrentUser, trans: Trans, creator: UserWsDTO):
|
||||||
|
if not current_user.isAdmin and current_user.weight == 0:
|
||||||
|
raise Exception(trans('i18n_permission.no_permission', url = '', msg = ''))
|
||||||
|
oid: int = creator.oid if (current_user.isAdmin and creator.oid) else current_user.oid
|
||||||
|
weight = creator.weight if (current_user.isAdmin and creator.weight) else 0
|
||||||
|
# 判断uid_list以及oid合法性
|
||||||
|
db_model_list = [
|
||||||
|
UserWsModel.model_validate({
|
||||||
|
"oid": oid,
|
||||||
|
"uid": uid,
|
||||||
|
"weight": weight
|
||||||
|
})
|
||||||
|
for uid in creator.uid_list
|
||||||
|
]
|
||||||
|
for uid in creator.uid_list:
|
||||||
|
await reset_single_user_oid(session, uid, oid)
|
||||||
|
await clean_user_cache(uid)
|
||||||
|
|
||||||
|
session.add_all(db_model_list)
|
||||||
|
session.commit()
|
||||||
|
|
||||||
|
@router.put("/uws")
|
||||||
|
async def edit(session: SessionDep, trans: Trans, editor: UserWsEditor):
|
||||||
|
if not editor.oid or not editor.uid:
|
||||||
|
raise Exception(trans('i18n_miss_args', key = '[oid, uid]'))
|
||||||
|
db_model = session.exec(select(UserWsModel).where(UserWsModel.uid == editor.uid, UserWsModel.oid == editor.oid)).first()
|
||||||
|
if not db_model:
|
||||||
|
raise HTTPException("uws not exist")
|
||||||
|
if editor.weight == db_model.weight:
|
||||||
|
return
|
||||||
|
|
||||||
|
db_model.weight = editor.weight
|
||||||
|
session.add(db_model)
|
||||||
|
|
||||||
|
await clean_user_cache(editor.uid)
|
||||||
|
session.commit()
|
||||||
|
|
||||||
|
@router.delete("/uws")
|
||||||
|
async def delete(session: SessionDep, current_user: CurrentUser, trans: Trans, dto: UserWsBase):
|
||||||
|
if not current_user.isAdmin and current_user.weight == 0:
|
||||||
|
raise Exception(trans('i18n_permission.no_permission', url = '', msg = ''))
|
||||||
|
oid: int = dto.oid if (current_user.isAdmin and dto.oid) else current_user.oid
|
||||||
|
db_model_list: list[UserWsModel] = session.exec(select(UserWsModel).where(UserWsModel.uid.in_(dto.uid_list), UserWsModel.oid == oid)).all()
|
||||||
|
if not db_model_list:
|
||||||
|
raise HTTPException(f"UserWsModel not found")
|
||||||
|
for db_model in db_model_list:
|
||||||
|
session.delete(db_model)
|
||||||
|
|
||||||
|
for uid in dto.uid_list:
|
||||||
|
await reset_single_user_oid(session, uid, oid, False)
|
||||||
|
await clean_user_cache(uid)
|
||||||
|
|
||||||
|
session.commit()
|
||||||
|
|
||||||
|
@router.get("", response_model=list[WorkspaceModel])
|
||||||
|
async def query(session: SessionDep, trans: Trans):
|
||||||
|
list_result = session.exec(select(WorkspaceModel).order_by(WorkspaceModel.create_time.asc())).all()
|
||||||
|
for ws in list_result:
|
||||||
|
if ws.name.startswith('i18n'):
|
||||||
|
ws.name = trans(ws.name)
|
||||||
|
return list_result
|
||||||
|
|
||||||
|
@router.post("")
|
||||||
|
async def add(session: SessionDep, creator: WorkspaceBase):
|
||||||
|
db_model = WorkspaceModel.model_validate(creator)
|
||||||
|
db_model.create_time = get_timestamp()
|
||||||
|
session.add(db_model)
|
||||||
|
session.commit()
|
||||||
|
|
||||||
|
@router.put("")
|
||||||
|
async def update(session: SessionDep, editor: WorkspaceEditor):
|
||||||
|
id = editor.id
|
||||||
|
db_model = session.get(WorkspaceModel, id)
|
||||||
|
if not db_model:
|
||||||
|
raise HTTPException(f"WorkspaceModel with id {id} not found")
|
||||||
|
db_model.name = editor.name
|
||||||
|
session.add(db_model)
|
||||||
|
session.commit()
|
||||||
|
|
||||||
|
@router.get("/{id}", response_model=WorkspaceModel)
|
||||||
|
async def get_one(session: SessionDep, trans: Trans, id: int):
|
||||||
|
db_model = session.get(WorkspaceModel, id)
|
||||||
|
if not db_model:
|
||||||
|
raise HTTPException(f"WorkspaceModel with id {id} not found")
|
||||||
|
if db_model.name.startswith('i18n'):
|
||||||
|
db_model.name = trans(db_model.name)
|
||||||
|
return db_model
|
||||||
|
|
||||||
|
@router.delete("/{id}")
|
||||||
|
async def single_delete(session: SessionDep, id: int):
|
||||||
|
if id == 1:
|
||||||
|
raise HTTPException(f"Can not delete default workspace")
|
||||||
|
db_model = session.get(WorkspaceModel, id)
|
||||||
|
if not db_model:
|
||||||
|
raise HTTPException(f"WorkspaceModel with id {id} not found")
|
||||||
|
|
||||||
|
user_ws_list = session.exec(select(UserWsModel).where(UserWsModel.oid == id)).all()
|
||||||
|
if user_ws_list:
|
||||||
|
# clean user cache
|
||||||
|
for user_ws in user_ws_list:
|
||||||
|
await clean_user_cache(user_ws.uid)
|
||||||
|
# reset user default oid
|
||||||
|
await reset_user_oid(session, id)
|
||||||
|
# delete user_ws
|
||||||
|
session.exec(sqlmodel_delete(UserWsModel).where(UserWsModel.oid == id))
|
||||||
|
|
||||||
|
session.delete(db_model)
|
||||||
|
session.commit()
|
||||||
|
|
||||||
|
|
||||||
Reference in New Issue
Block a user