
    8dg                     L    d dl Z d dl d dlmZ  G d dej                        Zy)    N)*)cmf_project_notify_schemec                        e Zd Zed        Ze ed      d               Zed        Zd Z	ed        Z
 fdZ fd	Z xZS )
CmfProjectNotifySchemec                 2    t        d       t        dd        y )Nz%project_notify_scheme::reload triggerCmfProjectNotifyScheme:changed)printcmf_emit_server_event)clss    5./modules/project/models/cmf_project_notify_scheme.pytrigger_reloadz%CmfProjectNotifyScheme.trigger_reload   s    56>E    r   )channelc                  F    t        d       i t        _        t        d       y )Nz#project_notify_scheme::reload STARTz"project_notify_scheme::reload DONE)r	   APPcache_notify_scheme_rule)_kwargss    r   on_project_notify_scheme_changez6CmfProjectNotifyScheme.on_project_notify_scheme_change   s     	34')$23r   c                    t               }t        j                  j                  dd|gdd| gg      }|s|S t        j                  j                  |j                  j                  dddgd	      }|s|S |D ]  }|j                  j                  dk(  r&|j                  |j                  j                         B|j                  j                  dk(  s\t        j                  j                  d
d|j                  gdg      }|j                  |j                  D ch c]  }|j                  j                   c}        |S c c}w )u  
        Получает и возвращает всех участников проектной роли правила

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

        Returns:
            role_members (list): ID пользователей проектной роли правила
        	parent_id=project_role_id)filtermembers	CmfPerson
CmfCompanyT)child_modelsfullidINpersons)r   fields)setmodelsCmfProjectRoleAssigngetRelationCacheget_childrenr   valuechild_modeladd
child_coder   child_idupdater!   code)r   
project_idrole_membersrole_assignr   membercompanypersons           r   _get_role_members_for_rulez1CmfProjectNotifyScheme._get_role_members_for_rule   s>    u1155 #z25F_4]^ 6 
 &&33NN  )%|4 4 

  	WF!!'';6  !2!2!8!89##))\9 ++//dFOO7T8A{ 0 D##W__$U6V[[%6%6$UV	W  %Vs   E
c                 J   i }t         j                  j                  | g d      }|D ]  }|j                  |j                   d|j
                  j                   t                     }t               }|j                  j                  ddg      D ]  }|j                  dk(  r}|j                  rK|j                  j                  j                  d      r&|j                  |j                  j                         i|j                  |j                   j                         |j                  d	k(  s|st         j"                  j%                  ||j                   j                        }|j'                  |        t        |      |d
<   |j(                  j                  |d<   |j*                  |d<   |j,                  r|j.                  j                  |d<   t         j0                  j3                  d      j                   j                  |d<    |t4        j6                  |<   y)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:CmfProjectRoler9   r:   r;   email_template_idsystem:defaultr/   )r$   CmfProjectNotifySchemeRulelist
setdefaultr8   
event_typer/   dictr#   r9   
all_nestedrA   r@   r)   
startswithr+   r   r   get_project_role_membersr.   r:   r;   r<   rC   CmfEmailTemplater&   r   r   )	selfr0   
rules_datarulesruleeventr9   r3   role_member_idss	            r   load_notify_scheme_rulesz/CmfProjectNotifyScheme.load_notify_scheme_rules:   s    
1166 7 

  	iD))T__,=Qt?S?S>T*UW[W]^E UN--88DRZQ[8\ ;$$3}}):):)E)Ef)M&**6;;+<+<=&**699??;&&*::z&,&6&6&O&OPZ\b\e\e\k\k&lO"))/:; '+>&:E"#$($5$5$;$;E.!+/+C+CE'(""-1-C-C-I-I)*-3-D-D-H-HN^-H-_-b-b-h-h)*+	i. 4>$$Z0r   c                 r   |t         j                  vru|rBt        j                  j	                  |dgd      }|st        d| d       |j                  }n t        j                  j	                  d      }|j                  |       t         j                  j	                  |      }|j	                  |d       S )Nnotify_schemeT)r   r"   include_deletedu<   get_notify_rule_data_cached не найден проект: abortrD   rE   )	r   r   r$   
CmfProjectr&   	cmf_alertrW   r   rU   )r   r0   rS   projectschemerQ   s         r   get_notify_rule_data_cachedz2CmfProjectNotifyScheme.get_notify_rule_data_cachedi   s    S999 ++//:FWim/n \]g\hiquv ..66::@P:Q++J7,,00<yy%%r   c           
         t         j                  j                          | j                  rt         j                  j	                  d      }g d}t         j
                  j                  ||      D ]F  }t         j                  |       }|D ]  }t        ||t        ||              |j                          H t        | $  |i |S )NrD   rE   )r8   rI   r9   r:   r;   r=   r>   )r$   r   r   is_newr&   rF   rG   setattrgetattrsavesuper)	rO   argskwargsdefault_schemerule_fieldsdefault_rulerR   field	__class__s	           r   re   zCmfProjectNotifyScheme.savex   s    %%446 ;;#::>>DT>UNK !' A A F FnNY !G ![ 888E( GED%u)EFG		 w|T,V,,r   c                    t         j                  j                  | dg      }|r=dj                  |D cg c]  }d|j                   d c}      }t        d| d       t         j                  j                  |       D ]  }|j                           t        |   |i |}t         j                  j                          |S c c}w )	Nname)rW   r"   z, "u|   Невозможно удалить схему уведомлений, она используется в проектах: TrY   ra   )r$   r[   rG   joinro   r\   rF   deleterf   r   r   )	rO   rg   rh   projectsr]   projects_strrR   resrm   s	           r   rr   zCmfProjectNotifyScheme.delete   s    $$))fX)N99%Rg',,q&9%RSL  U  Vb  Uc  d " 55::$:G 	DKKM	 gnd-f-%%446
 &Ss   C)__name__
__module____qualname__classmethodr   staticmethodon_server_eventr   r6   rU   r_   re   rr   __classcell__)rm   s   @r   r   r      sw    F F =>4 ? 4
 # #J->^ & &-2 r   r   )timecmf.includemodules.project.fieldsr   r    r   r   <module>r      s#      <V6MM Vr   