U
    h6                     @   s*   d dl T d dlmZ G dd dejZdS )    )*)cmf_security_levelc                       sz   e Zd Z fddZeeddddd Zedd Z fd	d
Z	edd Z
edd Zeedddd Z  ZS )CmfSecurityLevelc                    sH   t j  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)modelsr   trigger_reloadCmfTaskcountZ	cmf_alertZschedule_deferred_job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_jobc                 K   s6  t d|   tjj| ddgd}t }|jD ] }|jr0|jD ]}|| q@q0t	t
|}|j|krz||_|jd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 }qt  |	d7 }	tjj
| |dg|	|	d gd}
qt d|  d|  d S )NuF   Запуск пересчета Уровня безопасности access_task_fields_cache'security_level_rules.access_task_fieldsr   fieldsT)Z	only_dataz;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project.cmf_ownerzproject.cmf_owner_assistantsr   Zcmf_created_atd   )r   r   Zorder_byslice)force   u7   Пересчет Уровня безопасности u4    завершен. Обработано задач: )gdebugr   r   getsetsecurity_level_rulesZaccess_task_fieldsaddsortedlistr   r   r	   Zsave_preload_fieldsZ+_calc_perm_security_level_allowed_ids_cacheZcommit_with_event)Zsec_level_id_kwargsZ	sec_levelr   ZrulefZtmp_taskr   ir   ZbatchZtaskr   r   r   r      sX    


  

  
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_level9   s4    


z*CmfSecurityLevel.check_perm_security_levelc                    s6   t j  | j  | jD ]}|  qt j||S )N)r   r   r   r"   loaddeleter   )r   r   r   Zsecurity_level_ruler   r   r   r.   ^   s
    



zCmfSecurityLevel.deletec                 C   sH   t | } | tjkrtj|  S tjj| ddddgd}|tj| < tj|  S )Nz'security_level_rules.access_member.coder   z$security_level_rules.access_readonlyr   r   )strAPPcache_cmf_security_levelr   r   r    )Zsecurity_level_idZsecurity_levelr   r   r   get_cache_security_levele   s    



z)CmfSecurityLevel.get_cache_security_levelc                 C   s   t d tdd  d S )Nz"cmf_security_level::reload triggerCmfSecurityLevel:changed)printZcmf_emit_server_event)r+   r   r   r   r   s   s    zCmfSecurityLevel.trigger_reloadr3   )Zchannelc                  K   s   t d i t_t d d S )Nz cmf_security_level::reload STARTzcmf_security_level::reload DONE)r4   r0   r1   )r&   r   r   r   on_project_notify_scheme_changex   s    z0CmfSecurityLevel.on_project_notify_scheme_change)__name__
__module____qualname__r   staticmethodZcmf_deferred_jobr   classmethodr,   r.   r2   r   Zon_server_eventr5   __classcell__r   r   r   r   r      s   	
(
$

r   N)Zcmf.includeZcommon.fieldsr   r   r   r   r   r   <module>   s   