
    	mi>                     X    d dl T d dlmZ d dlmZ d dlmZ  G d dej                  ZdS )    )*)cmf_mail_handler)Path)normalize_email_addressc                   x     e Zd Zed fd	            Z fdZ fdZd Zd Zde	fdZ
d	 Zed
             Z xZS )CmfMailHandlerNc                     |sg }|dk    r"|                     dd           x}r|dd|gg}ng S |dk    r|o|                     dd           }|dd|gg} t                      j        |f||d|S )Nmailbox_folders
mailbox_id	parent_id=obj_request_type)filterobject_fields)getsuperfield_options_list)clsrelation_field_namer   r   kwargsr   r   	__class__s          *./modules/mail2/models/cmf_mail_handler.pyr   z!CmfMailHandler.field_options_list   s     	F"333*..|TBBBz  ;Z"@A	"444%N-*;*;K*N*NI{C;<F)uww)*=tf\ittmsttt    c                 R    g d}t                                                      |z   S )N)mailboxzmailbox_folders.parentparent.servicedesk_publicparent.logic_prefix)r   save_preload_fields)selffieldsr   s     r   r   z"CmfMailHandler.save_preload_fields   s)    jjjww**,,v55r   c                 D   | j         j        r6| j         D ].}|j        | j        k    rt	          d| d| j         d           /| j        j        r9| j        r2| j        r+| j        j        dk    r| j        j        st	          d            t                      j	        |i |S )Nu   Папка u;    не принадлежит почтовому ящику Tabortproject.servicedesku   Отправитель письма будет добавлен в пользователи, но не будет добавлен в клиенты проекта.)
r
   
is_changedparentr   	cmf_alertcreate_userlogic_prefixservicedesk_publicr   save)r   argsr   fr   s       r   r+   zCmfMailHandler.save   s    * 	F) F F8t|++xAxxjnjvxx  AE  F  F  F  F& 	~4+; 	~K	~$(K$<@U$U$U6 %V  }  ~  ~  ~uww|T,V,,,r   c                      d }dd fd}d} ||          }|r|}|s ||          }|D ]} ||          }|r n|S )u  
        Проверяет находится ли адрес электронной почты в черном/ белом списках, либо в списке зацикленной почты
        Алгоритм сложный, одним запросом сделать малореально
        https://bcrm.carbonsoft.ru/project/Document/DOC-013203#spec-nastrojka-elektronnoj-pochty
        c                     |                      d          d         }|                     d          }g }t          |          D ]5\  }}|                    d                    ||d                               6|S )N@.)split	enumerateappendjoin)emaildomainparts
subdomainsiparts         r   get_subdomainsz9CmfMailHandler.get_mail_list_type.<locals>.get_subdomains,   s~    [[%%b)F LL%%E J$U++ 7 74!!#((59"5"56666r   Nc                 b   i }t           j                            |           }t           j                            dd|gddg          }|D ]C}|j        j        |vs|j        j        j        dk    r|j        j        j        ||j        j        <   D| r| j        j        }nd}|t          j
        |<   dS )us   
            Кэшируем списки email по проекту этого обработчика
            )r&   r&   INzparent.typer   r    whiteN)modelsCmfEmailListlistCmfEmailListItemnamevaluer&   typeidAPPcache_email_list)projectemail_items_dataemail_listsitems
email_item	cache_keys         r   _cache_list_itemsz<CmfMailHandler.get_mail_list_type.<locals>._cache_list_items:   s      " -22'2BBK+00 $4 -0 1  E
 $ [ [
!,0@@@JDUDZD`biDiDi>H>O>T>Z$Z_%:; !#J,		 	.>C +++r   c                 B   j         t          j        vr j                   d t          j        vr
              | t          j        j                  v rt          j        j                  |          S | t          j        d          v rt          j        d          |          S d S N)
project_idrJ   rK   rL   )r7   rR   r   s    r   get_list_type_from_addresszECmfMailHandler.get_mail_list_type.<locals>.get_list_type_from_addressR   s    ?c&:::!!$,///3///!!###,T_===+DO<UCC,T222+D1%884r   rT    )	r   r7   r=   rV   
email_listmail_list_typer:   	subdomainrR   s	   `       @r   get_mail_list_typez!CmfMailHandler.get_mail_list_type%   s    	 	 		? 	? 	? 	?0	 	 	 	 	 	 
 43E:: 	('J 	'..J'  	77	BB
 E r   c                 R   |                      dg           t          j                                        }|j                                        }| j        j        |vr|                    | j        j                   |D ])}t          j	        
                    |d| ddd           *d S )Nzparent.cmf_owneru>   Детектирована почтовая петля. Email u    заблокирован!    )personrF   msgpriority)load_fieldsrB   CmfPersonGroupadmin_group
