
    ci                    x    d dl m Z mZmZ d dlmZ d dlmZ d dl d dlm	Z	m
Z
mZ  G d de	j                        Zy)	    )datetime	timedeltatimezone)uuid1)	dataclass)*)
cmf_notifyCmfRelationCmfTypec                       e Zd ZdZdZdZi Zej                  e	j                  j                  ej                  d      e	j                  j                  ej                  d      g      Zeed<    ej                  d3i eZej$                  j&                  g dz   Ze G d d	             Zed
        Zed        Zed        Ze	 	 	 d4d       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d5d       Z!edddddefd       Z"ed6d       Z#ed        Z$ fdZ%ed7d       Z&ed5d       Z'ed        Z(e) e*dd      d                Z+e) e*dd      d!               Z,ed"        Z-ed#        Z.ed8d%       Z/ed&        Z0e)d'ed$efd(       Z1e)d'ed$efd)       Z2ed*        Z3ed+        Z4e) e*ddd,-      d.               Z5e) e*dd/dd01      d2               Z6 xZ7S )9	CmfNotifyNotifydeskNTFzcommon/templateszcmf/templatesloader)close_open_notifiesconfirm_unconfirmed_notifiesplace_notifyc                   X   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 y)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.   r/   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                   xs |j                  }d|j                   d|j                   d|j                   }| j                         }|r|j                         }| j                  j                  |      }|j                  |      }t        | j                  |||g       y )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_old@   s     ))DZ-D-Dj001Z5H5H4IJOOK\]GGIKKMM>>..}=___4
c//w6TUr:   c                 Z   t        d      }|j                  xs |j                  }t        |      dkD  r|d d  d}| d|j                   d| |j                   }|j
                  xs |j                  }|st        d|j                   d       y t        | j                  ||g       y )	NTfull_url   z...
4   SMS уведомление пользователю _    не отправлено, не указан номер мобильного телефона.r@   )app_base_hrefr   msglenr   r'   r(   	cmf_alertr)   rF   process_sms)rH   rI   urlsubjr   phones         r;   send_sms_notify_oldzCmfNotify.send_sms_notify_oldO   s    T*0*..t9r>3Bi[$DF"Z^^,BseJ4G4G3HI..I*2I2ILZMcMcLd  eD  E  FcooUG4DEr:   c                 P   d|vs|d   du r't        j                  t        j                        |d<   d|v r|j	                  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<   |xs t
        j                  }|j                  j                  |d<   |j                  ddg       |j                   r|j                   j                  d   nd|j"                  r|j"                  j                  d   ndz   |d<   |rwt%        d      }|j&                  |d<   |j                  |d<   | |d    |d<   t)        |d      r0|j*                  r$|j*                  j                  j                  |d<   nd |d<   t,        j.                  j1                  |      }||d<   |d   |d<   |d   |d<   |d
   |d <   |d!   |d"<   |d#   |d$<    | j2                  d%i |}|S )&Nr   .tzmsg_fromr,   r-   r.   r/      Уведомлениеr   r   rY   r$   r%   
first_name	last_namer   r#   r&   TrR   r   r    r"   parentr!   r   r_   r(   phone_mobiler'   r)   emailr*   loginr+   r9   )r   nowr   utcpopgcurrent_personidvaluer   coderk   
isinstancer   current_userload_fieldsrf   rg   rX   hrefhasattrrh   models	CmfPersonget_notify_opt_cachedr<   )	rH   rJ   r   kwargsrd   notify_ownerr]   notify_optsr?   s	            r;   prepare_notify_ctx_oldz CmfNotify.prepare_notify_ctx_old]   s   v%)=)D#+<<8<<#@F< zz*-H''H ( 1 1}"*--"5"5"*--"5"5#+>>#7#7 1vF&(F6Nc,A XXF6Nv%)=)D#+<<8<<#@F< fUmW-"5M//F5M(.u$%11>>+0066|  ,!<=HTH_H_L$;$;$A$A!$Deg  P\  Pf  Pflx  mC  mC  mI  mI  JK  mL  ln  $o .C!$F:!$F:$'5
);(<!=F:sH%#**,/JJOO,A,A(),0()&&<<YG'{!,W!5~(3N(C$% +F 3}!,W!5~!,W!5~cmm%f%
r:   Nc           	         t         j                  rt         j                  d       yt        j	                  |d      }t
        j                  j                  |      }|yd}|t         j                  j                  k(  r|dk(  r	|d   rd}ny|r?|j                  j                  r|j                  j                  s|j                  ddg       d}|r7d	}|sd
}| j                  dd|j                  gdd|gdd|gg dg dgg d      }|st
        j                         }|sd}|j                   r |j                   dkD  r| d|j                    }|j"                  r|j$                  r|r||_        d	|_        |xj                   dz  c_        ||_        ||_        d|_        |	r|	|_        n|j.                  j1                          |rr|j"                  |_        |j                  |_        |j                  |_        |j8                  |_        t=        |d      r|j                  rt?        |j                  j@                  t
        jB                        r;tD        jG                  |jH                        j"                  j@                  }||_%        n%|j                  j"                  j@                  |_%        |jL                  |_'        t=        |d      rr|j&                  jQ                         rXt?        |j&                  tR              r|j&                  j"                  |_*        n"tW        |j&                        |_*        nd|_        |jX                  sg |_,        |jX                  rFt[        |jX                  j@                        dkD  r$|jX                  j@                  dd d   d   |k(  r|S t         j\                  j^                  r't         j\                  j^                  j@                  d   ndt         j\                  j`                  r't         j\                  j`                  j@                  d   ndz   }|r|j"                  j@                  nd}t         j\                  j                  j@                  t         j\                  j"                  j@                  t         j\                  j                  j@                  t         j\                  jb                  j@                  |dte        jf                  th        jj                        jm                         te        jf                         jo                  d      ||dtq                |dd}|jX                  js                  |       d|_:        |j$                  xs ||_        |d   |_;        |d    |_<        |d    r3|
