
    Vgi>                     \    d dl  d dlmZ d dlmZ d dlmZ  G d dej                        Zy)    )*)cmf_mail_handler)Path)normalize_email_addressc                   l     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 )CmfMailHandlerc                     |sg }|dk(  r|j                  dd       x}r|dd|gg}ng S |dk(  r|xr |j                  dd       }|dd|gg}t        |   |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*..|TBBzB ;Z"@A	"44%N-*;*;K*NI{C;<Fw)*=tf\itmstt    c                 .    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w*,v55r   c                    | j                   j                  rH| j                   D ]9  }|j                  | j                  k7  st	        d| d| j                   d       ; | j
                  j                  rR| j
                  rF| j                  r:| j                  j                  dk(  r!| j                  j                  st	        d       t        | $  |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88t||+A3.ijnjvjviwx  AE  FF &&4+;+;KKDKK$<$<@U$U66  }  ~w|T,V,,r   c                 |     d }dd fd}d} ||      }|r|}|s ||      }|D ]  } ||      }|s |S  |S )u  
        Проверяет находится ли адрес электронной почты в черном/ белом списках, либо в списке зацикленной почты
        Алгоритм сложный, одним запросом сделать малореально
        https://bcrm.carbonsoft.ru/project/Document/DOC-013203#spec-nastrojka-elektronnoj-pochty
        c                     | j                  d      d   }|j                  d      }g }t        |      D ](  \  }}|j                  dj                  ||d               * |S )N@.)split	enumerateappendjoin)emaildomainparts
