
    k(i                    t    d dl m Z mZmZ d dlmZ d dlmZ d dlT d dlm	Z	m
Z
mZ  G d de	j                  ZdS )	    )datetime	timedeltatimezone)uuid1)	dataclass)*)
cmf_notifyCmfRelationCmfTypec                       e Zd ZdZdZdZdej        iZe	
                    ej                            ej        d          ej                            ej        d          g          Zeed<    e	j        d7i eZej        j        g dz   Ze G d	 d
                      Zed             Zed             Zed             Ze	 	 	 d8d            Zed             Zed             Zedefd            Z edefd            Z!edefd            Z"ed9d            Z#edddddefd            Z$ed:d            Z%ed             Z& fdZ'ed;d             Z(ed9d!            Z)ed"             Z*e+ e,dd#          d$                         Z-e+ e,dd#          d%                         Z.ed&             Z/ed'             Z0ed<d)            Z1ed*             Z2e+d+ed(efd,            Z3e+d+ed(efd-            Z4ed.             Z5ed/             Z6e+ e,ddd01          d2                         Z7e+ e,dd3dd45          d6                         Z8 xZ9S )=	CmfNotifyNotifydeskNTF
autoescapezcommon/templateszcmf/templatesloader)close_open_notifiesconfirm_unconfirmed_notifiesplace_notifyc                   Z   e Zd ZU dZdZeed<   dZeed<   dZeed<   dZ	e
ed<   dZeed	<   dZeed
<   dZeed<   dZeed<   dZeed<   dZeed<   dZeed<   dZeed<   dZeed<   dZeed<   dZeed<   dZeed<   dZeed<   dZeed<   dZeed<   dZeed<   dZeed<   dZeed<   dZeed<   dZ dS )CmfNotify.NotifyCtxu1  
        notify_type - тип сообщения
        возможные варианты:
        - просто сообщение (default) -- message
        - редактирование объекта -- obj_edit
        - создание объекта -- obj_create
        - удаление объекта -- obj_delete
        - добавление комментария -- comment_create
        - редактирование комментария -- comment_edit
        - удаление комментария -- comment_delete
        N	person_idnametextr   priorityFstrikethrough
alarm_datemessagenotify_typeobj_hrefobj_codeobj_parent_nameobj_link html_changed_fields
owner_nameowner_initialsperson_phone_mobileperson_phoneperson_nameperson_emailperson_loginmsg_from_idmsg_from_namemsg_from_codemsg_from_login)!__name__
__module____qualname____doc__r   str__annotations__r   r   r   intr   boolr   r   r   r    r!   r"   r#   r%   r&   r'   r(   r)   r*   r+   r,   r-   r.   r/   r0   comments     ./cmf/models/cmf_notify.py	NotifyCtxr      s        
	 
	 	3cc##t####
H###$S$$$########%S%%%
C""""#'S''' c   S c    c   S!s!!!!s!!!""""r;   r=   c                 <   |j         p|j        }d|j         d|j         d|j         }|                                 }|r|                                }| j                            |          }|                    |          }t          | j
        |||g           d S )N[z] (z) )ctxargs)r+   r,   r"   r!   r   +get_default_mail_notification_template_name
_jinja_envget_templaterenderschedule_deferred_jobprocess_email)cls
notify_ctxobjrcpt_tosubjectmail_templatetemplate
email_bodys           r<   send_email_notify_oldzCmfNotify.send_email_notify_oldA   s     )DZ-D]j0]]Z5H]]JO]]GGII 	NKKMMM>..}==___44
c/w6TUUUUUUr;   c                 2   t          d          }|j        p|j        }t          |          dk    r|d d          d}| d|j         d| |j         }|j        p|j        }|st          d|j         d           d S t          | j
        ||g           d S )	NTfull_url   z...
4   SMS уведомление пользователю _    не отправлено, не указан номер мобильного телефона.rA   )app_base_hrefr   msglenr    r(   r)   	cmf_alertr*   rG   process_sms)rI   rJ   urlsubjr   phones         r<   send_sms_notify_oldzCmfNotify.send_sms_notify_oldP   s    T***0*.t99r>>3B3i$$$DIIZ^IIsIJ4GII.I*2I 	  EZMc  E  E  E  F  F  FFcoUG4DEEEEEEr;   c                    d|vs
|d         du r"t          j        t          j                  |d<   d|v r|                    d          }nt
          j        }|j        j        |d<   |j	        j        |d<   |j
        j        |d<   |j        j        |d<   d	|d
<   |rd|vs
|d         du r
|j	        |d<   d|vs
|d         du r"t          j        t          j                  |d<   t          |d         t                    r|d         j        |d<   |d         |d<   |pt
          j        }|j	        j        |d<   |                    ddg           |j        r|j        j        d         nd|j        r|j        j        d         ndz   |d<   |rdt%          d          }|j        |d<   |j
        |d<   | |d          |d<   t)          |d          r|j        r|j        j	        j        |d<   nd |d<   t,          j                            |          }||d<   |d         |d<   |d         |d<   |d
         |d <   |d!         |d"<   |d#         |d$<    | j        d%i |}|S )&Nr   .tzmsg_fromr-   r.   r/   r0      Уведомлениеr   r   rZ   r%   r&   
first_name	last_namer   r$   r'   TrS   r    r!   r#   parentr"   r   r`   r)   phone_mobiler(   r*   emailr+   loginr,   r:   )r   nowr   utcpopgcurrent_personidvaluer   coderl   
isinstancer   current_userload_fieldsrg   rh   rY   hrefhasattrri   models	CmfPersonget_notify_opt_cachedr=   )	rI   rK   r   kwargsre   notify_ownerr^   notify_optsr@   s	            r<   prepare_notify_ctx_oldz CmfNotify.prepare_notify_ctx_old^   s   v%%)=)D)D#+<8<#@#@#@F< zz*--HH'H ( 1}"*-"5"*-"5#+>#7 1v 	&F&((F6Nc,A,A XF6Nv%%)=)D)D#+<8<#@#@#@F< fUmW-- 	0"5M/F5M(.u$%11>+06|  ,!<===HTH_$gL$;$A!$D$Deg  P\  Pf  mnlx  mC  mI  JK  mL  mL  ln  $o  	1...C!$F:!$F:$'!=
);!=!=F:sH%% 1#* 1,/JO,A()),0()&<<YGG'{!,W!5~(3N(C$% +F 3}!,W!5~!,W!5~cm%%f%%
r;   Nr$   Fr   c           	         t           j        rt                               d           dS t                              |d          }t
          j                            |          }|dS d}|t           j        j	        k    r|dk    r|d         rd}ndS |r/|j
        j        r|j        j        s|                    ddg           d}|r6d	}|sd
}|                     dd|j	        gdd|gdd|gg dg dgg d          }|st
                                          }|sd}|j        r|j        dk    r| d|j         }|j        r	|j        r|r||_        d	|_        |xj        dz  c_        ||_        ||_        d|_        |	r|	|_        n|j                                         |r-|j        |_        |j	        |_        |j        |_        |j        |_        t=          |d          rr|j
        rkt?          |j
        j         t
          j!                  r1tD          #                    |j$                  j        j         }||_%        n|j
        j        j         |_%        |j&        |_'        t=          |d          r^|j        (                                rEt?          |j        tR                    r|j        j        |_*        n!tW          |j                  |_*        nd|_        |j,        sg |_,        |j,        rCt[          |j,        j                   dk    r&|j,        j         dd         d         d         |k    r|S t           j.        j/        rt           j.        j/        j         d         ndt           j.        j0        rt           j.        j0        j         d         ndz   }|r|j        j         nd}t           j.        j	        j         t           j.        j        j         t           j.        j        j         t           j.        j1        j         |dte          j3        th          j5                  6                                te          j3                    7                    d          ||dtq                       |dd}|j,        9                    |           d|_:        |j        p||_        |d         |_;        |d          |_<        |d          r.|
