U
    sf"                     @   s2   d dl T d dlmZ d dlZG dd dejZdS )    )*)cmf_project_perm_schemeNc                       s   e Zd ZdZ fddZ fddZ fddZedd	 Zed
d Z	e
edddd ZededddZededddZ  ZS )CmfProjectPermSchemeNc                    s   t j  | jrt jjdd}ddddddd	d
dddddg}t jj||dD ]6}t  }| |_|D ]}t||t	|| qb|
  qLt j
||S )Nsystem.open:defaultcodeproject_permissionaccess_project_roleaccess_membersaccess_local_useraccess_owneraccess_owner_assistantaccess_authoraccess_project_owneraccess_responsibleaccess_sdesk_clientaccess_anonymousaccess_guestaccess_sharelink_anonymousparentfields)modelsr   trigger_reloadis_newgetCmfProjectPermSchemeRulelistr   setattrgetattrsavesuper)selfargskwargsdefault_schemerule_fieldsdefault_rulerulefield	__class__ 3./modules/project/models/cmf_project_perm_scheme.pyr        s*    
      
zCmfProjectPermScheme.savec           
         s   | j }t j||}|rtjjdd}ddddddd	d
dddddg}tjj||dD ]:}t }| |_|D ]}	t	||	t
||	 qj|jdd qT|S )Nr   r   r   r	   r
   r   r   r   r   r   r   r   r   r   r   r   T)Zsave_import)r   r!   _save_importr   r   r   r   r   r   r   r   r    )
r"   r#   r$   r   resr%   r&   r'   r(   r)   r*   r,   r-   r.   3   s,          z!CmfProjectPermScheme._save_importc                    s   | dd}| dsTtjj| dgd}|r~ddd |D }td| d	d
 n*tjj| ||dD ]}d |_|jd	d qftjj| ||dD ]}|j	|| qt
 j	||S )NZTEXKOM_db_deleteFname)project_perm_schemer   z, c                 S   s   g | ]}d |j  d qS )")r0   ).0pr,   r,   r-   
<listcomp>L   s     z/CmfProjectPermScheme.delete.<locals>.<listcomp>u   Невозможно удалить Схему проектных прав, она используется в проектах: T)abort)r1   include_deletedinclude_system)Z	only_data)r   r7   r8   )r   r   
CmfProjectr   join	cmf_alertr1   r    r   deleter!   )r"   r#   r$   r7   Zused_projectsZused_projects_strprojectr(   r*   r,   r-   r<   G   s    
zCmfProjectPermScheme.deletec                 C   s   t   }i i i i i i i i i i i i d}i }tjjddddddgdD ]}t t i t t t t t t t t t d}i }i }tjjd	d
|gddgdD ]f}|jr|jsqg }	|jD ]4}
|
jdkr|
j	
 D ]}|	| qq|	|
 q|	sq|	||jjj< q|jjj|krZtjj|jdddddddddddddddddd d!gd"||jjj< ||jjj D ]}|jr|d |jjj |jr|d |jjj |jr|d |jjj |jr|d |jjj |jr|d |jjj |jr|d |jjj |jr2|d |jjj |jrN|d |jjj |jr|jrt|d# |jjj njtjjd$d%}|jjj|d& krt |d& |jjj< ||jjg D ]"}|d& |jjj |jj q|jr|d |jjj |j r@tj!" }|jj|kr(t ||jj< ||jj |jjj |j#r\|d |jjj |j$r|j%jj|krt ||j%jj< ||j%jj |jjj |j&r|j'D ]:}|jj|krt ||jj< ||jj |jjj q|j(r2|j)D ]:}|jj|krt ||jj< ||jj |jjj q|j*r||j+D ]:}|jj|kr`t ||jj< ||jj |jjj q@|j,r|j,D ]}|jj-d'r|jj|krt ||jj< ||jj |jjj n4|jj|krt ||jj< ||jj |jjj q|j.rh|j.D ]`}|jj|kr0q||jj D ]:}|jj|kr\t ||jj< ||jj |jjj q<qqh|/ D ],\}}||kri ||< ||| |jj< q|/ D ]\}}||| |jj< qqD|t0_1t23d(t   |  d) d S )*N)r   access_sdesk_publicaccess_sdesk_privater   r   r   r   access_executorsaccess_spectatorsr   r   access_list_ownerr1   	cmf_ownercmf_owner_assistantsservicedesk_public
