
    i;                        d dl Z d dlmZ d dlZ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)
    N)Iterable)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"                  d8i eZej(                  j*                  g dz   Ze G d	 d
             Zed        Zed        Zed        Ze	 	 	 d9d       Zed        Zed        Zeddde e!   de!fd       Z"ede!fd       Z#ede!fd       Z$ede!fd       Z%ed:d       Z&eddddde!fd       Z'ed;d       Z(ed         Z) fd!Z*ed<d"       Z+ed:d#       Z,ed$        Z-e e.dd%      d&               Z/e e.dd%      d'               Z0ed(        Z1ed)        Z2ed=d*       Z3ed+        Z4ed,e!de!fd-       Z5ed,e!de!fd.       Z6ed/        Z7ed0        Z8e e.ddd12      d3               Z9e e.dd4dd56      d7               Z: xZ;S )>	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/   r0   r1   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_oldF   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 уведомление пользователю _    не отправлено, не указан номер мобильного телефона.rB   )app_base_hrefr   msglenr!   r)   r*   	cmf_alertr+   rH   process_sms)rJ   rK   urlsubjr   phones         r=   send_sms_notify_oldzCmfNotify.send_sms_notify_oldU   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/   r0   r1      Уведомлениеr   r   r[   r&   r'   
first_name	last_namer   r%   r(   TrT   r!   r"   r$   parentr#   r   ra   r*   phone_mobiler)   r+   emailr,   loginr-   r;   )r   nowr   utcpopgcurrent_personidvaluer   coderm   
isinstancer   current_userload_fieldsrh   ri   rZ   hrefhasattrrj   models	CmfPersonget_notify_opt_cachedr>   )	rJ   rL   r   kwargsrf   notify_ownerr_   notify_optsrA   s	            r=   prepare_notify_ctx_oldz CmfNotify.prepare_notify_ctx_oldc   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u 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"                  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_changesrj   ru   openclosedobj_id==r   status	cron_doner   F)	confirmedr   F)
unread_cntr:   
cron_forcer   r   filterfieldsrg   r   u5    + обновил(а) другие параметры   r%   r   )rs   r   ru   rm   initialsrd   z%H:%MCmfComment:)	cmf_ownercmf_created_atcmf_created_at_formattedmsg_type_textr   rs   parent_name	log_level
notify_smsnotify_emailsystem:defaultru   rk   ra   rl   rm   	notify_os1z	notify-os)r   commentr!   )event_persons2znotify-important-)Frq   disable_notifydebugcmfutilget_obj_id_by_anyr{   r|   r}   rr   rs   rj   
is_definedru   rx   getr   r   r   r   r   priotityr   r   r   set_nowr   r   r"   ui_nameobj_ui_namerz   rv   rt   
CmfProjectAPPget_cache_project
project_idr#   ry   r!   loadr   obj_status_namer6   r:   r\   rw   rh   ri   rm   r   rn   r   ro   	isoformatstrftimer   appendr   person_notify_smsperson_notify_emailCmfEmailTemplatesgetemail_template_idr*   r,   saver   cmf_emit_eventr   )rJ   r[   personr   r   rL   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   s7   & 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PQD{{&"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   Nr[   .u   Укажите msgr   u   Укажите person_idr   rL   )rj   ru   r   ry   )r   zphone_mobile.numberzphone.numberrs   r   u   В метод place_notify пришел отсутствующий или удаленный пользователь person_id=recipient_opt)rq   r   r   rr   rs   r   rp   rx   r{   r|   CmfPersonNotifyOptcheck_permission_notify_eventprepare_notify_ctxcreate_desk_notifysend_email_notifysend_sms_notify)	rJ   r~   rL   r   r   r   notify_allowedrK   r   s	            r=   stol_place_notifyzCmfNotify.stol_place_notifyM  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_namers   rt   rz   r{   CmfProjectNotifySchemeget_notify_rule_data_cached)rJ   rL   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<   rL   zmodels.BaseModelr   returnc                    t         j                  j                  t         j                  j                  f}g }|D ]  }t	        | |      }|st        ||      r|j                  j                  }n|j                  }t        |t              r|j                  d      }|j                  |j                   d|         dj                  |      S )up   
        Формирует текст уведомления при создании объектов.
        z%d.%m.%Y %H:%M: <br>)cmfr   r   CmfGenericRelationgetattrrv   r   rt   r   r   r   captionjoin)rL   r   relation_klassesmsg_datafield	field_objrt   s          r=   _prepare_text_created_objz#CmfNotify._prepare_text_created_obj  s      JJ22CJJ4Q4QR 	AEU+Ii)9:%NN00E%OOEeX.!NN+;<E9#4#4"5Rw ?@	A {{8$$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   ,)rz   r   r   