*t
        jz                  j}                  d!"      j                  }
|
|_?        |d#   xs |d$   |_@        |d%   xs |d&   |_A        |sd
|_        |j                          |d'   s|j                  d(k(  r't        d)|||jN                  j@                  d*|g+       |j                  d,k(  r|j                  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 = FalseNrz   TFemail_if_self_changesrh   rs   openclosedobj_id==r   status	cron_doner   F)	confirmedr   F)
unread_cntr8   
cron_forcer   r   filterfieldsre   r   u
    + еще    r#   r   )rq   r   rs   rk   initialsrb   z%H:%MCmfComment:)	cmf_ownercmf_created_atcmf_created_at_formattedmsg_type_textr   rq   parent_name	log_level
notify_smsnotify_emailsystem:defaultrs   ri   r_   rj   rk   	notify_os1z	notify-os)r   commentr   )event_persons2znotify-important-)Fro   disable_notifydebugcmfutilget_obj_id_by_anyry   rz   r{   rp   rq   rh   
is_definedrs   rv   getr   r   r   r   r   priotityr   r   r   set_nowr   r   r    ui_nameobj_ui_namerx   rt   rr   
CmfProjectAPPget_cache_project
project_idr!   rw   r   loadr
   obj_status_namer4   r8   rZ   ru   rf   rg   rk   r   rl   r   rm   	isoformatstrftimer   appendr   person_notify_smsperson_notify_emailCmfEmailTemplatesgetemail_template_idr(   r*   saver   cmf_emit_eventr   )rH   rY   personr   r   rJ   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   sA   & GGXY--fkB	&&<<YG((+++0Ku0T23#::((88..6 23  #M (WW4(dI.4/**% Y  
F %%'F+D!2!2Q!6V:f&7&7%89D{{&"3"3uFKQ"$$  *F%%'((FKFFFM!hhFO!$FsH%#**cjj..0A0AB#&#8#8#H#M#M#S#SL-9F*-0ZZ__-B-BF* "hhFOsH%#**//*;cjj+6-0ZZ__F*-0_F*FK FO --.2OO))"#.q1&9S@M@A@Y@Y!..3399!<_a121I1IANN$$**1-rS ),chhnn nn''--++11++11--33* 'llhll;EEG(0(?(?(H*y)&
$ 	w' "--6#.|#< %0%@"~& ($*$;$;$@$@FV$@$W$Z$Z!'8F$
 *.9Q[=Q)'2Jk'6J $FM {#v#'=;i4;5;__5J5J)+ <E+G ??c!&*:*:.yk:9+Vr:   c                    t         j                  rt         j                  d       yd|v r|d   dusJ d       d|v r|d   dusJ d       |d   t         j                  j                  k(  r|j                  d      syd	|v r%|j                  d	      }|j                  g d
       nd}|j                  d      }t        j                  j                  |g d      }|st         j                  d|        y|j                  dg       }t        j                  j                  ||      } | j                  ||fi |}|y| j                  ||      }|r#| j                  ||       | j                  |       |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   NrY   .u   Укажите msgr   u   Укажите person_idr   rJ   )rh   rs   r   rw   )r   zphone_mobile.numberzphone.numberrq   r   u   В метод place_notify пришел отсутствующий или удаленный пользователь person_id=recipient_opt)ro   r   r   rp   rq   r   rn   rv   ry   rz   CmfPersonNotifyOptcheck_permission_notify_eventprepare_notify_ctxcreate_desk_notifysend_email_notifysend_sms_notify)	rH   r|   rJ   r   r   r   notify_allowedrI   r   s	            r;   stol_place_notifyzCmfNotify.stol_place_notifyG  s   $ GGXY6%=#;Q=QQ;f$)<C)GcIccG +!"2"2"5"55fjjIf>gF?**U#COOABCJJ{+	!!%%-b & d GG  W  Xa  Wb  c  d

?B722PPQWYfg+S++CB6B
''
C8!!*c2
+r:   c                 ,   |j                   }|j                  dk(  r|j                  j                  }t	        |d      sd }t
        j                  j                  ||j                   d|       }|s#t
        j                  j                  |d|       }|S )Nr   logic_prefix.
AllModels.)	parent_id
class_namerq   rr   rx   ry   CmfProjectNotifySchemeget_notify_rule_data_cached)rH   rJ   event_type_codetmp_parent_id	rule_datas        r;   get_rule_datazCmfNotify.get_rule_data  s    
 >>\)FFLLMsN+ M 11MMcnn-Q.?@
	 55QQO+<=I r:   r   c                 6   g }t        |d      r8|j                  dk7  r)|j                  r|j                  j                  d      sg S | j	                  ||      }|sy|d   r8|d   j                  d      D ]!  }|j                  |j                                # |S )u   
         email-ы из колонки "Адреса электронной почты" схемы уведомлений
        r   r   CmfProject:Nr   ,)rx   r   r   
startswithr   splitr   strip)rH   rJ   r   r   
recipientsrj   s         r;   get_notify_email_membersz"CmfNotify.get_notify_email_members  s     
 3'NNl2cmm.F.F}.UI%%c?;	 ^$">288= 1!!%++-01 r:   c                 	   t               }t        |d      rg|j                  dk7  rX|j                  r|j                  j	                  d      s1|j                         D ]  }dh||j                  j                  <    |S | j                  ||      }|syg }|d   D ]e  }|j                  |d      }|/|j                  |t                      ||   j                  d       H|D ]  }	t        j                  j                  |	j                  j                        }
