
    i                     X    d dl Z d dl d dlmZ d dlmZ  G d dej                        Zy)    N)*)cmf_project_notify_scheme)cmf_notify_metricsc                        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                    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                  |<   t8        j:                  r7t<        j>                  jA                  tC        t4        j6                               y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:CmfProjectRoler:   r;   r<   email_template_idsystem:defaultr0   )"r%   CmfProjectNotifySchemeRulelist
setdefaultr9   
event_typer0   dictr$   r:   
all_nestedrB   rA   r*   
startswithr,   r    r   get_project_role_membersr/   r;   r<   r=   rD   CmfEmailTemplater'   r   r   configMETRICS_NOTIFYr   cache_notify_scheme_rule_sizewritelen)	selfr1   
rules_datarulesruleeventr:   r4   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0  <<BB3sGcGcCde !r   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 не найден проект: abortrE   rF   )	r   r   r%   
CmfProjectr'   	cmf_alertr]   r   r[   )r   r1   rY   projectschemerW   s         r   get_notify_rule_data_cachedz2CmfProjectNotifyScheme.get_notify_rule_data_cachedl   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 )NrE   rF   )r9   rJ   r:   r;   r<   r>   r?   )r%   r   r   is_newr'   rG   rH   setattrgetattrsavesuper)	rU   argskwargsdefault_schemerule_fieldsdefault_rulerX   field	__class__s	           r   rk   zCmfProjectNotifyScheme.save{   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)r]   r#   z, "u|   Невозможно удалить схему уведомлений, она используется в проектах: Tr_   rg   )r%   ra   rH   joinru   rb   rG   deleterl   r   r   )	rU   rm   rn   projectsrc   projects_strrX   resrs   s	           r   rx   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   r7   r[   re   rk   rx   __classcell__)rs   s   @r   r   r      sx    F F =>4 ? 4
 # #J/fb & &-2 r   r   )timecmf.includemodules.project.fieldsr   cmf.metricsr   r    r   r   <module>r      s&      < *X6MM Xr   