
    iuN                        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 d dlmZ  G d	 d
ej$                        Zy)    N)Iterable)datetime	timedeltatimezone)uuid1)	dataclass)*)
cmf_notifyCmfRelationCmfType)cmf_notify_metricsc                       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/   r0   r1   r2   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_oldG   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 уведомление пользователю _    не отправлено, не указан номер мобильного телефона.rC   )app_base_hrefr   msglenr"   r*   r+   	cmf_alertr,   rI   process_sms)rK   rL   urlsubjr    phones         r>   send_sms_notify_oldzCmfNotify.send_sms_notify_oldV   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/   r0   r1   r2      Уведомлениеr   r   r\   r'   r(   
first_name	last_namer   r&   r)   TrU   r"   r#   r%   parentr$   r   rb   r+   phone_mobiler*   r,   emailr-   loginr.   r<   )r   nowr   utcpopgcurrent_personidvaluer   codern   
isinstancer   current_userload_fieldsri   rj   r[   hrefhasattrrk   models	CmfPersonget_notify_opt_cachedr?   )	rK   rM   r   kwargsrg   notify_ownerr`   notify_optsrB   s	            r>   prepare_notify_ctx_oldz CmfNotify.prepare_notify_ctx_oldd   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      }|sDt
        j                         }t         j"                  rOt$        j&                  j)                  d       n/t         j"                  rt$        j*                  j)                  d       |sd}|j,                  r|j,                  dkD  r| d}|j.                  r|j0                  r|r||_        d	|_        |xj,                  dz  c_        ||_        ||_        d|_        |	r|	|_        n|j:                  j=                          |rr|j.                  |_        |j                  |_         |j                  |_!        |jD                  |_#        tI        |d      r|j                  rtK        |j                  jL                  t
        jN                        r;tP        jS                  |jT                        j.                  jL                  }||_+        n%|j                  j.                  jL                  |_+        |jX                  |_-        tI        |d      rr|j2                  j]                         rXtK        |j2                  t^              r|j2                  j.                  |_0        n"tc        |j2                        |_0        nd|_        |jd                  sg |_2        |jd                  rFtg        |jd                  jL                        dkD  r$|jd                  jL                  dd d   d   |k(  r|S t         jh                  jj                  r't         jh                  jj                  jL                  d   ndt         jh                  jl                  r't         jh                  jl                  jL                  d   ndz   }|r|j.                  jL                  nd}t         jh                  j                  jL                  t         jh                  j.                  jL                  t         jh                  j                  jL                  t         jh                  jn                  jL                  |dtq        jr                  tt        jv                        jy                         tq        jr                         j{                  d      ||dt}                |dd}|jd                  j                  |       d|_@        |j0                  xs ||_        |d   |_A        |d    |_B        |d    r3|
*t
        j                  j                  d!"      j                  }
|
|_E        |d#   xs |d$   |_F        |d%   xs |d&   |_G        |sd
|_        |j                          |d'   s|j                  d(k(  rVt        d)|||jZ                  jL                  d*|g+       t         j"                  rt$        j                  j)                  d       |j                  d,k(  rL|j                  s@t        d-| |g+       t         j"                  rt$        j                  j)                  d       |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_changesrk   rv   openclosedobj_id==r   status	cron_doner   F)	confirmedr   F)
unread_cntr;   
cron_forcer   r   filterfields   rh   r   u5    + обновил(а) другие параметрыr&   r   )rt   r   rv   rn   initialsre   z%H:%MCmfComment:)	cmf_ownercmf_created_atcmf_created_at_formattedmsg_type_textr   rt   parent_name	log_level
notify_smsnotify_emailsystem:defaultrv   rl   rb   rm   rn   	notify_os1z	notify-os)r   commentr"   )event_persons2znotify-important-)Nrr   disable_notifydebugcmfutilget_obj_id_by_anyr|   r}   r~   rs   rt   rk   
is_definedrv   ry   getr   configMETRICS_NOTIFYr   created_notifieswriteupdated_notifiesr   r   r   r   priotityr   r   r   set_nowr   r   r#   ui_nameobj_ui_namer{   rw   ru   
CmfProjectAPPget_cache_project
project_idr$   rz   r"   loadr   obj_status_namer7   r;   r]   rx   ri   rj   rn   r   ro   r   rp   	isoformatstrftimer   appendr   person_notify_smsperson_notify_emailCmfEmailTemplatesgetemail_template_idr+   r-   saver   cmf_emit_eventevent_notify_osr   event_notify_important)rK   r\   personr   r   rM   force_notify_current_personforcer   r   r   r   r   r   desk_notifynotifyfilter_statusproject_namer)   r   r   s                        r>   r   zCmfNotify.place_notify   s   & GGXY--fkB	&&<<YG((+++0Ku0T23#::((88..6 23  #M (WW4(dI.4/**% Y  
F %%'F$$"3399!<$$"3399!<+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 $$"2288; ??c!&*:*:.yk:9+V$$"99??B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   rM   )rk   rv   r   rz   )r   zphone_mobile.numberzphone.numberrt   r   u   В метод place_notify пришел отсутствующий или удаленный пользователь person_id=recipient_opt)rr   r   r   rs   rt   r   rq   ry   r|   r}   CmfPersonNotifyOptcheck_permission_notify_eventprepare_notify_ctxcreate_desk_notifysend_email_notifysend_sms_notify)	rK   r   rM   r   r   r   notify_allowedrL   r   s	            r>   stol_place_notifyzCmfNotify.stol_place_notifyW  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_namert   ru   r{   r|   CmfProjectNotifySchemeget_notify_rule_data_cached)rK   rM   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=   rM   zmodels.BaseModelr   returnc                 d   t         j                  j                  t         j                  j                  f}t         j                  j                  t         j                  j
                  f}g }|D ]  }t        | |      }t        |d      t        ||      r|j                  j                  }n2t        ||      r|j                  |j                     }n|j                  }t        |t              r|j                  d      }|j                  |j                   d|         dj                  |      S )up   
        Формирует текст уведомления при создании объектов.
        ru   z%d.%m.%Y %H:%M: <br>)cmfr   r   CmfGenericRelation	CmfChoiceCmfChoiceIntgetattrrw   r   ru   choicesr   r   r   captionjoin)rM   r   relation_klasseschoices_klassesmsg_datafield	field_objru   s           r>   _prepare_text_created_objz#CmfNotify._prepare_text_created_obj  s      JJ22CJJ4Q4QR:://1H1HI 	AEU+Iy'*6i)9:%NN00E	?;%--ioo>E%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   ,)r{   r   r   
startswithr   splitr   strip)rK   rM   r   r   
recipientsrm   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   rm   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   rx   servicedesk_publicsdesk-client:defaultr   members)r   project_role_idr   notify_custom_fieldCmfTaskzvar:zDEV: Var user in notify! )abortrv   r   z DEV: Var user person in notify! )#dictr{   r   r   r   all_relation_personsrt   ru   r   extract_var_obj
setdefaultsetaddr|   r}   r~   
user_localr   rk   ry   r  CmfProjectRoler   CmfProjectRoleAssignrw   r   r   CmfRelationBase
issubclasstype
CmfM2MBaser^   r   DEBUGrv   )rK   rM   r   r   r   unon_local_personsuser_id	var_usersvar_userr   rm   	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dgS |dk(  r|j                  r7d|j                   d}d}d}d||||j                  j                  dd||ddgS |j                  j                  r7d|j                   d}d}d}d|||j                  j                  |d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(  rHd2}d3t$        j'                  |j(                  d/       }d}
t        |t        j                        rd4}| j+                  ||      }
nt        |t        j,                        rd5}| j+                  ||      }
nt        |t        j.                        rd6}| j+                  ||      }
nt        |t        j0                        rd7}| j+                  ||      }
n]t        |t        j2                        rd5}| j+                  ||      }
n.t        |t        j4                        rd8}| j+                  ||      }
d|
||dgS |d9k(  r,d:}
|
d;|j6                  j9                          z  }
d<}d|
||
dgS |d=k(  r|j:                  d>k(  r|j<                  d>k(  rd?}
d@}nndA}
|j:                  j>                  |j:                  j                     }|
dB| z  }
|j<                  j>                  |j<                  j                     }|
dC| z  }
dD}d|
||
dgS |dEk(  rdF|j6                  j@                  r|j6                  j@                  nd }
dG}|d;|j6                  jB                   dH|
 z  }dIt$        j'                  |jD                  j(                  dJ       }d|
||dgS |dKk(  rh|j                  r\dF|j6                  j9                          }
dL}|d;|
 z  }dMt$        j'                  |jD                  j(                  dJ       }d|
||dgS |dNk(  rdF|j6                  j@                  r|j6                  j@                  nd }
dO}|d;|j6                  jB                   dH|
 z  }dPt$        j'                  |jD                  j(                  dJ       }d|
||dgS |dQk(  rd|j                  rXdR|j                   }
dS}|dT|j                   z  }dUt$        j'                  |jD                  j(                  d/       }d|
||dgS |dVk(  r.dW|j                   dX}
dY}|dT|j                   z  }dZ}d|
||dgS |d[k(  rd\}
d]}d|
||
dgS |d^k(  r|j                  rd_}
d`}d|
||
dgS |dak(  rdb}
dc}d|
||
dgS |ddk(  rde}|jD                  j                  r&|df|jD                  j                  j                   z  }|jD                  r|dg|jD                  j                   z  }|jD                  j9                         }
dht$        j'                  |j(                  d/       di}d|
||dgS |djk(  r%g }|jF                  j                  rdk}|jF                  r|jF                  j                  }dk}|jH                  r|jH                  j                  }tK        |      j(                   dl| }||k7  r|dm| z  }|dnz  }|jL                  j6                  r|dT|jL                  j6                   z  }|jF                  j9                         }
dot$        j'                  |j(                  d/       }|jO                  d&|||
d       |jP                  j                  r|jP                  jR                  rdpjU                  |jP                  jR                  D cg c]  }tW        |j                         c}      }tK        |      j(                   dl| dn}|jL                  j6                  r|dT|jL                  j6                   z  }|jP                  j9                         }
dqt$        j'                  |j(                  dJ       }|jO                  d&|
||d       |S |drk(  rGds}|jX                  j9                         }
dtt$        j'                  |j(                  d/       }d&||
|dugS |dvk(  r|dw}|jL                  j6                  rtW        |jL                  j6                        }|jL                  j9                         }
dxt$        j'                  |j(                  d/       }d&|
||dgS |dyk(  r|dz}|jL                  j6                  rtW        |jL                  j6                        }|jL                  j9                         }
d{t$        j'                  |j(                  d|       }d&|
||dgS |d}k(  r|d~}|jL                  j6                  rtW        |jL                  j6                        }|jL                  j9                         }
dt$        j'                  |j(                  d|       }d&|
||dgS |dk(  r|d}|jL                  j6                  rtW        |jL                  j6                        }|jL                  j9                         }
dt$        j'                  |j(                  d/       }d&|
||dgS |dk(  rOdt$        j'                  |j(                  d       }|jL                  j9                         }
|jL                  j                  rE|jL                  r9|jL                  j                  jZ                  |jL                  jZ                  k(  rg S |j\                  dk(  r-dxt$        j'                  |j(                  d/       }d}d&|||
dgS dk}|jH                  r|jH                  j                  }d|jL                  j                   d| dn}|jL                  j6                  r|dT|jL                  j6                   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}|j^                  j9                         }
|j^                  j@                  D ]-  }||j^                  j                  vs|d|j                   z  }/ |j^                  j                  D ]-  }||j^                  j@                  vs|d|j                   z  }/ d&|||
dgS g d}|dk(  rg g g d}g g g d}|ja                  d      D ]  \  }}|jb                  s||v r|je                  |      }|dk  r/|j                  |j                  k(  rIt        |t        j                        r|dv r|jf                  rt|j9                         }|s||   jO                  |       ||   jO                  |        g }dt$        j'                  |j(                  d/       }|	r|	}d}|r|}|d   r=|jO                  d|djU                  |d         z   |d;jU                  |d         d       |d&   r=|jO                  d&|djU                  |d&         z   |d;jU                  |d&         d       |d   r=|jO                  d|djU                  |d         z   |d;jU                  |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_titlerk   deletedu   Удалена связь (u-   удалил(а) связь с задачейcreatedu$   Создана подзадача «u   Созданаu#   создал(а) подзадачуr&   )r   r+  r,  r    u(   Добавлена подзадача «u   Добавленаu%   добавил(а) подзадачу)r   r+  r,  r    rk   u$   Удалена подзадача «u   Удаленаu#   удалил(а) подзадачу)r   r    r,  rk   r+  )r   r    r,  r+  NCmfTestcaseStepu   Создан u+   создал(а) шаг тест-кейсаu   Удалён u+   удалил(а) шаг тест-кейсаu   Изменён u-   изменил(а) шаг тест-кейсаCmfTestParamsRowuE   Добавлена строка значений параметровuC   создал(а) строку значений параметровr   uA   Удалена строка значений параметровuC   удалил(а) строку значений параметровCmfTestParamRowValueu4   Изменено значение параметраu6   изменил(а) значение параметраrestoredu   Восстановленоu   восстановил(а) accsu   Удаленоu   удалил(а) u   Созданоu   создал(а) )r   
logic_typeresponsibler   
cmf_authorr   )r6  r   )testplanreleaser6  r   )r5  r6  r   )testcasetest_configurationr5  r6  r   	publishedu9   Выпущены изменения в документеr   u%   выпустил(а) документshareddefaultu[   Отменен публичный доступ к документу в интернете.u=   отменил(а) публикацию в интернетеui   Документ опубликован для публичного доступа в интернете.u   <br>Анонимные: u"   <br>Авторизованные: u,   опубликовал в интернетеcomment_createdu   Комментарий: u$   Комментарий создан.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   переместил(а) u    в другой проект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    изменил(а) статус gent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>удален: )r5  r   viewsresult_textrk   )r   r   r*  T)
is_changedr   )r   u   изменил(а) z <br>u   Пришло событие u    по объекту )r   r    r+  r,  )4r{   r|   rw   r'  relation_typeout_type_namein_linkr   in_type_nameout_linkr  parent_taskrZ  ru   oldr/  r0  r1  r   inflect_nounverbose_namer   CmfDocumentCmfTestcycleCmfTestcaseCmfTestplanCmfTestcaseRunr   	html_diffperm_policy_anonymousperm_policy_guestr   newr   rk   r5  waiting_forr  r   r   	executorschanges_appendedr   r7   rY  rv   cache_status_type
spectatorsitemsr   _get_field_log_levelperm_encrypt)rK   rM   r   in_msgout_msgr,  parent_task_msgtask_msgcustom_message_prefixcustom_message_titler\   comment_msgr   	anonymousguestresr5  rm  ern  	spectatorskip_field_namestmp_comment_listtmp_msg_listr#  r   r   ri  message_prefixs                                r>   _prepare_notify_messagez!CmfNotify._prepare_notify_message>  s    6./JsFD\D\4])+>s?P?P?^?^>__uvy  wB  wB  wG  wG  vH  HJ  K?@Q@Q@^@^?__uvy  wC  wC  wH  wH  vI  IK  L 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+-	  	 **,PQTQYQYPZZ\*]#3(M ./?]j*-//*=*=Ra
 ./2P]3;	  	 !%#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@C!4!45P33C@C!3!34H33C@C!3!34933C@C!6!67j33C@"#mhstuu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//,SXX\\SXX\\r,RSC@KT#(("2"2!32cU;;KKGL`L`adakakaxax  {A  MB  LC  DM"#mhstuu//CNN,SXX-?-?-A,BCCBKT#<'KKGL`L`adakakaxax  {A  MB  LC  DM"#mhstuu//,SXX\\SXX\\r,RSC?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!%c!7!7 88ST_S`a+-%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{&[\	!%c!7!7 88ST]S^^_`::??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   AGc           
         |j                   j                  }|j                  j                  }|j                  j                  }|j                  j                  }|j
                  }t        j                  j                  |      }		 t        j                  j                  |||||dd|	      s2t        j                  r!t        j                  j                  dd       y	 |j
                  dk(  ri|j&                  r]t        j(                  j+                  |j                  |	      s2t        j                  r!t        j                  j                  dd       y|rx|j
                  dk(  ri|j&                  r]t        j(                  j+                  |j                  |	      s2t        j                  r!t        j                  j                  dd       yy# t         $ r4 t        j                  r!t        j                  j                  dd       Y yt"        $ rN}
|
j$                  d   |k(  r6t        j                  r!t        j                  j                  dd	       Y d
}
~
y d
}
~
ww xY w)u   
        Проверяет, что у получателя notify есть доступ к объекту
        Доп. проверяются права у private-комментариев
        )rt   readF)initial_acl_keyobject_modelobject_owner_id	object_idobject_parent_idaccess_levelraise_errorchecking_personr   check_access)reasonCmfACLNotInitializedErrorCmfACLNotFoundErrorN