|
:|	j                   s|j#                  |	       |j                  |	j                  j                  t                      d	}|d
k(  r|
d   rd}nZ|dk(  r|
d   rd}nM|dv r|
d   rd}nA|dk(  r|
d   rd}n4|dk(  r/|
d   r*d}||	j                  j                     j                  d       |s||	j                  j                     j                  d        h |j                  r|j                  j	                  d      r|r|j$                  j'                  dg       |j$                  j(                  st        j*                  j-                  d      }t        j.                  j-                  |j$                  |dg      }|D ]m  }t1        |t2        j4                  j6                        r|j                  }|j                  j                  |v sL|sO||d   vsW||j                  j                  = o |d   r!|j                  dk(  r|j'                  |d          |d   D ]  }||   s	t9        t;        ||         t2        j4                  j<                        ra||   D ]X  }|j                  |j                  j                  t                      ||j                  j                     j                  d       Z |j                  ||   j                  j                  t                      |||   j                  j                     j                  d        |D ]  }|j	                  d      rt?        d| d	       t@        jB                  s5t        j                  j-                  |dg       }|sZ|jD                  sg|jD                  j                  j	                  d      st?        d!| d	        |S )"uY   
        Рассчитываем набор юзеров и их галочек
        r   r   r   rj   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   ru   servicedesk_publicsdesk-client:defaultr   members)r   project_role_idr   notify_custom_fieldCmfTaskzvar:zDEV: Var user in notify! )abortrs   r   z DEV: Var user person in notify! )#dictrx   r   r   r   all_relation_personsrq   rr   r   extract_var_obj
setdefaultsetaddry   rz   r{   
user_localr   rh   rv   r   CmfProjectRoler   CmfProjectRoleAssignrt   cmfr   CmfRelationBase
issubclasstype
CmfM2MBaser[   configDEBUGrs   )rH   rJ   r   r   r   unon_local_personsuser_id	var_usersvar_userr~   rj   	proj_roleproj_role_assignuser
field_nameis                    r;   get_notify_memberszCmfNotify.get_notify_members  sm   
 V
 3'NNl2cmm.F.F}.U--/ 3*1
144::&3%%c?;	  !12 	CG++G+MI %%gsu57#''0 ) CH"("2"2"H"HIZIZ"[K"* #..)00:))(++*;*;SUC!E,.;?P3Q $ K/K@P4Q $ $HH[YoMp $ $44EY9Z $ $66;G^;_ $"8;;#4#4599.I"8;;#4#4599'B1C	CB ==S]]55mDIZJJ""$8#9: ::00"1155;Q5R	#)#>#>#B#BSZZir  }F  |G#B  $H - 6D!$

(B(BC#zzww}}
27GDXhirXsLs&tww}}5	6 *+)0KOOI&;<='(=> 	F
:d3z?3SZZ5J5JK #J ?"--dggmmSUC"477==155g>? ))#j/*<*<*B*BCEJs:11778<<WE	F  	VA||F#5aS9G||''++q&+BDII$))//*D*DV*L @GuU	V r:   c                    t        t        d      r1t        |t        j                        r|dk(  rd|j                  j
                   d|j                  j                   d}d|j                  j                   d|j                  j                   d}d}d|||j                  dd|||j                  dgS |d	k(  rd
|j                  j
                   d|j                  j                   d}d
