§
    ‚Një>  ã            
       óÂ  — d dl mZmZ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Zd dlZd dl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mZmZmZmZmZmZm Z m!Z! ddl"m#Z#m$Z$ ddl%m&Z&  edddg¬¦  «        Z'e' (                    d¦  «        d ee¦  «         e e$d¦  «        ¦  «        dfde)dededefd„¦   «         Z*e' +                    deej,        ¬¦  «         ee¦  «         e e$d¦  «        ¦  «        f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„¦   «         Z.e' /                    de¬¦  «         ee¦  «         e e$d¦  «        ¦  «        fde)dededefd „¦   «         Z0e' 1                    dej2        ¬!¦  «         ee¦  «         e e$d¦  «        ¦  «        fde)dedefd"„¦   «         Z3e' (                    d#¦  «         ee¦  «         e e$d$¦  «        ¦  «        dfdededefd%„¦   «         Z4e' +                    d#eej,        ¬¦  «         ee¦  «         e e$d$¦  «        ¦  «        fd&ededefd'„¦   «         Z5e' (                    d(e¬¦  «         ee¦  «         e e$d$¦  «        ¦  «        fd)e)dedefd*„¦   «         Z6e' /                    d(e¬¦  «         ee¦  «         e e$d$¦  «        ¦  «        fd)e)d+ededefd,„¦   «         Z7e' 1                    d(ej2        ¬!¦  «         ee¦  «         e e$d$¦  «        ¦  «        fd)e)dedefd-„¦   «         Z8e' (                    d.e!¬¦  «         ee¦  «         e e$d$¦  «        ¦  «        fd)e)dedefd/„¦   «         Z9e' +                    d.e!¬¦  «         ee¦  «         e e$d$¦  «        ¦  «        fd)e)d0ededefd1„¦   «         Z:e' 1                    d2e!¬¦  «         ee¦  «         e e$d$¦  «        ¦  «        fd)e)de)dedefd3„¦   «         Z;e' /                    d4e!¬¦  «         ee¦  «         e e$d$¦  «        ¦  «        fd)e)d5e dedefd6„¦   «         Z<dS )7é    )Ú	APIRouterÚDependsÚHTTPExceptionÚstatusÚRequestÚResponse)ÚSession©Útext)ÚListNé   )Úget_db)Ú
PermissionÚRoleÚRolePermission)ÚUser)	ÚPermissionCreateÚPermissionUpdateÚPermissionResponseÚ
RoleCreateÚ
RoleUpdateÚRoleResponseÚRolePermissionCreateÚRolePermissionBulkUpdateÚRolePermissionsResponse)Úget_current_admin_userÚrequire_permission)Úpublish_eventz/apiÚrolesÚpermissions)ÚprefixÚtagsz/permissionszadmin:permissionsÚcategoryÚdbÚcurrent_userÚrequestc              ƒ   óH  K  — |                      t          ¦  «        }| r#|                     t          j        | k    ¦  «        }|                     t          j        t          j        ¦  «                             ¦   «         }d„ |D ¦   «         }t          j        d„ |D ¦   «         ¦  «        }t          j
        |                     ¦   «         ¦  «                             ¦   «         }|r.|j                             d¦  «        |k    rt          d¬¦  «        S t          |dd|i¬¦  «        S )	z!Get all permissions (admin only).c                 ó6   — g | ]}t          j        |¦  «        ‘ŒS © )r   Úfrom_orm)Ú.0Úps     ú/app/app/api/roles.pyú