%t
          j=        >                    d!"          j	        }
|
|_?        |d#         p|d$         |_@        |d%         p|d&         |_A        |sd
|_        |B                                 |d'         s|jC        d(k    r!t          d)|||j'        j         d*|g+           |jC        d,k    r|jE        st          d-| |g+           |S ).u  
        obj: CmfEntity

        :param obj:
        :param msg_from:
        :param person: Идентификатор пользователя которому отправляется сообщение
        :param name: Наименование объекта уведомления
        :param msg: Текст сообщения
        force - форсированная отправка
        :param priority:
        :param strikethrough:
        :param alarm_date: Будильник для уведомлений
        :param force_notify_current_person: отправить сообщение себе
        :param notify_type: Тип сообщения. Описание см в структуре NotifyCtx
        B   Уведомления отключены g.disable_notify = FalseNr{   TFemail_if_self_changesri   rt   openclosedobj_id==r   status	cron_doner   F)	confirmedr   F)
unread_cntr9   
cron_forcer   r   filterfieldsrf   r   u
    + еще    r$   r   )rr   r   rt   rl   initialsrc   z%H:%MCmfComment:)	cmf_ownercmf_created_atcmf_created_at_formattedmsg_type_textr   rr   parent_name	log_level
notify_smsnotify_emailsystem:defaultrt   rj   r`   rk   rl   	notify_os1z	notify-os)r   commentr    )event_persons2znotify-important-)Frp   disable_notifydebugcmfutilget_obj_id_by_anyrz   r{   r|   rq   rr   ri   
is_definedrt   rw   getr   r   r   r   r   priotityr   r   r   set_nowr   r   r!   ui_nameobj_ui_namery   ru   rs   
CmfProjectAPPget_cache_project
project_idr"   rx   r    loadr
   obj_status_namer5   r9   r[   rv   rg   rh   rl   r   rm   r   rn   	isoformatstrftimer   appendr   person_notify_smsperson_notify_emailCmfEmailTemplatesgetemail_template_idr)   r+   saver   cmf_emit_eventr   )rI   rZ   personr   r   rK   force_notify_current_personforcer   r   r   r}   r   r   desk_notifynotifyfilter_statusproject_namer'   r   r   s                        r<   r   zCmfNotify.place_notify   s   &  	GGXYYYF--fkBB	&<<YGGF(+++0Ku0T0T23 # 	4:( 48.46 2333  	 #M ) (WW4(dI.4/******% YXX  
 
F  	(%%''F 	,+D 	:!2Q!6!699f&799D{ 	&"3 	u 	FKQ"$$  	( *F%%''' 	(FKFFM!hFO!$FsH%% C#* Ccj.0ABB C#&#8#8#H#H#M#SL-9F**-0Z_-BF* "hFOsH%% =#*//*;*; =cj+66 =-0Z_F**-0__F*FK 	! FO 	-..22O)"##.q1&9S@@M@A@Ya!.39!<<_a121IQAN$*1--rS ),3chnn n'-+1+1-3*  'lhl;;;EEGG(0(?(?(H(H*)))&
 
$ 	w''' "-6#.|#< %0%@"~& 	9 ($*$;$@$@FV$@$W$W$Z!'8F$
 *.9Q[=Q)'2Jk'6J  	%$FM {# 	Gv#'='=;i4;5;_5J)+ )+ <E+G G G G ?c!!&*:!:y::9+VVVVr;   c                 J   t           j        rt                               d           dS d|v r
|d         dus
J d            d|v r
|d         dus
J d            |d         t           j        j        k    r|                    d          sdS d	|v r-|                    d	          }|                    g d
           nd}|                    d          }t          j	                            |g d          }|st                               d|            dS |                    dg           }t          j
                            ||          } | j        ||fi |}|dS |                     ||          }|r+|                     ||           |                     |           |S )u  
        obj: CmfEntity

        :param obj:
        :param msg_from:
        :param person_id: Идентификатор пользователя которому отправляется сообщение
        :param recipient_opt: Опции получателя для проверки разрешения получать уведомления пользователем
        :param name: Наименование объекта уведомления
        :param text: Тема сообщения
        :param msg: Текст сообщения
        :param priority:
        :param strikethrough:
        :param alarm_date: Будильник для уведомлений
        :param force_notify_current_person: отправить сообщение себе
        :param notify_type: Тип сообщения. Описание см в структуре NotifyCtx
        r   NrZ   .u   Укажите msgr   u   Укажите person_idr   rK   )ri   rt   r   rx   )r   zphone_mobile.numberzphone.numberrr   r   u   В метод place_notify пришел отсутствующий или удаленный пользователь person_id=recipient_opt)rp   r   r   rq   rr   r   ro   rw   rz   r{   CmfPersonNotifyOptcheck_permission_notify_eventprepare_notify_ctxcreate_desk_notifysend_email_notifysend_sms_notify)	rI   r}   rK   r   r   r   notify_allowedrJ   r   s	            r<   stol_place_notifyzCmfNotify.stol_place_notifyH  s   $  	GGXYYYF6%=#;#;#;=Q#;#;#;f$$)<C)G)G)GIc)G)G)G +!"2"555fjjIf>g>g5FF??**U##COOAAABBBBCJJ{++	!%%-b-b-b & d d  	GG  c  Xa  c  c  d  d  d4

?B772PPQWYfgg+S+CBB6BB
4''
C88 	,!!*c222
+++r;   c                    |j         }|j        dk    r|j        j        }t	          |d          sd }t
          j                            ||j         d|           }|s#t
          j                            |d|           }|S )Nr   logic_prefix.
AllModels.)	parent_id
class_namerr   rs   ry   rz   CmfProjectNotifySchemeget_notify_rule_data_cached)rI   rK   event_type_codetmp_parent_id	rule_datas        r<   get_rule_datazCmfNotify.get_rule_data  s    
 >\))FLMsN++ 	! M 1MMcn@@@@
 
	  	5QQ=O== I r;   r   c                 T   g }t          |d          r.|j        dk    r#|j        r|j                            d          sg S |                     ||          }|sdS |d         rE|d                             d          D ])}|                    |                                           *|S )u   
         email-ы из колонки "Адреса электронной почты" схемы уведомлений
        r   r   CmfProject:Nr   ,)ry   r   r   
startswithr   splitr   strip)rI   rK   r   r   
recipientsrk   s         r<   get_notify_email_membersz"CmfNotify.get_notify_email_members  s     
 3'' 	Nl22 3.1m.F.F}.U.U 3I%%c?;;	 	 F^$ 	1">288== 1 1!!%++--0000r;   c                 z	   t                      }t          |d          rU|j        dk    rJ|j        r|j                            d          s)|                                D ]}dh||j        j        <   |S |                     ||          }|sdS g }|d         D ]u}|	                    |d          }|>|
                    |t                                 ||                             d           Z|D ]}	t          j                            |	j        j                  }
|
/|	j        s|                    |	           |
                    |	j        j        t                                 d	}|d
k    r|
d         rd}nf|dk    r|
d         rd}nU|dv r|
d         rd}nF|dk    r|
d         rd}n5|dk    r/|
d         r'd}||	j        j                                     d           |r%||	j        j                                     d           w|j        r|j                            d          r|r|j                            dg           |j        j        st          j                            d          }t          j                            |j        |dg          }|D ]O}t1          |t2          j        j                  r|j        }|j        j        |v r|r||d         vr||j        j        = P|d         r'|j        dk    r|                    |d                    |d         D ]}||         st9          t;          ||                   t2          j        j                  r]||         D ]S}|
                    |j        j        t                                 ||j        j                                     d           T|
                    ||         j        j        t                                 |||         j        j                                     d           |D ]}|                    d          rt?          d| d	           t@          j!        r^t          j                            |dg           }|r:|j"        r3|j"        j                            d          rt?          d!| d	           |S )"uY   
        Рассчитываем набор юзеров и их галочек
        r   r   r   rk   Nnotify_membersT)all_nested_personsFz
var:authoremail_if_authorz	var:owneremail_if_owner)zvar:responsiblezvar:executorsemail_if_responsiblezvar:spectatorsemail_if_spectatorzvar:current_userr   rv   servicedesk_publicsdesk-client:defaultr   members)r   project_role_idr   notify_custom_fieldCmfTaskzvar:zDEV: Var user in notify! )abortrt   r   z DEV: Var user person in notify! )#dictry   r   r   r   all_relation_personsrr   rs   r   extract_var_obj
setdefaultsetaddrz   r{   r|   
user_localr   ri   rw   r   CmfProjectRoler   CmfProjectRoleAssignru   cmfr   CmfRelationBase
issubclasstype
CmfM2MBaser\   configDEBUGrt   )rI   rK   r   r   r   unon_local_personsuser_id	var_usersvar_userr   rk   	proj_roleproj_role_assignuser
field_nameis                    r<   get_notify_memberszCmfNotify.get_notify_members  sK   
 VV
 3'' 	Nl22 3.1m.F.F}.U.U 3--// 3 3*1
14:&&%%c?;;	 	 F !12 	C 	CG++G+MMI %%gsuu5557#''0000 ) C CH"("2"H"HIZ"["[K"* #. ;)00:::))(+*;SUUCCC!E,..;?P3Q. $ K//K@P4Q/ $ $HHH[YoMpH $ $444EY9Z4 $ $666;G^;_6 $"8;#4599.III C"8;#4599'BBB1C6 = 	6S]55mDD 	6IZ 	6J""$8#9::: :0 6"155;Q5RR	#)#>#B#BSZir  }F  |G#B  $H  $H - 6 6D!$
(BCC *#zw}
227G2DXhirXsLsLs&tw}5*+ 	F)0K0KOOI&;<==='(=> 	F 	F
: d3z?33SZ5JKK F #J ? ?"--dgmSUUCCC"47=155g>>>>? ))#j/*<*BCEEJJJs:178<<WEEEE  	V 	VA||F## H9a99GGGG| V'++q&+BB VDI V$)/*D*DV*L*L VGGGuUUUUr;   c                 n   t          |t          j                  r|dk    r:d|j        j         d}d|j        j         d}d}d|||j        dd|||j        dgS |dk    r:d|j        j         d}d|j        j         d}d	}d|||j        dd|||j        dgS t          |t          j                  r|j        j        r|d
k    r&d|j         d}d}d}d|||j        j	        dd||dgS |dk    r_|j        r&d|j         d}d}d}d|||j        j	        dd||dgS |j        j
        r&d|j         d}d}d}d|||j        j
        dd||dgS t          |t          j                  r3|d
k    rd}d}d||dgS |dk    rd}d}d||dgS |dk    rd}d}d||dgS t          |t          j                  r"|d
k    rd}d}d||dgS |dk    rd}d}d||dgS t          |t          j                  r|dk    rd }d!}d||dgS |d"k    rd#}d$}d||dgS |dk    rd%}d&}d||dgS |d
k    rd'}d(}d||dgS |d)k    r*d*}|d+|j                                         z  }d,}d||dgS |d-k    rn|j        d.k    r|j        d.k    rd/}d0}nLd1}|j        j        |j        j	                 }	|d2|	 z  }|j        j        |j        j	                 }
|d3|
 z  }d4}d||dgS |d5k    r8d6}|d+|j        j         d7|j        j        r|j        j        nd8 z  }d9}d||dgS |d:k    r1|j        r*d;}|d+|j                                         z  }d<}d||dgS |d=k    r8d>}|d+|j        j         d7|j        j        r|j        j        nd8 z  }d?}d||dgS |d@k    r|j        rdA}|dB|j         z  }dC}d||dgS |dDk    rdE}|dB|j         z  }dF}d||dgS |dGk    rdH}dI}d||dgS |dJk    r|j        rdK}dL}d||dgS |dMk    rdN}dO}d||dgS |dPk    rGdQ}|j        j
        r|dR|j        j
        j         z  }|j        r|dS|j        j         z  }dT}d||dgS |dUk    rg }|j        j        r{dV}|j        r|j        j        }dV}|j        r|j        j        }dW| }||k    r|dX| z  }|dYz  }|j        j        r|dB|j        j         z  }dZ}|                    d||d           |j        j        rt|j        j        rhd[                    d\ |j        j        D                       }dW| dY}|j        j        r|dB|j        j         z  }d]}|                    d||d           |S |d^k    r	d_}dd`|dgS |dak    r0db}|j        j        rt;          |j        j                  }dc}d||dgS |ddk    r0de}|j        j        rt;          |j        j                  }df}d||dgS |dgk    r0dh}|j        j        rt;          |j        j                  }di}d||dgS |djk    r0dk}|j        j        rt;          |j        j                  }dl}d||dgS |dmk    r|j        j
        r(|j        r!|j        j
        j        |j        j        k    rg S |j        dnk    r	dc}ddo|dgS dV}|j        r|j        j        }dp|j        j         dq| dY}|j        j        r|dB|j        j         z  }|j        j
        r*|j        r#dr|j        j
        j         ds|j        j         dt}ndu}d||dgS |dvk    rdw| }dx}d||dgS |dyk    rdz}d{}d||dgS |d|k    rd}| d~}d}d||dgS |dk    rd}d}d||dgS |dk    r_d}d}|j         j        D ]}||j         j
        vr|d|j         z  }|j         j
        D ]}||j         j        vr|d|j         z  }d||dgS g d}|dk    rAg g g d}|!                    d          D ]p\  }}|j"        s||v r|#                    |          }|dk     r.|j	        |j
        k    r?|                                }|r||                             |           qg }d}|d         r2|                    dd+                    |d                   |d           |d         r2|                    dd+                    |d                   |d           |d         r2|                    dd+                    |d                   |d           |S | }dd| d|j         |dgS )u  
        Логика:
        - по спец. событиям типа assigned, придет и assigned и updated, поэтому поля спец.событий
            дополнительно нужно отфильтровывать в updated
        updatedu6   Установлена связь с задачей «   »u/   установил связь с задачей   )r   r   message_titleri   deletedu.   Удалена связь с задачей «u)   удалил связь с задачейcreatedu$   Создана подзадача «u   Созданаu   создал подзадачу)r   r   r  u(   Добавлена подзадача «u   Добавленаu!   добавил подзадачуu$   Удалена подзадача «u   Удаленаu   удалил подзадачуu'   Создан шаг тест-кейсаu'   создал шаг тест-кейсаr   u'   Удалён шаг тест-кейсаu'   удалил шаг тест-кейсаu)   Изменён шаг тест-кейсаu)   изменил шаг тест-кейсаuE   Добавлена строка значений параметровu?   создал строку значений параметровuA   Удалена строка значений параметровu?   удалил строку значений параметровu4   Изменено значение параметраu2   изменил значение параметраrestoredu   Восстановленоu   восстановилu   Удаленоu   удалилu   Созданоu   создал	publishedu9   Выпущены изменения в документеz<br>u!   выпустил документshareddefaultu[   Отменен публичный доступ к документу в интернете.u9   отменил публикацию в интернетеui   Документ опубликован для публичного доступа в интернете.u   <br>Анонимные: u"   <br>Авторизованные: u,   опубликовал в интернетеcomment_createdu$   Комментарий создан.: r$   u%   написал комментарийcomment_updatedu&   Комментарий изменен.u%   изменил комментарийcomment_deletedu#   Комментарий удаленu#   удалил комментарийattachment_createdu#   Добавлено вложение u   добавил вложениеattachment_deletedu   Удалено вложениеu   удалил вложениеworklog_createdu+   Сделана запись о работеu)   сделал запись о работеworklog_updatedu&   Журнал работ измененu&   изменил журнал работworklog_deletedu$   Журнал работ удаленu$   удалил журнал работmovedu   Перемещеноu    из проекта u    в проект u1   переместил в другой проектassignedu   Не установленu%   Задача назначена на u   , ожидает r   u'   назначил исполнителяz, c                 6    g | ]}t          |j                  S r:   )r5   r   ).0es     r<   
<listcomp>z5CmfNotify._prepare_notify_message.<locals>.<listcomp>  s     &[&[&[qs16{{&[&[&[r;   u-   назначил соисполнителейresolvedu   добавил решениеu1   В задаче добавлено решениеr   u   Задача завершенаu   завершил задачуwork_startedu   Работа начатаu   начал работуwork_stoppedu#   Работа остановленаu%   приостановил работуreopenedu#   Задача переоткрытаu!   переоткрыл задачуchanged_statusCLOSEDu   Задача закрытаu!   Статус изменен на u   , ожидаем u   изменил статус c "u   " на ""u   изменил статусapprove_startedu.   Ожидается подтверждение u+   запустил подтверждениеapprove_rejectedu6   Пользователь отклонил запросu   отклонил запросapprove_success_fullu   Утверждение u    завершеноu)   утверждение завершеноapprove_success_oneu:   Пользователь подтвердил запросu!   подтвердил запросspectators_changedu'   изменены наблюдателиu4   Изменен состав наблюдателейu   <br>добавлен: u   <br>удален: )responsibler   viewsresult_textri   )r   r   r  T)
is_changedr   u   изменилu   Пришло событие u    по объекту )$ru   rz   CmfRelationOptionin_linkr   out_linkr   parent_taskr7  rs   oldCmfTestcaseStepCmfTestParamsRowCmfTestParamRowValuer   	html_diffperm_policy_anonymousperm_policy_guestchoicescaptionnewri   r4  waiting_forr   r   	executorschanges_appendedjoinr5   rt   cache_status_type
spectatorsitemsr   _get_field_log_level)rI   rK   r   in_msgout_msgr  parent_task_msgtask_msgrZ   	anonymousguestresr4  rF  rG  	spectatorskip_field_namestmp_listr
  	field_objr   r@  s                         r<   _prepare_notify_messagez!CmfNotify._prepare_notify_message  sH    c6344 	)++fRUR]RbfffhSVS_Sdhhh Q"#bebnoo"#-cfcnoo 
 )++^#+JZ^^^`3<K\``` K"#bebnoo"#-cfcnoo 
 c6>** 	) "i//&YSX&Y&Y&YO/H$EM&'OVcoro~  pE  F  F&'H}]] 
 #i// *aUXU]*a*a*a#7(K*+Zgsv  tC  tI  J  J*+S`aa  
 * *]QTQY*]*]*]#3(I*+Zgsv  tC  tG  H  H*+S`aa  
 c6122 	Z)++? I&'C-XXYY)++? I&'C-XXYY)++A K&'C-XXYYc6233 	Z)++] a&'C-XXYY)++Y a&'C-XXYYc6677 	Z)++L T&'C-XXYY j((.C4M"#mTTUUi''"C*M"#mTTUUi''"C*M"#mTTUUk))MC0#(,,..000C?M"#mTTUUh&&(I55#:OS\:\:\s [ B5=c>W>]^	=)===-5c6K6QRCECCC N"#mTTUU///8CT#(*TTchl.RchllPRTTTCCM"#mTTUU///CN/:C0#(,,..000CCM"#mTTUU///7CT#(*TTchl.RchllPRTTTCAM"#mTTUU222s~27C>sx>>!C=M"#mTTUU2223C>sx>>!C;M"#mTTUU///?CGM"#mTTUU///CN/:CDM"#mTTUU///8CBM"#mTTUU g%%(Cz~ EDsz~/BDDDz =<3:?<<<OM"#mTTUUj((C) ]9? 7"%/"6K9? 7"%/"6KKkKK+--<{<<<Cs
:? 10sz000C I

s][[\\\}' ]CM,J ] II&[&[CM<Z&[&[&[\\	JiJJJ:? 10sz000C O

s][[\\\Jj((;M"#0c  wD  E  E  F  Fh&&3Cz +#*/**;M"#mTTUUn,,-Cz +#*/**5M"#mTTUUn,,7Cz +#*/**CM"#mTTUUj((7Cz +#*/**?M"#mTTUU...z~ #* 1D
1W1W	$00 ?&'4Qdqrrss5K 3!o2fcjoffXcfffCz -,3:?,,,z~ ?#* ? q#*.BU q q_b_i_n q q q >"#mTTUU///H3HHCIM"#mTTUU000KC;M"#mTTUU444DCDDDCGM"#mTTUU333OC?M"#mTTUU222EMIC ^/ E E	 CN$666DINDDDC ^/ A A	 CN$666@	@@@C"#mTTUU WVVi''"++H),d)C)C : :%
I +  !11144Z@@	q==?im33%//11	 :Y'..y999 C-M{ r

v{{8A;7O7Oboppqqq{ r

v{{8A;7O7Oboppqqq{ r

v{{8A;7O7OboppqqqJ +,,{?,{,{qtqy,{,{  O\  ]  ]  ^  	^r;   c           
      b   |j         j        }|j        j        }|j        j        }|j        j        }|j        }t          j                            |          }		 t          j	        
                    |||||dd|	          sdS n6# t          $ r Y dS t          $ r}
|
j        d         |k    rY d}
~
dS  d}
~
ww xY w|j        dk    r/|j        r(t          j                            |j        |	          sdS |r:|j        dk    r/|j        r(t          j                            |j        |	          sdS d	S )
u   
        Проверяет, что у получателя notify есть доступ к объекту
        Доп. проверяются права у private-комментариев
        rr   readF)initial_acl_keyobject_modelobject_owner_id	object_idobject_parent_idaccess_levelraise_errorchecking_personr   N
CmfComment)check_for_userT)perm_effective_acl_idrs   r   cmf_owner_idrr   r   rz   r{   r   CmfAccessListcheck_accessCmfACLNotInitializedErrorCmfACLNotFoundErrorrB   privatere  check_visibility)rI   rK   	member_idobj_commentr]  obj_parent_idrh  self_idr   rd  r&  s              r<   _check_perm_for_notifyz CmfNotify._check_perm_for_notifyc  ss    39+'-&,^
 *..).<<	'44$3!+\%!'U$3 5 5 5  u ) 	 	 	 55" 	 	 	vayO++uuuuu		 >\))ck)$55cf_5]] u 	;1\AAkFYA$55knUd5ee uts$   'B 
B6	B6B10B11B6T)r   auditfilter_membersc          
         |j         rd S |sd S |sd S |j        sd S |j        r|j                            d          rd S t
          j        rd S d}|dv rd}d }	d }
