
    bEfi,                     j    d dl Z d dlmZ d dlmZ d dlZd dlmZ d dlT d dl	m
Z
  G d de
          ZdS )	    N)Path)rmtree)Template)*)	CmfEntityc                        e Zd ZdZ fdZdd fd
ZdefdZdefdZe	dd
e
de
de
fd            Zd
e
de
de
fdZd Zdd fd
Zd Zd Zde
fdZ xZS )
CmfMailboxu   
    TODO: разделить приём настроек, приём почты, отправку в Eva
    Частично сделано разделением CmfLeadMailbox и CmfMailbox.
    c                 N    t                                                      g dz   S )N)lead_mailboxestypeimap_serverparentz	parent.id)supersave_preload_fields)self	__class__s    $./modules/mail/models/cmf_mailbox.pyr   zCmfMailbox.save_preload_fields   s%    ww**,,/o/o/ooo    r   )depthc                   | j         j        r| j        j        s| j        | _         n2| j        j        r&| j         j        sd| j         j        v r| j         | _        | j        r_| j        j        rS| j                            d          d         }dddd}|                    |d          | _        | j        dk    rd| _        | j        r| j	        s| 
                                  t                      j        |d	|i|S )
u    Здесь не хватает поддержки исправления адреса: старый ящик не удалится. @googlemail.ruyandex)z	gmail.comr   z	yandex.rucustomzimap.mail.rur   )nameis_nullemailvaluer   splitgetr   
is_changedcmf_deletedrender_configr   save)r   r   argskwargsdomaintypesr   s         r   r&   zCmfMailbox.save   s   9 	#TZ%7 	#
DIIZ 	#	(9 	#cTY_>T>TDJ: 		2$)+ 		2Z%%c**2.F%$% E
 		&(33DIyI%%#1 ? 	!4#3 	!   uww|T99&999r   message_rawc                 (   |                     d          }|st          dd           d|vrt          d| d           |                     |          }|j        rt                              d           dS |                     d	g           t          | j                  d
k    r+t          d           t          
                    d           dS t                              d| d           | j        d
         }|                    |           dS )uh    Приём почту и вызываем "коллбэки" подключенных плагинов r   u   Не указан emailT)abortr   u!   Не корректный email: u   Удалось прикрепить сообщение к уже имеющейся сделке ещё на этапе создания!Nr   r   u`   Почтовый ящик не подключен ни к одной воронке продажu   У uf   , не нашлось родителя-сделки, отправим его в лидоловушку)r"   	cmf_alert_make_channel_messager   gdebugload_fieldslenr   loggingwarningreceive_email)r   r+   r'   r(   r   channel_msglead_mailboxs          r   r6   zCmfMailbox.receive_email)   sG   (( 	=/t<<<<eA%AANNNN00== 	GG  `  a  a  aF*+,,,t"##q((xyyyOO~F	  Jk  J  J  J  	K  	K  	K*1-"";/////r   c                 j   |                     d          }|s.t                              d|                                           nt	          |t
                    rt          |          dk    ru|                    dd                              dd          }t          |          dk    r3t                              d|t          |                     |dd         }||d<   |                     d	           |d
         |                     d
           |d	         i                     d|d
          d|d	                    }t          	                    | ||d         |d         dt          j
                             |d                   |          }|                                 |
J d            |S )u    Делаем всё что можем с ChannelMessage - создаём и парсим сырые данные для отображения в вебе 
message_idzMESSAGE WITHOUT ID: %s@   < >uh   Динный внешний message_id %s (%d символов), обрежем до 64 символовNbodysubjectTz

r   in)r   )channelr+   r:   	client_idmessage_flowperson_fromtextu*   Не создалось сообщение)r"   r4   r5   items
isinstancestrr3   replacemodelsCmfChannelMessage	CmfPersonr&   )r   r+   midrF   r7   s        r   r/   z CmfMailbox._make_channel_message=   s   ool++ 	,OO4k6G6G6I6IJJJJS!! 	,c#hhmm++c2&&..sB77C3xx"}}  !K  MP  RU  VY  RZ  RZ  [  [  [#2#h(+K%'''Y)?	***K,?
 #d{9-HH;v3FHH
I
I 	 ..#"<0!'*(,,;w3G,HH / 
 
 	&&(T&&&r   r   rC   client_secretrefresh_tokenc                     t           j                            g ddd|gg dg          }|st          d          t	          |          dk    rt          d          |d	         }|                    | ||           d
S )up    Уровень 1: валидация входящих данных и текущего состояния БД )r   z!=Nr   ==)rP   rR   N)filteru   Не найдены почтовые ящики, для которых была начата, но не закончена настройка   u   Найдено больше одного почтового ящика, с незаконченной настройкой, удалите одинr   N)rK   r	   list
IndexErrorr3   setup_oauth_credentials)rC   rO   rP   mailbox_typeunconfigured_mailboxesmailboxs         r   receive_oauth_credentialsz$CmfMailbox.receive_oauth_credentials[   s     "(!2!7!7!!!T<()))@
!7 " "
 & 	n  m  n  n  n%&&**  s  t  t  t(+''	=-PPPPPr   c                     |||J |                      g d           || _        || _        |                     |           |                                  dS )u9    Уровень 2: модификация объекта N)r   rC   rP   )r2   rC   rP   _update_oauth_secretsr&   )r   rC   rO   rP   s       r   rW   z"CmfMailbox.setup_oauth_credentialsj   sg    $)B}G`G`G`???@@@"*""=111		r   c                    | j         j        r"t                              d| j                   dS d| j         j        vr(t                              d| j         | j                   dS d| j         j        v r(t                              d| j         | j                   dS | j                             dd          \  }}t          d| d	|           S )