CmfComment)check_for_usercheck_visibilityT)perm_effective_acl_idru   r   cmf_owner_idrt   r   r|   r}   r   CmfAccessListr  r   r   r   skip_notify_noaccessr   r  r  rD   privater  r  )rK   rM   	member_idobj_commentr  obj_parent_idr  self_idr   r  r  s              r>   _check_perm_for_notifyz CmfNotify._check_perm_for_notify  s    3399++''--&&,,^^
 **..).<	''44$3!+\%!'U$3 5 5 ((&;;AA!NA[50 >>\)ckk$$55cff_5]((&;;AA!L^A_;11\AkFYFY$$55knnUd5e((&;;AA!L^A_5 ) 	 $$"77==aHc=d" 	vvayO+((&;;AA!LaAb	s&   AG :I%I%AI I  I%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&                  r!t(        j*                  j-                  d|       t
        j.                  j1                  |t3        |j4                        |	rt3        |	j4                        nd ||||d       y )Nz-headF)rP  rJ  r.  TCmfAccessRuler-  r  is_dummyr   CmfAttachmentCmfTimeTrackerHistoryr}   CmfGanttTaskr'  r/  r0  r1  r   )
event_type)msg_listr   obj_comment_idr   r   r   r  )disable_auditsmart_notifycmf_verrv   endswithrr   r   r   rk   ru   r{   r  r   r   r  taskr]  r  r   r   r   all_place_notifiesr   deferred_notify_messagesr   r7   rt   )rK   rM   r   r   r  r  rD   r   r   r  dependent_objr  s               r>   smart_all_place_notifyz CmfNotify.smart_all_place_notify:  s    ;;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  1177o7V	""))$cff+9D#knn"5$ #2"0+
 	r=   c                     |rg t         _        y t         j                  D ]  }| j                  |        g t         _        y N)rr   r  _apply_deferred_notify_message)rK   
