U
    =e4                     @   s*   d dl T d dlmZ G dd dejZdS )    )*)cmf_security_levelc                       sN   e Zd Z fddZeejddddd Zedd Z	 fd	d
Z
  ZS )CmfSecurityLevelc                    s>   t jj| ddkrtd tt jj| jjgd t	 j
||S )N)perm_security_leveli  u   Применение изменений потребует некоторого времени. Время зависит от количества объектов, использующих данный Уровень безопасности.)args)modelsCmfTaskcountZ	cmf_alertZcmf_deferred_taskr   recalc_security_level_cacheidvaluesupersave)selfr   kwargs	__class__ %./common/models/cmf_security_level.pyr      s    zCmfSecurityLevel.saveT)Z	only_onceZsystem_taskc                 K   s   t d|   t }| dddddg }d}d}tjj| |dg||d	 gd
}|r|D ]$}|jdd |jdd |d7 }q\t  |d	7 }tjj| |dg||d	 gd
}qTt d|  d|  d S )NuF   Запуск пересчета Уровня безопасности z;perm_security_level.security_level_rules.access_member.codez;perm_security_level.security_level_rules.access_task_fieldsz8perm_security_level.security_level_rules.access_readonlyzroot_parent.cmf_ownerz root_parent.cmf_owner_assistantsr   Zcmf_created_atd   )r   fieldsZorder_bysliceT)force)Z	only_data   u7   Пересчет Уровня безопасности u4    завершен. Обработано задач: )	gdebugr   r   Zsave_preload_fieldslistZ+_calc_perm_security_level_allowed_ids_cacher   Zcommit_with_event)Zsec_level_id_kwargsZtmp_taskr   ir   Zbatchtaskr   r   r   r
      s<      

  
z,CmfSecurityLevel.recalc_security_level_cachec                 C   s   d}t jjj|d krdS t jjj|d kr0d}t jD ]*}||d krL dS |s6||d kr6d}q6|r|d D ]&}|ds~qnt jj||drn dS qn|s|d D ](}|dsqt jj||drd} qq|rdS dS )NFZfullreadonlyTzCmfProjectRole:)ZprojectZrole)r   Zcurrent_userr   r   Zcurrent_person__member_of
startswithZin_project_role)clsZperm_security_level_allowed_idsZ
project_idZreadonly_accessZ
member_objZproject_role_idr   r   r   check_perm_security_level)   s4    


z*CmfSecurityLevel.check_perm_security_levelc                    s,   | j   | j D ]}|  qt j||S )N)Zsecurity_level_rulesloaddeleter   )r   r   r   Zsecurity_level_ruler   r   r   r%   N   s    


zCmfSecurityLevel.delete)__name__
__module____qualname__r   staticmethodZ
celery_appr   r
   classmethodr#   r%   __classcell__r   r   r   r   r      s   
$r   N)Zcmf.includeZcommon.fieldsr   r   r   r   r   r   <module>   s   