U
    -d!                     @   s   d dl Z d dlZd dlZd dlmZ d dlmZ d dlZG dd deZdd Z	G dd	 d	Z
d
d ZdddZdd Zedkre  dS )    N)datetime)Pathc                   @   s   e Zd ZdS )	AcrmErrorN)__name__
__module____qualname__ r   r   /opt/account/common/acrm.pyr   
   s   r   c                 C   s    |  dddo|  ddkS )Nlogin Z723ad4b0phonez+79068099069)get
startswith)datar   r   r	   is_auto_test   s    r   c                   @   sd   e Zd ZedZe ZeeeedddZ	edd Z
edd Zdd
dZdddZdd ZdS )	DelayPoolz/var/lib/account/acrm/)srcoldnewc                 C   sF   |    ||d}t|jjddd td| | | | d S )N   Tparentsexist_okzMove %s to %s)	absoluteas_posixreplacer   parentmkdirlogginginforename)r   r   r   dstr   r   r	   mv   s    zDelayPool.mvc               	   K   sp   |  ddkrdnd}tj| t d }td| |jj	ddd |
d	}t| | W 5 Q R X d S )
N	lead_type
email_only
new_stage1r   z%Y-%m-%d.%s.jsonuT   Добавляем задачу в отложенный пул обработки %sTr   w)r   r   	directoryr   nowstrftimer   warningr   r   openjsondump)_kwargsr'   Zdatafilefdr   r   r	   push   s    zDelayPool.pushc                  C   sJ   t d tjd  D ],} |  r| jdrt d|  |   S qd S )Nu$   Ищем в пуле задачу...r   z.jsonu   Нашли %s)r   r   r   r'   iterdiris_filenameendswith)entryr   r   r	   pop'   s
    
zDelayPool.popFc              
   C   s   t d| | }t|}W 5 Q R X zJtf | t|dd |d}| j	|}|rrt d| |
  W nd tk
r } zFt | |r|t|rt d t|dd nt|dd W 5 d }~X Y nX d S )	Nu(   Обрабатываем задачу %sr   donelead_email_nameuS   Удаляем файл %s т.к. человек дорегистрировалсяuh   Нас не волнуют разовые проблемы с сделками от автотестовzbad/auto_testsbad)r   r   r+   r,   load_acrm_registerr   r"   r   	at_stage1unlinkr   	exceptionr   r*   )selfr5   strictr/   r   emailZstage1_fileerrr   r   r	   process_entry/   s&    




zDelayPool.process_entryc                 C   sV   t dtjd  tjjddd t }|d k	rH| || t }q*t d d S )Nu"   Обрабатываем пул %sr   Tr   u(   Что нашли - обработали)r   r   r   r'   r   r6   rC   )r?   r@   r5   r   r   r	   processE   s    
zDelayPool.processc              
   C   s   | j d }| s td d S | D ]t}z"| }t|}W 5 Q R X W n& tjk
rt   t	d| Y q(Y nX |
d}|std| q(|| j|< q(d S )Nr%   uV   Для реги по email даже папки нет, нечего загружатьu2   Не удалось прочитать файл %sr8   u?   Каким-то образом %s создался без email)r'   is_dirr   r*   r1   r+   r,   r:   JSONDecodeErrorr>   r   r<   )r?   Zstage1_directoryr5   r/   r   rA   r   r   r	   load_stage1N   s     




zDelayPool.load_stage1N)F)F)r   r   r   r   r'   dictr<   staticmethodstrr"   r0   r6   rC   rD   rG   r   r   r   r	   r      s   



	r   c                  K   s   t d tjf |  dS )u   Обёртка с обработкой ошибок.
    Если acrm временно легла, клиент должен всё равно получить свою демку.
    А мы должны получить лида, но чуть попозже.
    Если проблема не в том, что acrm легла, всё равно сохраним данные.
    u   Регистрация в ACRM:N)r   r   r   r0   )kwargsr   r   r	   acrm_registera   s    
rL   c           
      K   s  t d |dkrtd|s(d| }||d< d| }| rF| |d< |rR||d< |r^||d	< ztj||d
did}	t d|	j|	|	j |	jdkrtd|	j d|	jkrt 	d|	j t 	dt
j|dd t 	d|	j tdW n" tjjk
r
   tdY nX dS )uO   
    Создаем сделку на bcrm
    :param kwargs:
    :return:
    u+   Собственно регистрацияNuK   Не указан ID формы с которой пришёл запросu3   Попробовать бесплатно org_name=user_askz+https://bcrm.carbonsoft.ru/pub/forms?token=rA   Zcompany_namer   zContent-typez!application/x-www-form-urlencoded)r   headerszcode: %s resp: %s content: %s   u   Код ответа ActiveCRM zaction=failureun   Форма для создания лидов в BCRM вывела на страницу об ошибке: %suN   Данные запроса, которые привели к ошибке: %s   )indentu!   Страница ошибки: %suY   Не удалось зарегистрировать лида из-за ответа BCRMu+   ActiveCRM вообще недоступна)r   r   r   requestspostdebugstatus_codecontenturlerrorr,   dumpstext
exceptionsConnectionError)
r
   companyr   Zform_idactionrM   org_namerK   rW   respr   r   r	   r;   t   s2    




r;   c                  C   s   t  } | jdddddd | jddtd	d
 | jdddddd | jdddddd | jdddddd |  }tjd|jrtjntj	dd t
 }|  |jr| }|r|| n@|jr||j n,|jr|t|j ntd| td d S )Nz-oz--process-one
store_trueFu8   Обработать одну запись из пула)r^   defaulthelpz-fz--process-fileu2   Обработать конкретный файл)typerc   z-az--process-poolu9   Попробовать обработать вес пулz-ez--stop-on-errorsu{   Упасть при первой ошибке обработки пула, не переносить задачу в ./bad/z-dz--debugu    Выводить ответ bcrmz7[%(asctime)s] %(filename)s #%(levelname)-8s %(message)sz%Y-%m-%d %H:%M:%S)formatleveldatefmtz#Choose one of processing targets %sr   )argparseArgumentParseradd_argumentrJ   
parse_argsr   basicConfigrT   DEBUGINFOr   rG   Zprocess_oner6   rC   Zprocess_poolrD   Zstop_on_errorsZprocess_filer   rX   exit)parserargspoolr5   r   r   r	   main   s:    rs   __main__)NNNNNNN)rh   r,   r   r   pathlibr   rR   	Exceptionr   r   r   rL   r;   rs   r   r   r   r   r	   <module>   s   N
&