11from typing import Optional
2- from fastapi import APIRouter , Query
3- from sqlmodel import func , or_ , select
4- from apps .system .crud .user import get_db_user , user_ws_options
5- from apps .system .models .system_model import UserWsModel , WorkspaceModel
2+ from fastapi import APIRouter , HTTPException , Query
3+ from sqlmodel import func , or_ , select , delete as sqlmodel_delete
4+ from apps .system .crud .user import get_db_user , single_delete , user_ws_options
5+ from apps .system .models .system_model import UserWsModel
66from apps .system .models .user import UserModel
77from apps .system .schemas .auth import CacheName , CacheNamespace
88from apps .system .schemas .system_schema import PwdEditor , UserCreator , UserEditor , UserGrid , UserLanguage , UserWs
@@ -34,14 +34,21 @@ async def pager(
3434 stmt = (
3535 select (
3636 UserModel ,
37- func .coalesce (func .string_agg (WorkspaceModel .name , ',' ), '' ).label ("space_name" )
37+ func .coalesce (
38+ func .array_remove (
39+ func .array_agg (UserWsModel .oid ),
40+ None
41+ ),
42+ []
43+ ).label ("oid_list" )
44+ #func.coalesce(func.string_agg(WorkspaceModel.name, ','), '').label("space_name")
3845 )
3946 .join (UserWsModel , UserModel .id == UserWsModel .uid , isouter = True )
40- .join (WorkspaceModel , UserWsModel .oid == WorkspaceModel .id , isouter = True )
47+ #.join(WorkspaceModel, UserWsModel.oid == WorkspaceModel.id, isouter=True)
48+ .where (UserModel .id != 1 )
4149 .group_by (UserModel .id )
4250 .order_by (UserModel .create_time )
4351 )
44-
4552 if status is not None :
4653 stmt = stmt .where (UserModel .status == status )
4754
@@ -67,10 +74,21 @@ async def pager(
6774 )
6875 )
6976
70- return await paginator .get_paginated_response (
77+ user_page = await paginator .get_paginated_response (
7178 stmt = stmt ,
7279 pagination = pagination ,
7380 ** filters )
81+
82+ """ for item in user_page.items:
83+ space_name: str = item['space_name']
84+ if space_name and 'i18n_default_workspace' in space_name:
85+ parts = list(map(
86+ lambda x: trans(x) if x == "i18n_default_workspace" else x,
87+ space_name.split(',')
88+ ))
89+ output_str = ','.join(parts)
90+ item['space_name'] = output_str """
91+ return user_page
7492
7593@router .get ("/ws" )
7694async def ws_options (session : SessionDep , current_user : CurrentUser , trans : Trans ) -> list [UserWs ]:
@@ -81,46 +99,78 @@ async def ws_options(session: SessionDep, current_user: CurrentUser, trans: Tran
8199async def ws_change (session : SessionDep , current_user : CurrentUser , oid : int ):
82100 ws_list : list [UserWs ] = await user_ws_options (session , current_user .id )
83101 if not any (x .id == oid for x in ws_list ):
84- raise RuntimeError (f"oid [{ oid } ] is invalid!" )
102+ raise HTTPException (f"oid [{ oid } ] is invalid!" )
85103 user_model : UserModel = get_db_user (session = session , user_id = current_user .id )
86104 user_model .oid = oid
87105 session .add (user_model )
88106 session .commit ()
89107
90108@router .get ("/{id}" , response_model = UserEditor )
91- async def query (session : SessionDep , id : int ) -> UserEditor :
109+ async def query (session : SessionDep , trans : Trans , id : int ) -> UserEditor :
92110 db_user : UserModel = get_db_user (session = session , user_id = id )
93- return db_user
111+ u_ws_options = await user_ws_options (session , id , trans )
112+ result = UserEditor .model_validate (db_user .model_dump ())
113+ if u_ws_options :
114+ result .oid_list = [item .id for item in u_ws_options ]
115+ return result
94116
95117@router .post ("" )
96118async def create (session : SessionDep , creator : UserCreator ):
97119 data = creator .model_dump (exclude_unset = True )
98120 user_model = UserModel .model_validate (data )
99121 #user_model.create_time = get_timestamp()
100122 user_model .language = "zh-CN"
123+ user_model .oid = 0
124+ if creator .oid_list :
125+ # need to validate oid_list
126+ db_model_list = [
127+ UserWsModel .model_validate ({
128+ "oid" : oid ,
129+ "uid" : user_model .id ,
130+ "weight" : 0
131+ })
132+ for oid in creator .oid_list
133+ ]
134+ session .add_all (db_model_list )
135+ user_model .oid = creator .oid_list [0 ]
101136 session .add (user_model )
102137 session .commit ()
103138
104139@router .put ("" )
105140@clear_cache (namespace = CacheNamespace .AUTH_INFO , cacheName = CacheName .USER_INFO , keyExpression = "editor.id" )
106141async def update (session : SessionDep , editor : UserEditor ):
107142 user_model : UserModel = get_db_user (session = session , user_id = editor .id )
143+ origin_oid : int = user_model .oid
144+ del_stmt = sqlmodel_delete (UserWsModel ).where (UserWsModel .uid == editor .id )
145+ session .exec (del_stmt )
146+
108147 data = editor .model_dump (exclude_unset = True )
109148 user_model .sqlmodel_update (data )
149+
150+ user_model .oid = 0
151+ if editor .oid_list :
152+ # need to validate oid_list
153+ db_model_list = [
154+ UserWsModel .model_validate ({
155+ "oid" : oid ,
156+ "uid" : user_model .id ,
157+ "weight" : 0
158+ })
159+ for oid in editor .oid_list
160+ ]
161+ session .add_all (db_model_list )
162+ user_model .oid = origin_oid if origin_oid in editor .oid_list else editor .oid_list [0 ]
110163 session .add (user_model )
111164 session .commit ()
112165
113166@router .delete ("/{id}" )
114- @clear_cache (namespace = CacheNamespace .AUTH_INFO , cacheName = CacheName .USER_INFO , keyExpression = "id" )
115167async def delete (session : SessionDep , id : int ):
116- user_model : UserModel = get_db_user (session = session , user_id = id )
117- session .delete (user_model )
118- session .commit ()
168+ await single_delete (session , id )
119169
120170@router .delete ("" )
121171async def batch_del (session : SessionDep , id_list : list [int ]):
122172 for id in id_list :
123- delete (session , id )
173+ await single_delete (session , id )
124174
125175@router .put ("/language" )
126176@clear_cache (namespace = CacheNamespace .AUTH_INFO , cacheName = CacheName .USER_INFO , keyExpression = "current_user.id" )
@@ -137,7 +187,7 @@ async def langChange(session: SessionDep, current_user: CurrentUser, language: U
137187@clear_cache (namespace = CacheNamespace .AUTH_INFO , cacheName = CacheName .USER_INFO , keyExpression = "id" )
138188async def pwdReset (session : SessionDep , current_user : CurrentUser , id : int ):
139189 if not current_user .isAdmin :
140- raise RuntimeError ('only for admin' )
190+ raise HTTPException ('only for admin' )
141191 db_user : UserModel = get_db_user (session = session , user_id = id )
142192 db_user .password = default_md5_pwd ()
143193 session .add (db_user )
@@ -148,7 +198,7 @@ async def pwdReset(session: SessionDep, current_user: CurrentUser, id: int):
148198async def pwdUpdate (session : SessionDep , current_user : CurrentUser , editor : PwdEditor ):
149199 db_user : UserModel = get_db_user (session = session , user_id = current_user .id )
150200 if not verify_md5pwd (editor .pwd , db_user .password ):
151- raise RuntimeError ("pwd error" )
201+ raise HTTPException ("pwd error" )
152202 db_user .password = md5pwd (editor .new_pwd )
153203 session .add (db_user )
154204 session .commit ()
0 commit comments