U
    cH                     @   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gdD ]}t t t t t d}i }i }tjjdd|gddgd	D ] }|jrp|jsqp|j||jj< qp|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r4|d |	jjj |	jrP|d |	jjj |	jrl|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rFt ||
j
j< ||
j
j |	jjj q&qq| D ],\}}||kri ||< ||| |j
j< qp| D ]\}}||| |j
j< qq.|t_tdt   |  d d S )N)r	   r
   r   r   r   r$   	cmf_owner)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CmfProjectRoleAssignr0   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_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_reloadrE   )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)rF   r4   sleep_project_permission_changedZcmfZappZcmf_contextr   r   rD   ZREDIS_DBZredisr5   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)rF   rI   ZgeventZspawn)_kwargsrM   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/   r3   r   r   r	   r
   r   r   r   r   r1   Tu*   DEV: check_project_role_access Право u_    разрешено для объектного поля, но объект не переданr7   INr0   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   r6   r   r0   CmfProjectPermPermissionCmfPermissionErrorr#   )
r?   r@   r   userobjraise_errorrC   Zrole_assignsZrole_assign	perm_infor!   r!   r"   check_project_role_access_old   sj    
   






z2CmfProjectPermScheme.check_project_role_access_oldc           
      C   s0  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rj|jjrx|ddg |jj	p|jj	}|| 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rD|| jd
 | krDdS || jd | krh||jkrhdS || jd | kr|j  ||jkrd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_onlyr9   r*   root_parent_id	parent_idr
   uX   Пропустили проверку Проектных прав для объекта u3   , т.к. проект еще не загружен r	   r   r   r   Fr#   rQ   rR   rS   rT   )r=   Zdisable_permissionsZacl_admin_moderU   current_person__member_ofr   ZCmfAccessListZsubject_full_group_listhasattrr9   
class_namer8   ra   Z
is_definedrb   Zload_fieldsr<   r>   rW   r.   Zcmf_owner_assistantsrV   rX   rY   rZ   r   r[   r#   )
r?   r@   r   r\   r]   r^   rc   Zobj_parent_idZcontainer_idr_   r!   r!   r"   check_project_role_access  sd    






z.CmfProjectPermScheme.check_project_role_access)NNT)NNT)__name__
__module____qualname__r<   r   r-   classmethodrD   r   staticmethodZon_server_eventrO   rJ   r`   rf   __classcell__r!   r!   r   r"   r      s   

l
Er   )Zcmf.includeZmodules.project.fieldsr   r4   r   r!   r!   r!   r"   <module>   s   