subdomainsiparts         r   get_subdomainsz9CmfMailHandler.get_mail_list_type.<locals>.get_subdomains,   si    [[%b)F LL%E J$U+ 74!!#((59"567 r   Nc                    i }t         j                  j                  |       }t         j                  j                  dd|gddg      }|D ]u  }|j                  j
                  |vs$|j                  j                  j
                  dk(  s?|j                  j                  j
                  ||j                  j
                  <   w | r| j                  j
                  }nd}|t        j                  |<   y)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BK++00 $4 -0 1 E
 $ [
!,,0@@JDUDUDZDZD`D`biDi>H>O>O>T>T>Z>Z$Z__%:%:;[
 #JJ,,	 	.>C  +r   c                 h   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 y 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__==++DOO<UCC,,T22++D1%88r   rT    )	r   r7   r=   rV   
email_listmail_list_typer:   	subdomainrR   s	   `       @r   get_mail_list_typez!CmfMailHandler.get_mail_list_type%   sg    		?0	 
 4E:'J'.J' 	7	B

 r   c                 n   | j                  dg       t        j                  j                         }|j                  j                         }| j                  j                  |vr%|j                  | j                  j                         |D ])  }t        j                  j                  |d| ddd       + y )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	%%002{{$$.MM$++//0 	
F))UV]U^^xy	 * 
	
r   returnc                 4   t         j                  }| j                  j                  }d}t        j
                  j                  }|r[d| }|j                  |      rEt        |j                  |      j                               }||k\  rd}||k(  r| j                  |       || j                  j                  k(  r|j                  d| d       y| j                  |      }|dk(  ry|dk(  r|j                  d| d       y|r|j                  d| d	       yy)
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C	'y1Hx("8<<#9#@#@#BC9,$(M#y0??H dll(((KKB7)  Lr  s  t 009W$w&KKB7)KopqKKB7)  LD  E  Fr   c                    |j                  g d       | j                  t        |j                  j                              ry | j
                  dk7  ry d }d }|j                  ddg       |j                  r-|j                  j                  r|j                  j                  }n7|j                  r+|j                  D ]  }|j                  s|j                  } n t        j                  j                  ddd|j                  gdd|j                  gg	      }|s| j                  }|s| j                  r|j                  j                  }t        j                  |||d
dd
d
      }|j                          t        t        j                  j                   | j"                  j$                  j                  |gg       |st&        j(                  }|s=t        j*                  j-                  |j.                  j                  dg      }|r|d   }|j.                  xs |j0                  j                  d d xs d}|rOt&        j3                  d| d|        t        j5                  |||j6                        }|j                          n| j"                  j8                  dk7  s@| j"                  j:                  s*| j<                  s|j?                  | j"                  d      r{d }	ddl m }
 tC        |
jE                  |
jE                         jG                         jH                        jK                         jM                               }tO        |dz  d      \  }}d|dd|dd }|jP                  j                  jG                         jS                  d!      }d"|jT                   d#|j                   d$ |	|jV                         d% |	|jX                         d&| d'| d(}t        j+                  | j"                  |||j6                  j                  z   ||| jZ                  | j\                  )      }t&        j3                  d*| d|        |j                          nt^        ja                  d+| ||       ||_        |j                  d
,       |sy |jc                  |j$                  d-g.      D ch c]  }|jd                   }}|xs |}t        jf                  ji                  |g d/0      D ]4  }|jd                  stk        d1| d2d
3       |jd                  |v r0|jm                         }|s(t^        ja                  d4d5| d6|jn                   d7       jt        jg                  |||j.                  |jd                  8      }tq        |js                         d9      5 }|ju                  |       d d d        |j                          |jw                  ||       ty        |t        j4                        s	|xj0                  t{        |j}                               z  c_        7 |j~                  r|j                  d
,       y y c c}w # 1 sw Y   xY w):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                 2    dj                  d | D              S )Nz, c              3   L   K   | ]  }|d    r|d     d|d    dn|d     yw)rF    (r7   )NrW   ).0ds     r   	<genexpr>zICmfMailHandler.handle_new_mail.<locals>.format_json_to.<locals>.<genexpr>   s8      m`a!F)AfI;b7A!>QRSZQ[![ ms   "$)r6   )json_tos    r   format_json_toz6CmfMailHandler.handle_new_mail.<locals>.format_json_to   s    yy mel 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_dataext_id)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_listr   CmfAttachmentrD   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
attachmentattachments_ext_idsattachment_parent	cmf_rfilenew_attachmentattachment_bytes                          r   handle_new_mailzCmfMailHandler.handle_new_mail   s    _ 	`!!"9$..:N:N"OP 33
24KLM 0 0 ; ;))44J____ <<!"J	 %%))$'4>>8Z]dfmoso}o}\~1)  A
Jd..NN((E))"&  $&* * J OO!&"2"2"H"H(,(<(<ug'FHJ  NN55diiooQbPc5dE"1X
yyPDIIOODS$9P=PGGLZLXklpkqrs''%!^^ ( G
 LLNKK$$(=={{----))$++I_)`n
 *!$X\\(,,.2K2K2M2T2T%U%_%_%a%o%o%q!r!"4":B?LD&!$tAfS\;L,,22==?HHI\]J%&&*&9&9%:"T^^<L M**89J9J*K)L M,,:4<<,H+I J**4Q|n E	!!  {{! ')=)==%$..!22 ( 
J GG2:,>QRVQWXYOOOOij,0 %		D	! 1;0F0Fjmmemdn0F0oq",Jq q#1z !..334 IY3 Z 	SJ$$9*E\]eij  $77",,.I8AjF[F[E\ ]$ %& #11%(__!((	 2 N i113T: Co11/BC!11*nM+V->->?!&&#n.O.O.Q*RR&9	S< ''""T"2 (Iq8C Cs   0YYY	c                 $   |j                   ry t        j                  j                  dd|j                  gddd|j
                  j                  ggg dggg d      }|D ]/  }t        j                  d	| d
|        |j                  |        y  y )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    ??#2277C-&t/B/B/E/E.FG2- 8 
  * 	GGG<TFBUV]U^_`##D)	r   )NN)__name__
__module____qualname__classmethodr   r   r+   r[   rn   boolr   r   r   __classcell__)r   s   @r   r   r      sU    u u6	-KZ
"(D (TU3n  r   r   N)cmf.includemodules.mail2.fieldsr   pathlibr   modules.auth.models.emailr   r   rW   r   r   <module>r      s&     1  =U%44 Ur   