
    h                    t    d dl m Z mZmZ d dlmZ d dlmZ d dlT d dlm	Z	m
Z
mZ  G d de	j                  ZdS )	    )datetime	timedeltatimezone)uuid1)	dataclass)*)
cmf_notifyCmfRelationCmfTypec                   $    e Zd ZdZdZdZi Ze                    e	j
                            ej        d          e	j
                            ej        d          g          Zeed<    ej        d0i eZej        j        g dz   Ze G d d	                      Zed
             Zed             Zed             Ze	 	 	 d1d            Zed             Zed             Zedefd            Zedefd            Zedefd            Z ed2d            Z!edddddefd            Z" fdZ#ed3d            Z$ed2d            Z%ed             Z&e' e(dd           d!                         Z)e' e(dd           d"                         Z*ed#             Z+ed$             Z,ed4d&            Z-ed'             Z.e'd(ed%efd)            Z/e'd(ed%efd*            Z0ed+             Z1ed,             Z2e' e(ddd-.          d/                         Z3 xZ4S )5	CmfNotifyNotifydeskNTFzcommon/templateszcmf/templatesloader)close_open_notifiesconfirm_unconfirmed_notifiesplace_notifyc                   Z   e Zd ZU dZdZeed<   dZeed<   dZeed<   dZ	e
ed<   dZeed	<   dZeed
<   dZeed<   dZeed<   dZeed<   dZeed<   dZeed<   dZeed<   dZeed<   dZeed<   dZeed<   dZeed<   dZeed<   dZeed<   dZeed<   dZeed<   dZeed<   dZeed<   dZeed<   dZ dS )CmfNotify.NotifyCtxu1  
        notify_type - тип сообщения
        возможные варианты:
        - просто сообщение (default) -- message
        - редактирование объекта -- obj_edit
        - создание объекта -- obj_create
        - удаление объекта -- obj_delete
        - добавление комментария -- comment_create
        - редактирование комментария -- comment_edit
        - удаление комментария -- comment_delete
        N	person_idnametextr   priorityFstrikethrough
alarm_datemessagenotify_typeobj_hrefobj_codeobj_parent_nameobj_link html_changed_fields
owner_nameowner_initialsperson_phone_mobileperson_phoneperson_nameperson_emailperson_loginmsg_from_idmsg_from_namemsg_from_codemsg_from_login)!__name__
__module____qualname____doc__r   str__annotations__r   r   r   intr   boolr   r   r   r   r    r!   r"   r$   r%   r&   r'   r(   r)   r*   r+   r,   r-   r.   r/   comments     ./cmf/models/cmf_notify.py	NotifyCtxr      s        
	 
	 	3cc##t####
H###$S$$$########%S%%%
C""""#'S''' c   S c    c   S!s!!!!s!!!""""r:   r<   c                 <   |j         p|j        }d|j         d|j         d|j         }|                                 }|r|                                }| j                            |          }|                    |          }t          | j
        |||g           d S )N[z] (z) )ctxargs)r*   r+   r!   r    r   +get_default_mail_notification_template_name
_jinja_envget_templaterenderschedule_deferred_jobprocess_email)cls
notify_ctxobjrcpt_tosubjectmail_templatetemplate
email_bodys           r;   send_email_notify_oldzCmfNotify.send_email_notify_old@   s     )DZ-D]j0]]Z5H]]JO]]GGII 	NKKMMM>..}==___44
c/w6TUUUUUUr:   c                 2   t          d          }|j        p|j        }t          |          dk    r|d d          d}| d|j         d| |j         }|j        p|j        }|st          d|j         d           d S t          | j
        ||g           d S )	NTfull_url   z...
4   SMS уведомление пользователю _    не отправлено, не указан номер мобильного телефона.r@   )app_base_hrefr   msglenr   r'   r(   	cmf_alertr)   rF   process_sms)rH   rI   urlsubjr   phones         r;   send_sms_notify_oldzCmfNotify.send_sms_notify_oldO   s    T***0*.t99r>>3B3i$$$DIIZ^IIsIJ4GII.I*2I 	  EZMc  E  E  E  F  F  FFcoUG4DEEEEEEr:   c                    d|vs
|d         du r"t          j        t          j                  |d<   d|v r|                    d          }nt
          j        }|j        j        |d<   |j	        j        |d<   |j
        j        |d<   |j        j        |d<   d	|d
<   |rd|vs
|d         du r
|j	        |d<   d|vs
|d         du r"t          j        t          j                  |d<   t          |d         t                    r|d         j        |d<   |d         |d<   |pt
          j        }|j	        j        |d<   |                    ddg           |j        r|j        j        d         nd|j        r|j        j        d         ndz   |d<   |rdt%          d          }|j        |d<   |j
        |d<   | |d          |d<   t)          |d          r|j        r|j        j	        j        |d<   nd |d<   t,          j                            |          }||d<   |d         |d<   |d         |d<   |d
         |d <   |d!         |d"<   |d#         |d$<    | j        d%i |}|S )&Nr   .tzmsg_fromr,   r-   r.   r/      Уведомлениеr   r   rY   r$   r%   