<listcomp>z#get_permissions.<locals>.<listcomp>&   s$   € ÐBÐBÐB°Õ Ô)¨!Ñ,Ô,ÐBÐBÐBó    c                 ó:   — g | ]}|                      d ¬¦  «        ‘ŒS )Újson)Úmode©Ú
model_dump©r+   Úrs     r-   r.   z#get_permissions.<locals>.<listcomp>'   s&   € ÐHÐHÐH¸A˜aŸlšl°˜lÑ7Ô7ÐHÐHÐHr/   úif-none-matché0  ©Ústatus_codezapplication/jsonÚetag)ÚcontentÚ
media_typeÚheaders)Úqueryr   Úfilterr#   Úorder_byÚnameÚallr1   ÚdumpsÚhashlibÚmd5ÚencodeÚ	hexdigestr>   Úgetr   )	r#   r$   r%   r&   r?   r    ÚresultÚresult_jsonr;   s	            r-   Úget_permissionsrL      s  è è € ð �HŠH•ZÑ Ô €EØð >Ø—’�ZÔ0°HÒ<Ñ=Ô=ˆØ—.’.¥Ô!4µj´oÑFÔF×JÒJÑLÔL€Kð CÐB°kÐBÑBÔB€FÝ”*ÐHÐHÀÐHÑHÔHÑIÔI€KÝŒ;�{×)Ò)Ñ+Ô+Ñ,Ô,×6Ò6Ñ8Ô8€Dàð )�7”?×&Ò& Ñ7Ô7¸4Ò?Ð?Ý CÐ(Ñ(Ô(Ð(åØØ%Ø˜�ðñ ô ð r/   )Úresponse_modelr:   Ú
permissionc              ƒ   ó  K  — |                      t          ¦  «                             t          j        | j        k    ¦  «                             ¦   «         }|r$t          t          j        d| j        › d�¬¦  «        ‚t          di |                      ¦   «         ¤Ž}| 	                    |¦  «         | 
                    ¦   «          |                     |¦  «         t          dt          |j        ¦  «        | j        dœ¦  «         |S )z%Create a new permission (admin only).úPermission 'ú' already exists©r:   ÚdetailÚpermission_created©Úpermission_idÚpermission_namer)   )r?   r   r@   rB   Úfirstr   r   ÚHTTP_400_BAD_REQUESTr4   ÚaddÚcommitÚrefreshr   ÚstrÚid)rN   r$   r%   ÚexistingÚnew_permissions        r-   Úcreate_permissionra   4   só   è è € ð �xŠx�
Ñ#Ô#×*Ò*­:¬?¸j¼oÒ+MÑNÔN×TÒTÑVÔV€HØð 
ÝÝÔ3ØC *¤/ÐCÐCÐCð
ñ 
ô 
ð 	
õ
  Ð:Ð: *×"7Ò"7Ñ"9Ô"9Ð:Ð:€NØ‡F‚Fˆ>ÑÔÐØ‡I‚I�K„K€KØ‡J‚Jˆ~ÑÔÐõ Ð&½#¸nÔ>OÑ:PÔ:PÐeoÔetÐ(uÐ(uÑvÔvÐvàÐr/   z/permissions/{permission_id})rM   rV   c              ƒ   óæ   K  — |                      t          ¦  «                             t          j        | k    ¦  «                             ¦   «         }|st          t          j        d| › d�¬¦  «        ‚|S )z+Get a single permission by ID (admin only).rP   ú' not foundrR   )r?   r   r@   r^   rX   r   r   ÚHTTP_404_NOT_FOUND©rV   r$   r%   rN   s       r-   Úget_permissionrf   N   su   è è € ð —’�*Ñ%Ô%×,Ò,­Z¬]¸mÒ-KÑLÔL×RÒRÑTÔT€JØð 
ÝÝÔ1Ø< -Ð<Ð<Ð<ð
ñ 
ô 
ð 	
ð Ðr/   Úpermission_updatec              ƒ   ó  K  — |                      t          ¦  «                             t          j        | k    ¦  «                             ¦   «         }|st          t          j        d| › d�¬¦  «        ‚|                     d¬¦  «        }| 	                    ¦   «         D ]\  }}t          |||¦  «         Œ|                     ¦   «          |                     |¦  «         t          dt          |j        ¦  «        |j        dœ¦  «         |S )z!Update a permission (admin only).rP   rc   rR   T©Úexclude_unsetÚpermission_updatedrU   )r?   r   r@   r^   rX   r   r   rd   r4   ÚitemsÚsetattrr[   r\   r   r]   rB   )rV   rg   r$   r%   rN   Úupdate_dataÚfieldÚvalues           r-   Úupdate_permissionrq   ^   s  è è € ð —’�*Ñ%Ô%×,Ò,­Z¬]¸mÒ-KÑLÔL×RÒRÑTÔT€JØð 
ÝÝÔ1Ø< -Ð<Ð<Ð<ð
ñ 
ô 
ð 	
ð
 $×.Ò.¸TÐ.ÑBÔB€KØ#×)Ò)Ñ+Ô+ð *ð *‰ˆˆuÝ�
˜E 5Ñ)Ô)Ð)Ð)à‡I‚I�K„K€KØ‡J‚JˆzÑÔÐõ Ð&½#¸j¼mÑ:LÔ:LÐakÔapÐ(qÐ(qÑrÔrÐràÐr/   r9   c              ƒ   ó^  K  — |                      t          ¦  «                             t          j        | k    ¦  «                             ¦   «         }|st          t          j        d| › d�¬¦  «        ‚|                     |¦  «         | 	                    ¦   «          t          d| | dœ¦  «         dS )z!Delete a permission (admin only).rP   rc   rR   Úpermission_deleted)rV   r^   N)r?   r   r@   r^   rX   r   r   rd   Údeleter[   r   re   s       r-   Údelete_permissionru   z   s®   è è € ð —’�*Ñ%Ô%×,Ò,­Z¬]¸mÒ-KÑLÔL×RÒRÑTÔT€JØð 
ÝÝÔ1Ø< -Ð<Ð<Ð<ð
ñ 
ô 
ð 	
ð
 ‡I‚IˆjÑÔÐØ‡I‚I�K„K€Kõ Ð&¸-È}Ð(]Ð(]Ñ^Ô^Ð^àˆ4r/   z/roleszadmin:rolesc              ƒ   óŠ  K  — |                       t          ¦  «                             t          j                             ¦   «         t          j        ¦  «                             ¦   «         }ddlm} |  	                     |d¦  «        ¦  «         
                    ¦   «         }g }|D ]�}d„ |j        D ¦   «         }|r%t          |j        ¦  «        t          |¦  «        k    nd}	|                     t          |j        |j        |j        |j        |j        |	|j        |j        |j        |¬¦
  «
        ¦  «         Œ‘d„ |D ¦   «         }
t+          j        |
t          ¬¦  «        }t/          j        |                     ¦   «         ¦  «                             ¦   «         }|r.|j                             d	¦  «        |k    rt;          d
¬¦  «        S |S )zGet all roles (admin only).r   r
   z4SELECT id FROM roles WHERE is_default = true LIMIT 1c                 ó   — g | ]	}|j         ‘Œ