|j        dk    r|dk    rd S |j        dk    rF|}	|j        j	        }t          |d          r|j                                        rd S |	j        d	k    rd S |j        d
k    r|}	|j        j	        }|j        dk    r|}
|j        j	        }|j        dk    r	|j        sd S |j        dk    r|}
|j        j	        }|j        dk    r |}
|j                                        j	        }|j        dk    r|}
|j        j	        }|j        dk    r|}
|j        j	        }|j        dk    r*|}
|j        j	        j                                        j	        }|	r|                     |	|          }n/|
r|                     |
|          }n|                     ||          }|sd S t
          j                            |t)          |j                  |	rt)          |	j                  nd ||||d           d S )Nz-headF)r,  r#  r  TCmfAccessRuler  re  is_dummyr   CmfAttachmentCmfTimeTrackerHistoryr{   CmfGanttTaskr8  r=  r>  r?  )msg_listr   obj_comment_idr   r   r   ru  )disable_auditsmart_notifycmf_verrt   endswithrp   r   r   ri   rs   ry   rx  r   r   r   taskr9  rY  deferred_notify_messagesr   r5   rr   )rI   rK   r   r   rt  ru  rB   r}   r   rp  dependent_objr|  s               r<   smart_all_place_notifyz CmfNotify.smart_all_place_notify  s     	F 	F 	F 	F; 	38,,W55 	F 	FGGGE>_,,I1M1MF>\))K*"CsJ'' CL,=,=,?,? $))>_,,K*"C>444M*"C>[((
 > >^++  M(.C>000M+""$$*C>...M*"C>///M*"C>333M*")..006C  	I22;PPHH 	I22=/RRHH223HHH 	F	"))$cf++9D"N#kn"5"5"5$ #2"0+
 +
 	 	 	 	 	r;   c                     |rg t           _        d S t           j        D ]}|                     |           g t           _        d S N)rp   r  _apply_deferred_notify_message)rI   