first_name	last_namer   r#   r&   TrR   r   r    r"   parentr!   r   r_   r(   phone_mobiler'   r)   emailr*   loginr+   r9   )r   nowr   utcpopgcurrent_personidvaluer   coderk   
isinstancer   current_userload_fieldsrf   rg   rX   hrefhasattrrh   models	CmfPersonget_notify_opt_cachedr<   )	rH   rJ   r   kwargsrd   notify_ownerr]   notify_optsr?   s	            r;   prepare_notify_ctx_oldz CmfNotify.prepare_notify_ctx_old]   s   v%%)=)D)D#+<8<#@#@#@F< zz*--HH'H ( 1}"*-"5"*-"5#+>#7 1v 	&F&((F6Nc,A,A XF6Nv%%)=)D)D#+<8<#@#@#@F< fUmW-- 	0"5M/F5M(.u$%11>+06|  ,!<===HTH_$gL$;$A!$D$Deg  P\  Pf  mnlx  mC  mI  JK  mL  mL  ln  $o  	1...C!$F:!$F:$'!=
);!=!=F:sH%% 1#* 1,/JO,A()),0()&<<YGG'{!,W!5~(3N(C$% +F 3}!,W!5~!,W!5~cm%%f%%
r:   Nr#   Fr   c           	      Z
   t           j        rt                               d           dS t                              |d          }t
          j                            |          }|dS d}|t           j        j	        k    r|dk    r|d         rd}ndS |r/|j
        j        r|j        j        s|                    ddg           d}|r6d	}|sd
}|                     dd|j	        gdd|gdd|gg dg dgg d          }|st
                                          }|sd}|j        r|j        dk    r| d|j         }|j        r	|j        r|r||_        d	|_        |xj        dz  c_        ||_        ||_        d|_        |	r|	|_        n|j                                         |r|j        |_        |j	        |_        |j        |_        |j        |_        t=          |d          r|j
        r|j
        j        j        |_         |j!        |_"        t=          |d          r^|j        #                                rEtI          |j        tJ                    r|j        j        |_&        n!tO          |j                  |_&        nd|_        |j(        sg |_(        |j(        rCtS          |j(        j                  dk    r&|j(        j        dd         d         d         |k    r|S t           j*        j+        rt           j*        j+        j        d         ndt           j*        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*        j-        j        |dt]          j/        t`          j1                  2                                t]          j/                    3                    d          ||dti                       |dd}|j(        5                    |           d|_6        |j        p||_        |d         |_7        |d          |_8        |d          r.|
%t
          j9        :                    d!"          j	        }
|
|_;        |d#         p|d$         |_<        |d%         p|d&         |_=        |sd
|_        |>                                 |d'         s|j?        d(k    r!t          d)|||j"        j        d*|g+           |j?        d,k    r|jA        st          d-| |g+           |S ).u  
        obj: CmfEntity

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

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

?B772PPQWYfgg+S+CBB6BB
4''
C88 	,!!*c222
+++r:   c                    |j         }|j        dk    r|j        j        }t	          |d          sd }t
          j                            ||j         d|           }|s#t
          j                            |d|           }|S )N
CmfProjectlogic_prefix.
AllModels.)	parent_id
class_namerq   rr   rx   ry   CmfProjectNotifySchemeget_notify_rule_data_cached)rH   rJ   event_type_codetmp_parent_id	rule_datas        r;   get_rule_datazCmfNotify.get_rule_data|  s    
 >\))FLMsN++ 	! M 1MMcn@@@@
 
	  	5QQ=O== I r:   r   c                 T   g }t          |d          r.|j        dk    r#|j        r|j                            d          sg S |                     ||          }|sdS |d         rE|d                             d          D ])}|                    |                                           *|S )u   
         email-ы из колонки "Адреса электронной почты" схемы уведомлений
        r   r   CmfProject:Nr   ,)rx   r   r   
startswithr   splitr   strip)rH   rJ   r   r   
recipientsrj   s         r;   get_notify_email_membersz"CmfNotify.get_notify_email_members  s     
 3'' 	Nl22 3.1m.F.F}.U.U 3I%%c?;;	 	 F^$ 	1">288== 1 1!!%++--0000r:   c                 z	   t                      }t          |d          rU|j        dk    rJ|j        r|j                            d          s)|                                D ]}dh||j        j        <   |S |                     ||          }|sdS g }|d         D ]u}|	                    |d          }|>|
                    |t                                 ||                             d           Z|D ]}	t          j                            |	j        j                  }
|
/|	j        s|                    |	           |
                    |	j        j        t                                 d	}|d
k    r|
d         rd}nf|dk    r|
d         rd}nU|dv r|
d         rd}nF|dk    r|
d         rd}n5|dk    r/|
d         r'd}||	j        j                                     d           |r%||	j        j                                     d           w|j        r|j                            d          r|r|j                            dg           |j        j        st          j                            d          }t          j                            |j        |dg          }|D ]O}t1          |t2          j        j                  r|j        }|j        j        |v r|r||d         vr||j        j        = P|d         r'|j        dk    r|                    |d                    |d         D ]}||         st9          t;          ||                   t2          j        j                  r]||         D ]S}|
                    |j        j        t                                 ||j        j                                     d           T|
                    ||         j        j        t                                 |||         j        j                                     d           |D ]}|                    d          rt?          d| d	           t@          j!        r^t          j                            |dg           }|r:|j"        r3|j"        j                            d          rt?          d!| d	           |S )"uY   
        Рассчитываем набор юзеров и их галочек
        r   r   r   rj   Nnotify_membersT)all_nested_personsFz