|j                  j                   d|j                  j                   d}d}d|||j                  dd|||j                  dgS t        |t        j                        r|j                  j                  r|dk(  r5d|j                   d}d}d}d|||j                  j                  dd||dgS |dk(  r|j                  r5d|j                   d}d}d}d|||j                  j                  dd||dgS |j                  j                  r5d|j                   d}d}d}d|||j                  j                  dd||dgS t        |t        j                        r0|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$                  j'                          z  }d.}d||dgS |d/k(  r|j(                  d0k(  r|j*                  d0k(  rd1}d2}nnd3}|j(                  j,                  |j(                  j                     }	|d4|	 z  }|j*                  j,                  |j*                  j                     }
|d5|
 z  }d6}d||dgS |d7k(  rVd8}|d-|j$                  j.                   d9|j$                  j0                  r|j$                  j0                  nd: z  }d;}d||dgS |d<k(  r7|j                  r+d=}|d-|j$                  j'                          z  }d>}d||dgS |d?k(  rVd@}|d-|j$                  j.                   d9|j$                  j0                  r|j$                  j0                  nd: z  }dA}d||dgS |dBk(  r)|j                  rdC}|dD|j                   z  }dE}d||dgS |dFk(  rdG}|dD|j                   z  }dH}d||dgS |dIk(  rdJ}dK}d||dgS |dLk(  r|j                  rdM}dN}d||dgS |dOk(  rdP}dQ}d||dgS |dRk(  rodS}|j2                  j                  r&|dT|j2                  j                  j                   z  }|j2                  r|dU|j2                  j                   z  }dV}d||dgS |dWk(  rg }|j4                  j                  rdX}|j4                  r|j4                  j                  }dX}|j6                  r|j6                  j                  }dY| }||k7  r|dZ| z  }|d[z  }|j8                  j$                  r|dD|j8                  j$                   z  }d\}|j;                  d||d       |j<                  j                  r|j<                  j>                  rd]jA                  |j<                  j>                  D cg c]  }tC        |j                         c}      }dY| d[}|j8                  j$                  r|dD|j8                  j$                   z  }d^}|j;                  d||d       |S |d_k(  r	d`}dda|dgS |dbk(  r@dc}|j8                  j$                  rtC        |j8                  j$                        }dd}d||dgS |dek(  r@df}|j8                  j$                  rtC        |j8                  j$                        }dg}d||dgS |dhk(  r@di}|j8                  j$                  rtC        |j8                  j$                        }dj}d||dgS |dkk(  r@dl}|j8                  j$                  rtC        |j8                  j$                        }dm}d||dgS |dnk(  rM|j8                  j                  rE|j8                  r9|j8                  j                  jD                  |j8                  jD                  k(  rg S |jF                  dok(  r	dd}ddp|dgS dX}|j6                  r|j6                  j                  }dq|j8                  j                   dr| d[}|j8                  j$                  r|dD|j8                  j$                   z  }|j8                  j                  rH|j8                  r<ds|j8                  j                  j                   dt|j8                  j                   du}ndv}d||dgS |dwk(  rdx| }dy}d||dgS |dzk(  rd{}d|}d||dgS |d}k(  rd~| d}d}d||dgS |dk(  rd}d}d||dgS |dk(  rd}d}|jH                  j0                  D ]-  }||jH                  j                  vs|d|j                   z  }/ |jH                  j                  D ]-  }||jH                  j0                  vs|d|j                   z  }/ d||dgS g d}|dk(  rg g g d}|jK                  d      D ]o  \  }}|jL                  s||v r|jO                  |      }|dk  r/|j                  |j                  k(  rI|j'                         }|s\||   j;                  |       q g }d}|d   r'|j;                  dd-jA                  |d         |d       |d   r'|j;                  dd-jA                  |d         |d       |d   r'|j;                  dd-jA                  |d         |d       |S | }dd| d|j                   |dgS c c}w )u  
        Логика:
        - по спец. событиям типа assigned, придет и assigned и updated, поэтому поля спец.событий
            дополнительно нужно отфильтровывать в updated
        CmfRelationOptionupdatedu#   Установлена связь (u   ) с задачей «   »u/   установил связь с задачей   )r   r   message_titlerh   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, 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_textrh   )r   r   r  T)