only_cleandeferred_notify_datas      r<   apply_deferred_notify_messagesz(CmfNotify.apply_deferred_notify_messages  sT    
  	)+A&F$%$> 	E 	E ../CDDDD%'"""r;   c                    g d}t                               |d         |d          }d }|d         r&t                               |d         |dgz             }|d         }|d	         }|d
         }|d         }|d         }	|j        dv r|s|D ]}
|
                    d|          }t                                           5  |
d         dk    r(t
          j                            ||
d                    n=t
                              ||
d         |
d                                       d           d d d            n# 1 swxY w Y   |sd S |D ]~}
|
d         dvr|j	        }t          |d          sd }t
          j                            ||j         d|           }|s(t
          j                            |d|           }|s d S |                     |||          }|dk    rV|j        rO|j        j                            d          r0|                    dg           |j        j        j        }||vri ||<   |	r+t)          |                                          D ]	}||	vr||= 
t,          j        j         d|
d          d|j         }|r|                                D ]\  }}|                     |||          st8          j        j                                         5  t
          j                            ||||
d         |
d         d|v rdnd||d          !           d d d            n# 1 swxY w Y   |                      |||          }|D ]v}t8          j        j                                         5  t
          j                            ||||
d         |
d         d||d          !           d d d            n# 1 swxY w Y   wd S )"N)r   r   ri   rt   r   r   T)rr   r   include_deletedr}  ztree_parent.cmf_author_idr   r|  r   r   r   ru  )r   CmfDocumentCmfTestcaseCmfTestcaseRunCmfTestcycleri   r   r  r   )ri   r   )ri   r   r   F)rt  )r   r  r   r   r   r  r   r  r  )rp  rv   r   )rK   r   r   rZ   r   r   r   r   )!r   get_obj_by_idr   r   disable_aclrz   re  add_comment_auditr   r   ry   r   r   r  tree_parent_idrs   r   rw   tree_parentcmf_author_idlistkeysrp   rq   r   verbose_namerL  rs  r   utilr   r   r   )rI   r  _fieldsrK   rp  r|  r   r   r   ru  msg_datari   tmp_project_idr   r   ro  r  r   	email_setr   rk   s                        r<   r  z(CmfNotify._apply_deferred_notify_message  sy   LLL##';H'Eggk#ll 01 	I!//3GHX3Ybi  lG  kH  cH/  I  IK'
3%h/./@A$W--.>? > @ @ @HS@ % 
, 
,!h44((** , ,,11);;6PXYbPc;dddd))#)!))!4&.{&; *   $U$+++, , , , , , , , , , , , , , ,  	F  D	 D	H$F22
 !^N3// &!% 5QQ3> E EO E E I  "9UU"$B$B$B 	 !  FF,,S/9MMG"3338R3-3>>}MM 0++-H,IJJJ + 7 E KI //-/	* -#GLLNN33 - -Gn44#G,&+\\h.G\\#JZ\\D ,3MMOO  (Iy55c9R]5^^ ! )5577 
 
