
    Xj                         d dl mZ d dlmZ d dlmZmZmZmZm	Z	 d dl
mZ d dlmZ  ee          Z G d d          ZdS )	    )Session)AppException)add_permission_for_roleget_enforcerget_permissions_for_roleget_redis_clientremove_permission_for_role)Role)
get_loggerc                   Z   e Zd Zg dZg dZedededee	e
e
f                  dedef
d            Zededededee	e
e
f                  fd	            Zededed
ededef
d            Zededed
ededef
d            Zededefd            Zedee	e
ef                  fd            ZdS )CasbinPermissionService)usersrolesknowledge_basesknowledge_categoriesknowledge_tagsagents	workflows	documents
audit_logsmenus	providersmodels)readcreateupdatedeleteexecutedbrole_idpermissions	tenant_idreturnc                     |                      t                                        t          j        |k                                              }|st          dd          |j        rt          dd          t                      }d|j         }t          |          }|
                    d||          }	 |                    d||           |D ]k}	|	                    d          }
|	                    d          }|
r|st          d	|	           t          |||
|          }|st          d
|
 d|           lt                               ||           t$                              dt)          |           d|j                    dS # t          $ ry}t$                              d|            |                    d||           |D ]} |j        |  t          dt          |           dt          |                     d d }~ww xY w)N   角色不存在Role not foundu   系统角色权限不可修改z*System role permissions cannot be modifiedrole:r   resourceactionzInvalid permission: zFailed to add permission: :z	Assigned z permissions to role Tz,Permission assignment failed, rolling back: u   权限分配失败: zPermission assignment failed: )queryr
   filteridfirstr   	is_systemr   codestrget_filtered_policyremove_filtered_policyget
ValueErrorr   	Exceptionr   _invalidate_role_cacheloggerinfolenerror
add_policy)r   r    r!   r"   roleenforcer	role_codedomainold_policiespermr(   r)   successepolicys                  U/lsinfo/ai/hellotax_ai/base_platform/app/services/access/casbin_permission_service.pyassign_permissionsz*CasbinPermissionService.assign_permissions"   sV    xx~~$$TW%788>>@@ 	D02BCCC> 	o?Amnnn>>'DI''	Y33Ay&II	u++Ay&AAA# V V88J//(++ Dv D$%BD%B%BCCC1)YRXYY V#$T$T$TF$T$TUUUV#::7INNNKKVC$4$4VV49VVWWW4 	u 	u 	uLLKKKLLL++Ay&AAA& - -##V,,,>c!ff>>@iadefagag@i@ijjptt	us   6CF
 

HA4HHc                     |                     t                                        t          j        | k                                              }|sg S d|j         }t          ||          }d |D             S )Nr'   c                 0    g | ]}|d          |d         dS )      )r(   r)    ).0ps     rF   
<listcomp>z@CasbinPermissionService.get_role_permissions.<locals>.<listcomp>J   s(    EEEqQqTQqT22EEE    )r+   r
   r,   r-   r.   r0   r   )r    r"   r   r=   r?   policiess         rF   get_role_permissionsz,CasbinPermissionService.get_role_permissionsC   sq    xx~~$$TW%788>>@@ 	I'DI''	+IyAAEEHEEEErP   menu_idc                 D   |                      t                                        t          j        |k                                              }|st          dd          d| }d}d|j         }t          ||||          }|rt          	                    ||           |S Nr%   r&   zmenu:viewr'   )
r+   r
   r,   r-   r.   r   r0   r   r   r7   	r   r    rS   r"   r=   r(   r)   r?   rC   s	            rF   grant_menu_permissionz-CasbinPermissionService.grant_menu_permissionL   s    xx~~$$TW%788>>@@ 	D02BCCC$7$$'DI''	))Y&QQ 	O#::7INNNrP   c                 D   |                      t                                        t          j        |k                                              }|st          dd          d| }d}d|j         }t          ||||          }|rt          	                    ||           |S rU   )
r+   r
   r,   r-   r.   r   r0   r	   r   r7   rW   s	            rF   revoke_menu_permissionz.CasbinPermissionService.revoke_menu_permissionY   s    xx~~$$TW%788>>@@ 	D02BCCC$7$$'DI''	,Y	8VTT 	O#::7INNNrP   c                 8   	 t                      }d| d}d}	 |                    ||d          \  }}|r
 |j        |  |dk    rn/t                              d|            d S # t
          $ r(}t                              d|            Y d }~d S d }~ww xY w)	Nzperm:*:z:*:*r   Td   )matchcountz(Invalidated permission cache for tenant zFailed to invalidate cache: )r   scanr   r8   r9   r6   warning)r    r"   redis_clientpatterncursorkeysrD   s          rF   r7   z.CasbinPermissionService._invalidate_role_cachef   s    	?+--L/	///GF+00wc0RR /'L'..Q;; KKN9NNOOOOO 	? 	? 	?NN=!==>>>>>>>>>	?s   A#A' '
B1BBc                  .    d t           j        D             S )Nc                 ,    g | ]}|t           j        d S ))r(   actions)r   ACTIONS)rM   r(   s     rF   rO   zCCasbinPermissionService.get_available_resources.<locals>.<listcomp>x   s4     
 
 
 ".E.MNN
 
 
rP   )r   	RESOURCESrL   rP   rF   get_available_resourcesz/CasbinPermissionService.get_available_resourcesv   s&    
 
3=
 
 
 	
rP   N)__name__
__module____qualname__ri   rh   staticmethodr   intlistdictr1   boolrG   rR   rX   rZ   r7   anyrj   rL   rP   rF   r   r      s         I @??Guu!u04T#s(^0DuQTu	u u u \u@ Fc Fc Fw F4PTUXZ]U]P^K_ F F F \F 
' 
C 
# 
RU 
Z^ 
 
 
 \
 
7 
S 
3 
SV 
[_ 
 
 
 \
 ? ? ? ? ? \? 
T$sCx.%9 
 
 
 \
 
 
rP   r   N)sqlalchemy.ormr   app.core.exceptionsr   app.core.permissionsr   r   r   r   r	   app.models.roler
   common_loggingr   rk   r8   r   rL   rP   rF   <module>ry      s    " " " " " " , , , , , ,              !           % % % % % %	H		j
 j
 j
 j
 j
 j
 j
 j
 j
 j
rP   