startswithr   splitr   strip)rJ   rL   r   r   
recipientsrl   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   rl   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   rw   servicedesk_publicsdesk-client:defaultr   members)r   project_role_idr   notify_custom_fieldCmfTaskzvar:zDEV: Var user in notify! )abortru   r   z DEV: Var user person in notify! )#dictrz   r   r   r   all_relation_personsrs   rt   r   extract_var_obj
setdefaultsetaddr{   r|   r}   
user_localr   rj   rx   r   CmfProjectRoler   CmfProjectRoleAssignrv   r   r   CmfRelationBase
issubclasstype
CmfM2MBaser]   configDEBUGru   )rJ   rL   r   r   r   unon_local_personsuser_id	var_usersvar_userr   rl   	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      r5t        |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(  r7d|j                   d}d}d}d||||j                  j                  dd|||dgS |dk(  r|j                  r7d|j                   d}d}d}d||||j                  j                  dd|||dgS |j                  j                  r7d|j                   d}d}d}d|||j                  j                  |dd|||dgS d}d}	t        t        d      rlt        |t        j                        rR|dk(  rd|j                   }d}	d||	|dgS |d	k(  rd|j                   }d}	d||	|dgS |dk(  rd |j                   }d!}	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-t$        j'                  |j(                  d.       }dd/||dgS |d	k(  r-d0}d1t$        j'                  |j(                  d.       }dd/||dgS |dk(  rd2}d3t$        j'                  |j(                  d.       }d/}
t        |t        j                        rd4}| j+                  ||      }
n.t        |t        j,                        rd5}| j+                  ||      }
d|
||
dgS |d6k(  r,d7}
|
d8|j.                  j1                          z  }
d9}d|
||
dgS |d:k(  r|j2                  d;k(  r|j4                  d;k(  rd<}
d=}nnd>}
|j2                  j6                  |j2                  j                     }|
d?| z  }
|j4                  j6                  |j4                  j                     }|
d@| z  }
dA}d|
||
dgS |dBk(  r|j.                  j8                  r|j.                  j8                  nd/}
dC}|d8|j.                  j:                   dD|
 z  }dEt$        j'                  |j<                  j(                  dF       }d|
||dgS |dGk(  re|j                  rY|j.                  j1                         }
dH}|d8|
 z  }dIt$        j'                  |j<                  j(                  dF       }d|
||dgS |dJk(  r|j.                  j8                  r|j.                  j8                  nd/}
dK}|d8|j.                  j:                   dD|
 z  }dLt$        j'                  |j<                  j(                  dF       }d|