var:authoremail_if_authorz	var:owneremail_if_owner)zvar:responsiblezvar:executorsemail_if_responsiblezvar:spectatorsemail_if_spectatorzvar:current_userr   ru   servicedesk_publicsdesk-client:defaultr   members)r   project_role_idr   notify_custom_fieldCmfTaskzvar:zDEV: Var user in notify! )abortrs   r   z DEV: Var user person in notify! )#dictrx   r   r   r   all_relation_personsrq   rr   r   extract_var_obj
setdefaultsetaddry   rz   r{   
user_localr   rh   rv   r   CmfProjectRoler   CmfProjectRoleAssignrt   cmfr   CmfRelationBase
issubclasstype
CmfM2MBaser[   configDEBUGrs   )rH   rJ   r   r   r   unon_local_personsuser_id	var_usersvar_userr~   rj   	proj_roleproj_role_assignuser
field_nameis                    r;   get_notify_memberszCmfNotify.get_notify_members  sK   
 VV
 3'' 	Nl22 3.1m.F.F}.U.U 3--// 3 3*1
14:&&%%c?;;	 	 F !12 	C 	CG++G+MMI %%gsuu5557#''0000 ) C CH"("2"H"HIZ"["[K"* #. ;)00:::))(+*;SUUCCC!E,..;?P3Q. $ K//K@P4Q/ $ $HHH[YoMpH $ $444EY9Z4 $ $666;G^;_6 $"8;#4599.III C"8;#4599'BBB1C6 = 	6S]55mDD 	6IZ 	6J""$8#9::: :0 6"155;Q5RR	#)#>#B#BSZir  }F  |G#B  $H  $H - 6 6D!$
(BCC *#zw}
227G2DXhirXsLsLs&tw}5*+ 	F)0K0KOOI&;<==='(=> 	F 	F
: d3z?33SZ5JKK F #J ? ?"--dgmSUUCCC"47=155g>>>>? ))#j/*<*BCEEJJJs:178<<WEEEE  	V 	VA||F## H9a99GGGG| V'++q&+BB VDI V$)/*D*DV*L*L VGGGuUUUUr:   c                 :   t          |t          j                  r|dk    r:d|j        j         d}d|j        j         d}d}d|||j        dd|||j        dgS |dk    r:d|j        j         d}d|j        j         d}d	}d|||j        dd|||j        dgS t          |t          j                  r|j        j        r|d
k    r&d|j         d}d}d}d|||j        j	        dd||dgS |dk    r_|j        r&d|j         d}d}d}d|||j        j	        dd||dgS |j        j
        r&d|j         d}d}d}d|||j        j
        dd||dgS |dk    rd}d}d||dgS |dk    rd}d}d||dgS |d