(55 #!%#, ( 3*2?*C@NR[@[@[af"'.78K.L 6 	 	 	
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 !99#PYZZN'  X%1133 
 
$11!$$Y/&.&?49#*34G*H 2 	 	 	
 
 
 
 
 
 
 
 
 
 
 
 
 
 
sD	 D	s8   >A2D<<E 	E 	$A L00L47L4::O  OOc                 :     t                      j        |i | d S r  )superemit)selfrB   r}   	__class__s      r<   r  zCmfNotify.emita  s$    d%f%%%%%r;   c                     |st           j        j        j        }dd|gg dg}|r|                    dd|j        g           |                     |dg          }|D ]}d|_        |                                 d S )Nr   r   )r   z!=r   r   r   r   r   )rp   rq   rr   rs   r   r  r   r   )rI   r   rK   _filternotifiesr   s         r<   r   zCmfNotify.close_open_notifiesj  s     	2(+1I $	*&&&
  	5NNHdCF3444887H:8>> 	 	F$FMKKMMMM	 	r;   c                     |st           j        j        }|                     dd|gg dg          }|D ]}d|_        |                                 d S )Nr   r   )r   r   Falser   T)rp   rq   rr   r  r   r   )rI   r   r  r   s       r<   r   z&CmfNotify.confirm_unconfirmed_notifies|  st     	,(+I88$	*((($
8  
  	 	F#FKKMMMM	 	r;   c           	         |j         dk    r,|j                                                                        }nY|j         dk    r|g}nJ|j         dk    r&|j                                        j        g}d |v rd S nt          d|j                     d S |D ]y}t          j        	                    |j
        j                  }||d         s6t          j                            |||j        d|j                                         d           zd S )	NCmfPersonGroupr{   CmfRolez,DEV: handle_mention_event unknown obj type: email_if_mentionsu   Вас упомянули в T)rK   r   r   rZ   r   )r   
rg_membersr   
all_nestedr   rs   r\   rz   r{   r|   rr   r   r   r   r  lower)rI   rK   event_personpersonsr   r   s         r<   handle_mention_eventzCmfNotify.handle_mention_event  s<    "&666"-2244??AAGG$33#nGG$	11#*//1178Gw  ^\E\^^___F 
	 
	F *@@QQK"+6I*J"))XNC4D4J4J4L4LNN *    	
	 
	r;   )	only_once