u   
        Формируем из email-адреса путь к его папке с конфигами.
        :return: Path or None
        u(   Не указан email у ящика %sNr   u<   Некорректный email без @: %s у ящика %sz..uD   Некорректный email с двумя ..: %s у ящика %srT   z/var/lib/eva-app/mail//)	r   r   r4   r5   idr    errorr!   r   )r   	user_nameservers      r   	_mail_dirzCmfMailbox._mail_dirt   s    
 : 	OOFPPPF
(((MMXZ^ZdfjfmnnnFTZ%%%MM`bfblnrnuvvvF J,,S!44	6AVAAiAABBBr   F)forcec                    |                      dg           t          d| j                    |                                 }|rt	          |           n t
                              d| j                    t                      j        |d|i|S )ub    Нельзя тут использовать return, иначе не вызовется super()! r   u   Удаляем ящик u5   Не удалили настройки ящика! %sre   )	r2   printr   rd   r   r4   r5   r   delete)r   re   r'   r(   mail_dirr   s        r   rh   zCmfMailbox.delete   s    '###555666>>## 	a8OOSUYU_```uww~t;5;F;;;r   c                    |                                  }|s"t                              d| j                   dS t	          d| j                    t          d          5 }t          |                                          }ddd           n# 1 swxY w Y   |                    | |          }|	                    dd           |dz                      d	          5 }|
                    |           ddd           dS # 1 swxY w Y   dS )
u    Порядок действий продиктован нежеланием писать в файловую систему, пока возможны ошибки уровнем выше u;   Не сможем сохранить настройки! %sNu9   Переписываем конфиг для offlineimap z8/opt/eva-app/modules/mail/templates/offlineimaprc.jinja2)rZ   localfoldersT)parentsexist_okz.offlineimaprcw)rd   r4   r5   r   rg   openr   readrendermkdirwrite)r   ri   tmplttemplatedatafds         r   r%   zCmfMailbox.render_config   s|   >>## 	OOY[_[efffFV$*VVWWWLMM 	.QV

--H	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	.t(CCtd333))//44 	HHTNNN	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	s$   "BBBDDDc                    d}t          d| j         d          }|                                sdS |                    d          5 }|                                D ]S}||v rM|                                                    |          dd         \  }}|| j        k    r|c cddd           S T	 ddd           dS # 1 swxY w Y   dS )u    Существует чтобы чтобы client_secret = mailbox.get_client_secret() во время рендеринга было попроще =/opt/eva-app/custom/_secrets.iniNr   )r   r   existsro   	readlinesstripr!   rC   )r   sepsecrets_filerw   line_idsecrets          r   get_client_secretzCmfMailbox.get_client_secret   s:   J49JJJKK""$$ 	Fs## 	&r & &$;;"&**,,"4"4S"9"9"1""=KCdn,,%	& 	& 	& 	& 	& 	& 	& 	&&	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	&s   AB=.B==CCc                    
 i }t          d| j         d          }d
|                                r|                    d          5 }|                                D ]=}
|v r7|                                                    
          dd         \  }}|||<   >	 ddd           n# 1 swxY w Y   t          t          j                              }||	                                j
        z
  }	|	dk     rt          d          |                    | j                  |k    rm||| j        <   |                    d	          5 }|                    
fd
|                                D                        ddd           dS # 1 swxY w Y   dS dS )up    Уровень 3: сохранение секрета в конфиг для дальнейшей работы rz   r{   ry   r|   Nr}   
   uz   WARNING: подозрительно частая попытка сменить авторизационные данныеrn   c              3   0   K   | ]\  }}|  | d V  dS )
N ).0r   r   r   s      r   	<genexpr>z3CmfMailbox._update_oauth_secrets.<locals>.<genexpr>   s:      ZZ;3#6s6F666ZZZZZZr   )r   r   r~   ro   r   r   r!   inttimestatst_mtimeOverflowErrorr"   rC   
writelinesrG   )r   rO   secretsr   rw   r   r   r   nowseconds_since_last_accessr   s             @r   r]   z CmfMailbox._update_oauth_secrets   s3   J49JJJKK   
	b""3'' .2LLNN . .Dd{{&*jjll&8&8&=&=bqb&AV'-.. . . . . . . . . . . . . . . dikk""C(+l.?.?.A.A.J(J%(2--#  %a  b  b  b;;t~&&-77&3GDN#""3'' \2ZZZZ'--//ZZZ[[[\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ 87s%   AB''B+.B+ 4FFF)r   )__name__
__module____qualname____doc__r   r&   dictr6   r/   staticmethodrI   r[   rW   rd   rh   r%   r   r]   __classcell__)r   s   @r   r	   r	      s        p p p p p !" : : : : : : :*0 0 0 0 0(    < Q QS Q QUX Q Q Q \Q S Y\    C C C" #( 	< 	< 	< 	< 	< 	< 	<   & & &\3 \ \ \ \ \ \ \ \r   r	   )r   pathlibr   shutilr   shlexjinja2r   cmf.include
cmf.modelsr   r	   r   r   r   <module>r      s                                       t\ t\ t\ t\ t\ t\ t\ t\ t\ t\r   