is_changedr   u   изменилu   Пришло событие u    по объекту )(rx   ry   rt   r  relation_typeout_type_namein_linkr   in_type_nameout_linkr   parent_taskr3  rr   oldCmfTestcaseStepCmfTestParamsRowCmfTestParamRowValuer   	html_diffperm_policy_anonymousperm_policy_guestchoicescaptionnewrh   r0  waiting_forr   r   	executorschanges_appendedjoinr4   rs   cache_status_type
spectatorsitemsr   _get_field_log_level)rH   rJ   r   in_msgout_msgr  parent_task_msgtask_msgrY   	anonymousguestresr0  rD  erE  	spectatorskip_field_namestmp_listr	  	field_objr   r>  s                          r;   _prepare_notify_messagez!CmfNotify._prepare_notify_message  s
    6./JsFD\D\4])+>s?P?P?^?^>__uvy  wB  wB  wG  wG  vH  HJ  K?@Q@Q@^@^?__uvy  wC  wC  wH  wH  vI  IK  L Q"#bebnbno"#-cfcncno 
 )+6s7H7H7V7V6WWmnqnynyn~n~m  @B  C78I8I8V8V7WWmnqnznznn  nA  AC  D K"#bebnbno"#-cfcncno 
 c6>>*))"i/(LSXXJVX&YO/H$EM&'OVcoro~o~  pE  pE  F&'H}] 
 #i/,TUXU]U]T^^`*a#7(K*+Zgsv  tC  tC  tI  tI  J*+S`a  
 **,PQTQYQYPZZ\*]#3(I*+Zgsv  tC  tC  tG  tG  H*+S`a  
 c6112)+? I&'C-XYY)+? I&'C-XYY)+A K&'C-XYYc6223)+] a&'C-XYY)+Y a&'C-XYYc6667)+L T&'C-XYY j(.C4M"#mTUUi'"C*M"#mTUUi'"C*M"#mTUUk)MCT#((,,./00C?M"#mTUUh&((I5#:O:OS\:\s [ B55==c>W>W>]>]^	1)==--55c6K6K6Q6QR;E7CC N"#mTUU//8CT#((**+2chhllchhllPR-STTCCM"#mTUU//CNN:CT#((,,./00CCM"#mTUU//7CT#((**+2chhllchhllPR-STTCAM"#mTUU22s~~7CQsxxj>!C=M"#mTUU223CQsxxj>!C;M"#mTUU//?CGM"#mTUU//CNN:CDM"#mTUU//8CBM"#mTUU g%(Czz~~.szz~~/B/B.CDDzz*3::??*;<<OM"#mTUUj(C))9??"%//"6"6K9??"%//"6"6K=k]K+-.{m<<Cs
::??Qszz/00C I

s][\}}''CMM,J,J IICMM<Z<Z&[qs166{&[\	=i[J::??Qszz/00C O

s][\Jj(;M"#0c  wD  E  F  Fh&3Czz#**//*;M"#mTUUn,-Czz#**//*5M"#mTUUn,7Czz#**//*CM"#mTUUj(7Czz#**//*?M"#mTUU..zz~~#**1D1D

1W	$$0 ?&'4Qdqrss5K!oo225cjjoo5FFWXcWddefCzz3::??+,,zz~~#**"A#**..BUBUAVV^_b_i_i_n_n^oop q"="#mTUU//B3%HCIM"#mTUU00JC;M"#mTUU44+C50CDCGM"#mTUU33NC?M"#mTUU22EMHC ^^// E	 CNN$6$663INN3CDDCE !^^// A	 CNN$6$66/	/?@@CA #$mTUU Wi'"+H),d)C :%
I ++ !1144Z@	q=??imm3%//1	Y'..y9':, C,M{

v{{8A;7Obopq{

v{{8A;7Obopq{

v{{8A;7ObopqJ ++.J?J[[pqtqyqypz,{  O\  ]  ^  	^I '\s   0o4c           
         |j                   j                  }|j                  j                  }|j                  j                  }|j                  j                  }|j
                  }t        j                  j                  |      }		 t        j                  j                  |||||dd|	      sy	 |j
                  dk(  r8|j                  r,t        j                  j!                  |j                  |	      sy|rG|j
                  dk(  r8|j                  r,t        j                  j!                  |j                  |	      syy	# t        $ r Y yt        $ r}
|
j                  d   |k(  rY d}
~
y d}
~
ww xY w)
u   
        Проверяет, что у получателя notify есть доступ к объекту
        Доп. проверяются права у private-комментариев
        )rq   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_idrr   r   cmf_owner_idrq   r   ry   rz   r   CmfAccessListcheck_accessCmfACLNotInitializedErrorCmfACLNotFoundErrorrA   privaterc  check_visibility)rH   rJ   	member_idobj_commentr[  obj_parent_idrf  self_idr   rb  rS  s              r;   _check_perm_for_notifyz CmfNotify._check_perm_for_notifyb  sF    3399++''--&&,,^^
 **..).<	''44$3!+\%!'U$3 5 5 5$ >>\)ckk$$55cff_5];11\AkFYFY$$55knnUd5e% ) 	 " 	vvayO+		s$   'E   	E0E0E+*E++E0T)r   auditfilter_membersc          
         |j                   ry |sy |sy |j                  sy |j                  r|j                  j	                  d      ry t
        j                  ry d}|dv rd}d }	d }
|j                  dk(  r|dk(  ry |j                  dk(  rO|}	|j                  j                  }t        |d      r|j                  j                         ry |	j                  d	k7  ry |j                  d
k(  r|}	|j                  j                  }|j                  dk(  r|}
|j                  j                  }|j                  dk(  r|j                  sy |j                  dk(  r|}
|j                  j                  }|j                  dk(  r&|}
|j                   j                         j                  }|j                  dk(  r|}
|j                  j                  }|j                  dk(  r|}
|j                  j                  }|j                  dk(  r:|}
|j                  j                  j                  j                         j                  }|	r| j#                  |	|      }n'|
r| j#                  |
|      }n| j#                  ||      }|sy t
        j$                  j'                  |t)        |j*                        |	rt)        |	j*                        nd ||||d       y )Nz-headF)r(  r#  r  TCmfAccessRuler  rc  is_dummyr   CmfAttachmentCmfTimeTrackerHistoryrz   CmfGanttTaskr  r;  r<  r=  )msg_listr   obj_comment_idr   r   r   rs  )disable_auditsmart_notifycmf_verrs   endswithro   r   r   rh   rr   rx   rv  r   r   r   taskr6  rX  deferred_notify_messagesr   r4   rq   )rH   rJ   r   r   rr  rs  rA   r|   r   rn  dependent_objrz  s               r;   smart_all_place_notifyz CmfNotify.smart_all_place_notify  sq    ;;388,,W5GGE>>_,I1M>>\)K**""CsJ'CLL,=,=,?$$)>>_,K**""C>>44M**""C>>[(
 >>>>^+  M((..C>>00M++""$**C>>..M**""C>>//M**""C>>33M**""))..066C 22;PH22=/RH223HH	""))$cff+9D#knn"5$ #2"0+
 	r:   c                     |rg t         _        y t         j                  D ]  }| j                  |        g t         _        y N)ro   r  _apply_deferred_notify_message)rH   
only_cleandeferred_notify_datas      r;   apply_deferred_notify_messagesz(CmfNotify.apply_deferred_notify_messages  sA    
 )+A&$%$>$> 	E ../CD	E%'"r:   c                 0   g d}t         j                  |d   |d      }d }|d   rt         j                  |d   |dgz         }|d   }|d	   }|d
   }|d   }|d   }	|j                  dv r|s|D ]  }