S r)   ©rN   ©r+   Úrps     r-   r.   zget_roles.<locals>.<listcomp>¢   s   € Ð@Ð@Ð@¨�r”}Ð@Ð@Ð@r/   F)
r^   rB   ÚdescriptionÚcolorÚiconÚ
is_defaultÚpriorityÚ
created_atÚ
updated_atr    c                 ó6   — g | ]}|                      ¦   «         ‘ŒS r)   r3   r5   s     r-   r.   zget_roles.<locals>.<listcomp>³   s    € Ð2Ð2Ð2 a�1—<’<‘>”>Ð2Ð2Ð2r/   )Údefaultr7   r8   r9   )r?   r   rA   r   ÚdescrB   rC   Ú
sqlalchemyr   ÚexecuteÚscalarr    r]   r^   Úappendr   r{   r|   r}   r€   r�   r1   rD   rE   rF   rG   rH   r>   rI   r   )r$   r%   r&   r   r   Údefault_role_idrJ   Úroler    r~   Úresult_dictrK   r;   s                r-   Ú	get_rolesrŒ   “   s±  è è € ð �HŠH•T‰NŒN×#Ò#¥D¤M×$6Ò$6Ñ$8Ô$8½$¼)ÑDÔD×HÒHÑJÔJ€EàÐÐÐÐÐØ—j’j  Ð&\Ñ!]Ô!]Ñ^Ô^×eÒeÑgÔg€Oð €FØð ð ˆØ@Ð@¨tÔ/?Ð@Ñ@Ô@ˆà=LÐW•S˜œ‘\”\¥S¨Ñ%9Ô%9Ò9Ð9ÐRWˆ
Ø�Š•lØŒwØ”ØÔ(Ø”*Ø”Ø!Ø”]Ø”Ø”Ø#ð
ñ 
ô 
ñ 	ô 	ð 	ð 	ð 3Ð2¨6Ð2Ñ2Ô2€KÝ”*˜[µ#Ð6Ñ6Ô6€KÝŒ;�{×)Ò)Ñ+Ô+Ñ,Ô,×6Ò6Ñ8Ô8€Dàð )�7”?×&Ò& Ñ7Ô7¸4Ò?Ð?Ý CÐ(Ñ(Ô(Ð(à€Mr/   rŠ   c              ƒ   óô  K  — |                      t          ¦  «                             t          j        | j        k    ¦  «                             ¦   «         }|r$t          t          j        d| j        › d�¬¦  «        ‚t          | j        | j        | j	        | j
        ¬¦  «        }|                     |¦  «         |                     ¦   «          |                     |¦  «         | j	        rˆ|                      t          ¦  «                             t          j        |j        k    ¦  «                             t          j	        di¦  «         |                     ¦   «          |                     |¦  «         | j        r^| j        D ]-}t#          |j        |¬¦  «        }|                     |¦  «         Œ.|                     ¦   «          |                     |¦  «         t%          ddt'          |j        ¦  «        i¦  «         |S )	zCreate a new role (admin only).úRole 'rQ   rR   )rB   r{   r~   r   F©Úrole_idrV   Úrole_createdr�   )r?   r   r@   rB   rX   r   r   rY   r{   r~   r   rZ   r[   r\   r^   ÚupdateÚpermission_idsr   r   r]   )rŠ   r$   r%   r_   Únew_rolerV   Úrole_permissions          r-   Úcreate_roler–   ½   sÂ  è è € ð �xŠx�‰~Œ~×$Ò$¥T¤Y°$´)Ò%;Ñ<Ô<×BÒBÑDÔD€HØð 
ÝÝÔ3Ø7˜DœIÐ7Ð7Ð7ð
ñ 
ô 
ð 	
õ ØŒYØÔ$Ø”?Ø”ð	ñ ô €Hð ‡F‚Fˆ8ÑÔÐØ‡I‚I�K„K€KØ‡J‚JˆxÑÔÐð „ð Ø
�Š•‰Œ×Ò�dœg¨¬Ò4Ñ5Ô5×<Ò<½d¼oÈuÐ=UÑVÔVÐVØ
�	Š	‰ŒˆØ
�
Š
�8ÑÔÐð Ôð Ø!Ô0ð 	$ð 	$ˆMÝ,°X´[ÐP]Ð^Ñ^Ô^ˆOØ�FŠF�?Ñ#Ô#Ð#Ð#Ø
�	Š	‰ŒˆØ
�
Š
�8ÑÔÐõ �. 9­c°(´+Ñ.>Ô.>Ð"?Ñ@Ô@Ð@à€Or/   z/roles/{role_id}r�   c              ƒ   óæ   K  — |                      t          ¦  «                             t          j        | k    ¦  «                             ¦   «         }|st          t          j        d| › d�¬¦  «        ‚|S )z%Get a single role by ID (admin only).rŽ   rc   rR   )r?   r   r@   r^   rX   r   r   rd   ©r�   r$   r%   rŠ   s       r-   Úget_roler™   ë   sr   è è € ð �8Š8•D‰>Œ>× Ò ¥¤¨GÒ!3Ñ4Ô4×:Ò:Ñ<Ô<€DØð 
ÝÝÔ1Ø0˜GÐ0Ð0Ð0ð
ñ 
ô 
ð 	
ð €Kr/   Úrole_updatec              ƒ   ó:  K  — |                      t          ¦  «                             t          j        | k    ¦  «                             ¦   «         }|st          t          j        d| › d�¬¦  «        ‚|                     d¬¦  «        }| 	                    d¦  «        dk    }| 
                    dd¦  «        }|                     ¦   «         D ]\  }}	t          |||	¦  «         Œ|rJ|                     t          d	¦  «        d
