U
    
\e                     @   s2   d dl Z d dlT d dlmZ G dd dejZdS )    N)*)cmf_project_notify_schemec                       sj   e Zd Zedd Zeedddd Zedd Zd	d
 Z	edd Z
 fddZ fddZ  ZS )CmfProjectNotifySchemec                 C   s   t d tdd  d S )Nz%project_notify_scheme::reload triggerCmfProjectNotifyScheme:changed)printZcmf_emit_server_event)cls r   5./modules/project/models/cmf_project_notify_scheme.pytrigger_reload   s    z%CmfProjectNotifyScheme.trigger_reloadr   )Zchannelc                  K   s   t d i t_t d d S )Nz#project_notify_scheme::reload STARTz"project_notify_scheme::reload DONE)r   APPcache_notify_scheme_rule)_kwargsr   r   r	   on_project_notify_scheme_change   s    z6CmfProjectNotifyScheme.on_project_notify_scheme_changec                 C   s   t  }tjjdd|gdd| ggd}|s,|S tjj|jjdddgdd	}|sP|S |D ]\}|jjdkrt|	|j
j qT|jjdkrTtjjd
d|jgdgd}|dd |jD  qT|S )u  
        Получает и возвращает всех участников проектной роли правила

        Args:
            project_role_id (str): ID проектной роли
            project_id (str): ID проекта

        Returns:
            role_members (list): ID пользователей проектной роли правила
        Z	parent_id=project_role_id)filtermembers	CmfPerson
CmfCompanyT)Zchild_modelsZfullidINpersons)r   fieldsc                 S   s   h | ]}|j jqS r   )codevalue).0Zpersonr   r   r	   	<setcomp>6   s     zDCmfProjectNotifyScheme._get_role_members_for_rule.<locals>.<setcomp>)setmodelsZCmfProjectRoleAssigngetZRelationCacheZget_childrenr   r   Zchild_modeladdZ
child_coder   Zchild_idupdater   )r   
project_idZrole_membersZrole_assignr   memberZcompanyr   r   r	   _get_role_members_for_rule   s.     z1CmfProjectNotifyScheme._get_role_members_for_rulec           	      C   s   i }t jj| dddddgd}|D ]}||j d|jj t }t }|j	j
dd	gd
D ]l}|jdkr|jr|jjdr||jj q||jj q\|jdkr\|r\t j||jj}|| q\t||d< |jj|d< |j|d< q"|tj|< dS )u   
        Создает структуру проектных правил схемы уведомлений и загружает в кэш

        Args:
            project_id (str): ID проекта
        
model_typezevent_type.codenotify_membersnotify_emailnotify_custom_fieldparentr   .Nsystem)
class_namer   r   zvar:ZCmfProjectRole)r   CmfProjectNotifySchemeRulelist
setdefaultr%   
event_typer   dictr   r&   Z
all_nestedr-   r,   r   
startswithr    r   r   Zget_project_role_membersr!   r'   r(   r   r   )	selfr"   Z
rules_datarulesruleeventr&   r#   Zrole_member_idsr   r   r	   load_notify_scheme_rules:   s2    
z/CmfProjectNotifyScheme.load_notify_scheme_rulesc                 C   sp   |t jkrX|r@tjj|dgdd}|s8td| dd |j}ntjjdd}|| t j|}||d S )Nnotify_schemeT)r   r   Zinclude_deletedu<   get_notify_rule_data_cached не найден проект: abortsystem:defaultr   )	r   r   r   
CmfProjectr   	cmf_alertr9   r   r8   )r   r"   r7   projectZschemer5   r   r   r	   get_notify_rule_data_cachedd   s    

z2CmfProjectNotifyScheme.get_notify_rule_data_cachedc                    s   t j  | jrrt jjdd}dddddg}t jj||dD ]4}t j| d	}|D ]}t||t|| qP|	  q<t
 j	||S )
Nr<   r=   r%   r1   r&   r'   r(   r)   r*   )r   r   r
   Zis_newr   r.   r/   setattrgetattrsavesuper)r4   argskwargsZdefault_schemeZrule_fieldsZdefault_ruler6   Zfield	__class__r   r	   rE   s   s"    


zCmfProjectNotifyScheme.savec                    st   t jj| dgd}|r<ddd |D }td| dd t jj| d	D ]}|  qJt j||}t j	  |S )
Nname)r9   r   z, c                 S   s   g | ]}d |j  d qS )")rK   )r   r@   r   r   r	   
<listcomp>   s     z1CmfProjectNotifyScheme.delete.<locals>.<listcomp>u|   Невозможно удалить схему уведомлений, она используется в проектах: Tr:   rB   )
r   r>   r/   joinr?   r.   deleterF   r   r
   )r4   rG   rH   ZprojectsZprojects_strr6   resrI   r   r	   rO      s    


zCmfProjectNotifyScheme.delete)__name__
__module____qualname__classmethodr
   staticmethodZon_server_eventr   r$   r8   rA   rE   rO   __classcell__r   r   rI   r	   r      s   

%*
r   )timeZcmf.includeZmodules.project.fieldsr   r   r   r   r   r	   <module>   s   