|
j                  d|      }t         j	                         5  |
d   dk(  r%t
        j                  j                  ||
d          n.t
        j                  ||
d   |
d         j                  d       d d d         |sy |D ]i  }
|
d   dvr|j                  }t        |d      sd }t
        j                  j                  ||j                   d|       }|s't
        j                  j                  |d|       }|s y | j                  |||      }|dk(  rl|j                  r`|j                  j                  j!                  d      r;|j#                  dg       |j$                  j&                  j                  }||vri ||<   |	r&t)        |j+                               D ]
  }||	vs||=  t,        j.                  j0                   d|
d    d|j2                   }|r|j5                         D ]  \  }}| j7                  |||      st8        j:                  j                   j	                         5  t
        j<                  j?                  ||||
d   |
d   d|v rdnd||d    !       d d d         | jA                  |||      }|D ]c  }t8        j:                  j                   j	                         5  t
        j<                  j?                  ||||
d   |
d   d||d    !       d d d        e l y # 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   xY w)"N)r   r   rh   rs   r   r   T)rq   r   include_deletedr{  ztree_parent.cmf_author_idr   rz  r   r   r   rs  )r   CmfDocumentCmfTestcaseCmfTestcaseRunCmfTestcyclerh   r   r  r   )rh   r   )rh   r   r   F)rr  )r   r  r   r   r   r  r   r  r  )rn  ru   r   )rJ   r   r   rY   r   r   r   r   )!r   get_obj_by_idr   r   disable_aclry   rc  add_comment_auditr   r   rx   r   r   r  tree_parent_idrr   r   rv   tree_parentcmf_author_idlistkeysro   rp   r   verbose_namerJ  rq  r   utilr   r   r   )rH   r  _fieldsrJ   rn  rz  r   r   r   rs  msg_datarh   tmp_project_idr   r   rm  r  r   	email_setr   rj   s                        r;   r  z(CmfNotify._apply_deferred_notify_message  s!   L##';H'Eggk#l 01!//3GHX3Ybi  lG  kH  cH/  IK'
3%h/./@A$W--.>? >> @ @HS$ 
,!h4((* ,,1));;6PXYbPc;d))#)!))!4&.{&; *  $U$+, ,
,   D	H$F2
 !^^N3/!% 55QQ3>>"2!O3D EI "99UU"j0A$B	 ! ,,S/9MG"338R8R--33>>}M++-H,IJ + 7 7 E E K KI /-/	*#GLLN3 -Gn4#G,- &&++,Ah.G-H#JZJZI[\D,3MMO (Iy55c9R]5^ ))557 
((55 #!%#, ( 3*2?*C@NR[@[af"'.78K.L 6 	
 
  !99#PYZN' XX%%113 
$$11!$$Y/&.&?49#*34G*H 2 	
 
sD	, ,p
 

 
s%   AM227M?31N2M<	?N	Nc                 $    t        |   |i | y r  )superemit)selfrA   r|   	__class__s      r;   r  zCmfNotify.emit`  s    d%f%r:   c                    |s$t         j                  j                  j                  }dd|gg dg}|r|j	                  dd|j                  g       | j                  |dg      }|D ]  }d|_        |j                           y )Nr   r   )r   z!=r   r   r   r   r   )ro   rp   rq   rr   r   r  r   r   )rH   r   rJ   _filternotifiesr   s         r;   r   zCmfNotify.close_open_notifiesi  s    ((++11I $	*&
 NNHdCFF34887H:8> 	F$FMKKM	r:   c                     |st         j                  j                  }| j                  dd|gg dg      }|D ]  }d|_        |j                           y )Nr   r   )r   r   Falser   T)ro   rp   rq   r  r   r   )rH   r   r  r   s       r;   r   z&CmfNotify.confirm_unconfirmed_notifies{  sZ    ((++I88$	*($
8 
  	F#FKKM	r:   c           	      T   |j                   dk(  r)|j                  j                         j                         }ne|j                   dk(  r|g}nR|j                   dk(  r*|j                  j                         j
                  g}d |v ry t        d|j                           y |D ]  }t        j                  j                  |j                  j
                        }||d   s>t        j                  j                  |||j                  d|j                  j                          d        y )	NCmfPersonGrouprz   CmfRolez,DEV: handle_mention_event unknown obj type: email_if_mentionsu   Вас упомянули в T)rJ   r   r   rY   r   )r   
rg_membersr   
all_nestedr   rr   r[   ry   rz   r{   rq   r   r   r   r  lower)rH   rJ   event_personpersonsr   r~   s         r;   handle_mention_eventzCmfNotify.handle_mention_event  s    ""&66"--224??AG$$3#nG$$	1#**//1778GwD\E\E\D]^_ 
	F **@@QK"+6I*J))XX3C4D4D4J4J4L3MN * 	
	r:   )	only_once
system_jobc                 h    t         j                  j                         }|j                  | ||       y )N)rL   )ry   CmfPluginMailBoxget_local_mailboxsend_message)rctp_torL   rO   rA   r|   mail_boxs         r;   rG   zCmfNotify.process_email  s-     **<<>gz7Cr:   c                 d    t         j                  j                         }|j                  | |       y r  )ry   CmfPluginSMSGateget_local_smsgater  )r_   r   rA   r|   sms_gates        r;   r\   zCmfNotify.process_sms  s(     **<<>eW-r:   c                    t         j                  j                  |j                  dg      }|r|j                  rt        |d      r~|j                  j                  d      rc|j                  |j                  d      s|j                  |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=:)ry   rz   r   r   r   rx   r   r   in_project_rolerh   	ui_moduler   rs   r   )rH   r   rJ   r   s       r;   _calc_notify_obj_linkzCmfNotify._calc_notify_obj_link  s    !!%%)9)9<.%Q!!^,  ++I6&&szzEZ&[--cjjLb-c s}}oVCKK=#((DDr:   c           
         ddl m} ddlm} |s|g fS |j	                  ddg       |j
                  s|g fS |j
                  j                  dk7  r|g fS t        j                  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 }|j                  dddd      D ]  }	|	j                  j                  d      }
