U
    Ac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                       sv   e Zd Z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r|t jjdd}ddddddd	d
dg	}t jj||dD ]6}t  }| |_|D ]}t||t	|| qZ|
  qDt 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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                 C   s  t   }i }i }tjjddgdD ]}t t t t t d}i }i }tjjdd|gddgd	D ] }|jrd|jsvqd|j||jj< qd|j	j
j|krtjj|j	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rD|d |	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r|	jD ]`}|j
j|krq||j
j D ]:}
|
j
j|kr:t ||
j
j< ||
j
j |	jjj qqq| D ],\}}||kr~i ||< ||| |j
j< qd| D ],\}}||kri ||< ||| |j
j< qq"|t_tdt   |  d d S )Nproject_perm_scheme	cmf_owner)r   )r	   r
   r   r   r   r   =memberszproject_role.codefilterr   r   r   r	   r
   r   r   r   r   project_permission.coder   zLoad time _PROJECT_PERM_DATA: Zsec)timer   
CmfProjectr   setCmfProjectRoleAssignr&   project_roler   r#   idvaluer   r	   addr   r
   r   r   r   r   r$   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rr   memberZroleZuser_idpermZperm_funr!   r!   r"   load_project_permission_data2   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)r6   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=   r*   sleep_project_permission_changedZcmfZappZcmf_contextr   r   r;   ZREDIS_DBZredisr,   strosgetpidr4   r5   Z	CMF_CACHEZflush_jscacher!   r!   r!   r"   handler   s    


zBCmfProjectPermScheme.on_project_permission_change.<locals>.handlerz(project_permission::reload spawn handlerT)r=   r@   ZgeventZspawn)_kwargsrD   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||j
krvd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rdS |jr||j krdS |jr`tjjdd|gdd|jggdgd}|D ]}||j krB dS qB|sjdS tjj|dgd}	td|	j d|j d| d S )Nr   r%   r)   r   r   r	   r
   r   r   r   r   r'   Tu*   DEV: check_project_role_access Право u_    разрешено для объектного поля, но объект не переданr.   INr&   Fnamer   r   N   У пользователя нет Проектного разрешения "   " в проекте     для объекта )r4   current_userr#   loadr   r   r   r	   
user_localr   r$   r
   r   r   r   Z	cmf_alertZcmf_owner_assistant
cmf_authorresponsibler   Z
all_nestedr   r-   r   r&   CmfProjectPermPermissionCmfPermissionErrorrH   )
r6   r7   r   userobjraise_errorr:   Zrole_assignsZrole_assign	perm_infor!   r!   r"   check_project_role_access_old   sj    
   






z2CmfProjectPermScheme.check_project_role_access_oldc           
      C   s  t jst jrd S |d kr&t j}t j}ntjj|dd}t|drF|j	}|j
dkrZ|jj	}n
|jjj	}|dr|| jd krt d| d|  d S |jj	| jkr|| j|jj	 kr|| j|jj	 | krdS |D ]4}|| jkr|| j| kr|| j| | kr dS q|jr*|| jd	 | kr*dS || jd | krN||jkrNdS || jd
 | kr||j  ||jkr|dS || jd | kr|j  ||jkrdS || jd | kr|j  ||jkrdS |sdS tjj|dgd}	td|	j d|j d| d S )NT)Zid_onlyr0   r+   zCmfProject:r
   uX   Пропустили проверку Проектных прав для объекта u3   , т.к. проект еще не загружен r	   r   r   r   FrH   rI   rJ   rK   rL   )r4   Zdisable_permissionsZacl_admin_moderM   current_person__member_ofr   ZCmfAccessListZsubject_full_group_listhasattrr0   
class_namer/   r   
startswithr3   r5   rO   r$   Zcmf_owner_assistantsrN   rP   rQ   rR   r   rS   rH   )
r6   r7   r   rT   rU   rV   rY   Zobj_parent_idZcontainer_idrW   r!   r!   r"   check_project_role_access   s\    








z.CmfProjectPermScheme.check_project_role_access)NNT)NNT)__name__
__module____qualname__r3   r   classmethodr;   r   staticmethodZon_server_eventrF   rA   rX   r]   __classcell__r!   r!   r   r"   r      s   
g
Er   )Zcmf.includeZmodules.project.fieldsr   r*   r   r!   r!   r!   r"   <module>   s   