B
    Efc                 @   s*   d dl T d dlmZ G dd dejZdS )    )*)cmf_security_levelc                   sL   e Zd Z fddZee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schedule_deferred_jobr   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   sF  t d|   tjj| ddgd}t }x.|jD ]$}|jr2x|jD ]}|| qDW q2W t	t
|}|j|kr||_|jdd t }| ddd	d
dg }d}d}	tjj
| |dg|	|	d gd}
xd|
r*x,|
D ]$}|jdd |jdd |d7 }qW t  |	d7 }	tjj
| |dg|	|	d gd}
qW t d|  d|  d S )NuF   Запуск пересчета Уровня безопасности access_task_fields_cachez'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_idZ_kwargsZ	sec_levelr   ZrulefZtmp_taskr   ir   ZbatchZtaskr   r   r   r
      sD    


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}x2t jD ](}||d krLdS |s8||d kr8d}q8W |rx0|d D ]$}|dsqrt jj||drrdS qrW |sx2|d D ]&}|dsqt jj||drd}P qW |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_level8   s4    

z*CmfSecurityLevel.check_perm_security_levelc                s0   | j   x| j D ]}|  qW t j||S )N)r   loaddeleter   )r   r   r   Zsecurity_level_rule)r   r   r   r)   ]   s    
zCmfSecurityLevel.delete)__name__
__module____qualname__r   staticmethodZcmf_deferred_jobr
   classmethodr'   r)   __classcell__r   r   )r   r   r      s
   )%r   N)Zcmf.includeZcommon.fieldsr   r   r   r   r   r   <module>   s   