only_cleandeferred_notify_datas      r>   apply_deferred_notify_messagesz(CmfNotify.apply_deferred_notify_messages  sA    
 )+A&$%$>$> 	E ../CD	E%'"r=   c                    g d}t         j                  |d   |d      }|sPt         j                  |d         j                  st        j                  d|d           y t        d|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         t        j                  r(t         j"                  j%                  t'        |             |sy |D ]  }
|
d   dvr|j(                  }t+        |d      sd }t        j,                  j/                  ||j                   d|       }|s't        j,                  j/                  |d|       }|s y | j1                  |||      }|dk(  rn|rl|j2                  r`|j2                  j4                  j7                  d      r;|j9                  d	g       |j:                  j<                  j4                  }||vri ||<   |	r&t?        |jA                               D ]
  }||	vs||=  d}tB        jD                  jF                   d |
d!    }|r|jI                         D ]  \  }}| jK                  |||"      s|d#z  }tL        jN                  j                   j                         5  t        jP                  jS                  ||||
d$   |
d!   d%|v rdnd||d&   '       d d d         | jU                  |||      }|D ]h  }|d#z  }tL        jN                  j                   j                         5  t        jP                  jS                  ||||
d$   |
d!   d||d&   '       d d d        j t        j                  s}t         jV                  j%                  d#|(        y # 1 sw Y   xxY w# 1 sw Y   WxY w# 1 sw Y   xY w))N)r   r   rk   rv   r   r   T)rt   r   include_deletedu   WARNING. Попытались оставить notify по удаленному объекту, у которого logical_delete=False: u   По объекту uH    был создан нотифай, но объект не найденr  ztree_parent.cmf_author_idr   r  r   r   r   r  )r  rd  rf  rh  re  CmfDealrk   r   r*  r+  )rk   r   )rk   r   r   F)r  )r   r*  r   r   r   r>  r   r   rD  r,  )r  r   r    rx   r   )rM   r   r   r\   r   r   r   r   
member_cnt),r   get_obj_by_idget_model_by_idlogical_deleteloggingwarning	Exceptionr   r   disable_aclr|   r  add_comment_auditr   r   r   r   place_notify_make_commentsr   r]   r   r{   r   r   r%  tree_parent_idru   r   ry   tree_parentcmf_author_idlistkeysrr   rs   r   rr  r  r   utilr   r   r   place_notify_recipients)rK   r  _fieldsrM   r  r  r   r   r   r  r   rk   tmp_project_idr   r  r  r  notify_member_countr   	email_setr   rm   s                         r>   r  z(CmfNotify._apply_deferred_notify_message  s   L##';H'Eggk#l **+?+IJYY  #m  nB  CK  nL  mM  !N  O23G3Q2R  S[  \  ]  ] 01!//3GHX3Ybi  lG  kH  cH/  IK'
3%h/./@A$W--.>? >> K KS^$ 
,!h4((* ,,1));;6PXYjPk;l))#)!)*;!<&.{&; *  $U$+, ,
, $$"==CCCMR   J	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HbHb--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^ '1,'))557 
((55 #!%#, ( 3*2?*C@NR[@[af"'.78K.L 6 	
 
	" !99#PYZN' #q(#XX%%113 
$$11!$$Y/&.&?49#*34G*H 2 	
 
 $$"::@@Ob@cUJ	d, ,z
 
 
 
s%   +AP087P=>1Q
0P:	=Q
Qc                 $    t        |   |i | y r  )superemit)selfrD   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   )rr   rs   rt   ru   r   r  r   r   )rK   r   rM   _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)rr   rs   rt   r  r   r   )rK   r   r  r   s       r>   r   z&CmfNotify.confirm_unconfirmed_notifies=  sZ    ((++I88$	*($
8 
  	F#FKKM	r=   c           	      "   |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>dt        j                  |j                  j                         d       }t        j                   j"                   d| }t        j$                  j'                  |||d	|d
        t(        j*                  r+t,        j.                  j1                  dt3        |             y y )NCmfPersonGroupr}   CmfRolez,DEV: handle_mention_event unknown obj type: email_if_mentionsu   упомянул(а) вас в loctrD  r&   T)rM   r   r   r\   r   r   r   r  )r   