k    rd}d}d||dgS |dk    r*d}|d|j                                         z  }d}d||dgS |d k    rn|j        d!k    r|j        d!k    rd"}d#}nLd$}|j        j        |j        j	                 }	|d%|	 z  }|j        j        |j        j	                 }
|d&|
 z  }d'}d||dgS |d(k    r8d)}|d|j        j         d*|j        j        r|j        j        nd+ z  }d,}d||dgS |d-k    r1|j        r*d.}|d|j                                         z  }d/}d||dgS |d0k    r8d1}|d|j        j         d*|j        j        r|j        j        nd+ z  }d2}d||dgS |d3k    r|j        rd4}|d5|j         z  }d6}d||dgS |d7k    rd8}|d5|j         z  }d9}d||dgS |d:k    rd;}d<}d||dgS |d=k    r|j        rd>}d?}d||dgS |d@k    rdA}dB}d||dgS |dCk    rGdD}|j        j
        r|dE|j        j
        j         z  }|j        r|dF|j        j         z  }dG}d||dgS |dHk    r%g }|j        j        r{dI}|j        r|j        j        }dI}|j        r|j        j        }dJ| }||k    r|dK| z  }|dLz  }|j        j        r|d5|j        j         z  }dM}|                    dN||d           |j        j        rt1          |j                  t1          |j        j
                  z
  }|r^dO                    dP |D                       }dJ| dL}|j        j        r|d5|j        j         z  }dQ}|                    dN||d           |S |dRk    r	dS}dNdT|dgS |dUk    r0dV}|j        j        rt5          |j        j                  }dW}dN||dgS |dXk    r0dY}|j        j        rt5          |j        j                  }dZ}dN||dgS |d[k    r0d\}|j        j        rt5          |j        j                  }d]}dN||dgS |d^k    r0d_}|j        j        rt5          |j        j                  }d`}dN||dgS |dak    r|j        j
        r(|j        r!|j        j
        j        |j        j        k    rg S |j        dbk    r	dW}dNdc|dgS dI}|j        r|j        j        }dd|j        j         de| dL}|j        j        r|d5|j        j         z  }|j        j
        r*|j        r#df|j        j
        j         dg|j        j         dh}ndi}dN||dgS |djk    rdk| }dl}dN||dgS |dmk    rdn}do}dN||dgS |dpk    rdq| dr}ds}dN||dgS |dtk    rdu}dv}dN||dgS |dwk    r_dx}dy}|j        j        D ]}||j        j
        vr|dz|j         z  }|j        j
        D ]}||j        j        vr|d{|j         z  }dN||dgS g d|}|dk    rAg g g d}}|                    d~          D ]p\  }}|j        s|j	        |j
        k    r||v r#|                     |          }|dk     r?|                                }|r||                             |           qg }d}|d         r2|                    dd                    |d                   |d           |dN         r2|                    dNd                    |dN                   |d           |d         r2|                    dd                    |d                   |d           |S | }dNd| d|j         |dgS )u  
        Логика:
        - по спец. событиям типа assigned, придет и assigned и updated, поэтому поля спец.событий
            дополнительно нужно отфильтровывать в updated
        updatedu6   Установлена связь с задачей «   »u/   установил связь с задачей   )r   r   message_titlerh   deletedu.   Удалена связь с задачей «u)   удалил связь с задачейcreatedu$   Создана подзадача «u   Созданаu   создал подзадачу)r   r   r  u(   Добавлена подзадача «u   Добавленаu!   добавил подзадачуu$   Удалена подзадача «u   Удаленаu   удалил подзадачуrestoredu   Восстановленоu   восстановилu   Удаленоu   удалилu   Созданоu   создал	publishedu9   Выпущены изменения в документеz<br>u!   выпустил документshareddefaultu[   Отменен публичный доступ к документу в интернете.u9   отменил публикацию в интернетеui   Документ опубликован для публичного доступа в интернете.u   <br>Анонимные: u"   <br>Авторизованные: u,   опубликовал в интернетеcomment_createdu$   Комментарий создан.: r#   u%   написал комментарийcomment_updatedu&   Комментарий изменен.u%   изменил комментарийcomment_deletedu#   Комментарий удаленu#   удалил комментарийattachment_createdu#   Добавлено вложение u   добавил вложениеattachment_deletedu   Удалено вложениеu   удалил вложениеworklog_createdu+   Сделана запись о работеu)   сделал запись о работеworklog_updatedu&   Журнал работ измененu&   изменил журнал работworklog_deletedu$   Журнал работ удаленu$   удалил журнал работmovedu   Перемещеноu    из проекта u    в проект u1   переместил в другой проектassignedu   Не установленu%   Задача назначена на u   , ожидает r   u'   назначил исполнителяr   z, c                 6    g | ]}t          |j                  S r9   )r4   r   ).0es     r;   
<listcomp>z5CmfNotify._prepare_notify_message.<locals>.<listcomp>  s     *N*N*N13qv;;*N*N*Nr:   u-   назначил соисполнителейresolvedu   добавил решениеu1   В задаче добавлено решениеr   u   Задача завершенаu   завершил задачуwork_startedu   Работа начатаu   начал работуwork_stoppedu#   Работа остановленаu%   приостановил работуreopenedu#   Задача переоткрытаu!   переоткрыл задачуchanged_statusCLOSEDu   Задача закрытаu!   Статус изменен на u   , ожидаем u   изменил статус c "u   " на ""u   изменил статусapprove_startedu.   Ожидается подтверждение u+   запустил подтверждениеapprove_rejectedu6   Пользователь отклонил запросu   отклонил запросapprove_success_fullu   Утверждение u    завершеноu)   утверждение завершеноapprove_success_oneu:   Пользователь подтвердил запросu!   подтвердил запросspectators_changedu'   изменены наблюдателиu4   Изменен состав наблюдателейu   <br>добавлен: u   <br>удален: )responsibler   viewsresult_textrh   )r   r   r  T)
is_changedr   u   изменилu   Пришло событие u    по объекту )!rt   ry   CmfRelationOptionin_linkr   out_linkr   parent_taskr3  rr   oldr   	html_diffperm_policy_anonymousperm_policy_guestchoicescaptionnewrh   r0  waiting_forr   r   	executorsr   joinr4   rs   cache_status_type
spectatorsitemsr   _get_field_log_level)rH   rJ   r   in_msgout_msgr  parent_task_msgtask_msgrY   	anonymousguestresr0  r?  new_executorsr@  	spectatorskip_field_namestmp_listr  	field_objr   r9  s                          r;   _prepare_notify_messagez!CmfNotify._prepare_notify_message  s+    c6344 	)++fRUR]RbfffhSVS_Sdhhh Q"#bebnoo"#-cfcnoo 
 )++^#+JZ^^^`3<K\``` K"#bebnoo"#-cfcnoo 
 c6>** 	) "i//&YSX&Y&Y&YO/H$EM&'OVcoro~  pE  F  F&'H}]] 
 #i// *aUXU]*a*a*a#7(K*+Zgsv  tC  tI  J  J*+S`aa  
 * *]QTQY*]*]*]#3(I*+Zgsv  tC  tG  H  H*+S`aa   j((.C4M"#mTTUUi''"C*M"#mTTUUi''"C*M"#mTTUUk))MC0#(,,..000C?M"#mTTUUh&&(I55#:OS\:\:\s [ B5=c>W>]^	=)===-5c6K6QRCECCC N"#mTTUU///8CT#(*TTchl.RchllPRTTTCCM"#mTTUU///CN/:C0#(,,..000CCM"#mTTUU///7CT#(*TTchl.RchllPRTTTCAM"#mTTUU222s~27C>sx>>!C=M"#mTTUU2223C>sx>>!C;M"#mTTUU///?CGM"#mTTUU///CN/:CDM"#mTTUU///8CBM"#mTTUU g%%(Cz~ EDsz~/BDDDz =<3:?<<<OM"#mTTUUj((C) ]9? 7"%/"6K9? 7"%/"6KKkKK+--<{<<<Cs