spectators	executorsr   r   =memberszproject_role.codefilterr   Z
CmfCompanyr	   r
   r   r   r   r   r   access_project_owner_assistantr   r@   project_permission.coder   r   r   rA   r   rB   access_project_spectatorsaccess_project_executorsr   r>   zsdesk-client:defaultr   r?   zvar:zLoad time _PROJECT_PERM_DATA: Zsec)4timer   r9   r   setCmfProjectRoleAssignrJ   project_role
class_nameZpersonsloadappendidvaluer1   r   r   addr   r   r   r   r   r   r@   rA   rB   r   rE   ZCmfProjectRoler   r   r   ZCmfPersonGroupZguest_groupr   r   rC   rM   rD   rO   rF   rP   rG   r
   
startswithr	   itemsr   _PROJECT_PERM_DATAgdebug)clsZ
start_timeZ	perm_dataZloaded_scheme_rulesr=   Zproject_permsZproject_user_permsZproject_role_membersrZ_membersmr4   r(   Zsdesk_client_rolememberZguest_person_groupZroleZuser_idpermZperm_funr,   r,   r-   load_project_permission_dataW   s,      


           





$
z1CmfProjectPermScheme.load_project_permission_datac                 C   s   t d tdd  d S )Nz"project_permission::reload triggerCmfProjectPermScheme:changed)printZcmf_emit_server_event)r`   r,   r,   r-   r   "  s    z#CmfProjectPermScheme.trigger_reloadrf   )Zchannelc                  K   s"   dd }t d dat| d S )Nc                	   S   s~   t d td trrt d datj > tj	  t
jjdtt dddrftd	 t  W 5 Q R X nt d
 d S )Nz*project_permission::reload handler spawned   z,project_permission::reload handler do reloadFz&project_permission::clear_jscache:lockTi  )ZnxZpxz?project_permission::reload handler do CMF_CACHE.flush_jscache()z'project_permission::reload handler skip)rg   rQ   sleep_project_permission_changedcmfZappZcmf_contextr   r   re   ZREDIS_DBZredisrR   strosgetpidr^   r_   Z	CMF_CACHEZflush_jscacher,   r,   r,   r-   handler,  s    


zBCmfProjectPermScheme.on_project_permission_change.<locals>.handlerz(project_permission::reload spawn handlerT)rg   rj   ZgeventZspawn)_kwargsro   r,   r,   r-   on_project_permission_change'  s    z1CmfProjectPermScheme.on_project_permission_changeT)r   c           
   
   C   s  |d krt j}|j  tjjdd|jgdd|ggdddddd	d
dgd}|sRdS |jrb|jrbdS |j	rv|t j
krvdS |jr||jkrdS |js|js|js|jr|std| d |r|jr||jkrdS |jr||jkrdS |jr||jkrdS |jr||jkrdS |jr,||j kr,dS |jrztjjdd|gdd|jggdgd}|D ]}||j kr\ dS q\|sdS tjj|dgd}	td|	j d|j d| d S )Nr   rI   rN   r	   r
   r   r   r   r   r   r   rK   Tu*   DEV: check_project_role_access Право u_    разрешено для объектного поля, но объект не переданrT   INrJ   Fr0   r   r   N   У пользователя нет Проектного разрешения "   " в проекте     для объекта )r^   current_userr1   rV   r   r   r   r   
user_localr   anonymous_userr   rC   r   r   r   r   r;   Zcmf_owner_assistant
cmf_authorresponsibler
   Z