||dgS |dMk(  rd|j                  rXdN|j                   }
dO}|dP|j                   z  }dQt$        j'                  |j<                  j(                  d.       }d|
||dgS |dRk(  r.dS|j                   dT}
dU}|dP|j                   z  }dV}d|
||dgS |dWk(  rdX}
dY}d|
||
dgS |dZk(  r|j                  rd[}
d\}d|
||
dgS |d]k(  rd^}
d_}d|
||
dgS |d`k(  rda}|j<                  j                  r&|db|j<                  j                  j                   z  }|j<                  r|dc|j<                  j                   z  }|j<                  j1                         }
ddt$        j'                  |j(                  de       df}d|
||dgS |dgk(  rg }|j>                  j                  rdh}|j>                  r|j>                  j                  }dh}|j@                  r|j@                  j                  }di| }||k7  r|dj| z  }|dkz  }|jB                  j.                  r|dP|jB                  j.                   z  }|j>                  j1                         }
dlt$        j'                  |j(                  d.       }|jE                  d%|||
d       |jF                  j                  r|jF                  jH                  rdmjK                  |jF                  jH                  D cg c]  }tM        |j                         c}      }di| dk}|jB                  j.                  r|dP|jB                  j.                   z  }|jF                  j1                         }
dnt$        j'                  |j(                  dF       }|jE                  d%|
||d       |S |dok(  rGdp}|jN                  j1                         }
dqt$        j'                  |j(                  d.       }d%||
|drgS |dsk(  r|dt}|jB                  j.                  rtM        |jB                  j.                        }|jB                  j1                         }
dut$        j'                  |j(                  d.       }d%|
||dgS |dvk(  r|dw}|jB                  j.                  rtM        |jB                  j.                        }|jB                  j1                         }
dxt$        j'                  |j(                  dy       }d%|
||dgS |dzk(  r|d{}|jB                  j.                  rtM        |jB                  j.                        }|jB                  j1                         }
d|t$        j'                  |j(                  dy       }d%|
||dgS |d}k(  r|d~}|jB                  j.                  rtM        |jB                  j.                        }|jB                  j1                         }
dt$        j'                  |j(                  d.       }d%|
||dgS |dk(  rOdt$        j'                  |j(                  de       }|jB                  j1                         }
|jB                  j                  rE|jB                  r9|jB                  j                  jP                  |jB                  jP                  k(  rg S |jR                  dk(  r-dut$        j'                  |j(                  d.       }d}d%|||
dgS dh}|j@                  r|j@                  j                  }d|jB                  j                   d| dk}|jB                  j.                  r|dP|jB                  j.                   z  }d%|
||dgS |dk(  r0d| }dt$        j'                  |j(                  d.       }d%||d/dgS |dk(  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}|jT                  j1                         }
|jT                  j8                  D ]-  }||jT                  j                  vs|d|j                   z  }/ |jT                  j                  D ]-  }||jT                  j8                  vs|d|j                   z  }/ d%|||
dgS g d}|dk(  rg g g d}g g g d}|jW                  d      D ]  \  }}|jX                  s||v r|j[                  |      }|dk  r/|j                  |j                  k(  rIt        |t        j                        r|dv r|j\                  rt|j1                         }|s||   jE                  |       ||   jE                  |        g }dt$        j'                  |j(                  d.       }|	r|	}d/}|r|}|d   r=|jE                  d|djK                  |d         z   |d8jK                  |d         d       |d%   r=|jE                  d%|djK                  |d%         z   |d8jK                  |d%         d       |d   r=|jE                  d|djK                  |d         z   |d8jK                  |d         d       |S | }d| d|j                   }
d%|
|
|dgS c c}w )u  
        Логика:
        - по спец. событиям типа assigned, придет и assigned и updated, поэтому поля спец.событий
            дополнительно нужно отфильтровывать в updated
        CmfRelationOptionupdatedu#   Установлена связь (u   ) с задачей «   »u3   установил(а) связь с задачей   )r   comment_messager   message_titlerj   deletedu   Удалена связь (u-   удалил(а) связь с задачейcreatedu$   Создана подзадача «u   Созданаu#   создал(а) подзадачу)r   r   r!  r   u(   Добавлена подзадача «u   Добавленаu%   добавил(а) подзадачу)r   r   r!  r   rj   u$   Удалена подзадача «u   Удаленаu#   удалил(а) подзадачу)r   r   r!  rj   r   )r   r   r!  r   NCmfTestcaseStepu   Создан u+   создал(а) шаг тест-кейсаu   Удалён u+   удалил(а) шаг тест-кейсаu   Изменён u-   изменил(а) шаг тест-кейсаCmfTestParamsRowuE   Добавлена строка значений параметровuC   создал(а) строку значений параметровr   uA   Удалена строка значений параметровuC   удалил(а) строку значений параметровCmfTestParamRowValueu4   Изменено значение параметраu6   изменил(а) значение параметраrestoredu   Восстановленоu   восстановил(а) accsr%   u   Удаленоu   удалил(а) u   Созданоu   создал(а) )r   
logic_typeresponsibler   
cmf_authorr   )r+  r   	publishedu9   Выпущены изменения в документеr   u%   выпустил(а) документshareddefaultu[   Отменен публичный доступ к документу в интернете.u=   отменил(а) публикацию в интернетеui   Документ опубликован для публичного доступа в интернете.u   <br>Анонимные: u"   <br>Авторизованные: u,   опубликовал в интернетеcomment_createdu$   Комментарий создан.r   u-   написал(а) комментарий к datvcomment_updatedu&   Комментарий изменен.u-   изменил(а) комментарий к comment_deletedu#   Комментарий удаленu+   удалил(а) комментарий к attachment_created   Вложение: u#   Добавлено вложение u'   добавил(а) вложение в attachment_deletedu   Вложение: <s>z</s>u   Удалено вложениеu!   удалил(а) вложениеworklog_createdu+   Сделана запись о работеu-   сделал(а) запись о работеworklog_updatedu&   Журнал работ измененu*   изменил(а) журнал работworklog_deletedu$   Журнал работ удаленu(   удалил(а) журнал работmovedu   Перемещеноu    из проекта u    в проект u   переместил(а) gentu    в другой проектassignedu   Не установленu%   Задача назначена на u   , ожидает r   u5   обновил(а) ответственного за z, u/   добавил(а) исполнителей к resolvedu1   В задаче добавлено решениеu%   добавил(а) решение в )r   r   r   r!  r   u   Задача завершенаu   завершил(а) work_startedu   Работа начатаu#   начал(а) работу над abltwork_stoppedu#   Работа остановленаu1   приостановил(а) работу над reopenedu#   Задача переоткрытаu   переоткрыл(а) changed_statusu    изменил(а) статус CLOSEDu   Задача закрытаu!   Статус изменен на u   , ожидаем approve_startedu.   Ожидается подтверждение u0   запустил(а) подтверждение approve_rejectedu6   Пользователь отклонил запросu!   отклонил(а) запросapprove_success_fullu   Утверждение u    завершеноu+   завершил(а) утверждениеapprove_success_oneu:   Пользователь подтвердил запросu%   подтвердил(а) запросspectators_changedu8   изменил(а) состав наблюдателейu4   Изменен состав наблюдателейu   <br>добавлен: u   <br>удален: )r*  r   viewsresult_textrj   )r   r   r  T)
is_changedr   )r   u   изменил(а) z <br>u   Пришло событие u    по объекту )r   r   r   r!  )/rz   r{   rv   r  relation_typeout_type_namein_linkr   in_type_nameout_linkr   parent_taskrK  rt   oldr$  r%  r&  r   inflect_nounverbose_namer   CmfDocumentr   	html_diffperm_policy_anonymousperm_policy_guestchoicesnewr   rj   r*  waiting_forr   r   	executorschanges_appendedr   r6   rJ  ru   cache_status_type
spectatorsitemsr   _get_field_log_levelperm_encrypt)rJ   rL   r   in_msgout_msgr!  parent_task_msgtask_msgcustom_message_prefixcustom_message_titler[   comment_msgr   	anonymousguestresr*  r[  er\  	spectatorskip_field_namestmp_comment_listtmp_msg_listr  r   r   rV  message_prefixs                                r=   _prepare_notify_messagez!CmfNotify._prepare_notify_message1  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 U &'6f)6#,,
 &'7v)6#++	 	 )+6s7H7H7V7V6WWmnqnynyn~n~m  @B  C78I8I8V8V7WWmnqnznznn  nA  AC  D O &'6f)6#,,
 &'7v)6#++	 	 c6>>*))"i/(LSXXJVX&YO/H$IM *+[j-:cooF[F[
 *+xZg'/	 	 #i/,TUXU]U]T^^`*a#7(O ./?er+:cooF[F[
 ./8^k+3	  	 **,PQTQYQYPZZ\*]#3(M ./?]j*-//*=*=Ra
 ./8Vc3;	  	 !%#6,-*S&BXBX2Y)+*7z(B%'T$ &'3H[o+@  !I-*7z(B%'T$ &'3H[o+@  !I-*9#(((D%'V$6-.:c6CZCZ3[)+] e&'C-lopqq)+Y e&'C-lopqq612z#vGbGb7c)+L X&'C-lopqq j(6K9':N:NsO_O_ag:h9ijM"#]grstti'*K/0D0DSEUEUW]0^/_`M"#]grstti'*K/0D0DSEUEUW]0^/_`MC#v~~.l33C@C!3!34933C@"#mhklmmk)MCT#((,,./00CCM"#mhklmmh&((I5#:O:OS\:\s _ B55==c>W>W>]>]^	1)==--55c6K6K6Q6QR;E7CC N"#mhklmm//"%((,,#((,,BC@KT#(("2"2!32cU;;KKGL`L`adakakaxax  {A  MB  LC  DM"#mhstuu//CNN(($$&CBKT#<'KKGL`L`adakakaxax  {A  MB  LC  DM"#mhstuu//"%((,,#((,,BC?KT#(("2"2!32cU;;KI'J^J^_b_i_i_v_vx~J  JA  BM"#mhstuu22s~~&sxxj1C?KQsxxj>)KEgFZFZ[^[e[e[r[rtzF{E|}M"#mhstuu22)#((48C;KQsxxj>)K?M"#mhstuu//?CKM"#mhklmm//CNN:CHM"#mhklmm//8CFM"#mhklmm g%0Kzz~~!6szz~~7J7J6KLLzz!23::??2CDD**&&(C78L8LSM]M]_e8f7g  hE  FM"#mhstuuj(C))9??"%//"6"6K9??"%//"6"6K Ek]S+-%6{m#DDKs"::??Qszz&7#88Koo//1"WX_XlXlmpm}m}  @F  YG  XH  !I