system_jobc                 r    t           j                                        }|                    | ||           d S )N)rM   )rz   CmfPluginMailBoxget_local_mailboxsend_message)rctp_torM   rP   rB   r}   mail_boxs         r<   rH   zCmfNotify.process_email  s9     *<<>>gz7CCCCCr;   c                 n    t           j                                        }|                    | |           d S r  )rz   CmfPluginSMSGateget_local_smsgater  )r`   r   rB   r}   sms_gates        r<   r]   zCmfNotify.process_sms  s4     *<<>>eW-----r;   c                 h   t           j                            |j        dg          }|r|j        r|t          |d          rl|j                            d          rR|                    |j	        d          s|                    |j	        d          sd|j
         d	|j         d
|j         S |j        S )Nr   r   r   ztask.sdzsdesk-agent:default)project	role_coder   /z/?obj=:)rz   r{   r   r   r   ry   r   r   in_project_roleri   	ui_moduler   rt   r    )rI   r   rK   r   s       r<   _calc_notify_obj_linkzCmfNotify._calc_notify_obj_link  s    !%%)9<.%QQ
	E!
	E ^,,
	E  ++I66	
	E &&szEZ&[[
	E --cjLb-cc
	E Es}DDCKDD#(DDDr;   c           
         ddl m} ddlm} |s|g fS |                    ddg           |j        s|g fS |j        j        dk    r|g fS t          j        	                    |j
        dg          }|j        r|g fS |j        j        d	k    r|g fS |j        j        d
k    r|g fS  ||d          }g }|                    dddd          D ]}	|	j        	                    d          }
t          j        	                    |
g d          }|r:|j        j                            d          r|j        |k    r/|j        j        |k    rt&                              d|
d           |j        dk    rt&                              d|
d           	 |                                D ]}|j                            dd          d         } ||                                |          }|                    d|           |                    |           |                    d          }|                    d           |                    d d!d"| i          }|                    |           |                    |           |	                    |            # t>          $ r3}t&                              d#|j         d$| d%|            Y d }~d }~ww xY wtA          |          |fS )&Nr   BeautifulSoup)MIMEApplicationz,project.servicedesk_email_notify_attach_typezproject.logic_prefixzproject.servicedeskr   r   1_AUTH_LINK2_SECURE_LINKlxmldivzapp-tinymce-card-previewT)classdata-attach-id)attrsr  )full_path_fileparent.parentst_sizer   re  u@   Не могу прикрепить вложение attach_id = r  i   u=    так как его размер превышает 80Мб r  r   r   r   
Content-IDspanu   Вложение: arx   cid:u@   Не удалось приложить файл к письму     вложения из r  )!bs4r  email.mime.applicationr  rw   r  r   rz   r{   r   r   r   $servicedesk_email_notify_attach_typefind_allr  ry  ri   rr   r   logging	exceptionr  infoget_contentr   rsplitr\  
add_headerr   new_tagreplace_with	Exceptionr5   )rI   rK   email_body_htmlr   r  r  r   soupemail_attaches
attach_tag	attach_idattachattachment_bytefilename
mime_imageattach_linkattach_link_hrefr&  s                     r<   _handle_html_attachzCmfNotify._handle_html_attach  s    	&%%%%%:::::: 	'"B&&GI_`aaa{ 	'"B&&;#'<<<"B&& !%%)9<.%QQ 	'"B&&;;}LL #B&&;;NN"B&& }_f55--?Ymq5r5r-ss  	  	J"(,,-=>>I)--i@n@n@n-ooF }'22<@@MS((V]-AS-H-H%%&l]f&l&l&lmmm~ 000  `T]  `  `  `  a  a  a'-'9'9';';  O.3::3BB2FH!01E1E1G1Gh!W!W!WJ)),AAA"))*555"&,,v"6"6K&&';<<<'+||CHYxHYHY?Z|'['[$$++H555&&'7888++K888   !!  #Tekep  #T  #T  JM  #T  #T  QR  #T  #T  U  U  U 4yy.((s   DJ
K$(KKreturnc           
         ddl m} ddl}ddl}ddlm} ddlm}  ||          }g }	|                                5 }