rg_membersr   
all_nestedr   ru   r^   r|   r}   r~   rt   r   rb  rc  lowerrr   rs   r   r   r   r   r   r   mention_eventsr   r]   )rK   rM   event_personpersonsr   r   r,  r   s           r>   handle_mention_eventzCmfNotify.handle_mention_eventK  sr    ""&66"--224??AG$$3#nG$$	1#**//1778GwD\E\E\D]^_ 	F **@@QK"+6I*J=g>R>RSVScScSiSiSkms>t=uvM&&++,Am_=D))+ * 	   --33A#g,3O !r=   )	only_once
system_jobc                 h    t         j                  j                         }|j                  | ||       y )N)rO   )r|   CmfPluginMailBoxget_local_mailboxsend_message)rctp_torO   rR   rD   r   mail_boxs         r>   rJ   zCmfNotify.process_emaill  s-     **<<>gz7Cr=   c                 d    t         j                  j                         }|j                  | |       y r  )r|   CmfPluginSMSGateget_local_smsgater  )rb   r    rD   r   sms_gates        r>   r_   zCmfNotify.process_smsr  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  r{   r   r   in_project_rolerk   	ui_moduler   rv   r"   )rK   r   rM   r   s       r>   _calc_notify_obj_linkzCmfNotify._calc_notify_obj_linkx  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 = rD  i   u=    так как его размер превышает 80Мб r  r   r   r   
Content-IDspanrC  arz   cid:u@   Не удалось приложить файл к письму     вложения из r   )!bs4r  email.mime.applicationr  ry   r  r   r|   r}   r   r   r  $servicedesk_email_notify_attach_typefind_allr	  r  rk   rt   r   r  	exceptionr  infoget_contentr   rsplitr  
add_headerr   new_tagreplace_withr  r7   )rK   rM   email_body_htmlr   r  r  r   soupemail_attaches
attach_tag	attach_idattachattachment_bytefilename
mime_imageattach_linkattach_link_hrefr  s                     r>   _handle_html_attachzCmfNotify._handle_html_attach  s    	&:"B&&GI_`a{{"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 = rD  r  r   r   r  r  r  srcu	   Файл r  u/    не является изображением)PILr,  tempfilebase64r  r  email.mime.imager-  TemporaryDirectoryr  r	  r   r|   r  rk   rt   r   r  r  r  r   r  r  r  r   r  r7   )rK   rM   r  r,  r1  r2  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>)r8  r*  extendclean_junk_attr_tags)rK   r  email_body_cssrM   r   email_attachmentsemail_attachments2r~  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  rz   T)r   z^(https?:|mailto:|tel:|#)r  )rz   )r  r  rer   EXTERNAL_PORT_HTTPSAPP_FQDNr  r   get_textmatchlstripr  stringr  r   bodychildrenr7   )r@  r  rB  	port_spec	base_hrefr   linkrz   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	  rr  r   	decomposer   rI  rJ  r7   )r@  r  r   tagkvrS  rO  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   )rv   r   r   )r   rM   TrU   r   )rO   r=  )r-   ru   r   r|   r   r   r]   r;   r7   r  r[   r%   rP  render_templater   rZ  	   body_сssr[  r?  r  r  r  )rK   r   rM   rN   r  rQ   r\   rz   email_subjectr  rR   r=  r  s                r>   r   zCmfNotify.send_email_notify4  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 )NrY   rZ   TrU   rX   )r+   r^   r   r[   r"   r   ru   r|   r  r  r  )rK   r   rM   r`   ra   r    rb   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                  rb	 t        d       t         j                  j                  ||       d|_        t        j                   rt"        j$                  j'                  d       |j0                  rb	 t        d       t         j                  j3                  ||       d|_        t        j                   rt"        j6                  j'                  d       d|_        |j=                          t        j                   rt"        j>                  j'                  d       |j@                  jC                          c c}w # t(        $ rR}t        j                   rt"        j*                  j'                  d       t,        j/                  d|        Y d }~+d }~ww xY w# t(        $ rR}t        j                   rt"        j8                  j'                  d       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   )rt   rv   r   r   r  r   r   rk   zparent.logic_prefixr6  r4  deadliner   r5  listsreleasesaffected_versionsstory_pointr   )r  r   u   Отправляем СМСr   z"models.CmfNotify.send_sms_notify: u   Отправляем emailz$models.CmfNotify.send_email_notify: )"r|   r   slistr   r   r   ro   r   printrt   r   r  r   r   sms_doner   r   r   
send_emailr   r  send_email_errorr  r  r   r   
email_donesend_smssend_sms_errorr   r   cron_processeddpcommit)rD   r   force_objectsrM   force_object_idsr   r   r  s           r>   celery_minutely_hookzCmfNotify.celery_minutely_hookl  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,,*55;;A>
 ))	R67$$66vsC(,F%,,*3399!<
  $FKKM$$"1177:IIa  A< ! P,,*;;AA!D%%(J1#&NOOP ! R,,*99??B%%(LQC&PQQRs9   H'6A!H, $A!J
 ,	J5AJJ
	K%AK  K%u<   Удаление устаревших уведомленийz@daily)r  descriptionr  r`  c                     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 t        j                  r t        j                  j                  |       y y c c}w )N   )days-   Z   r   i i  rc  )r   =u   Ошибкаrd  re  )r   r  r   r   rb  rt   T)r   ri  r   sliceTECHCOM_nocacherh  r  )r   ro   r   r|   r   ro  r]   rangert   bulk_delete
cmf_commitr   r   r   delete_outdated_notifiesr   )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  sm    ,,.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	   77==lK ! 8s   Er<   )Nr&   NFFr   NNr  )F)NN)r   N)<r3   r4   r5   r   r  code_prefixr   select_jinja_autoescape_optionsjinja2FileSystemLoaderosrT  r   r   PROJECT_DIR_loaderEnvironmentrF   r
   r   api_methodsr   r?   classmethodrS   rc   r   r   r   r   staticmethodr   r7   r   r   r%  r  r  r  r  r  r  r   r   r  cmf_deferred_jobrJ   r_   r  r*  r8  r?  rP  r;  r   r   r|  r  __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z zx 7 7r  , %'9 %8C= %UX % %6 3  4 \S \ \| E3 E EN 1 1f &*$ta# a aF 	( 	( td tdn&  "   P P@ 6D 7 D 6. 7 .   D) D)N %' %'N & &( = = = =, =3 =3 = = 'o 'oR . . L6 M 6p 2p  ~B  MU  V/L V /Lr=   r   )r  typingr   r  r   r   r   uuidr   dataclassesr   cmf.include
cmf.fieldsr
   r   r   cmf.metricsr   r   r<   r=   r>   <module>r     s<    	   2 2  !  7 7 *HL
$$ HLr=   