"#Vcpst }}''CMM,J,J IICMM<Z<Z&[qs166{&[\	 Ei[PQR::??Qszz&7#88Kmm--/"QRYRfRfgjgwgwy  SA  RB  !C

"#mhst Jj(MK//++-CCGDXDXY\YiYikqDrCstM"#PSfstuuh&;Kzz!#**//2**&&(C3G4H4HIYIY[a4b3cdM"#mhstuun,5Kzz!#**//2**&&(CA'BVBVWZWgWgioBpAqrM"#mhstuun,?Kzz!#**//2**&&(COPWPdPdeheueuw}P~O  AM"#mhstuuj(?Kzz!#**//2**&&(C78L8LSM]M]_e8f7ghM"#mhstuu..>w?S?STWTdTdfl?m>noM**&&(Czz~~#**1D1D

1W	$$0"78L8LSM]M]_e8f7g h;"#Vcpst  6K!oo22=cjjoo=NN_`k_llmnKzz3::??"344"#mhstuu//J3%PKNwOcOcdgdtdtv|O}N~MKR_lno  00RK?MK-lwx  44+C50CDCIM"#mhklmm33NCCM"#mhklmm22VMPK..**,C ^^// M	 CNN$6$66%;INN;K#LLKM !^^// I	 CNN$6$66%7	7G#HHKI
  KR_lop 
 Wi'#%"3!bB/L),d)C >%