| i¦  «         |                     t          d¦  «        d
| i¦  «         |�x|                      t          ¦  «                             t          j        | k    ¦  «                             ¦   «          |D ](}
t          | |
¬¦  «        }|                     |¦  «         Œ)|                     ¦   «          |                     |¦  «         |r%t+          dd
t-          |j        ¦  «        i¦  «         n$t+          dd
t-          |j        ¦  «        i¦  «         |S )zUpdate a role (admin only).rŽ   rc   rR   Tri   r~   r“   Nz6UPDATE roles SET is_default = TRUE WHERE id = :role_idr�   z8UPDATE roles SET is_default = FALSE WHERE id != :role_idr�   Úrole_default_changedÚrole_updated)r?   r   r@   r^   rX   r   r   rd   r4   rI   Úpoprl   rm   r†   r   r   r�   rt   rZ   r[   r\   r   r]   )r�   rš   r$   r%   rŠ   rn   Úis_setting_defaultr“   ro   rp   rV   r•   s               r-   Úupdate_roler    û   s  è è € ð �8Š8•D‰>Œ>× Ò ¥¤¨GÒ!3Ñ4Ô4×:Ò:Ñ<Ô<€DØð 
ÝÝÔ1Ø0˜GÐ0Ð0Ð0ð
ñ 
ô 
ð 	
ð
 ×(Ò(°tÐ(Ñ<Ô<€Kð %Ÿš¨Ñ6Ô6¸$Ò>Ðà —_’_Ð%5°tÑ<Ô<€Nð $×)Ò)Ñ+Ô+ð $ð $‰ˆˆuÝ��e˜UÑ#Ô#Ð#Ð#ð ð kà
�
Š
•4ÐPÑQÔQÐT]Ð_fÐSgÑhÔhÐhð 	�
Š
•4ÐRÑSÔSÐV_ÐahÐUiÑjÔjÐjð Ð!à
�Š•Ñ Ô ×'Ò'­Ô(>À'Ò(IÑJÔJ×QÒQÑSÔSÐSà+ð 	$ð 	$ˆMÝ,°WÈMÐZÑZÔZˆOØ�FŠF�?Ñ#Ô#Ð#Ð#à‡I‚I�K„K€KØ‡J‚JˆtÑÔÐð ð AÝÐ,¨y½#¸d¼g¹,¼,Ð.GÑHÔHÐHÐHå�n yµ#°d´g±,´,Ð&?Ñ@Ô@Ð@à€Kr/   c              ƒ   óþ  K  — |                      t          ¦  «                             t          j        | k    ¦  «                             ¦   «         }|st          t          j        d| › d�¬¦  «        ‚|j        dk    rt          t          j	        d¬¦  «        ‚|j
        r$t          t          j	        d|j        › d�¬¦  «        ‚|                     |¦  «         |                     ¦   «          t          dd	| i¦  «         d
S )zDelete a role (admin only).rŽ   rc   rR   Tz"Cannot delete default system roleszCannot delete role 'z' because it has assigned usersÚrole_deletedr�   N)r?   r   r@   r^   rX   r   r   rd   r~   rY   ÚusersrB   rt   r[   r   r˜   s       r-   Údelete_roler¤   3  s  è è € ð �8Š8•D‰>Œ>× Ò ¥¤¨GÒ!3Ñ4Ô4×:Ò:Ñ<Ô<€DØð 
ÝÝÔ1Ø0˜GÐ0Ð0Ð0ð
ñ 
ô 
ð 	
ð „˜$ÒÐÝÝÔ3Ø7ð
ñ 
ô 
ð 	
ð „zð 
ÝÝÔ3ØT¨$¬)ÐTÐTÐTð
ñ 
ô 
ð 	
ð
 ‡I‚Iˆd�O„O€OØ‡I‚I�K„K€Kõ �. 9¨gÐ"6Ñ7Ô7Ð7àˆ4r/   z/roles/{role_id}/permissionsc              ƒ   ó<  K  — |                      t          ¦  «                             t          j        | k    ¦  «                             ¦   «         }|st          t          j        d| › d�¬¦  «        ‚d„ |j        D ¦   «         }t          |j        |j
        |¬¦  «        S )z5Get all permissions for a specific role (admin only).rŽ   rc   rR   c                 ó   — g | ]	}|j         ‘Œ
