1+ from collections import defaultdict
12from typing import Optional
23from fastapi import APIRouter , HTTPException , Query
3- from sqlmodel import func , or_ , select , delete as sqlmodel_delete
4+ from sqlmodel import SQLModel , func , or_ , select , delete as sqlmodel_delete
45from 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
56from apps .system .models .system_model import UserWsModel , WorkspaceModel
67from apps .system .models .user import UserModel
1112from common .core .schemas import PaginatedResponse , PaginationParams
1213from common .core .security import default_md5_pwd , md5pwd , verify_md5pwd
1314from common .core .sqlbot_cache import clear_cache
15+
1416router = APIRouter (tags = ["user" ], prefix = "/user" )
1517
1618@router .get ("/info" )
@@ -30,43 +32,15 @@ async def pager(
3032 pagination = PaginationParams (page = pageNum , size = pageSize )
3133 paginator = Paginator (session )
3234 filters = {}
33-
34- stmt = (
35- select (
36- UserModel ,
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")
45- )
46- .join (UserWsModel , UserModel .id == UserWsModel .uid , isouter = True )
47- #.join(WorkspaceModel, UserWsModel.oid == WorkspaceModel.id, isouter=True)
48- .where (UserModel .id != 1 )
49- .group_by (UserModel .id )
50- .order_by (UserModel .create_time )
51- )
52- if status is not None :
53- stmt = stmt .where (UserModel .status == status )
5435
36+ origin_stmt = select (UserModel .id ).join (UserWsModel , UserModel .id == UserWsModel .uid ).where (UserModel .id != 1 ).distinct ()
5537 if oidlist :
56- user_filter = (
57- select (UserModel .id )
58- .join (UserWsModel , UserModel .id == UserWsModel .uid )
59- .where (UserWsModel .oid .in_ (oidlist ))
60- .distinct ()
61- )
62- stmt = stmt .where (UserModel .id .in_ (user_filter ))
63-
64- """ if origins is not None:
65- stmt = stmt.where(UserModel.origin == origins) """
66-
38+ origin_stmt = origin_stmt .where (UserWsModel .oid .in_ (oidlist ))
39+ if status is not None :
40+ origin_stmt = origin_stmt .where (UserModel .status == status )
6741 if keyword :
6842 keyword_pattern = f"%{ keyword } %"
69- stmt = stmt .where (
43+ origin_stmt = origin_stmt .where (
7044 or_ (
7145 UserModel .account .ilike (keyword_pattern ),
7246 UserModel .name .ilike (keyword_pattern ),
@@ -75,21 +49,47 @@ async def pager(
7549 )
7650
7751 user_page = await paginator .get_paginated_response (
78- stmt = stmt ,
52+ stmt = origin_stmt ,
7953 pagination = pagination ,
8054 ** 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 """
55+ uid_list = [item .get ('id' ) for item in user_page .items ]
56+ if not uid_list :
57+ return user_page
58+ stmt = (
59+ select (UserModel , UserWsModel .oid .label ('ws_oid' ))
60+ .join (UserWsModel , UserModel .id == UserWsModel .uid , isouter = True )
61+ .where (UserModel .id .in_ (uid_list ))
62+ .order_by (UserModel .create_time )
63+ )
64+ user_workspaces = session .exec (stmt ).all ()
65+ merged = defaultdict (list )
66+ extra_attrs = {}
67+
68+ for (user , ws_oid ) in user_workspaces :
69+ item = {}
70+ item .update (user .model_dump ())
71+ user_id = item ['id' ]
72+ merged [user_id ].append (ws_oid )
73+ if user_id not in extra_attrs :
74+ extra_attrs [user_id ] = {k : v for k , v in item .items () if k != "ws_oid" }
75+
76+ # 组合结果
77+ result = [
78+ {** extra_attrs [user_id ], "oid_list" : oid_list }
79+ for user_id , oid_list in merged .items ()
80+ ]
81+ user_page .items = result
9182 return user_page
9283
84+ def format_user_dict (row ) -> dict :
85+ result_dict = {}
86+ for item , key in zip (row , row ._fields ):
87+ if isinstance (item , SQLModel ):
88+ result_dict .update (item .model_dump ())
89+ else :
90+ result_dict [key ] = item
91+
92+ return result_dict
9393@router .get ("/ws" )
9494async def ws_options (session : SessionDep , current_user : CurrentUser , trans : Trans ) -> list [UserWs ]:
9595 return await user_ws_options (session , current_user .id , trans )
0 commit comments