
    *.+h;                     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    ddg}t                                                      |z   S )Nmailboxzmailbox_folders.parent)r   save_preload_fields)selffieldsr   s     r   r   z"CmfMailHandler.save_preload_fields   s)    56ww**,,v55r   c                     | j         j        r6| j         D ].}|j        | j        k    rt	          d| d| j         d           / t                      j        |i |S )Nu   Папка u;    не принадлежит почтовому ящику Tabort)r
   
is_changedparentr   	cmf_alertr   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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_items6   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_idrD   rE   rF   )r1   rL   r   s    r   get_list_type_from_addresszECmfMailHandler.get_mail_list_type.<locals>.get_list_type_from_addressN   s    ?c&:::!!$,///3///!!###,T_===+DO<UCC,T222+D1%884r   rN    )	r   r1   r7   rP   
email_listmail_list_typer4   	subdomainrL   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    заблокирован!    )personr@   msgpriority)load_fieldsr<   CmfPersonGroupadmin_group
rg_members
all_nestedr#   	cmf_ownerextend	CmfNotifyplace_notify)r   address	admin_grpadminsrY   s        r   "_loop_detector_notify_responsiblesz1CmfMailHandler._loop_detector_notify_responsiblesn   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   , адрес отправителя совпадает с адресом почтового ящикаr;   blacku$   , email в черном спискеu8   , детектирована почтовая петля)rD   REDIS_DBr   loggergglobal_settingsemail_loop_detector_thresholdexistsintr   decoderh   r1   inforU   )	r   re   redis_dbrn   loop_detected	thresholdloop_keynum_of_mailsrS   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                 
   |                      t          |j        j                            rd S | j        dk    r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         }d
}|j        p|j        j        d d         pd}	|rZt&                              d| d|            t                              |||j                  }|                                 d	}n| j        j        s|                    | j        d          rwd }
ddlm} t?          |                     |                                 !                                j"                  #                                $                                          }tK          |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tZ          .                    d)| ||	           ||_        |                    d	*           |sd S |/                    |j        d+g,          }t          j0        1                    |g d-.          D ] }|j2        r|j2        d/ |D             v r|j2        stg          d0| d1d	2           |4                                }|rt          0                    ||j        |j2        3          }|r||_        tk          |6                                d4          5 }|7                    |           d d d            n# 1 swxY w Y   |                                 |j        8                    ||           |j        j                            d	*            d S d S )5Ncreate_or_commentin_reply_to.handle_objreferences.handle_objORr1   ILIKElogin)r   TF)r   r@   r1   servicedesk_allow
user_localemail_if_authoremail_if_self_changes)r&   z-cmf_created_at)order_byr   d   u   <Без темы>u6   Создали комментарий в задачу u    из письма )
cmf_authorr#   textzsdesk-client:default)rF   	role_codec                 @    d                     d | D                       S )Nz, c              3   ^   K   | ](}|d          r|d           d|d          dn|d         V  )dS )r@    (r1   )NrQ   ).0ds     r   	<genexpr>zICmfMailHandler.handle_new_mail.<locals>.format_json_to.<locals>.<genexpr>   sQ      $q$qdeai%_&	%B%BQwZ%B%B%B%BUVW^U_$q$q$q$q$q$qr   )r0   )json_tos    r   format_json_toz6CmfMailHandler.handle_new_mail.<locals>.format_json_to   s$    99$q$qip$q$q$qqqqr   )datetime<   z(UTCz+03d:02dr   z%d.%m.%Y %H:%M:%SuE   <table class='mail-header'>
                    <tr><th>От</th><td>r   u9   )</td></tr>
                    <tr><th>Кому</th><td>u:   </td></tr>
                    <tr><th>Копия</th><td>u8   </td></tr>
                    <tr><th>Дата</th><td> z,</td></tr>
                    </table><br/>)r#   r@   r   r   ra   
logic_typerequest_typeu   Создали задачу zWCmfMailHandler.handle_new_mail(%s): Skip task creation from %s. Not allowed! subject=%s)	only_dataext_id)obj_idr   )r@   full_path_filer   urlurl_previewurl_preview_img)r#   r   c                     g | ]	}|j         
S rQ   )r   )r   objs     r   
<listcomp>z2CmfMailHandler.handle_new_mail.<locals>.<listcomp>  s    >e>e>ecsz>e>e>er   u   DEV: Fatal. Вложение u    не имеет ext_idr    )r#   r@   r   rb)9r{   r   	mail_fromrA   handler_typer\   in_reply_to
handle_obj
referencesr<   	CmfPersonr   
obj_authorcreate_userr%   schedule_deferred_jobregister_sdesk_clientr#   rC   ro   current_userCmfTaskfind_related_tasksr@   r   debug
CmfComment	text_htmlservicedesk_publicin_project_roler   rs   now
astimezonetzinfo	utcoffsettotal_secondsdivmodcmf_created_atstrftimemail_from_namemail_to_jsoncc_jsonobj_logic_typer   loggingwarningattach_listCmfAttachmentr>   r   r$   	get_rfileopentmp_readonly_pathupload_stream_file_replace_attachment)r   mailcommentr   rr   r1   tasks
in_commentmail_subjectr   r   utc_offset_secondshourminuteformatted_tz
created_dttext_header_tableall_attachments
attachment	cmf_rfilenew_attachmentattachment_bytes                          r   handle_new_mailzCmfMailHandler.handle_new_mail   s   !!"9$.:N"O"OPP 	F 333GJ68OPQQQ D$4$? !-8

   A| %&\
  )--dWgt~<^ahjqsw  tB  aC  6D-  E  EJ -!_
 L$"2 L,#--&*$$(*. .  
 !!!%f&6&L,0KN,@5'+JL L L L ,^
  * 99$)/UfTg9hh *!&qJJ9T	(=TATL /4vQ[vvptvvwww ++)% ,  
 !

/ %4!11$+Qg1hh%4r r r
 .-----%(hllnn6O6O6Q6Q6X)Y)Y)c)c)e)e)s)s)u)u%v%v"%&8B&>CCf?d???&????!06AACCLLM`aa
%%*.*=%% %%AE%% %%.<nT=N.O.O%% %% 1?t|0L0L%% %% /9	%% %% <H	%% %% %%! $^^;% +T^-AA)(#2!%!6 , 
 

 \z\\VZ\\]]]!!!!m*l4 4 4 )DOIII%%% (44JMS[R\4]]O %277t M] M] M]7 ^ ^ E E
$ ):>e>eUd>e>e>e)e)e!( oajaaaimnnnn&0022	 E%+%9%9)'_)0 &: & &N
  6.5-i99;;TBB Ko&99/JJJK K K K K K K K K K K K K K K"'')))")==j.YYY")/44t4DDD{ 43TE Es   S22S6	9S6	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
   r9   )r
   r   N)
zparent.servicedesk_publicrF   r   r~   r   r   r   r   r   zmailbox.emailr:   u&   Обрабатываем письмо u    с помощью )
r   r<   r   r>   r#   mailbox_folderrC   ro   r   r   )r   r   available_handlershandlers       r   new_mail_handler_hookz$CmfMailHandler.new_mail_handler_hook,  s    ? 	F#277C-&t/B/E.FG222d d d 8 
 
 * 	 	GGG_T__V]__```##D)))EE	 	r   )NN)__name__
__module____qualname__classmethodr   r   r%   rU   rh   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AE AE AEF   [    r   r   N)cmf.includemodules.mail2.fieldsr   pathlibr   modules.auth.models.emailr   r   rQ   r   r   <module>r      s        1 1 1 1 1 1       = = = = = =| | | | |%4 | | | | |r   