
    Xj'              
       ^   d dl mZmZmZmZ d dlmZmZ d dlm	Z	 d dl
mZmZmZmZ d dlmZ d dlmZ d dlmZ d dlmZ d d	lmZ d d
lmZ d dlmZ d dlmZm Z m!Z! d dl"m#Z# d dl$m%Z%  edg          Z& e%e'          Z(d(dedede)fdZ*e&+                    de,e                    d d ee           e ed                    fde-de-dedefd            Z.e&/                    de            ee           e ed                    fdededefd            Z0e&1                    d e            ee           e ed                    fd!e-de!dedefd"            Z2e&3                    d            ee           e ed                    fd!e-dedefd#            Z4e&1                    d$           ee           e ed                    fd!e-d%e,e-         dedefd&            Z5e&+                    d$           ee           ee	          fd!e-dedefd'            Z6dS ))    )	APIRouterDependsHTTPExceptionstatus)Session
joinedload)get_current_user)require_createrequire_deleterequire_readrequire_update)get_password_hash)user)get_db)Role)Tenant)User)UserRole)
UserCreateUserResponse
UserUpdate)RBACBootstrapService)
get_loggerusers)tagsNr   tenantreturnc                 p    ddddd}|                     | j        | j                  }|r|j         d| S |S )Nu   平台管理员u   平台用户u   客户管理员u   客户用户)platform_adminplatform_usercustomer_admincustomer_user/)getrolename)r   r   role_map	role_texts       ?/lsinfo/ai/hellotax_ai/base_platform/app/api/v1/access/users.pyget_role_displayr*      sW    +'+'	 H TY	22I ,+++	+++    r#   )response_modeld   skiplimitdbcurrent_userc                 j   |                     t                                        t          t          j                            }|j        dk    r(|                    t          j        |j        k              }|                    |           	                    |          
                                }g }|D ]|}|                    t          |j        |j        |j        |j        |j        |j        r|j        j        nd t!          ||j                  |j        |j        |j        
  
                   }|S )Nr   
idemailr&   r%   	tenant_idcompany_namerole_displayis_verified
last_login
created_at)queryr   optionsr   r   r%   filterr6   offsetr/   allappendr   r4   r5   r&   r*   r9   r:   r;   )r.   r/   r0   r1   r<   r   resultr   s           r)   
list_usersrC   #   s    HHTNN"":dk#:#:;;E,,,T^|/EEFFLL$$U++//11EF 
 
7jYY.15FT[--$-dDK@@ ,??  	
 	
 	
 	
 Mr+   user_inc                    |j         dk    r0| j         dvrt          t          j        d          |j        | _        t          j        || j                  }|rt          t          j        d          | j         dv r| j        st          t          j        d          |	                    t                                        t          j        | j        k                                              }|st          t          j        d          t          | j        | j        t#          | j                  | j         | j        d	
          }|                    |           |                                 |                    |           t-          j        ||           t0                              |j                                      d           |j        rR|	                    t                                        t          j        |j        k                                              nd }t7          |j        |j        |j        |j         |j        |r|j        nd t9          ||          |j        |j        |j        
  
        S )Nr!   r!   r"   zECustomer admin can only create customer_admin and customer_user rolesstatus_codedetailr5   Email already registeredz(tenant_id is required for customer rolesCompany not foundT)r5   r&   hashed_passwordr%   r6   r9   user_idzUser createdr3   ) r%   r   r   HTTP_403_FORBIDDENr6   	crud_userget_by_emailr5   HTTP_400_BAD_REQUESTr<   r   r>   r4   firstHTTP_404_NOT_FOUNDr   r&   r   passwordaddcommitrefreshr   sync_user_role_bindingloggerbindinfor   r*   r9   r:   r;   )rD   r0   r1   existing_userr   db_users         r)   create_userr`   A   sj    ,,,<BBB"5^    )2*2W]CCCM 
3<V
 
 
 	
 |:::  	"7A    &!!((g6G)GHHNNPP 	cF,ENabbbbm\)'*:;;\#  G FF7OOOIIKKKJJw/G<<<
KK
K##((888 		W-> >??EEGGG 
 :m\\#$*4V[[%gv66'%%   r+   z
