U
    ScN                     @   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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                    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"   r-   2   s    

zCmfProjectPermScheme.deletec                 C   s,  t   }i i i i i d}i }tjjd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rr|jsqr|j||jj< qr|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r6|d |	jjj |	jrR|d |	jjj |	jrn|d |	jjj |	jr|jj
j|krt ||jj
j< ||jj
j |	jjj |jD ]:}
|
j
j|krt ||
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^qH||j
j D ]:}|j
j|krt ||j
j< ||j
j |	jjj qjqHq| D ],\}}||kri ||< ||| |j
j< q| D ]\}}||| |j
j< qq0|t_tdt   |  d d S )N)r	   r
   r   r   r   r$   	cmf_ownercmf_owner_assistants)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   r*   r   setCmfProjectRoleAssignr1   project_roler   r$   idvaluer   r	   addr   r
   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   Zproject_owner_assistantmemberZ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)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   r5   sleep_project_permission_changedcmfZappZcmf_contextr   r   rE   ZREDIS_DBZredisr6   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||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   r0   r4   r   r   r	   r
   r   r   r   r   r2   Tu*   DEV: check_project_role_access Право u_    разрешено для объектного поля, но объект не переданr8   INr1   Fr#   r   r   N   У пользователя нет Проектного разрешения "   " в проекте     для объекта )r>   current_userr$   loadr   r   r   r	   
user_localr   r.   r
   r   r   r   r,   Zcmf_owner_assistant
cmf_authorresponsibler   Z
all_nestedr   r7   r   r1   CmfProjectPermPermissionCmfPermissionErrorr#   )
r@   rA   r   userobjraise_errorrD   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|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 || 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r,||jjkr,dS n||jkr,dS || jd | krx|j  |jjrh||jjkrxdS n||jkrxdS || jd | kr|j  |jjr||jjkrdS n||jkrdS |sd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   Fr#   rS   rT   rU   rV   )!r>   Zdisable_permissionsZacl_admin_moderW   current_person__member_ofr   ZCmfAccessListZsubject_full_group_list
isinstancerK   r   ZCmfTyper:   
class_namer9   rc   Z
is_definedrd   Zload_fieldsZ
is_changedoldr=   r?   rY   r.   r/   rX   rZ   r[   r\   r   r]   r#   )
r@   rA   r   r^   r_   r`   re   Zobj_parent_idZcontainer_idra   r!   r!   r"   check_project_role_access  s    












z.CmfProjectPermScheme.check_project_role_access)NNT)NNT)__name__
__module____qualname__r=   r   r-   classmethodrE   r   staticmethodZon_server_eventrQ   rL   rb   ri   __classcell__r!   r!   r   r"   r      s   

q
Er   )Zcmf.includeZmodules.project.fieldsr   r5   r   r!   r!   r!   r"   <module>   s   