|	                    d          D ]b}|j
                            d          }t          j                            |dd	g
          }|r:|j        j                            d          r|j        |k    r/|j        j        |k    rt"                              d|d           	 |                                D ]z}|j                            dd          d         } ||                                |          }|                    d|           |	                    |           d| |j
        d<   {-# t2          $ r* t"                              d|j         d| d           Y `w xY w	 ddd           n# 1 swxY w Y   t5          |          |	fS )uu  
        Заменяет все ссылки на изображения на ссылки вида <img src="cid:%imagename%">
        Возвращает текст письма и словарь заMIMEенкоженных картинок вида {ключ - имя файла картинки: значение - MIMEэнкоженная картинка}
        r   )ImageNr  )	MIMEImageimgr  r  r  r  re  uF   Не могу прикрепить изображение attach_id = r  r  r   r   r  r  r  srcu	   Файл r  u/    не является изображением)PILr  tempfilebase64r  r  email.mime.imager  TemporaryDirectoryr  r  r   rz   ry  ri   rr   r   r  r  r  r   r  r\  r  r   r  r5   )rI   rK   r  r  r  r  r  r  r  email_imagestmp_dirimg_tagr  r  r  r  r  s                    r<   _handle_html_imgzCmfNotify._handle_html_img
  s    	%%%%%%......}_--((** 	g==//  #M--.>??	-11)EUWfDg1hh !!=+66|DD!,,1E1L1L))*vgp*v*v*vwww 
+1+=+=+?+? A A#2#7#>#>sA#F#Fr#J%.Y/C/C/E/EH%U%U%U
"--lHEEE$++J777/@h/@/@e,,A !   %%  'K&+  'K  'KVY  'K  'K  'K  L  L  LH'	 	 	 	 	 	 	 	 	 	 	 	 	 	 	. 4yy,&&s7   B1G.BE?=G?0F3/G2F33GG
Gc                     |                      ||          \  }}|                     |||          \  }}|                    |           |                     |          }d| d| d}||fS )Nz<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
            <html>
                <head>
                    <style>
                        za
                    </style>
                </head>
                <body>
                    z+
                </body>
            <html>)r  r  extendclean_junk_attr_tags)rI   r  email_body_cssrK   r   email_attachmentsemail_attachments2rT  s           r<   prepare_email_textzCmfNotify.prepare_email_text2  s    -0-A-A#-W-W**.1.E.Ec?\b.c.c++  !344422?CC
 )	
 
 &
 
 
 %%%r;   htmlc                 .   ddl m} dd l}t          j        rdt          j         nd}dt          j         | } || d          }|                    d          D ]}|                    d          }|                    d	
          }|rd|	                    d|          rF| d|
                    d           }|                    d|          }	||	_        |                    |	           d                    d |j        j        D                       S )Nr   r  r  r$   zhttps://r  r  rx   T)r   z^(https?:|mailto:|tel:|#)r  )rx   c                 ,    g | ]}t          |          S r:   r5   r%  xs     r<   r'  z0CmfNotify.simplify_for_email.<locals>.<listcomp>\      ;;;1A;;;r;   )r  r  rer   EXTERNAL_PORT_HTTPSAPP_FQDNr  r   get_textmatchlstripr  stringr  rI  bodychildren)
r  r  r  	port_spec	base_hrefr  linkrx   r   new_links
             r<   simplify_for_emailzCmfNotify.simplify_for_emailG  s:   %%%%%%			8>8RZ42444XZ	;v;	;;	}T6** MM#&& 
	, 
	,D88F##D==t=,,D ,888$?? #88dkk#&6&688<<$<77"&!!(+++ww;;	(:;;;<<<r;   c                 T   ddl m}  || d          }|                    d          D ]*}d |j                                        D             |_        +|                    ddg          D ]}|                                 d                    d	 |j        j        D                       S )