S r)   rx   ry   s     r-   r.   z(get_role_permissions.<locals>.<listcomp>h  ó   € Ð<Ð<Ð< R�2”=Ð<Ð<Ð<r/   ©r�   Ú	role_namer    )r?   r   r@   r^   rX   r   r   rd   r    r   rB   )r�   r$   r%   rŠ   r    s        r-   Úget_role_permissionsrª   Z  s§   è è € ð �8Š8•D‰>Œ>× Ò ¥¤¨GÒ!3Ñ4Ô4×:Ò:Ñ<Ô<€DØð 
ÝÝÔ1Ø0˜GÐ0Ð0Ð0ð
ñ 
ô 
ð 	
ð
 =Ð<¨4Ô+;Ð<Ñ<Ô<€KÝ"Ø”Ø”)Øðñ ô ð r/   r•   c              ƒ   óÐ  K  — |                      t          ¦  «                             t          j        | k    ¦  «                             ¦   «         }|st          t          j        d| › d�¬¦  «        ‚|                      t          ¦  «                             t          j        |j	        k    ¦  «                             ¦   «         }|s$t          t          j        d|j	        › d�¬¦  «        ‚|                      t          ¦  «                             t          j        | k    t          j	        |j	        k    ¦  «                             ¦   «         }|rt          t          j        d¬¦  «        ‚t          | |j	        ¬¦  «        }|                     |¦  «         |                     ¦   «          |                     |¦  «         d„ |j        D ¦   «         }t#          |j        |j        |¬¦  «        S )	z(Add a permission to a role (admin only).rŽ   rc   rR   rP   z#Permission already assigned to roler�   c                 ó   — g | ]	}|j         ‘Œ
S r)   rx   ry   s     r-   r.   z'add_role_permission.<locals>.<listcomp>—  r§   r/   r¨   )r?   r   r@   r^   rX   r   r   rd   r   rV   r   r�   rY   rZ   r[   r\   r    r   rB   )r�   r•   r$   r%   rŠ   rN   r_   r    s           r-   Úadd_role_permissionr­   p  sÎ  è è € ð �8Š8•D‰>Œ>× Ò ¥¤¨GÒ!3Ñ4Ô4×:Ò:Ñ<Ô<€DØð 
ÝÝÔ1Ø0˜GÐ0Ð0Ð0ð
ñ 
ô 
ð 	
ð
 —’�*Ñ%Ô%×,Ò,­Z¬]¸oÔ>[Ò-[Ñ\Ô\×bÒbÑdÔd€JØð 
ÝÝÔ1ØL /Ô"?ÐLÐLÐLð
ñ 
ô 
ð 	
ð �xŠx�Ñ'Ô'×.Ò.ÝÔ 'Ò)ÝÔ$¨Ô(EÒEñô ÷ ‚e�g„gð ð ð 
ÝÝÔ3Ø8ð
ñ 
ô 
ð 	
õ %¨WÀOÔDaÐbÑbÔb€OØ‡F‚Fˆ?ÑÔÐØ‡I‚I�K„K€KØ‡J‚JˆtÑÔÐà<Ð<¨4Ô+;Ð<Ñ<Ô<€KÝ"Ø”Ø”)Øðñ ô ð r/   z,/roles/{role_id}/permissions/{permission_id}c              ƒ   óª  K  — |                      t          ¦  «                             t          j        | k    ¦  «                             ¦   «         }|st          t          j        d| › d�¬¦  «        ‚|                      t          ¦  «                             t          j	        | k    t          j
        |k    ¦  «                             ¦   «         }|st          t          j        d¬¦  «        ‚|                     |¦  «         |                     ¦   «          |                     |¦  «         d„ |j        D ¦   «         }t          |j        |j        |¬¦  «        S )z-Remove a permission from a role (admin only).rŽ   rc   rR   zPermission not assigned to rolec                 ó   — g | ]	}|j         ‘Œ