rg_members
all_nestedr&   	cmf_ownerextend	CmfNotifyplace_notify)r   address	admin_grpadminsr_   s        r   "_loop_detector_notify_responsiblesz1CmfMailHandler._loop_detector_notify_responsiblesr   s    ,-...)5577	%0022{$..MM$+/000 	
 	
F))yV]yyy	 * 
 
 
 
	
 	
r   returnc                 N   t           j        }| j        j        }d}t          j        j        }|rqd| }|                    |          rWt          |	                    |          
                                          }||k    rd}||k    r|                     |           || j        j        k    r|                    d| d           dS |                     |          }|dk    rdS |dk    r|                    d| d           dS |r|                    d| d	           dS dS )
u   
        Проверяет можно ли создавать заявку по письму на основе email адреса
        https://bcrm.carbonsoft.ru/project/Document/DOC-013203#spec-nastrojka-elektronnoj-pochty
        Floop_detector_Tu(   Не принят email с адреса uf   , адрес отправителя совпадает с адресом почтового ящикаrA   blacku$   , email в черном спискеu8   , детектирована почтовая петля)rJ   REDIS_DBr   loggergglobal_settingsemail_loop_detector_thresholdexistsintr   decodern   r7   infor[   )	r   rk   redis_dbrt   loop_detected	thresholdloop_keynum_of_mailsrY   s	            r   address_forbiddenz CmfMailHandler.address_forbidden   s   
 <$%C	 	I111Hx(( I"8<<#9#9#@#@#B#BCC9,,$(M#y00??HHH dl(((KK  s7  s  s  s  t  t  t4 0099W$$5w&&KKp7pppqqq4 	KK  E7  E  E  E  F  F  F4ur   c                    |                     g d           |                     t          |j        j                            rd S | j        dk    rd S d }d }|                     ddg           |j        r|j        j        r|j        j        }n!|j        r|j        D ]}|j        r	|j        } nt          j
                            ddd|j        gdd|j        gg	          }|s| j        }|sz| j        rs|j        j        }t          
                    |||d
dd
d
          }|                                 t          t          j
        j        | j        j        j        |gg           |st&          j        }|s6t          j                            |j        j        dg          }|r|d         }|j        p|j        j        d d         pd}|rXt&                              d| d|            t                              |||j                  }|                                 n| j        j        dk    s0| j        j        s$| j        s|                    | j        d          rwd }	ddl m }
 tC          |