Nr   r  r  Tc                 P    i | ]#\  }}|                     d           |dk     ||$S )zdata-contenteditable)r   )r%  kvs      r<   
<dictcomp>z2CmfNotify.clean_junk_attr_tags.<locals>.<dictcomp>f  s<    uuu$!QALLQXDYDYu]^bs]s]sA]s]s]sr;   svgpathr$   c                 ,    g | ]}t          |          S r:   r  r  s     r<   r'  z2CmfNotify.clean_junk_attr_tags.<locals>.<listcomp>l  r  r;   )	r  r  r  r  rL  	decomposerI  r  r  )r  r  r  tagr(  s        r<   r  zCmfNotify.clean_junk_attr_tags^  s    %%%%%%}T6** ==&& 	v 	vCuu#)//*;*;uuuCII ==%11 	 	CMMOOOOww;;	(:;;;<<<r;   c                    |j         sd S |j         j        }g d}|j        r't          j                            |j        |          }n!t          j                            d|          }t          |j                  r|j        d         nt                      }| 	                    ||          }t          d           | |_        |                     |d	                   |d	<   t          j                            |||d	         |j        j        |j        j        |j        j                  }t          j                            |||d	         |j        j        |j        j        |j        j                  }	|                     |	|j        ||          \  }
}t          j                                        }|                    ||
||
           d S )N)tmplt_subjecttmplt_body_htmlu	   body_сssr  r   )rt   r   r   )r   rK   TrS   r   )rM   r
  )r+   rs   r   rz   r   r   r[   r9   r5   r  rY   r#   r!  render_templater   r.  	   body_сssr/  r  r  r  r  )rI   r   rK   rL   r  rO   rZ   rx   email_subjectr  rP   r
  r  s                r<   r   zCmfNotify.send_email_notifyn  s   " 	F%+AAA# 	Z.2263KT[2\\HH.228HQX2YYH%(%9%9Dfob!!suu ((C(@@*D999A4AA,,S[99F/??KK"($  !1AAKK$*$  ),(>(>PXPbdgio(p(p%
%*<<>>gz=\mnnnnnr;   c                    |j         st          d|j         d           d S t          d           |j         }|j        }| d| }|j         j        }t          j        	                                }|
                    ||           d S )NrW   rX   TrS   rV   )r)   r\   r   rY   r    r   rs   rz   r  r  r  )rI   r   rK   r^   r_   r   r`   r  s           r<   r   zCmfNotify.send_sms_notify  s    " 	 yvGW  y  y  yz z zF---@v@@{""S""#)*<<>>eW-----r;   z	@minutely)r  r  schedulec            
         t           j                            ddgg dg dg          }d |D             }	 t           j                            g ddd	d
t	          j                    t          d          z
  gg ddd|gggdgd	g          }|sd S t          d|j         d|            g d}d }|j	        r"t                              |j	        d|          }|j        rl	 t          d           t           j                            ||           d|_        n4# t          $ r'}t                               d|            Y d }~nd }~ww xY w|j        rl	 t          d           t           j                            ||           d|_        n4# t          $ r'}t                               d|            Y d }~nd }~ww xY wd|_        |                                 |j                                         )N--r   r   )r   r   T)r   r   c                     h | ]	}|j         
S r:   )r   )r%  rK   s     r<   	<setcomp>z1CmfNotify.celery_minutely_hook.<locals>.<setcomp>  s    @@@3CJ@@@r;   TORcmf_modified_at<   )minutesINr   )r   r   order_byuB   Обработка отправки уведомлений для r  )rr   rt   r   r   r  r   r   ri   zparent.logic_prefix
cmf_author
logic_typedeadliner   r4  listsreleasesaffected_versionsstory_pointr   )r  r   u   Отправляем СМСz"models.CmfNotify.send_sms_notify: u   Отправляем emailz$models.CmfNotify.send_email_notify: )rz   r   slistr   r   rm   r   printrr   r   r   r  r   r   sms_doner  r  r  r   r   
email_doner   r   dpcommit)rB   r}   force_objectsforce_object_idsr   r   rK   r&  s           r<   celery_minutely_hookzCmfNotify.celery_minutely_hook  s   
 (..tX6F7Q7Q7QSmSmSm6n / p p@@-@@@&	%))***&X\^^iPQ>R>R>R-RS...t%562 e'8&9 * ; ;F  lW]W`lldjllmmm  F C} `++FM4X^+__' PP7888$44VSAAA&*FOO  P P P%%&N1&N&NOOOOOOOOP) RR6777$66vsCCC(,F%%  R R R%%&PQ&P&PQQQQQQQQR#FKKMMMIM&	s0   "6D 
E
#EE
6F 
F=F88F=u<   Удаление устаревших уведомленийz@daily)r  descriptionr  r4  c                  P   t          j                    t          d          z
  } t          j                    t          d          z
  }t          j                    t          d          z
  }d}d}d}dg d	dd
d| gg dgdd|gggg dd
d|ggg}t          j                            ddgdg|||gd          }t          |          }t          d||          D ]L}	||	|	|z            }
d |
D             }t          j                            dd|g           t                       Md S )N   )days-   Z   r   i i  r9  )r   =u   Ошибкаr:  r;  )r   rV  r   r   r6  rr   T)r   r?  r   sliceTECHCOM_nocachec                     h | ]	}|j         
S r:   r[  )r%  els     r<   r8  z3CmfNotify.delete_outdated_notify.<locals>.<setcomp>  s    777B"%777r;   r>  r  )
r   rm   r   rz   r   rG  r[   rangebulk_delete
cmf_commit)days_30days_45days_90startlimitdeleted_limitr  notifsnotifs_countr  notifs_batch
notify_idss               r<   delete_outdated_notifyz CmfNotify.delete_outdated_notify  s    ,..9"#5#5#55,..9"#5#5#55,..9"#5#5#55
 ---*C9111 &sG4
 *))"C1
( !''$<V%.  ( 
 
 6{{q,66 	 	A!!Q%6"67L77,777J((tZ0H(IIILLLL	 	r;   r:   )Nr$   NFFr   NNr  )F)NN)r  N):r1   r2   r3   r   r  code_prefixr   select_jinja_autoescape_optionsjinja2FileSystemLoaderosr)  rI  r   PROJECT_DIR_loaderEnvironmentrD   r	   r   api_methodsr   r=   classmethodrQ   ra   r   r   r   r   r5   r   r  rY  rs  r  r  r  r  r   r   r  staticmethodcmf_deferred_jobrH   r]   r  r  r  r  r!  r  r   r   rO  rh  __classcell__)r  s   @r<   r   r   	   sV       GIKc9:H%%	f(*<	=	=rw||FL^`o?p?pqs sG HX##//h//J&2 6
 6
 6
 
K $ $ $ $ $ $ $ Y$L V V [V F F [F 3 3 [3j @BHMFJq q q [qf 6 6 [6p   [, 3    [4 \S \ \ \ [\| N^3 N^ N^ N^ [N^`
 ' ' ' ['R &*$t^ ^ ^# ^ ^ ^ [^@ 	( 	( 	( [	( c c [cL& & & & &    ["    [   [6 666D D 76 \D 666. . 76 \.   [ D) D) [D)N %' %' %' [%'N & & [&( = = = = = \=, =3 =3 = = = \= 'o 'o ['oR . . [. LLL, , ML \,\ 2p  ~B  MU  V  V  V- - V  V \- - - - -r;   r   N)r   r   r   uuidr   dataclassesr   cmf.include
cmf.fieldsr	   r
   r   r   r:   r;   r<   <module>r{     s    2 2 2 2 2 2 2 2 2 2       ! ! ! ! ! !     7 7 7 7 7 7 7 7 7 7| | | | |
$ | | | | |r;   