:? 10sz000C I

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

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

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

v{{8A;7O7OboppqqqJ +,,{?,{,{qtqy,{,{  O\  ]  ]  ^  	^r:   c           
      b   |j         j        }|j        j        }|j        j        }|j        j        }|j        }t          j                            |          }		 t          j	        
                    |||||dd|	          sdS n6# t          $ r Y dS t          $ r}
|
j        d         |k    rY d}
~
dS  d}
~
ww xY w|j        dk    r/|j        r(t          j                            |j        |	          sdS |r:|j        dk    r/|j        r(t          j                            |j        |	          sdS d	S )
u   
        Проверяет, что у получателя notify есть доступ к объекту
        Доп. проверяются права у private-комментариев
        )rq   readF)initial_acl_keyobject_modelobject_owner_id	object_idobject_parent_idaccess_levelraise_errorchecking_personr   N
CmfComment)check_for_userT)perm_effective_acl_idrr   r   cmf_owner_idrq   r   ry   rz   r   CmfAccessListcheck_accessCmfACLNotInitializedErrorCmfACLNotFoundErrorrA   privater]  check_visibility)rH   rJ   	member_idobj_commentrU  obj_parent_idr`  self_idr   r\  r"  s              r;   _check_perm_for_notifyz CmfNotify._check_perm_for_notifyA  ss    39+'-&,^
 *..).<<	'44$3!+\%!'U$3 5 5 5  u ) 	 	 	 55" 	 	 	vayO++uuuuu		 >\))S[)$55cf_5]] u 	;1\AAkFYA$55knUd5ee uts$   'B 
B6	B6B10B11B6T)r   auditfilter_membersc                   |j         rd S |sd S |sd S |j        sd S t          j        rd S d}|dv rd}d }	d }
|j        dk    rF|}	|j        j        }t          |d          r|j        	                                rd S |	j
        dk    rd S |j        dk    r|}	|j        j        }|j        dk    r|}
|j        j        }|j        d	k    r	|j        sd S |j        d
k    r|}
|j        j        }|j        dk    r |}
|j        	                                j        }|	r|                     |	|          }n/|
r|                     |
|          }n|                     ||          }|j        dv r|	s|D ]}|                    d|          }t                                           5  t$                              ||d         |d                                       d           d d d            n# 1 swxY w Y   |sd S |D ]~}|d         dvr|j        }t          |d          sd }t$          j                            ||j         d|           }|s(t$          j                            |d|           }|s d S |                     |||          }|dk    rV|	j        rO|	j        j                            d          r0|	                    dg           |	j        j        j        }||vri ||<   |r+t=          |                                          D ]	}||vr||= 
t          j         j!         d|d          d|j"         }|r|#                                D ]\  }}| $                    |||	          stJ          j&        j                                        5  t$          j'        (                    ||||d         |d         d|v rdnd||d                    d d d            n# 1 swxY w Y   | )                    |||          }|D ]v}tJ          j&        j                                        5  t$          j'        (                    ||||d         |d         d||d                    d d d            n# 1 swxY w Y   wd S )NF)r(  r  r  Tr]  is_dummyr   CmfAttachmentCmfTimeTrackerHistoryrz   CmfGanttTaskr4  )r   CmfDocumentrh   r   r   )rh   r   r   )rl  )r   r  r   r   r   r  r   ztree_parent.cmf_author_idr  r  )rh  ru   r   )rJ   r   r   rY   r   r   r   r   )*disable_auditsmart_notifyro   r   r   rh   rr   rx   ro  r   r   r   taskr5  rR  r   r   disable_aclry   r]  r   
project_idr   r   r  tree_parent_idr   rv   tree_parentcmf_author_idlistkeysrp   r   verbose_namerD  rk  r   utilr   r   r   )rH   rJ   r   r   rl  rm  rA   r|   r   rh  dependent_objmsg_listmsg_datarh   tmp_project_idr   r   rg  r   r   	email_setr   rj   s                          r;   smart_all_place_notifyz CmfNotify.smart_all_place_notifyk  s@     	F 	F 	F 	F 	FGGGE>\))K*"CsJ'' CL,=,=,?,? $))>_,,K*"C>444M*"C>[((
 > >^++  M(.C>000M+""$$*C  	I22;PPHH 	I22=/RRHH223HHH >7777$ ( (!h44((** ( (%%%%i0"*;"7 &   dd'''( ( ( ( ( ( ( ( ( ( ( ( ( ( (  	F  D	 D	H$F22
 !^N3// &!% 5QQ3> E EO E E I  "9UU"$B$B$B 	 !  FF,,S/9MMG"3338R3-3>>}MM 0++-H,IJJJ + 7 E KI //-/	* -#GLLNN33 - -Gn44#G,&+\\h.G\\#JZ\\D ,3MMOO  (Iy55c9R]5^^ ! )5577 
 
(55 #!%#, ( 3*2?*C@NR[@[@[af"'.78K.L 6 	 	 	
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 !99#PYZZN'  X%1133 
 
$11!$$Y/&.&?49#*34G*H 2 	 	 	
 
 
 
 
 
 
 
 
 
 
 
 
 
 
sD	 D	s7   >G  G$	'G$	A OOO:Q$$Q(+Q(c                      t                      j        |i | t          d| j                                         d| j        j        i| j                                        g           d S )Nznotify-person-	notify_idr   )superemitr   r   r   rq   rr   )selfrA   r|   	__class__s      r;   r  zCmfNotify.emit  sz    d%f%%%4T^002244TW]7"n11334	
 	
 	
 	
 	
 	
r:   c                     |st           j        j        j        }dd|gg dg}|r|                    dd|j        g           |                     |dg          }|D ]}d|_        |                                 d S )Nr   r   )r   z!=r   r   r   r   r   )ro   rp   rq   rr   r   r|  r   r   )rH   r   rJ   _filternotifiesr   s         r;   r   zCmfNotify.close_open_notifies  s     	2(+1I $	*&&&
  	5NNHdCF3444887H:8>> 	 	F$FMKKMMMM	 	r:   c                     |st           j        j        }|                     dd|gg dg          }|D ]}d|_        |                                 d S )Nr   r   )r   r   False)r   T)ro   rp   rq   r|  r   r   )rH   r   r  r   s       r;   r   z&CmfNotify.confirm_unconfirmed_notifies  st     	,(+I88$	*((($
8  
  	 	F#FKKMMMM	 	r:   c           	         |j         dk    r,|j                                                                        }n(|j         dk    r|g}nt	          d|j                     d S |D ]y}t
          j                            |j        j	                  }||d         s6t
          j
                            |||j        d|j                                         d           zd S )NCmfPersonGrouprz   z,DEV: handle_mention_event unknown obj type: email_if_mentionsu   Вас упомянули в T)rJ   r   r   rY   r   )r   
rg_membersr   
all_nestedr[   ry   rz   r{   rq   rr   r   r   r   r~  lower)rH   rJ   event_personpersonsr   r~   s         r;   handle_mention_eventzCmfNotify.handle_mention_event-  s     "&666"-2244??AAGG$33#nGG^\E\^^___F 
	 
	F *@@QQK"+6I*J"))XNC4D4J4J4L4LNN *    	
	 
	r:   )	only_once
system_jobc                 r    t           j                                        }|                    | ||           d S )N)rL   )ry   CmfPluginMailBoxget_local_mailboxsend_message)rctp_torL   rO   rA   r|   mail_boxs         r;   rG   zCmfNotify.process_emailE  s9     *<<>>gz7CCCCCr:   c                 n    t           j                                        }|                    | |           d S N)ry   CmfPluginSMSGateget_local_smsgater  )r_   r   rA   r|   sms_gates        r;   r\   zCmfNotify.process_smsK  s4     *<<>>eW-----r:   c                 0   t           j                            |j        dg          }|rg|j        r`t          |d          rP|j                            d          r6|                    |j	        d          sd|j
         d|j         d	|j         S |j        S )