S r)   rx   ry   s     r-   r.   z*remove_role_permission.<locals>.<listcomp>¼  r§   r/   r¨   )r?   r   r@   r^   rX   r   r   rd   r   r�   rV   rt   r[   r\   r    r   rB   )r�   rV   r$   r%   rŠ   r•   r    s          r-   Úremove_role_permissionr°   Ÿ  sI  è è € ð �8Š8•D‰>Œ>× Ò ¥¤¨GÒ!3Ñ4Ô4×:Ò:Ñ<Ô<€DØð 
ÝÝÔ1Ø0˜GÐ0Ð0Ð0ð
ñ 
ô 
ð 	
ð
 —h’h�~Ñ.Ô.×5Ò5ÝÔ 'Ò)ÝÔ$¨Ò5ñô ÷ ‚e�g„gð ð ð 
ÝÝÔ1Ø4ð
ñ 
ô 
ð 	
ð
 ‡I‚IˆoÑÔÐØ‡I‚I�K„K€KØ‡J‚JˆtÑÔÐà<Ð<¨4Ô+;Ð<Ñ<Ô<€KÝ"Ø”Ø”)Øðñ ô ð r/   z!/roles/{role_id}/permissions/bulkÚbulk_updatec              ƒ   óˆ  K  — |                      t          ¦  «                             t          j        | k    ¦  «                             ¦   «         }|st          t          j        d| › d�¬¦  «        ‚|                      t          ¦  «                             t          j	        | k    ¦  «         
                    ¦   «          |j        D ](}t          | |¬¦  «        }|                     |¦  «         Œ)|                     ¦   «          |                     |¦  «         d„ |j        D ¦   «         }t!          |j        |j        |¬¦  «        S )z0Bulk update permissions for a role (admin only).rŽ   rc   rR   r�   c                 ó   — g | ]	}|j         ‘Œ
