
    oi!                    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dej                  iZe	j                  ej                  j                  ej                  d      ej                  j                  ej                  d      g      Zeed<    e	j"                  d4i eZej(                  j*                  g dz   Ze G d	 d
             Zed        Zed        Zed        Ze	 	 	 d5d       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d6d       Z#edddddefd       Z$ed7d       Z%ed        Z& fdZ'ed8d       Z(ed6d       Z)ed        Z*e+ e,dd       d!               Z-e+ e,dd       d"               Z.ed#        Z/ed$        Z0ed9d&       Z1ed'        Z2e+d(ed%efd)       Z3e+d(ed%efd*       Z4ed+        Z5ed,        Z6e+ e,ddd-.      d/               Z7e+ e,dd0dd12      d3               Z8 xZ9S ):	CmfNotifyNotifydeskNTF
autoescapez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/   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                   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_oldA   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 уведомление пользователю _    не отправлено, не указан номер мобильного телефона.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*..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/   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#+<<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 = 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   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   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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_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    
 >>\)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   ,)ry   r   r   
startswithr   splitr   strip)rI   rK   r   r   
recipientsrk   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   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  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        d      rJt        |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        d      r:t        |t        j                         r |dk(  rd }d!}d||dgS |d	k(  rd"}d#}d||dgS t        t        d$      r*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/}|d0|j$                  j'                          z  }d1}d||dgS |d2k(  r|j(                  d3k(  r|j*                  d3k(  rd4}d5}nnd6}|j(                  j,                  |j(                  j                     }	|d7|	 z  }|j*                  j,                  |j*                  j                     }
|d8|
 z  }d9}d||dgS |d:k(  rVd;}|d0|j$                  j.                   d<|j$                  j0                  r|j$                  j0                  nd= z  }d>}d||dgS |d?k(  r7|j                  r+d@}|d0|j$                  j'                          z  }dA}d||dgS |dBk(  rVdC}|d0|j$                  j.                   d<|j$                  j0                  r|j$                  j0                  nd= z  }dD}d||dgS |dEk(  r)|j                  rdF}|dG|j                   z  }dH}d||dgS |dIk(  rdJ}|dG|j                   z  }dK}d||dgS |dLk(  rdM}dN}d||dgS |dOk(  r|j                  rdP}dQ}d||dgS |dRk(  rdS}dT}d||dgS |dUk(  rodV}|j2                  j                  r&|dW|j2                  j                  j                   z  }|j2                  r|dX|j2                  j                   z  }dY}d||dgS |dZk(  rg }|j4                  j                  rd[}|j4                  r|j4                  j                  }d[}|j6                  r|j6                  j                  }d\| }||k7  r|d]| z  }|d^z  }|j8                  j$                  r|dG|j8                  j$                   z  }d_}|j;                  d||d       |j<                  j                  r|j<                  j>                  rd`jA                  |j<                  j>                  D cg c]  }tC        |j                         c}      }d\| d^}|j8                  j$                  r|dG|j8                  j$                   z  }da}|j;                  d||d       |S |dbk(  r	dc}ddd|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(  r@do}|j8                  j$                  rtC        |j8                  j$                        }dp}d||dgS |dqk(  rM|j8                  j                  rE|j8                  r9|j8                  j                  jD                  |j8                  jD                  k(  rg S |jF                  drk(  r	dg}dds|dgS d[}|j6                  r|j6                  j                  }dt|j8                  j                   du| d^}|j8                  j$                  r|dG|j8                  j$                   z  }|j8                  j                  rH|j8                  r<dv|j8                  j                  j                   dw|j8                  j                   dx}ndy}d||dgS |dzk(  rd{| }d|}d||dgS |d}k(  rd~}d}d||dgS |dk(  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 ]  \  }}|jL                  s||v r|jO                  |      }|dk  r/|j                  |j                  k(  rIt        |t        j                        r|dv r|jP                  rt|j'                         }|s||   j;                  |        g }d}|d   r'|j;                  dd0jA                  |d         |d       |d   r'|j;                  dd0jA                  |d         |d       |d   r'|j;                  dd0jA                  |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_titleri   deletedu   Удалена связь (u)   удалил связь с задачейcreatedu$   Создана подзадача «u   Созданаu   создал подзадачу)r   r   r  u(   Добавлена подзадача «u   Добавленаu!   добавил подзадачуu$   Удалена подзадача «u   Удаленаu   удалил подзадачуCmfTestcaseStepu'   Создан шаг тест-кейсаu'   создал шаг тест-кейсаr   u'   Удалён шаг тест-кейсаu'   удалил шаг тест-кейсаu)   Изменён шаг тест-кейсаu)   изменил шаг тест-кейсаCmfTestParamsRowuE   Добавлена строка значений параметровu?   создал строку значений параметровuA   Удалена строка значений параметровu?   удалил строку значений параметровCmfTestParamRowValueu4   Изменено значение параметра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_textri   )r   r   r  T)