Nr   r   r   ztask.sdr   )project	role_code/z/?obj=:)ry   rz   r   r   r   rx   r   r   in_project_rolerh   	ui_moduler   rs   r   )rH   r   rJ   r   s       r;   _calc_notify_obj_linkzCmfNotify._calc_notify_obj_linkQ  s    !%%)9<.%QQ 	E6$ 	En)E)E 	E#JZJeJefoJpJp 	E&&szE[&\\	EDs}DDCKDD#(DDDr:   c           
         ddl m} ddlm} |s|g fS |                    ddg           |j        s|g fS |j        j        dk    r|g fS t          j        	                    |j
        dg          }|j        r|g fS |j        j        d	k    r|g fS |j        j        d
k    r|g fS  ||d          }g }|                    dddd          D ]}	|	j        	                    d          }
t          j        	                    |
g d          }|r:|j        j                            d          r|j        |k    r/|j        j        |k    rt&                              d|
d           |j        dk    rt&                              d|
d           	 |                                D ]}|j                            dd          d         } ||                                |          }|                    d|           |                    |           |                    d          }|                    d           |                    d d!d"| i          }|                    |           |                    |           |	                    |            # t>          $ r3}t&                              d#|j         d$| d%|            Y d }~d }~ww xY wtA          |          |fS )&Nr   BeautifulSoup)MIMEApplicationz,project.servicedesk_email_notify_attach_typezproject.logic_prefixzproject.servicedeskr   r   1_AUTH_LINK2_SECURE_LINKlxmldivzapp-tinymce-card-previewT)classdata-attach-id)attrsr  )full_path_fileparent.parentst_sizer   r]  u@   Не могу прикрепить вложение attach_id = r  i   u=    так как его размер превышает 80Мб r  r   r   r   
Content-IDspanu   Вложение: arw   cid:u@   Не удалось приложить файл к письму     вложения из r  )!bs4r  email.mime.applicationr  rv   r  r   ry   rz   r   r   r   $servicedesk_email_notify_attach_typefind_allr  rp  rh   rq   r   logging	exceptionr  infoget_contentr   rsplitrT  
add_headerr   new_tagreplace_with	Exceptionr4   )rH   rJ   email_body_htmlr   r  r  r   soupemail_attaches
attach_tag	attach_idattachattachment_bytefilename
mime_imageattach_linkattach_link_hrefr"  s                     r;   _handle_html_attachzCmfNotify._handle_html_attachY  s    	&%%%%%:::::: 	'"B&&GI_`aaa{ 	'"B&&;#'<<<"B&& !%%)9<.%QQ 	'"B&&;;}LL #B&&;;NN"B&& }_f55--?Ymq5r5r-ss  	  	J"(,,-=>>I)--i@n@n@n-ooF }'22<@@MS((V]-AS-H-H%%&l]f&l&l&lmmm~ 000  `T]  `  `  `  a  a  a'-'9'9';';  O.3::3BB2FH!01E1E1G1Gh!W!W!WJ)),AAA"))*555"&,,v"6"6K&&';<<<'+||CHYxHYHY?Z|'['[$$++H555&&'7888++K888   !!  #Tekep  #T  #T  JM  #T  #T  QR  #T  #T  U  U  U 4yy.((s   DJ
K$(KKreturnc           
         ddl m} ddl}ddl}ddlm} ddlm}  ||          }g }	|                                5 }
|	                    d          D ]b}|j
                            d          }t          j                            |dd	g
          }|r:|j        j                            d          r|j        |k    r/|j        j        |k    rt"                              d|d           	 |                                D ]z}|j                            dd          d         } ||                                |          }|                    d|           |	                    |           d| |j
        d<   {-# t2          $ r* t"                              d|j         d| d           Y `w xY w	 ddd           n# 1 swxY w Y   t5          |          |	fS )uu  
        Заменяет все ссылки на изображения на ссылки вида <img src="cid:%imagename%">
        Возвращает текст письма и словарь заMIMEенкоженных картинок вида {ключ - имя файла картинки: значение - MIMEэнкоженная картинка}
        r   )ImageNr  )	MIMEImageimgr  r  r  r  r]  uF   Не могу прикрепить изображение attach_id = r  r  r   r   r  r  r  srcu	   Файл r  u/    не является изображением)PILr  tempfilebase64r  r  email.mime.imager  TemporaryDirectoryr  r  r   ry   rp  rh   rq   r   r  r  r  r   r  rT  r  r   r  r4   )rH   rJ   r  r  r  r  r  r  r  email_imagestmp_dirimg_tagr  r  r  r  r  s                    r;   _handle_html_imgzCmfNotify._handle_html_img  s    	%%%%%%......}_--((** 	g==//  #M--.>??	-11)EUWfDg1hh !!=+66|DD!,,1E1L1L))*vgp*v*v*vwww 
+1+=+=+?+? A A#2#7#>#>sA#F#Fr#J%.Y/C/C/E/EH%U%U%U
"--lHEEE$++J777/@h/@/@e,,A !   %%  'K&+  'K  'KVY  'K  'K  'K  L  L  LH'	 	 	 	 	 	 	 	 	 	 	 	 	 	 	. 4yy,&&s7   B1G.BE?=G?0F3/G2F33GG
Gc                     |                      ||          \  }}|                     |||          \  }}|                    |           |                     |          }d| d| d}||fS )Nz<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
            <html>
                <head>
                    <style>
                        za
                    </style>
                </head>
                <body>
                    z+
                </body>
            <html>)r  r  extendclean_junk_attr_tags)rH   r  email_body_cssrJ   r   email_attachmentsemail_attachments2rL  s           r;   prepare_email_textzCmfNotify.prepare_email_text  s    -0-A-A#-W-W**.1.E.Ec?\b.c.c++  !344422?CC
 )	
 
 &
 
 
 %%%r:   htmlc                    ddl m} t          j        rdt          j         nd}dt          j         | } || d          }|                    d          D ]g}|                    d          }|                    d	
          }|r8|                    d| d|           }||_	        |
                    |           hd                    d |j        j        D                       S )Nr   r  r  r#   zhttps://r  r  rw   T)r   r  )rw   c                 ,    g | ]}t          |          S r9   r4   r!  xs     r;   r#  z0CmfNotify.simplify_for_email.<locals>.<listcomp>      ;;;1A;;;r:   )r  r  r   EXTERNAL_PORT_HTTPSAPP_FQDNr  r   get_textr  stringr  rA  bodychildren)	r  r  	port_spec	base_hrefr  linkrw   r   new_links	            r;   simplify_for_emailzCmfNotify.simplify_for_email  s   %%%%%%8>8RZ42444XZ	;v;	;;	}T6**MM#&& 	, 	,D88F##D==t=,,D ,<<Y2G2G2G2G<HH"&!!(+++ww;;	(:;;;<<<r:   c                 T   ddl m}  || d          }|                    d          D ]*}d |j                                        D             |_        +|                    ddg          D ]}|                                 d                    d	 |j        j        D                       S )
