11from collections import defaultdict
22from typing import Optional
3- from fastapi import APIRouter , Query
3+ from fastapi import APIRouter , Path , Query
4+ from pydantic import Field
45from sqlmodel import SQLModel , or_ , select , delete as sqlmodel_delete
56from apps .system .crud .user import check_account_exists , check_email_exists , check_email_format , check_pwd_format , get_db_user , single_delete , user_ws_options
67from apps .system .models .system_model import UserWsModel , WorkspaceModel
78from apps .system .models .user import UserModel
89from apps .system .schemas .auth import CacheName , CacheNamespace
910from apps .system .schemas .permission import SqlbotPermission , require_permissions
10- from apps .system .schemas .system_schema import PwdEditor , UserCreator , UserEditor , UserGrid , UserLanguage , UserStatus , UserWs
11+ from apps .system .schemas .system_schema import PwdEditor , UserCreator , UserEditor , UserGrid , UserInfoDTO , UserLanguage , UserStatus , UserWs
1112from common .core .deps import CurrentUser , SessionDep , Trans
1213from common .core .pagination import Paginator
1314from common .core .schemas import PaginatedResponse , PaginationParams
1415from common .core .security import default_md5_pwd , md5pwd , verify_md5pwd
1516from common .core .sqlbot_cache import clear_cache
1617from common .core .config import settings
18+ from apps .swagger .i18n import PLACEHOLDER_PREFIX
1719
18- router = APIRouter (tags = ["user " ], prefix = "/user" )
20+ router = APIRouter (tags = ["system_user " ], prefix = "/user" )
1921
20- @router .get ("/info" )
21- async def user_info (current_user : CurrentUser ):
22+ @router .get ("/info" , summary = f" { PLACEHOLDER_PREFIX } system_user_current_user" , description = f" { PLACEHOLDER_PREFIX } system_user_current_user_desc" )
23+ async def user_info (current_user : CurrentUser ) -> UserInfoDTO :
2224 return current_user
2325
2426
25- @router .get ("/defaultPwd" )
27+ @router .get ("/defaultPwd" , include_in_schema = False )
2628@require_permissions (permission = SqlbotPermission (role = ['admin' ]))
2729async def default_pwd () -> str :
2830 return settings .DEFAULT_PWD
2931
30- @router .get ("/pager/{pageNum}/{pageSize}" , response_model = PaginatedResponse [UserGrid ])
32+ @router .get ("/pager/{pageNum}/{pageSize}" , response_model = PaginatedResponse [UserGrid ], summary = f" { PLACEHOLDER_PREFIX } system_user_grid" , description = f" { PLACEHOLDER_PREFIX } system_user_grid" )
3133@require_permissions (permission = SqlbotPermission (role = ['admin' ]))
3234async def pager (
3335 session : SessionDep ,
34- pageNum : int ,
35- pageSize : int ,
36- keyword : Optional [str ] = Query (None , description = "搜索关键字(可选) " ),
37- status : Optional [int ] = Query (None , description = "状态 " ),
38- origins : Optional [list [int ]] = Query (None , description = "来源 " ),
39- oidlist : Optional [list [int ]] = Query (None , description = "空间ID集合(可选) " ),
36+ pageNum : int = Path (..., title = f" { PLACEHOLDER_PREFIX } page_num" , description = f" { PLACEHOLDER_PREFIX } page_num" ) ,
37+ pageSize : int = Path (..., title = f" { PLACEHOLDER_PREFIX } page_size" , description = f" { PLACEHOLDER_PREFIX } page_size" ) ,
38+ keyword : Optional [str ] = Query (None , description = f" { PLACEHOLDER_PREFIX } keyword " ),
39+ status : Optional [int ] = Query (None , description = f" { PLACEHOLDER_PREFIX } status " ),
40+ origins : Optional [list [int ]] = Query (None , description = f" { PLACEHOLDER_PREFIX } origin " ),
41+ oidlist : Optional [list [int ]] = Query (None , description = f" { PLACEHOLDER_PREFIX } oid " ),
4042):
4143 pagination = PaginationParams (page = pageNum , size = pageSize )
4244 paginator = Paginator (session )
@@ -108,13 +110,14 @@ def format_user_dict(row) -> dict:
108110 result_dict [key ] = item
109111
110112 return result_dict
111- @router .get ("/ws" )
113+
114+ @router .get ("/ws" , include_in_schema = False )
112115async def ws_options (session : SessionDep , current_user : CurrentUser , trans : Trans ) -> list [UserWs ]:
113116 return await user_ws_options (session , current_user .id , trans )
114117
115- @router .put ("/ws/{oid}" )
118+ @router .put ("/ws/{oid}" , summary = f" { PLACEHOLDER_PREFIX } switch_oid_api" , description = f" { PLACEHOLDER_PREFIX } switch_oid_api" )
116119@clear_cache (namespace = CacheNamespace .AUTH_INFO , cacheName = CacheName .USER_INFO , keyExpression = "current_user.id" )
117- async def ws_change (session : SessionDep , current_user : CurrentUser , trans :Trans , oid : int ):
120+ async def ws_change (session : SessionDep , current_user : CurrentUser , trans :Trans , oid : int = Path ( description = f" { PLACEHOLDER_PREFIX } oid" ) ):
118121 ws_list : list [UserWs ] = await user_ws_options (session , current_user .id )
119122 if not any (x .id == oid for x in ws_list ):
120123 db_ws = session .get (WorkspaceModel , oid )
@@ -126,9 +129,9 @@ async def ws_change(session: SessionDep, current_user: CurrentUser, trans:Trans,
126129 session .add (user_model )
127130 session .commit ()
128131
129- @router .get ("/{id}" , response_model = UserEditor )
132+ @router .get ("/{id}" , response_model = UserEditor , summary = f" { PLACEHOLDER_PREFIX } user_detail_api" , description = f" { PLACEHOLDER_PREFIX } user_detail_api" )
130133@require_permissions (permission = SqlbotPermission (role = ['admin' ]))
131- async def query (session : SessionDep , trans : Trans , id : int ) -> UserEditor :
134+ async def query (session : SessionDep , trans : Trans , id : int = Path ( description = f" { PLACEHOLDER_PREFIX } uid" ) ) -> UserEditor :
132135 db_user : UserModel = get_db_user (session = session , user_id = id )
133136 u_ws_options = await user_ws_options (session , id , trans )
134137 result = UserEditor .model_validate (db_user .model_dump ())
@@ -137,7 +140,7 @@ async def query(session: SessionDep, trans: Trans, id: int) -> UserEditor:
137140 return result
138141
139142
140- @router .post ("" )
143+ @router .post ("" , summary = f" { PLACEHOLDER_PREFIX } user_create_api" , description = f" { PLACEHOLDER_PREFIX } user_create_api" )
141144@require_permissions (permission = SqlbotPermission (role = ['admin' ]))
142145async def create (session : SessionDep , creator : UserCreator , trans : Trans ):
143146 if check_account_exists (session = session , account = creator .account ):
@@ -167,7 +170,7 @@ async def create(session: SessionDep, creator: UserCreator, trans: Trans):
167170 session .commit ()
168171
169172
170- @router .put ("" )
173+ @router .put ("" , summary = f" { PLACEHOLDER_PREFIX } user_update_api" , description = f" { PLACEHOLDER_PREFIX } user_update_api" )
171174@require_permissions (permission = SqlbotPermission (role = ['admin' ]))
172175@clear_cache (namespace = CacheNamespace .AUTH_INFO , cacheName = CacheName .USER_INFO , keyExpression = "editor.id" )
173176async def update (session : SessionDep , editor : UserEditor , trans : Trans ):
@@ -203,18 +206,18 @@ async def update(session: SessionDep, editor: UserEditor, trans: Trans):
203206 session .add (user_model )
204207 session .commit ()
205208
206- @router .delete ("/{id}" )
209+ @router .delete ("/{id}" , summary = f" { PLACEHOLDER_PREFIX } user_del_api" , description = f" { PLACEHOLDER_PREFIX } user_del_api" )
207210@require_permissions (permission = SqlbotPermission (role = ['admin' ]))
208- async def delete (session : SessionDep , id : int ):
211+ async def delete (session : SessionDep , id : int = Path ( description = f" { PLACEHOLDER_PREFIX } uid" ) ):
209212 await single_delete (session , id )
210213
211- @router .delete ("" )
214+ @router .delete ("" , summary = f" { PLACEHOLDER_PREFIX } user_batchdel_api" , description = f" { PLACEHOLDER_PREFIX } user_batchdel_api" )
212215@require_permissions (permission = SqlbotPermission (role = ['admin' ]))
213216async def batch_del (session : SessionDep , id_list : list [int ]):
214217 for id in id_list :
215218 await single_delete (session , id )
216219
217- @router .put ("/language" )
220+ @router .put ("/language" , summary = f" { PLACEHOLDER_PREFIX } language_change" , description = f" { PLACEHOLDER_PREFIX } language_change" )
218221@clear_cache (namespace = CacheNamespace .AUTH_INFO , cacheName = CacheName .USER_INFO , keyExpression = "current_user.id" )
219222async def langChange (session : SessionDep , current_user : CurrentUser , trans : Trans , language : UserLanguage ):
220223 lang = language .language
@@ -226,18 +229,18 @@ async def langChange(session: SessionDep, current_user: CurrentUser, trans: Tran
226229 session .commit ()
227230
228231
229- @router .patch ("/pwd/{id}" )
232+ @router .patch ("/pwd/{id}" , summary = f" { PLACEHOLDER_PREFIX } reset_pwd" , description = f" { PLACEHOLDER_PREFIX } reset_pwd" )
230233@require_permissions (permission = SqlbotPermission (role = ['admin' ]))
231234@clear_cache (namespace = CacheNamespace .AUTH_INFO , cacheName = CacheName .USER_INFO , keyExpression = "id" )
232- async def pwdReset (session : SessionDep , current_user : CurrentUser , trans : Trans , id : int ):
235+ async def pwdReset (session : SessionDep , current_user : CurrentUser , trans : Trans , id : int = Path ( description = f" { PLACEHOLDER_PREFIX } uid" ) ):
233236 if not current_user .isAdmin :
234237 raise Exception (trans ('i18n_permission.no_permission' , url = " patch[/user/pwd/id]," , msg = trans ('i18n_permission.only_admin' )))
235238 db_user : UserModel = get_db_user (session = session , user_id = id )
236239 db_user .password = default_md5_pwd ()
237240 session .add (db_user )
238241 session .commit ()
239242
240- @router .put ("/pwd" )
243+ @router .put ("/pwd" , summary = f" { PLACEHOLDER_PREFIX } update_pwd" , description = f" { PLACEHOLDER_PREFIX } update_pwd" )
241244@clear_cache (namespace = CacheNamespace .AUTH_INFO , cacheName = CacheName .USER_INFO , keyExpression = "current_user.id" )
242245async def pwdUpdate (session : SessionDep , current_user : CurrentUser , trans : Trans , editor : PwdEditor ):
243246 new_pwd = editor .new_pwd
@@ -251,10 +254,10 @@ async def pwdUpdate(session: SessionDep, current_user: CurrentUser, trans: Trans
251254 session .commit ()
252255
253256
254- @router .patch ("/status" )
257+ @router .patch ("/status" , summary = f" { PLACEHOLDER_PREFIX } update_status" , description = f" { PLACEHOLDER_PREFIX } update_status" )
255258@require_permissions (permission = SqlbotPermission (role = ['admin' ]))
256259@clear_cache (namespace = CacheNamespace .AUTH_INFO , cacheName = CacheName .USER_INFO , keyExpression = "statusDto.id" )
257- async def langChange (session : SessionDep , current_user : CurrentUser , trans : Trans , statusDto : UserStatus ):
260+ async def statusChange (session : SessionDep , current_user : CurrentUser , trans : Trans , statusDto : UserStatus ):
258261 if not current_user .isAdmin :
259262 raise Exception (trans ('i18n_permission.no_permission' , url = ", " , msg = trans ('i18n_permission.only_admin' )))
260263 status = statusDto .status
0 commit comments