I ++ !1144Z@	q=??imm3c6>>2!X-#2B2B %//1	$Y/66yA +229=1>8 C1'2F2FsGWGWY_2`1abM# 4N$!6"

%&>GLLYijkYlLm;m)66;;|\]C_  "

%&>GLLYijkYlLm;m)66;;|\]C_  "

%&>GLLYijkYlLm;m)66;;|\]C_ J ++,_,==RSVS[S[R\]ss*
  	c '\s   ,AC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-комментариев
        )rs   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_idrt   r   cmf_owner_idrs   r   r{   r|   r   CmfAccessListcheck_accessCmfACLNotInitializedErrorCmfACLNotFoundErrorrC   privater~  check_visibility)rJ   rL   	member_idobj_commentrv  obj_parent_idr  self_idr   r}  rm  s              r=   _check_perm_for_notifyz CmfNotify._check_perm_for_notify  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)rB  r<  r#  TCmfAccessRuler"  r~  is_dummyr   CmfAttachmentCmfTimeTrackerHistoryr|   CmfGanttTaskr  r$  r%  r&  )msg_listr   obj_comment_idr   r   r   r  )disable_auditsmart_notifycmf_verru   endswithrq   r   r   rj   rt   rz   r  r   r   r  taskrN  rs  deferred_notify_messagesr   r6   rs   )rJ   rL   r   r   r  r  rC   r~   r   r  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)rq   r  _apply_deferred_notify_message)rJ   