/{user_id}rO   c                    |j         dk    rb|                    t                                        t          j        | k    t          j        |j        k                                              }nM|                    t                                        t          j        | k                                              }|st          t          j	        d          |j         dk    r+|j         r$|j         dvrt          t          j
        d          |j        rH|j        |j        k    r8t          j        ||j                  }|rt          t          j        d          |j        |j        |_        |j        |j        |_        |j         }|j        }|j         |j         |_         |j        {|                    t                                         t           j        |j        k                                              }|st          t          j	        d          |j        |_        |j        |j        |_        |                                 |                    |           t)          j        ||||	           t,                              |j        
                              d           |j        rR|                    t                                         t           j        |j        k                                              nd }t3          |j        |j        |j        |j         |j        |r|j        nd t5          ||          |j        |j        |j        
  
        S )Nr!   User not foundrG   rF   zBCustomer admin can only set customer_admin and customer_user rolesrJ   rK   rL   )previous_roleprevious_tenant_idrN   zUser updatedr3   )r%   r<   r   r>   r4   r6   rT   r   r   rU   rP   r5   rQ   rR   rS   r&   r   r9   rX   rY   r   rZ   r[   r\   r]   r   r*   r:   r;   )	rO   rD   r0   r1   r_   r^   rc   rd   r   s	            r)   update_userre   |   s    ,,,HHTNNVDGw&,:P(PQQUWW 	 ((4..''7(:;;AACC \(AJZ[[[[,,,< 	GL0SSS"5[    } '-77!.rGGG 	"7@Z    ||} LM *||$&!!((g6G)GHHNNPP 	cF,ENabbbb#-&%1IIKKKJJw/
G=EW    KK
K##((888 		W-> >??EEGGG 
 :m\\#$*4V[[%gv66'%%   r+   c                    | |j         k    rt          t          j        d          |j        dk    rb|                    t                                        t          j         | k    t          j        |j        k              	                                }nM|                    t                                        t          j         | k              	                                }|st          t          j
        d          t                              |j                                       d           |                    |           |                                 dd|j         d	iS )
NzCannot delete your own accountrG   r!   rb   rN   zUser deletedmessagezUser z deleted successfully)r4   r   r   rS   r%   r<   r   r>   r6   rT   rU   r[   r\   r]   deleterX   r&   )rO   r0   r1   r_   s       r)   delete_userri      s-    ,/!!3<\
 
 
 	
 ,,,HHTNNVDGw&,:P(PQQUWW 	 ((4..''7(:;;AACC \(AJZ[[[[
KK
K##((888IIgIIKKKBw|BBBCCr+   z/{user_id}/rolesrole_idsc                    ddl m} ddlm} |j        dk    rt          t          j        d          |                     |d                     |	                    t                                        t          j        | k                                              }|st          t          j        d          |	                    t                                        t          j                            |          t          j                                                   }t'          |          t'          |          k    rt          t          j        d	          |                    || ||j        
           |r&|d         j        |_        |                                 t2                              | |                              d           d|dS )Nr   text)	user_roler   z)Only platform admin can update user rolesrG   SET search_path TO publicrb   zOne or more roles not found)rO   rj   r6   )rO   rj   zUser roles updatedzUser roles updated successfully)rg   rj   )
sqlalchemyrm   app.crud.user_rolern   r%   r   r   rP   executer<   r   r>   r4   rT   rU   r   in_
is_deletedr@   lenrS   update_user_rolesr6   coderX   r[   r\   r]   )rO   rj   r0   r1   rm   user_role_crudr_   roless           r)   rv   rv      s     >>>>>>,,,1>
 
 
 	
 JJtt/00111hhtnn##DGw$677==??G \(AJZ[[[[HHTNN!!$'++h"7"7T_9LMMQQSSE
5zzS]]""3<Y
 
 
 	
 $$
Gh':K %     Qx}
		
KK(K33889MNNN8hOOOr+   c                 "   ddl m} |j        dk    rt          t          j        d          |                     |d                     |                    t                    	                    t          j
        | k                                              }|st          t          j        d          |                    t                    	                    t          j        | k    t          j                                                   }d |D             }|                    t"                    	                    t"          j
                            |          t"          j                                                   }| d	 |D             d
S )Nr   rl   r   z+Insufficient permissions to view user rolesrG   ro   rb   c                     g | ]	}|j         
S  )role_id).0urs     r)   
<listcomp>z"get_user_roles.<locals>.<listcomp>  s    000r
000r+   c                 8    g | ]}|j         |j        |j        d S )r4   rw   r&   r   )r~   rs     r)   r   z"get_user_roles.<locals>.<listcomp>  s(    NNN1qvqv>>NNNr+   )rO   ry   )rp   rm   r%   r   r   rP   rr   r<   r   r>   r4   rT   rU   r   rO   rt   r@   r   rs   )rO   r0   r1   rm   r_   
user_rolesrj   ry   s           r)   get_user_rolesr      sh     ,,,1@
 
 
 	
 JJtt/00111hhtnn##DGw$677==??G \(AJZ[[[[
!!("2g"=8CV?VWW[[]]  10Z000HHHTNN!!$'++h"7"7T_9LMMQQSSENNNNN  r+   )N)7fastapir   r   r   r   sqlalchemy.ormr   r   app.api.depsr	   app.api.permissionsr
   r   r   r   app.core.securityr   app.crud.userr   rQ   app.db.sessionr   app.models.roler   app.models.tenantr   app.models.userr   app.models.user_roler   app.schemas.userr   r   r   *app.services.access.rbac_bootstrap_servicer   common_loggingr   router__name__r[   strr*   r$   listintrC   postr`   putre   rh   ri   rv   r   r|   r+   r)   <module>r      sz   = = = = = = = = = = = = . . . . . . . . ) ) ) ) ) ) \ \ \ \ \ \ \ \ \ \ \ \ / / / / / / + + + + + + ! ! ! ! ! !             $ $ $ $ $ $             ) ) ) ) ) ) A A A A A A A A A A K K K K K K % % % % % %			"	"	"	H		
 
4 
 
3 
 
 
 
 C\ 233'&// g!6!677	 
 	 	   43: S.. '&// !8!8997 777 7 7 7 /.7t L66 '&// !8!899	A AAA 	A 	A A A 76AH | '&// !8!899D DDD D D D D2  '&// !8!899	P PP3iP 	P 	P P P  PD  'ggN^F_F_ ?C      r+   