U
    bEfq                     @   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: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 d	}i }tjjddddgdD ]F}t t i 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r8tjj|jdddddddddddddgd||jjj< ||jjj D ]}|jrh|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rh|jr|d |jjj njtjjdd}|jjj|d kr4t |d |jjj< ||jjg D ]"}|d |jjj |jj qD|jr|d |jjj |jrtj }|jj|krt ||jj< ||jj |jjj |j r|d |jjj |j!rj|j"jj|krt ||j"jj< ||j"jj |jjj |j#D ]:}|jj|krNt ||jj< ||jj |jjj q.|j$r|j$D ]:}|jj|krt ||jj< ||jj |jjj qx|j%rF|j%D ]`}|jj|krؐq||jj D ]:}|jj|krt ||jj< ||jj |jjj qqqF|& D ],\}}||krJi ||< ||| |jj< q0|& D ]\}}||| |jj< qfq:|t'_(t)*dt   |  d  d S )!N)	r   access_sdesk_publicaccess_sdesk_privater   r   r   r   r   r   r1   	cmf_ownercmf_owner_assistantsservicedesk_publicr   r   =memberszproject_role.codefilterr   Z
CmfCompanyr	   r
   r   r   r   r   r   r   project_permission.coder   r   r   r   r   r>   zsdesk-client:defaultr   r?   zLoad time _PROJECT_PERM_DATA: Zsec)+timer   r9   r   setCmfProjectRoleAssignrE   project_role
class_nameZpersonsloadappendidvaluer1   r   r   addr   r   r   r   r   r   r   rB   ZCmfProjectRoler   r   r   ZCmfPersonGroupZguest_groupr   r   r@   rA   r
   r	   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project_owner_assistantZ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)rW   r,   r,   r-   r      s    z#CmfProjectPermScheme.trigger_reloadr]   )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)r^   rI   sleep_project_permission_changedcmfZappZcmf_contextr   r   r\   ZREDIS_DBZredisrJ   strosgetpidrU   rV   Z	CMF_CACHEZflush_jscacher,   r,   r,   r-   handler  s    


zBCmfProjectPermScheme.on_project_permission_change.<locals>.handlerz(project_permission::reload spawn handlerT)r^   ra   ZgeventZspawn)_kwargsrf   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   rD   rH   r	   r
   r   r   r   r   r   r   rF   Tu*   DEV: check_project_role_access Право u_    разрешено для объектного поля, но объект не переданrL   INrE   Fr0   r   r   N   У пользователя нет Проектного разрешения "   " в проекте     для объекта )rU   current_userr1   rN   r   r   r   r   
user_localr   anonymous_userr   r@   r   r   r   r   r;   Zcmf_owner_assistant
cmf_authorresponsibler
   Z
all_nestedr	   rK   r   rE   CmfProjectPermPermissionCmfPermissionErrorr0   )
rW   r=   r   userobjraise_errorr[   Zrole_assignsZrole_assign	perm_infor,   r,   r-   check_project_role_access_old  sn    
   





z2CmfProjectPermScheme.check_project_role_access_oldc                 C   sf  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}|rt
|tjjrz|j}|}	|}n|jdkrt|j}	nl|jjr|jjs|ddg |jjr|jjr|jjr|jj}	n|jj}	n"|jjr|jjr|jj}	n|jj}	|	| jd kr0t d	| d
|	  dS |jrP|| jd |	 krPd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rdS |s\|t jkr,|| jd |	 kr,t j|kr,dS || jd |	 krn|jjr^||jjkrndS n||jkrndS || jd |	 kr|j   |jj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rdS n||j!krdS || jd |	 kr\|j"   |j"jrL||j"jkr\dS n||j"kr\dS d}t#t drt j$rxd}t%j&'drd}|| 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}|r4|j)}tj*j+|dgd}t,d|j) d| d| d S )NT)Zid_onlyr@   rC   r9   root_parent_id	parent_idr   uX   Пропустили проверку Проектных прав для объекта u3   , т.к. проект еще не загружен r   r   r   r   r   r   Frequest_servicedeskz/filesr>   r?    r0   rj   rk   rl   rm   )-rU   Zdisable_permissionsZacl_admin_modern   current_person__member_ofr   ZCmfAccessListZsubject_full_group_listZcmfutilZget_obj_by_id
isinstancerb   r   ZCmfTyperQ   rM   rc   rP   rz   Z
is_definedr{   Zload_fieldsZ
is_changedoldrT   rV   ro   rp   Zsharelink_anonymous_userZsharelink_access_objr@   rA   rN   rq   rr   hasattrr|   Zrequestpath
startswithZservicedesk_allowr0   rs   r   rt   )rW   r=   r   ru   rv   Zobj_idZproject_id_simplecheckrw   r~   Zobj_parent_idZcontainer_idZis_request_servicedeskZtmp_project_namerx   r,   r,   r-   check_project_role_accesse  s    




 







z.CmfProjectPermScheme.check_project_role_access)NNT)NNNNT)__name__
__module____qualname__rT   r    r.   r<   classmethodr\   r   staticmethodZon_server_eventrh   rc   ry   r   __classcell__r,   r,   r*   r-   r      s&   
 '
H    r   )Zcmf.includeZmodules.project.fieldsr   rI   r   r,   r,   r,   r-   <module>   s   