U
    fd_\                     @   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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g}t jj||dD ]6}t  }| |_|D ]}t||t	|| q`|
  qJt j
||S )Nz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parentfields)modelsr   trigger_reloadZis_newgetCmfProjectPermSchemeRulelistr   setattrgetattrsavesuper)selfargskwargsZdefault_schemeZrule_fieldsZdefault_ruleruleZfield	__class__ 3./modules/project/models/cmf_project_perm_scheme.pyr       s(    
      
zCmfProjectPermScheme.savec                    sf   t jj| dgd}|r<ddd |D }td| dd t jj| d	D ]}|  qJt j||S )
Nname)project_perm_schemer   z, c                 S   s   g | ]}d |j  d qS )")r'   ).0pr%   r%   r&   
<listcomp>5   s     z/CmfProjectPermScheme.delete.<locals>.<listcomp>u   Невозможно удалить Схему проектных прав, она используется в проектах: T)abort)r   )r   
CmfProjectr   join	cmf_alertr   deleter   )r   r    r!   Zused_projectsZused_projects_strr"   r#   r%   r&   r1   2   s    

zCmfProjectPermScheme.deletec                 C   sp  t   }i i i i i i i d}i }tjjddddgdD ]}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r,tjj|j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rx|d |jjj |jr|d |jjj |jr|d |jjj |jr|d |jjj |jrL|jr|d |jjj nZtjjdd}||jjg D ]:}|jj|kr0t ||jj< ||jj |jjj q|jrh|d |jjj |jrtj }|jj|krt ||jj< ||jj |jjj |j r2|j!jj|krt ||j!jj< ||j!jj |jjj |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|krq||jj D ]:}|jj|krt ||jj< ||jj |jjj qqq:|% D ],\}}||kri ||< ||| |jj< q|% D ]\}}||| |jj< q.q6|t&_'t()dt   |  d d S )N)r
   access_sdesk_publicr   r   r   r   r   r(   	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   r2   zsdesk-client:defaultr   zLoad time _PROJECT_PERM_DATA: Zsec)*timer   r.   r   setCmfProjectRoleAssignr7   project_role
class_nameZpersonsloadappendidvaluer(   r   r
   addr   r   r   r   r   r   r   r5   ZCmfProjectRoler   r   r   ZCmfPersonGroupZguest_groupr   r3   r4   r	   r   itemsr   _PROJECT_PERM_DATAgdebug)clsZ
start_timeZ	perm_dataZloaded_scheme_rulesprojectZproject_permsZproject_user_permsZproject_role_membersrZ_membersmr+   r"   Zsdesk_client_rolememberZguest_person_groupZproject_owner_assistantZroleZuser_idpermZperm_funr%   r%   r&   load_project_permission_data<   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)rI   r%   r%   r&   r      s    z#CmfProjectPermScheme.trigger_reloadrP   )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)rQ   r;   sleep_project_permission_changedcmfZappZcmf_contextr   r   rO   ZREDIS_DBZredisr<   strosgetpidrG   rH   Z	CMF_CACHEZflush_jscacher%   r%   r%   r&   handler   s    


zBCmfProjectPermScheme.on_project_permission_change.<locals>.handlerz(project_permission::reload spawn handlerT)rQ   rT   ZgeventZspawn)_kwargsrY   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   r6   r:   r   r	   r
   r   r   r   r   r   r8   Tu*   DEV: check_project_role_access Право u_    разрешено для объектного поля, но объект не переданr>   INr7   Fr'   r   r   N   У пользователя нет Проектного разрешения "   " в проекте     для объекта )rG   current_userr(   r@   r   r   r   r
   
user_localr   anonymous_userr   r3   r   r   r   r   r0   Zcmf_owner_assistant
cmf_authorresponsibler	   Z
all_nestedr   r=   r   r7   CmfProjectPermPermissionCmfPermissionErrorr'   )
rI   rJ   r   userobjraise_errorrN   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}t|t	j
jrJ|j}|jdkr^|jj}nl|jjrn|jjs||ddg |jjr|jjr|jjr|jj}q|jj}n"|jjr|jjr|jj}n|jj}|| jd krt d| d|  dS |jj| jkr2|| j|jj kr2|| j|jj | kr2dS |D ]<}|| jkr6|| j| kr6|| j| | kr6 dS q6|jr|| jd	 | krdS |t jkr|| jd
 | krdS || jd | kr|jjr||jjkrdS n||jkrdS || jd | krP|j  |jjr@|jjrP||jjkrPdS n||jkrPdS || jd | kr|j  |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r|jrdS |sdS tjj |dgd}	t!d|	j" d|j" d| d S )NT)Zid_onlyr.   root_parent_id	parent_idr   uX   Пропустили проверку Проектных прав для объекта u3   , т.к. проект еще не загружен r
   r   r   r   r   r2   Fr'   r]   r^   r_   r`   )#rG   Zdisable_permissionsZacl_admin_modera   current_person__member_ofr   ZCmfAccessListZsubject_full_group_list
isinstancerU   r   ZCmfTyperC   r?   rB   rm   Z
is_definedrn   Zload_fieldsZ
is_changedoldrF   rH   rb   rc   r3   r4   r@   rd   re   Zservicedesk_allowrf   r   rg   r'   )
rI   rJ   r   rh   ri   rj   ro   Zobj_parent_idZcontainer_idrk   r%   r%   r&   check_project_role_access=  s    





 






z.CmfProjectPermScheme.check_project_role_access)NNT)NNT)__name__
__module____qualname__rF   r   r1   classmethodrO   r   staticmethodZon_server_eventr[   rV   rl   rr   __classcell__r%   r%   r#   r&   r      s   

 
Hr   )Zcmf.includeZmodules.project.fieldsr   r;   r   r%   r%   r%   r&   <module>   s   