
    B
di,                     d    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 d dl	m
Z
  G d de
      Zy)	    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                 *    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    w*,/ooo    r   )depthc                   | j                   j                  r(| j                  j                  s| j                  | _         nU| j                  j                  r?| j                   j                  s)d| j                   j                  v r| j                   | _        | j                  rg| j                  j                  rQ| j                  j                  d      d   }dddd}|j                  |d      | _        | j                  dk(  rd| _        | j                  r| j                  s| j                          t        | 0  |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    99TZZ%7%7

DIZZ		(9(9cTYY__>TDJ::$))++ZZ%%c*2.F%$%E
 		&(3DIyyI%#1 ??4#3#3 w|T99&99r   message_rawc                    |j                  d      }|st        dd       d|vrt        d| d       | j                  |      }|j                  rt        j                  d       y| j                  d	g       t        | j                        d
k(  r!t        d       t        j                  d       yt        j                  d| d       | j                  d
   }|j                  |       y)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)   s    (/t<e9%AN00=GG  `  a*+,t""#q(xyOO~	#k]  #I  J  	K**1-"";/r   c                    |j                  d      }|s%t        j                  d|j                                nxt	        |t
              rht        |      dkD  rZ|j                  dd      j                  dd      }t        |      dkD  r%t        j                  d|t        |             |dd }||d<   |j                  d	       |d
   |j                  d
       |d	   ij                  d|d
    d|d	          }t        j                  | ||d   |d   dt        j                  j                  |d         |      }|j                          |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4k6G6G6IJS!c#hm++c2&..sB7C3x"}  !K  MP  RU  VY  RZ  [#2h(+K%''Y)?	**K,?
 #d{9-.d;v3F2GH
I 	 ..#"<0!'*((,,;w3G,H / 
 	&T(TT&r   rC   client_secretrefresh_tokenc                     t         j                  j                  g ddd|gg dg      }|st        d      t	        |      dkD  rt        d      |d	   }|j                  | ||       y
)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!2!7!7!T<()@
!7 "
 &  m  n  n%&*  s  t  t(+''	=-Pr   c                     |||J | j                  g d       || _        || _        | j                  |       | j	                          y)u9    Уровень 2: модификация объекта N)r   rC   rP   )r2   rC   rP   _update_oauth_secretsr&   )r   rC   rO   rP   s       r   rW   z"CmfMailbox.setup_oauth_credentialsj   sM    $)B}G```?@"*""=1		r   c                    | j                   j                  r!t        j                  d| j                         yd| j                   j
                  vr,t        j                  d| j                   | j                         yd| j                   j
                  v r,t        j                  d| j                   | j                         y| j                   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

(((MMXZ^ZdZdfjfmfmnTZZ%%%MM`bfblblnrnunuv JJ,,S!4	6,VHAi[ABBr   F)forcec                    | j                  dg       t        d| j                          | j                         }|rt	        |       n t
        j                  d| j                         t        |    |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   sm    '#(56>>#8OOSUYU_U_`w~t;5;F;;r   c                    | j                         }|s!t        j                  d| j                         yt	        d| j                          t        d      5 }t        |j                               }ddd       j                  | |      }|j                  dd       |dz  j                  d	      5 }|j                  |       ddd       y# 1 sw Y   ^xY w# 1 sw Y   yxY w)
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[efI$**VWLM 	.QV

-H	.t(Ctd3))//4 	HHTN	 			. 	.	 	s   C3CCC#c                 `   d}t        d| j                   d      }|j                         sy|j                  d      5 }|j	                         D ]H  }||v s|j                         j                  |      dd \  }}|| j                  k(  s=|c cddd       S  	 ddd       y# 1 sw Y   yxY w)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    2499+\JK""$s# 	&r &$;"&**,"4"4S"9"1"=KCdnn,%	& 	&&	& 	& 	&s   B$4B$B$B$$B-c                   
 i }t        d| j                   d      }d
|j                         r|j                  d      5 }|j	                         D ]1  }
|v s|j                         j                  
      dd \  }}|||<   3 	 ddd       t        t        j                               }||j                         j                  z
  }	|	dk  rt        d      |j                  | j                        |k7  rR||| j                  <   |j                  d	      5 }|j                  
fd
|j                         D               ddd       yy# 1 sw Y   xY w# 1 sw Y   yxY w)up    Уровень 3: сохранение секрета в конфиг для дальнейшей работы rz   r{   ry   r|   Nr}   
   uz   WARNING: подозрительно частая попытка сменить авторизационные данныеrn   c              3   6   K   | ]  \  }}|  | d   yw)
N ).0r   r   r   s      r   	<genexpr>z3CmfMailbox._update_oauth_secrets.<locals>.<genexpr>   s$     Z;3#seF826Zs   )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   sT   2499+\JK ""3' .2LLN .Dd{&*jjl&8&8&=bq&AV'-.. diik"C(+l.?.?.A.J.J(J%(2-#  %a  b  b;;t~~&-7&3GDNN#""3' \2Z'--/Z[\ \ 8. .\ \s    E	,E	)E	EE)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 !" :*0 0( < QS Q QUX Q Q S Y\ C" #( 	< &\3 \r   r	   )r   pathlibr   shutilr   shlexjinja2r   cmf.include
cmf.modelsr   r	   r   r   r   <module>r      s*           t\ t\r   