all_nestedr	   rS   r   rJ   CmfProjectPermPermissionCmfPermissionErrorr0   )
r`   r=   r   userobjraise_errorrd   Zrole_assignsZrole_assign	perm_infor,   r,   r-   check_project_role_access_old@  sn    
   





z2CmfProjectPermScheme.check_project_role_access_oldFc
                 C   sN  t jst jrdS |d kr&t j}t j}
ntjj|dd}
|sN|rNtj	|dgd}t
|tjjrb|j}|r|st
|tjjr~|j}|}|}n|jdkrt|j}nz|jjr|jjs|ddg |jjr|jjr|jjr|s|jj}n|jj}n,|jjr|jjr|s|jj}n|jj}|| jd krBt d	| d
|  dS |jrb|| jd | krbdS |jj| jkr|| j|jj kr|| j|jj | krdS |
D ]<}|| jkr|| j| kr|| j| | kr dS q|t jkr|| jd | krdS |rt
|ts*|t jkrJ|| jd | krJt j|krJdS || jd | kr|jjr|||jjkrdS n||jkrdS || jd | kr|j   |jjr||jjkrdS n||jkrdS || jd | kr0t!|dr0|j"   |j"jr ||j"jkr0dS n||j"kr0dS || jd | krt!|dr|j#   |j#jr|j#jr||j#jkrdS n||j#krdS || jd | krPt!|drP|j$   |j$jr|j$jr||j$jkrdS n||j$krdS |j$jr.|j$jrPt%|
t%dd |j$jD @ rPdS n"t%|
t%dd |j$D @ rPdS || jd | krt!|dr|j&}|j&jr|j&j}|D ]\}||jks||j#kr dS |
D ]2}||jjks|dd |j#D kr  dS qq|| jd | krt!|dr|j'   |j'jr<|j'jrL||j'jkrLdS n||j'krLdS |j'jr|j'jrt%|
t%dd |j'jD @ rdS n"t%|
t%dd |j'D @ rdS dD ]x}|| jkr|| j| kr|| j| | kr|(|}||kr dS |
D ]"}|d d |D kr  dS qqn|rD|d! d"krDt% }|| jd | krj|)|*d#d  || jd | kr|)|*d$d  || jd | kr|)|*d%d  || jd | kr|*dg D ]}|)|d&  q|| jd | kr"|*dg D ]}|)|d&  q|j|kr2dS t%|
|@ rDdS d'}t!t d(rrt j+r`d}t,j-.d)rrd}|| jd* | kr|j/r|rdS || jd+ | kr|jj| jd+ | | kr|rdS |
D ]*}|| jd+ | | kr|r dS q|	sd'S d,}|r|j0}tj1j*|d-gd.}t2d/|j0 d0| d1| d S )2NT)Zid_onlyrC   rH   r9   
project_id	parent_idr   uX   Пропустили проверку Проектных прав для объекта u3   , т.к. проект еще не загружен r   r   r   r   r   r{   r   rD   r@   rG   c                 S   s   g | ]}|j jqS r,   rX   rY   r3   er,   r,   r-   r5     s     zBCmfProjectPermScheme.check_project_role_access.<locals>.<listcomp>c                 S   s   g | ]}|j jqS r,   r   r   r,   r,   r-   r5     s     rB   listsc                 S   s   g | ]
}|j qS r,   rX   r3   xr,   r,   r-   r5     s     rA   rF   c                 S   s   g | ]}|j jqS r,   r   r   r,   r,   r-   r5   -  s     c                 S   s   g | ]}|j jqS r,   r   r   r,   r,   r-   r5   0  s     )zvar:responsiblezvar:executorszvar:spectatorsz	var:ownerzvar:owner_assistantszvar:project_ownerzvar:project_owner_assistantsz
var:authorZvar_waiting_forzvar:component_ownerzvar:current_userzvar:all_related_userszvar:followersu   var:Подпискиzvar:project_userszvar:approversc                 S   s   g | ]
}|j qS r,   r   r   r,   r,   r-   r5   C  s     rU   ZCmfTaskZcmf_owner_idZcmf_author_idZcmf_responsible_idrX   Frequest_servicedeskz/filesr>   r?    r0   rs   rt   ru   rv   )3r^   Zdisable_permissionsZacl_admin_moderw   current_person__member_ofr   ZCmfAccessListZsubject_full_group_listZcmfutilZget_obj_by_id
isinstancerk   r   ZCmfTyperY   rU   rl   rX   r   Z
is_definedr   Zload_fieldsZ
is_changedoldr]   r_   rx   ry   Zsharelink_anonymous_userZsharelink_access_objrC   rz   rV   hasattrr{   rD   rG   rR   r   rF   Zextract_var_objrZ   r   r   Zrequestpathr[   Zservicedesk_allowr0   r|   r}   )r`   r=   r   r~   r   Zobj_idZproject_id_simplecheckZobj_dict_simplecheckZuse_new_projectr   r   Zobj_parent_idZcontainer_idr   lZvar_user_codeZ	var_usersZsimple_check_allowed_idiZis_request_servicedeskZtmp_project_namer   r,   r,   r-   check_project_role_access  sJ   




 


 

 

 


* 
$ 


*


z.CmfProjectPermScheme.check_project_role_access)NNT)NNNNNFT)__name__
__module____qualname__r]   r    r.   r<   classmethodre   r   staticmethodZon_server_eventrq   rl   r   r   __classcell__r,   r,   r*   r-   r      s*   
 K
H       r   )Zcmf.includeZmodules.project.fieldsr   rQ   r   r,   r,   r,   r-   <module>   s   