"                    |
"                                #                                j$                  %                                &                                          }tO          |dz  d          \  }}d|dd|dd }|j(        j        #                                )                    d!          }d"|j*         d#|j         d$ |	|j+                   d% |	|j,                   d&| d'| d(}t                              | j        |||j        j        z   ||| j-        | j.        )          }t&                              d*| d|            |                                 nt^          0                    d+| ||           ||_        |                    d
,           |sd S d- |1                    |j        d.g/          D             }|p|}t          j2        3                    |g d01          D ]Q}|j4        stk          d2| d3d
4           |j4        |v r)|6                                }|s(t^          0                    d5d6| d7|j7         d8           gt          2                    |||j        |j4        9          }tq          |9                                d:          5 }|:                    |           d d d            n# 1 swxY w Y   |                                 |;                    ||           ty          |t          j                  r/|xj        t{          |>                                          z  c_        S|j?        r|                    d
,           d S d S );N)	mail_fromcmf_created_atrF   textmail_from_name	text_htmlmail_to_jsoncc_jsoncreate_or_commentin_reply_to.handle_objreferences.handle_objORr7   ILIKElogin)r   TF)r   rF   r7   servicedesk_allow
user_localemail_if_authoremail_if_self_changes)r,   z-cmf_created_at)order_byr   d   u   <Без темы>u6   Создали комментарий в задачу u    из письма )
cmf_authorr&   r   r$   zsdesk-client:default)rL   	role_codec                 @    d                     d | D                       S )Nz, c              3   ^   K   | ](}|d          r|d           d|d          dn|d         V  )dS )rF    (r7   )NrW   ).0ds     r   	<genexpr>zICmfMailHandler.handle_new_mail.<locals>.format_json_to.<locals>.<genexpr>   sQ       m m`a!F)![AfI!>!>7!>!>!>!>QRSZQ[ m m m m m mr   )r6   )json_tos    r   format_json_toz6CmfMailHandler.handle_new_mail.<locals>.format_json_to   s$    yy m mel m m mmmmr   )datetime<   z(UTCz+03d:02dr   z%d.%m.%Y %H:%M:%SuA   <table class='mail-header'>
                <tr><th>От</th><td>r   u5   )</td></tr>
                <tr><th>Кому</th><td>u6   </td></tr>
                <tr><th>Копия</th><td>u4   </td></tr>
                <tr><th>Дата</th><td> z(</td></tr>
                </table><br/>)r&   rF   r   r   rg   
logic_typerequest_typeu   Создали задачу zWCmfMailHandler.handle_new_mail(%s): Skip task creation from %s. Not allowed! subject=%s)	only_datac                     h | ]	}|j         
S rW   )ext_id)r   
attachments     r   	<setcomp>z1CmfMailHandler.handle_new_mail.<locals>.<setcomp>  s.     q q q",Jq q qr   r   )obj_idr    )rF   full_path_filer   urlurl_previewurl_preview_img)r&   r    u   DEV: Fatal. Вложение u    не имеет ext_idr"   z%sz"CmfMailHandler.handle_new_mail(): (z) without rfile!!! Skip handle.)r   r&   rF   r   rb)@rb   r   r   r   rG   handler_typein_reply_to
handle_obj
referencesrB   	CmfPersonr   
obj_authorr(   r+   schedule_deferred_jobregister_sdesk_clientr&   rI   ru   current_userCmfTaskfind_related_tasksrF   r   debug
CmfCommentr   r)   r*   allow_non_project_clientsin_project_roler   ry   now
astimezonetzinfo	utcoffsettotal_secondsdivmodr   strftimer   r   r   obj_logic_typer   loggingwarningattach_listCmfAttachmentrD   r   r'   	get_rfile
_file_nameopentmp_readonly_pathupload_stream_file_replace_attachment
isinstancestrcreate_preview_tagr%   )r   mailcommentr   rr   r7   tasksmail_subjectr   r   utc_offset_secondshourminuteformatted_tz
created_dttext_header_tableattachments_ext_idsattachment_parentr   	cmf_rfilenew_attachmentattachment_bytes                          r   handle_new_mailzCmfMailHandler.handle_new_mail   ss    _ _ _ 	` 	` 	`!!"9$.:N"O"OPP 	F 333F
24KLMMM 	 0 ; 	)4JJ_ 	_  < !"JE %))$'4>8Z]dfmoso}\~1)  A  A
 	)J 	Hd. 	HN(E))"&  $&* *  J OO!&"2"H(,(<ug'FH H H H 	(J  	& N55dioQbPc5ddE &"1X
yPDIODSD$9P=P 2	0GGrZrrlprrsss''%!^ (  G
 LLNNNNK$(==={- >- > ))$+I_)`` >n n n
 *)))))!$X\\(,,..2K2K2M2M2T%U%U%_%_%a%a%o%o%q%q!r!r!"4":B??LD&;$;;;f;;;;L,2==??HHI\]]J!!&*&9!! !!=A^!! !!*8.9J*K*K!! !! -;N4<,H,H!! !! +5	!! !! 8D	!! !! !!  {! ')==%$.!2 ( 
 
J GGX:XXRVXXYYYOOOOij,0 0 0 %		D	!!! 	Fq q0:0F0Fjmemdn0F0o0oq q q#1z !.334 IY IY IY3 Z Z 	S 	SJ$ k]*]]]eijjjj $777",,..I % % %jF[ % % %& & & #11%(_!(	 2  N i1133T:: Co11/BBBC C C C C C C C C C C C C C C!!!11*nMMM+V->?? S!&&#n.O.O.Q.Q*R*RR&&' 	3""T"22222	3 	3s   T::T>	T>	c                    |j         rd S t          j                            dd|j        gddd|j        j        ggg dggg d          }|D ]9}t                              d	| d
|            |	                    |            d S d S )Nr   r   r   r
   r?   )r
   r   N)r   r   rL   r   r   r   r   r   r   r(   zmailbox.emailr   r@   u&   Обрабатываем письмо u    с помощью )
r   rB   r   rD   r&   mailbox_folderrI   ru   r   r   )r   r   available_handlershandlers       r   new_mail_handler_hookz$CmfMailHandler.new_mail_handler_hookD  s    ? 	F#277C-&t/B/E.FG222- - - 8 
 
  * 	 	GGG_T__V]__```##D)))EE	 	r   )NN)__name__
__module____qualname__classmethodr   r   r+   r[   rn   boolr   r   r   __classcell__)r   s   @r   r   r      s        u u u u u [u6 6 6 6 6	- 	- 	- 	- 	-K K KZ
 
 
"(D ( ( ( (TU3 U3 U3n   [    r   r   N)cmf.includemodules.mail2.fieldsr   pathlibr   modules.auth.models.emailr   r   rW   r   r   <module>r      s        1 1 1 1 1 1       = = = = = =U U U U U%4 U U U U Ur   