t        j                  j                  |
g d      }|rM|j                   j"                  j%                  d      r(|j                   |k7  r3|j                   j                   |k7  rt&        j)                  d|
d       |j*                  dkD  rt&        j-                  d|
d       	 |j/                         D ]  }|j0                  j3                  dd      d   } ||j5                         |      }|j7                  d|       |j9                  |       |j;                  d      }|j9                  d       |j;                  d d!d"| i      }|j9                  |       |j9                  |       |	j=                  |        n  tA        |      |fS # t>        $ r3}t&        j)                  d#|j0                   d$| d%|        Y d }~d }~ww xY w)&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   rc  u@   Не могу прикрепить вложение attach_id = r  i   u=    так как его размер превышает 80Мб r  r   r   r   
Content-IDspanu   Вложение: arw   cid:u@   Не удалось приложить файл к письму     вложения из r  )!bs4r  email.mime.applicationr  rv   r  r   ry   rz   r   r   r   $servicedesk_email_notify_attach_typefind_allr  rw  rh   rq   r   logging	exceptionr  infoget_contentr   rsplitrZ  
add_headerr   new_tagreplace_with	Exceptionr4   )rH   rJ   email_body_htmlr   r  r  r   soupemail_attaches
attach_tag	attach_idattachattachment_bytefilename
mime_imageattach_linkattach_link_hrefrS  s                     r;   _handle_html_attachzCmfNotify._handle_html_attach  s    	&:"B&&GI_`a{{"B&&;;##'<<"B&& !!%%)9)9<.%Q"B&&;;;;}L #B&&;;;;N"B&& _f5--?Ymq5r-s  	J"((,,-=>I))--i@n-oF}}''22<@MMS(V]]-A-AS-H%%(i]f\jjk&lm~~ 00`T]Sa  b_  `  a'-'9'9'; O.33::3B2FH!01E1E1Gh!WJ)),A"))*5"&,,v"6K&&';<'+||C$xjHY?Z|'[$$++H5&&'78++K8 	B 4y.((  !!$dekepepdq  rI  JM  IN  NP  QR  PS  #T  Us   ?CJ,,	K(5(K##K(returnc           
         ddl m} ddl}ddl}ddlm} ddlm}  ||      }g }	|j                         5 }
|j                  d      D ],  }|j                  j                  d      }t        j                  j                  |dd	g
      }|rM|j                  j                  j!                  d      r(|j                  |k7  r3|j                  j                  |k7  rt"        j%                  d|d       	 |j'                         D ]n  }|j(                  j+                  dd      d   } ||j-                         |      }|j/                  d|       |	j1                  |       d| |j                  d<   p / 	 ddd       t5        |      |	fS # t2        $ r* t"        j%                  d|j(                   d| d       Y xw xY w# 1 sw Y   LxY w)uu  
        Заменяет все ссылки на изображения на ссылки вида <img src="cid:%imagename%">
        Возвращает текст письма и словарь заMIMEенкоженных картинок вида {ключ - имя файла картинки: значение - MIMEэнкоженная картинка}
        r   )ImageNr  )	MIMEImageimgr  r  r  r  rc  uF   Не могу прикрепить изображение attach_id = r  r  r   r   r  r  r  srcu	   Файл r  u/    не является изображением)PILr  tempfilebase64r  r  email.mime.imager  TemporaryDirectoryr  r  r   ry   rw  rh   rq   r   r  r  r  r   r  rZ  r  r   r  r4   )rH   rJ   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==/ #MM--.>?	--11)EUWfDg1h!==++66|D,1E1E1L)),sgpfttu*vw 
+1+=+=+? A#2#7#7#>#>sA#Fr#J%./C/C/EH%U
"--lHE$++J715hZ/@e,A	. 4y,&& ! %%	&++>UVYUZ  [J  'K  L)	 	s1   B=G3BF4G/G <G?G  GGc                     | j                  ||      \  }}| j                  |||      \  }}|j                  |       | j                  |      }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)rH   r  email_body_cssrJ   r   email_attachmentsemail_attachments2rR  s           r;   prepare_email_textzCmfNotify.prepare_email_text1  s    -0-A-A#-W**.1.E.Ec?\b.c++  !3422?C )* + &' (
 %%%r:   htmlc                 >   ddl m} dd l}t        j                  rdt        j                   nd}dt        j
                   | } || d      }|j                  d      D ]|  }|j                  d      }|j                  d	
      }|s)|j                  d|      r<| d|j                  d       }|j                  d|      }	||	_        |j                  |	       ~ dj                  |j                  j                   D 
cg c]  }
t#        |
       c}
      S c c}
w )Nr   r  r  r#   zhttps://r  r  rw   T)r   z^(https?:|mailto:|tel:|#)r  )rw   )r  r  rer   EXTERNAL_PORT_HTTPSAPP_FQDNr  r   get_textmatchlstripr  stringr  rG  bodychildrenr4   )r  r  r  	port_spec	base_hrefr  linkrw   r   new_linkxs              r;   simplify_for_emailzCmfNotify.simplify_for_emailF  s   %8>8R8Ra2234XZ	v/	{;	T6* MM#& 
	,D88F#D==t=,D888$?#Adkk#&6%78<<$<7"&!!(+
	, ww		(:(:;1A;<<;s   Dc                    ddl m}  || d      }|j                  d      D ]M  }|j                  j	                         D ci c]   \  }}|j                  d      r|dk(  r||" c}}|_        O |j                  ddg      D ]  }|j                           d	j                  |j                  j                  D cg c]  }t        |       c}      S c c}}w c c}w )
Nr   r  r  Tzdata-contenteditablesvgpathr#   )r  r  r  r  rJ  r   	decomposerG  r  r  r4   )r  r  r  tagkvr  r  s           r;   r  zCmfNotify.clean_junk_attr_tags]  s    %T6* ==& 	vC*-))//*;u$!QALLQXDY]^bs]sAuCI	v
 ==%1 	CMMO	 ww		(:(:;1A;<< v <s   CC!C<Cc                    |j                   sy |j                   j                  }g d}|j                  r,t        j                  j                  |j                  |      }n!t        j                  j                  d|      }t        |j                        r|j                  d   n	t               }| j                  ||      }t        d       | |_        | j                  |d	         |d	<   t        j                  j                  |||d	   |j                  j                  |j                  j                  |j                   j                        }t        j                  j                  |||d	   |j                  j                  |j"                  j                  |j                   j                        }	| j%                  |	|j                   ||      \  }
}t        j&                  j)                         }|j+                  ||
||
       y )N)tmplt_subjecttmplt_body_htmlu	   body_сssr  r   )rs   r   r   )r   rJ   TrR   r   )rL   r  )r*   rr   r   ry   r   r   rZ   r8   r4   r  rX   r"   r  render_templater   r%  	   body_сssr&  r
  r  r  r  )rH   r   rJ   rK   r  rN   rY   rw   email_subjectr  rO   r  r  s                r;   r   zCmfNotify.send_email_notifym  s   ""%%++A##..2263K3KT[2\H..228HQX2YH%(%9foob!su ((C(@*D9:4&A,,S[9F//??KKK""(($$ !11AAKKK$$**$$ ),(>(>PXPbPbdgio(p%
