U
    ߆g                     @   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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< |jr|jj|d< q$t jjddj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email_templateparentr   .Nsystem)
class_namer   r   zvar:ZCmfProjectRoleemail_template_idsystem:defaultr   )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/   ZCmfEmailTemplater   r   r   )	selfr"   Z
rules_datarulesruleeventr&   r#   Zrole_member_idsr   r   r	   load_notify_scheme_rules:   s:    

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 не найден проект: abortr0   r1   )	r   r   r   
CmfProjectr   	cmf_alertr=   r   r<   )r   r"   r;   projectschemer9   r   r   r	   get_notify_rule_data_cachedi   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 )
Nr0   r1   r%   r5   r&   r'   r(   r*   r+   )r   r   r
   Zis_newr   r2   r3   setattrgetattrsavesuper)r8   argskwargsZdefault_schemeZrule_fieldsZdefault_ruler:   Zfield	__class__r   r	   rH   x   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)r=   r   z, c                 S   s   g | ]}d |j  d qS )")rN   )r   rB   r   r   r	   
<listcomp>   s     z1CmfProjectNotifyScheme.delete.<locals>.<listcomp>u|   Невозможно удалить схему уведомлений, она используется в проектах: Tr>   rE   )
r   r@   r3   joinrA   r2   deleterI   r   r
   )r8   rJ   rK   ZprojectsZprojects_strr:   resrL   r   r	   rR      s    


zCmfProjectNotifyScheme.delete)__name__
__module____qualname__classmethodr
   staticmethodZon_server_eventr   r$   r<   rD   rH   rR   __classcell__r   r   rL   r	   r      s   

%/
r   )timeZcmf.includeZmodules.project.fieldsr   r   r   r   r   r	   <module>   s   