only_cleandeferred_notify_datas      r=   apply_deferred_notify_messagesz(CmfNotify.apply_deferred_notify_messagesx  sA    
 )+A&$%$>$> 	E ../CD	E%'"r<   c                    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 ]\  }
|
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    }|r|j3                         D ]  \  }}| j5                  |||      st6        j8                  j                   j	                         5  t
        j:                  j=                  ||||
d   |
d   d |v rdnd||d!   "       d d d         | j?                  |||      }|D ]c  }t6        j8                  j                   j	                         5  t
        j:                  j=                  ||||
d   |
d   d||d!   "       d d d        e _ 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   rj   ru   r   r   T)rs   r   include_deletedr  ztree_parent.cmf_author_idr   r  r   r   r   r  )r   rU  CmfTestcaseCmfTestcaseRunCmfTestcycleCmfDealrj   r   r  r   )rj   r   )rj   r   r   F)r  )r   r  r   r   r   r/  r   r5  r!  )r  r   rw   r   )rL   r   r   r[   r   r   r   r   ) r   get_obj_by_idr   r   disable_aclr{   r~  add_comment_auditr   r   rz   r   r   r  tree_parent_idrt   r   rx   tree_parentcmf_author_idlistkeysrq   rr   r   r`  r  r   utilr   r   r   )rJ   r  _fieldsrL   r  r  r   r   r   r  r   rj   tmp_project_idr   r   r  r  r   	email_setr   rl   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--.>? >> K KS^$ 
,!h4((* ,,1));;6PXYjPk;l))#)!)*;!<&.{&; *  $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ID,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M%%7M2&1M?%M/	2M<?Nc                 $    t        |   |i | y r  )superemit)selfrC   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   )rq   rr   rs   rt   r   r  r   r   )rJ   r   rL   _filternotifiesr   s         r=   r   zCmfNotify.close_open_notifies  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)rq   rr   rs   r  r   r   )rJ   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)rL   r   r   r[   r   )r   
rg_membersr   
all_nestedr   rt   r]   r{   r|   r}   rs   r   r   r   rT  lower)rJ   rL   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)rN   )r{   CmfPluginMailBoxget_local_mailboxsend_message)rctp_torN   rQ   rC   r~   mail_boxs         r=   rI   zCmfNotify.process_email0  s-     **<<>gz7Cr<   c                 d    t         j                  j                         }|j                  | |       y r  )r{   CmfPluginSMSGateget_local_smsgater  )ra   r   rC   r~   sms_gates        r=   r^   zCmfNotify.process_sms6  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=:)r{   r|   r   r   r  rz   r   r   in_project_rolerj   	ui_moduler   ru   r!   )rJ   r   rL   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   r~  u@   Не могу прикрепить вложение attach_id = r5  i   u=    так как его размер превышает 80Мб r  r   r   r   
Content-IDspanr4  ary   cid:u@   Не удалось приложить файл к письму     вложения из r   )!bs4r  email.mime.applicationr  rx   r  r   r{   r|   r   r   r  $servicedesk_email_notify_attach_typefind_allr  r  rj   rs   r   logging	exceptionr  infoget_contentr   rsplitru  
add_headerr   new_tagreplace_with	Exceptionr6   )rJ   rL   email_body_htmlr   r  r  r   soupemail_attaches
attach_tag	attach_idattachattachment_bytefilename
mime_imageattach_linkattach_link_hrefrm  s                     r=   _handle_html_attachzCmfNotify._handle_html_attachL  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(c           
         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  r~  uF   Не могу прикрепить изображение attach_id = r5  r  r   r   r  r  r  srcu	   Файл r  u/    не является изображением)PILr  tempfilebase64r  r  email.mime.imager  TemporaryDirectoryr  r  r   r{   r  rj   rs   r   r  r  r  r   r  ru  r  r   r  r6   )rJ   rL   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)rJ   r  email_body_cssrL   r   email_attachmentsemail_attachments2rl  s           r=   prepare_email_textzCmfNotify.prepare_email_text  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  ry   T)r   z^(https?:|mailto:|tel:|#)r  )ry   )r  r  rer  EXTERNAL_PORT_HTTPSAPP_FQDNr  r   get_textmatchlstripr  stringr   r   bodychildrenr6   )r#  r  r%  	port_spec	base_hrefr  linkry   r   new_linkxs              r=   simplify_for_emailzCmfNotify.simplify_for_email  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  r`  r   	decomposer   r,  r-  r6   )r#  r  r  tagkvr6  r2  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   )ru   r   r   )r   rL   TrT   r   )rN   r   )r,   rt   r   r{   r   r   r\   r:   r6   r  rZ   r$   r3  render_templater   r=  	   body_сssr>  r"  r  r  r  )rJ   r   rL   rM   r  rP   r[   ry   email_subjectr  rQ   r   r  s                r=   r   zCmfNotify.send_email_notify  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 )NrX   rY   TrT   rW   )r*   r]   r   rZ   r!   r   rt   r{   r  r  r  )rJ   r   rL   r_   r`   r   ra   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   )rs   ru   r   r   r  r   r   rj   zparent.logic_prefixr+  r)  deadliner   r*  listsreleasesaffected_versionsstory_pointr   )r  r   u   Отправляем СМСz"models.CmfNotify.send_sms_notify: u   Отправляем emailz$models.CmfNotify.send_email_notify: )r{   r   slistr   r   r   rn   r   printrs   r   r  r   r   sms_doner  r  r  r   r   
email_doner   r   dpcommit)rC   r~   force_objectsrL   force_object_idsr   r   rm  s           r=   celery_minutely_hookzCmfNotify.celery_minutely_hook0  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  rC  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  rF  )r   =u   ОшибкаrG  rH  )r   ra  r   r   rE  rs   T)r   rL  r   sliceTECHCOM_nocacherK  r  )r   rn   r   r{   r   rR  r\   rangers   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)<r2   r3   r4   r   r  code_prefixr   select_jinja_autoescape_optionsjinja2FileSystemLoaderosr7  r   r  PROJECT_DIR_loaderEnvironmentrE   r
   r   api_methodsr   r>   classmethodrR   rb   r   r   r   r   staticmethodr   r6   r   r   r  rs  r  r  r  r  r  r   r   r  cmf_deferred_jobrI   r^   r  r  r  r"  r3  r  r   r   rZ  rr  __classcell__)r  s   @r=   r   r      s   GIKc99:H%f%%	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  , %'9 %8C= %UX % %0 3  4 \S \ \| y3 y yv ' '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   )rx  typingr   rv  r   r   r   uuidr   dataclassesr   cmf.include
cmf.fieldsr
   r   r   r   r;   r<   r=   <module>r     s7    	   2 2  !  7 7A
$$ Ar<   