%**<<>gz=\mnr:   c                 6   |j                   st        d|j                   d       y t        d       |j                   }|j
                  }| d| }|j                   j                  }t        j                  j                         }|j                  ||       y )NrV   rW   TrR   rU   )r(   r[   r   rX   r   r   rr   ry   r  r  r  )rH   r   rJ   r]   r^   r   r_   r  s           r;   r   zCmfNotify.send_sms_notify  s    ""FvGWGWFX  Yx  yz-.v.?@{{F"SE"##))**<<>eW-r:   z	@minutely)r  r  schedulec            
         t         j                  j                  ddgg dg dg      }|D ch c]  }|j                   }}	 t         j                  j	                  g dddd	t        j                         t        d
      z
  gg ddd|gggdgdg      }|sy t        d|j                   d|        g d}d }|j                  r"t        j                  |j                  d|      }|j                  r3	 t        d       t         j                  j                  ||       d|_        |j$                  r3	 t        d       t         j                  j'                  ||       d|_        d|_        |j-                          |j.                  j1                          Vc c}w # t        $ r"}t         j#                  d|        Y d }~d }~ww xY w# t        $ r"}t         j#                  d|        Y d }~d }~ww xY w)N--r   r   )r   r   T)r   r   TORcmf_modified_at<   )minutesINr   )r   r   order_byuB   Обработка отправки уведомлений для r  )rq   rs   r   r   r  r   r   rh   zparent.logic_prefix
cmf_author
logic_typedeadliner   r0  listsreleasesaffected_versionsstory_pointr   )r  r   u   Отправляем СМСz"models.CmfNotify.send_sms_notify: u   Отправляем emailz$models.CmfNotify.send_email_notify: )ry   r   slistr   r   r   rl   r   printrq   r   r  r   r   sms_doner  r  r  r   r   
email_doner   r   dpcommit)rA   r|   force_objectsrJ   force_object_idsr   r   rS  s           r;   celery_minutely_hookzCmfNotify.celery_minutely_hook  s   
 ((..tX6F7QSm6n / p2?@3CJJ@@%%))*&X\\^iPQ>R-RS.t%562 e'8&9 * ;F VW]W`W`VaacdjcklmF C}}++FMM4X^+_''P78$$44VSA&*FO ))R67$$66vsC(,F%  $FKKMIIM  A8 ! P%%(J1#&NOOP ! R%%(LQC&PQQRs5   F62F 52G 	G
(GG
	G8G33G8u<   Удаление устаревших уведомленийz@daily)r  descriptionr  r+  c                  B   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                  j                  ddgdg|||gd      }t        |      }t        d||      D ]P  }	||	|	|z    }
|
D ch c]  }|j                   }}t        j                  j                  dd|g       t                R y c c}w )N   )days-   Z   r   i i  r.  )r   =u   Ошибкаr/  r0  )r   rK  r   r   r-  rq   T)r   r4  r   sliceTECHCOM_nocacher3  r  )r   rl   r   ry   r   r<  rZ   rangerq   bulk_delete
cmf_commit)days_30days_45days_90startlimitdeleted_limitr  notifsnotifs_countr
  notifs_batchel
notify_idss                r;   delete_outdated_notifyz CmfNotify.delete_outdated_notify  sG    ,,.9"#55,,.9"#55,,.9"#55
 -*C91 &sG4
 *"C1
( !!''$<V%.  ( 
 6{q,6 	A!!Q%67L*67B"%%7J7((tZ0H(IL	7s   Dr9   )Nr#   NFFr   NNr  )F)NN)r  N)8r0   r1   r2   r   r  code_prefix_optionsjinja2FileSystemLoaderosr  rG  r   PROJECT_DIR_loaderEnvironmentrC   r	   r   api_methodsr   r<   classmethodrP   r`   r   r   r   r   r4   r   r  rX  rq  r  r  r  r  r   r   r  staticmethodcmf_deferred_jobrG   r\   r  r  r  r
  r  r  r   r   rD  r\  __classcell__)r  s   @r;   r   r   	   s   GIKH%%	f((*<	=rww||FL^L^`o?pqsG HX###/h/J&&22 6
 
K $ $ $L V V F F 3 3j @BHMFJq qf 6 6p  , 3  4 \S \ \| N^3 N^ N^`
 ' 'R &*$t^# ^ ^@ 	( 	( c cL&  "    6 6D 7 D 6. 7 .   D) D)N %' %'N & &( = = = =, =3 =3 = = 'o 'oR . . L, M ,\ 2p  ~B  MU  V- V -r:   r   N)r   r   r   uuidr   dataclassesr   cmf.include
cmf.fieldsr	   r
   r   r   r9   r:   r;   <module>rn     s.    2 2  !  7 7{
$$ {r:   