Nr   r  r  Tc                 P    i | ]#\  }}|                     d           |dk     ||$S )zdata-contenteditable)r   )r!  kvs      r;   
<dictcomp>z2CmfNotify.clean_junk_attr_tags.<locals>.<dictcomp>  s<    uuu$!QALLQXDYDYu]^bs]s]sA]s]s]sr:   svgpathr#   c                 ,    g | ]}t          |          S r9   r  r  s     r;   r#  z2CmfNotify.clean_junk_attr_tags.<locals>.<listcomp>  r  r:   )	r  r  r  r  rD  	decomposerA  r  r  )r  r  r  tagr  s        r;   r  zCmfNotify.clean_junk_attr_tags  s    %%%%%%}T6** ==&& 	v 	vCuu#)//*;*;uuuCII==%11 	 	CMMOOOOww;;	(:;;;<<<r:   c                    |j         sd S |j         j        }g d}|j        r't          j                            |j        |          }n!t          j                            d|          }t          |j                  r|j        d         nt                      }| 	                    ||          }t          d           | |_        |                     |d	                   |d	<   t          j                            |||d	         |j        j        |j        j        |j        j                  }t          j                            |||d	         |j        j        |j        j        |j        j                  }	|                     |	|j        ||          \  }
}t          j                                        }|                    ||
||
           d S )N)tmplt_subjecttmplt_body_htmlu	   body_сssr  r   )rs   r   r   )r   rJ   TrR   r   )rL   r  )r*   rr   r   ry   r   r   rZ   r8   r4   r  rX   r"   r  render_templater   r  	   body_сssr  r  r  r  r  )rH   r   rJ   rK   _fieldsrN   rY   rw   email_subjectr  rO   r  r  s                r;   r   zCmfNotify.send_email_notify  s   " 	F%+AAA# 	Z.2263KT[2\\HH.228HQX2YYH%(%9%9Dfob!!suu ((C(@@*D999A4AA,,S[99F/??KK"($  !1AAKK$*$  ),(>(>PXPbdgio(p(p%
