U
    ddz                     @   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"   dd }t d dat| d S )Nc                	   S   sz   t d td trnt d datj : i t_t	j
jdtt dddrbtd	 t  W 5 Q R X nt d
 d S )Nz-project_notify_scheme::reload handler spawned   z/project_notify_scheme::reload handler do reloadFz)project_notify_scheme::clear_jscache:lockTi  )ZnxZpxzBproject_notify_scheme::reload handler do CMF_CACHE.flush_jscache()z*project_notify_scheme::reload handler skip)r   timesleep_project_notify_scheme_changedZcmfZappZcmf_contextAPPcache_notify_scheme_ruleZREDIS_DBZredissetstrosgetpidgdebugZ	CMF_CACHEZflush_jscacher   r   r   r	   handler   s    

  
zGCmfProjectNotifyScheme.on_project_notify_scheme_change.<locals>.handlerz+project_notify_scheme::reload spawn handlerT)r   r   ZgeventZspawn)_kwargsr   r   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>J   s     zDCmfProjectNotifyScheme._get_role_members_for_rule.<locals>.<setcomp>)r   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   r0   Z
all_nestedr7   r6   r%   
startswithr*   r    r   Zget_project_role_membersr+   r1   r2   r   r   )	selfr,   Z
rules_datarulesruleeventr0   r-   Zrole_member_idsr   r   r	   load_notify_scheme_rulesN   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_alertrC   r   rB   )r   r,   rA   projectZschemer?   r   r   r	   get_notify_rule_data_cachedx   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 )
NrF   rG   r/   r;   r0   r1   r2   r3   r4   )r(   r   r
   Zis_newr)   r8   r9   setattrgetattrsavesuper)r>   argskwargsZdefault_schemeZrule_fieldsZdefault_ruler@   Zfield	__class__r   r	   rO      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)rC   r#   z, c                 S   s   g | ]}d |j  d qS )")rU   )r&   rJ   r   r   r	   
<listcomp>   s     z1CmfProjectNotifyScheme.delete.<locals>.<listcomp>u|   Невозможно удалить схему уведомлений, она используется в проектах: TrD   rL   )
r(   rH   r9   joinrI   r8   deleterP   r   r
   )r>   rQ   rR   ZprojectsZprojects_strr@   resrS   r   r	   rY      s    


zCmfProjectNotifyScheme.delete)__name__
__module____qualname__classmethodr
   staticmethodZon_server_eventr   r.   rB   rK   rO   rY   __classcell__r   r   rS   r	   r      s   

%*
r   )r   Zcmf.includeZmodules.project.fieldsr   r   r   r   r   r	   <module>   s   