is_changedr   )r   u   изменилu   Пришло событие u    по объекту ))ry   rz   ru   r  relation_typeout_type_namein_linkr   in_type_nameout_linkr   parent_taskr7  rs   oldr  r  r  r   	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perm_encrypt)rI   rK   r   in_msgout_msgr  parent_task_msgtask_msgrZ   	anonymousguestresr4  rE  erF  	spectatorskip_field_namestmp_listr
  	field_objr   r?  s                          r<   _prepare_notify_messagez!CmfNotify._prepare_notify_message  sI    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  
 6,-*S&BXBX2Y)+? I&'C-XYY)+? I&'C-XYY)+A K&'C-XYY6-.:c6CZCZ3[)+] a&'C-XYY)+Y a&'C-XYY612z#vGbGb7c)+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c6>>2!X-#2B2B %//1	Y'..y9/:4 C,M{

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

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

v{{8A;7ObopqJ ++.J?J[[pqtqyqypz,{  O\  ]  ^  	^Q '\s    q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-комментариев
        )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  rU  s              r<   _check_perm_for_notifyz CmfNotify._check_perm_for_notifyi  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  re  is_dummyr   CmfAttachmentCmfTimeTrackerHistoryr{   CmfGanttTaskr  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   taskr:  rZ  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  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)rp   r  _apply_deferred_notify_message)rI   
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   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_namerK  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   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)selfrB   r}   	__class__s      r<   r  zCmfNotify.emitg  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   )rp   rq   rr   rs   r   r  r   r   )rI   r   rK   _filternotifiesr   s         r<   r   zCmfNotify.close_open_notifiesp  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)rp   rq   rr   r  r   r   )rI   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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"--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)rM   )rz   CmfPluginMailBoxget_local_mailboxsend_message)rctp_torM   rP   rB   r}   mail_boxs         r<   rH   zCmfNotify.process_email  s-     **<<>gz7Cr;   c                 d    t         j                  j                         }|j                  | |       y r  )rz   CmfPluginSMSGateget_local_smsgater  )r`   r   rB   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=:)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)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   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_hrefrU  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  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==/ #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)rI   r  email_body_cssrK   r   email_attachmentsemail_attachments2rT  s           r<   prepare_email_textzCmfNotify.prepare_email_text8  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  rx   T)r   z^(https?:|mailto:|tel:|#)r  )rx   )r  r  rer   EXTERNAL_PORT_HTTPSAPP_FQDNr  r   get_textmatchlstripr  stringr  rH  bodychildrenr5   )r  r  r  	port_spec	base_hrefr  linkrx   r   new_linkxs              r<   simplify_for_emailzCmfNotify.simplify_for_emailM  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  rK  r   	decomposerH  r  r  r5   )r  r  r  tagkvr   r  s           r<   r  zCmfNotify.clean_junk_attr_tagsd  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   )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_notifyt  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 )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    ""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  )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   r   rm   r   printrr   r   r  r   r   sms_doner  r  r  r   r   
email_doner   r   dpcommit)rB   r}   force_objectsrK   force_object_idsr   r   rU  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  r0  )r   =u   Ошибкаr1  r2  )r   rM  r   r   r/  rr   T)r   r6  r   sliceTECHCOM_nocacher5  r  )r   rm   r   rz   r   r>  r[   rangerr   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r:   )Nr$   NFFr   NNr  )F)NN)r  N):r1   r2   r3   r   r  code_prefixr   select_jinja_autoescape_optionsjinja2FileSystemLoaderosr!  rH  r   PROJECT_DIR_loaderEnvironmentrD   r	   r   api_methodsr   r=   classmethodrQ   ra   r   r   r   r   r5   r   r  rZ  rs  r  r  r  r  r   r   r  staticmethodcmf_deferred_jobrH   r]   r  r  r  r  r  r  r   r   rF  r^  __classcell__)r  s   @r<   r   r   	   s   GIKc99: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 7 7r  , 3  4 \S \ \| S^3 S^ S^j
 ' '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   r:   r;   r<   <module>rq     s.    2 2  !  7 7B
$$ Br;   