S r)   rx   ry   s     r-   r.   z0bulk_update_role_permissions.<locals>.<listcomp>Þ  r§   r/   r¨   )r?   r   r@   r^   rX   r   r   rd   r   r�   rt   r“   rZ   r[   r\   r    r   rB   )r�   r±   r$   r%   rŠ   rV   r•   r    s           r-   Úbulk_update_role_permissionsr´   Ä  s5  è è € ð �8Š8•D‰>Œ>× Ò ¥¤¨GÒ!3Ñ4Ô4×:Ò:Ñ<Ô<€DØð 
ÝÝÔ1Ø0˜GÐ0Ð0Ð0ð
ñ 
ô 
ð 	
ð ‡H‚H�^ÑÔ×#Ò#¥NÔ$:¸gÒ$EÑFÔF×MÒMÑOÔOÐOð %Ô3ð  ð  ˆÝ(°ÈÐVÑVÔVˆØ
�ŠˆÑÔÐÐà‡I‚I�K„K€KØ‡J‚JˆtÑÔÐà<Ð<¨4Ô+;Ð<Ñ<Ô<€KÝ"Ø”Ø”)Øðñ ô ð r/   )=Úfastapir   r   r   r   r   r   Úsqlalchemy.ormr	   r…   r   Útypingr   ÚloggingrE   r1   Údatabaser   Úmodels.permissionr   r   r   Úmodels.userr   Úschemas.permissionr   r   r   r   r   r   r   r   r   Úauthr   r   Ússer   ÚrouterrI   r]   rL   ÚpostÚHTTP_201_CREATEDra   rf   Úputrq   rt   ÚHTTP_204_NO_CONTENTru   rŒ   r–   r™   r    r¤   rª   r­   r°   r´   r)   r/   r-   ú<module>rÄ      sh  ðØ PÐ PÐ PÐ PÐ PÐ PÐ PÐ PÐ PÐ PÐ PÐ PÐ PÐ PÐ PÐ PØ "Ð "Ð "Ð "Ð "Ð "Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð Ø €€€Ø €€€Ø €€€Ø Ð Ð Ð Ð Ð Ø @Ð @Ð @Ð @Ð @Ð @Ð @Ð @Ð @Ð @Ø Ð Ð Ð Ð Ð ðð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð
 >Ð =Ð =Ð =Ð =Ð =Ð =Ð =Ø Ð Ð Ð Ð Ð à	ˆ˜&¨°Ð'?Ð	@Ñ	@Ô	@€ð
 ‡‚ˆNÑÔàØ�'˜&‘/”/Ø ˜Ð!3Ð!3Ð4GÑ!HÔ!HÑIÔIØð	ð Øðàðð ðð ð	ð ð ñ Ôðð6 ‡‚ˆ^Ð,>ÈFÔLc€ÑdÔdð �'˜&‘/”/Ø ˜Ð!3Ð!3Ð4GÑ!HÔ!HÑIÔIðð Ø ðàðð ðð ð ñ eÔdðð2 ‡‚Ð*Ð;M€ÑNÔNð �'˜&‘/”/Ø ˜Ð!3Ð!3Ð4GÑ!HÔ!HÑIÔIðð Øðàðð ðð ð ñ OÔNðð ‡‚Ð*Ð;M€ÑNÔNð �'˜&‘/”/Ø ˜Ð!3Ð!3Ð4GÑ!HÔ!HÑIÔIð	ð Øðà'ðð 	ðð ð	ð ð ñ OÔNðð6 ‡‚Ð-¸6Ô;U€ÑVÔVð �'˜&‘/”/Ø ˜Ð!3Ð!3Ð4GÑ!HÔ!HÑIÔIðð Øðàðð ðð ð ñ WÔVðð0 ‡‚ˆHÑÔà�'˜&‘/”/Ø ˜Ð!3Ð!3°MÑ!BÔ!BÑCÔCØð&ð &Øð&àð&ð ð&ð &ð &ñ Ôð&ðR ‡‚ˆX lÀÔ@W€ÑXÔXð �'˜&‘/”/Ø ˜Ð!3Ð!3°MÑ!BÔ!BÑCÔCð*ð *Ø
ð*àð*ð ð*ð *ð *ñ YÔXð*ðZ ‡‚Ð¨|€Ñ<Ô<ð �'˜&‘/”/Ø ˜Ð!3Ð!3°MÑ!BÔ!BÑCÔCðð Øðàðð ðð ð ñ =Ô<ðð ‡‚Ð¨|€Ñ<Ô<ð �'˜&‘/”/Ø ˜Ð!3Ð!3°MÑ!BÔ!BÑCÔCð	4ð 4Øð4àð4ð 	ð4ð ð	4ð 4ð 4ñ =Ô<ð4ðn ‡‚Ð!¨vÔ/I€ÑJÔJð �'˜&‘/”/Ø ˜Ð!3Ð!3°MÑ!BÔ!BÑCÔCð!ð !Øð!àð!ð ð!ð !ð !ñ KÔJð!ðL ‡‚Ð*Ð;R€ÑSÔSð �'˜&‘/”/Ø ˜Ð!3Ð!3°MÑ!BÔ!BÑCÔCðð Øðàðð ðð ð ñ TÔSðð* ‡‚Ð+Ð<S€ÑTÔTð �'˜&‘/”/Ø ˜Ð!3Ð!3°MÑ!BÔ!BÑCÔCð	+ð +Øð+à)ð+ð 	ð+ð ð	+ð +ð +ñ UÔTð+ð\ ‡‚Ð=ÐNe€ÑfÔfð �'˜&‘/”/Ø ˜Ð!3Ð!3°MÑ!BÔ!BÑCÔCð	!ð !Øð!àð!ð 	ð!ð ð	!ð !ð !ñ gÔfð!ðH ‡‚Ð/Ð@W€ÑXÔXð �'˜&‘/”/Ø ˜Ð!3Ð!3°MÑ!BÔ!BÑCÔCð	ð Øðà)ðð 	ðð ð	ð ð ñ YÔXðð ð r/   