%*<<>>gz=\mnnnnnr:   c                    |j         st          d|j         d           d S t          d           |j         }|j        }| d| }|j         j        }t          j        	                                }|
                    ||           d S )NrV   rW   TrR   rU   )r(   r[   r   rX   r   r   rr   ry   r  r  r  )rH   r   rJ   r]   r^   r   r_   r  s           r;   r   zCmfNotify.send_sms_notify%  s    " 	 yvGW  y  y  yz z zF---@v@@{""S""#)*<<>>eW-----r:   z	@minutely)r  r  schedulec            
         t           j                            ddgg dg dg          }d |D             }	 t           j                            g ddd	d
t	          j                    t          d          z
  gg ddd|gggdgd	g          }|sd S t          d|j         d|            g d}d }|j	        r"t                              |j	        d|          }|j        rl	 t          d           t           j                            ||           d|_        n4# t          $ r'}t                               d|            Y d }~nd }~ww xY w|j        rl	 t          d           t           j                            ||           d|_        n4# t          $ r'}t                               d|            Y d }~nd }~ww xY wd|_        |                                 |j                                         )Nz--r   r   )r   r   T)r   r   c                     h | ]	}|j         
S r9   )r   )r!  rJ   s     r;   	<setcomp>z1CmfNotify.celery_minutely_hook.<locals>.<setcomp>:  s    @@@3CJ@@@r:   TORcmf_modified_at<   )minutesINr   )r   r   order_byuB   Обработка отправки уведомлений для r  )rq   rs   r   r   r  r   r   rh   zparent.logic_prefix
cmf_author
logic_typedeadliner   r0  listsreleasesaffected_versionsstory_pointr   )include_deletedr   u   Отправляем СМСz"models.CmfNotify.send_sms_notify: u   Отправляем emailz$models.CmfNotify.send_email_notify: )ry   r   slistr   r   rl   r   printrq   r   r   get_obj_by_idr   r   sms_doner  r  r  r   r   
email_doner   r   dpcommit)rA   r|   force_objectsforce_object_idsr   r   rJ   r"  s           r;   celery_minutely_hookzCmfNotify.celery_minutely_hook3  s   
 (..tX6F7Q7Q7QSmSmSm6n / p p@@-@@@&	%))***&X\^^iPQ>R>R>R-RS...t%562 e'8&9 * ; ;F  lW]W`lldjllmmm  F C} `++FM4X^+__' PP7888$44VSAAA&*FOO  P P P%%&N1&N&NOOOOOOOOP) RR6777$66vsCCC(,F%%  R R R%%&PQ&P&PQQQQQQQQR#FKKMMMIM&	s0   "6D 
E
#EE
6F 
F=F88F=r9   )Nr#   NFFr   NNr  )NN)r  N)5r0   r1   r2   r   r  code_prefix_optionsjinja2FileSystemLoaderosr  rA  r   PROJECT_DIR_loaderEnvironmentrC   r	   r   api_methodsr   r<   classmethodrP   r`   r   r   r   r   r4   r   r  rR  rk  r  r  r   r   r  staticmethodcmf_deferred_jobrG   r\   r  r  r  r  r  r  r   r   r4  __classcell__)r  s   @r;   r   r   	   s       GIKH%%	f(*<	=	=rw||FL^`o?p?pqs sG HX##//h//J&2 6
 6
 6
 
K $ $ $ $ $ $ $ Y$L V V [V F F [F 3 3 [3j @BHMFJm m m [m^ 6 6 [6p   [, 3    [4 \S \ \ \ [\| q^3 q^ q^ q^ [q^f	 ' ' ' ['R &*$tV V V# V V V [Vr
 
 
 
 
    ["    [   [. 666D D 76 \D 666. . 76 \.   [ D) D) [D)N %' %' %' [%'N & & [&( = = = = = \= =3 =3 = = = \= 'o 'o ['oR . . [. LLL, , ML \, , , , ,r:   r   N)r   r   r   uuidr   dataclassesr   cmf.include
cmf.fieldsr	   r
   r   r   r9   r:   r;   <module>rF     s    2 2 2 2 2 2 2 2 2 2       ! ! ! ! ! !     7 7 7 7 7 7 7 7 7 7X X X X X
$ X X X X Xr:   