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   ./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)	ZabsoluteZ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 )
NZ	lead_typeZ
email_only
new_stage1r   z%Y-%m-%d.%s.jsonuT   Добавляем задачу в отложенный пул обработки %sTr   w)r   r   	directoryr   Z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   Zdonelead_email_nameuS   Удаляем файл %s т.к. человек дорегистрировалсяuh   Нас не волнуют разовые проблемы с сделками от автотестовzbad/auto_testsZbad)r   r   r&   r'   load_acrm_registerr   r    r   	at_stage1unlinkr   	exceptionr   r%   )selfr0   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   r1   r<   )r8   r9   r0   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   Не удалось прочитать файл %sr2   u?   Каким-то образом %s создался без email)r#   is_dirr   r%   r,   r&   r'   r3   ZJSONDecodeErrorr7   r   r5   )r8   Zstage1_directoryr0   r*   r   r:   r   r   r	   load_stage1N   s     




zDelayPool.load_stage1N)F)F)r   r   r   r   r#   dictr5   staticmethodstrr    r+   r1   r<   r=   r?   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   r+   )kwargsr   r   r	   acrm_registera   s    
rD   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=r:   Zcompany_namer   zContent-typez!application/x-www-form-urlencoded)r   Zheaderszcode: %s resp: %s content: %s   u   Код ответа ActiveCRM zaction=failureun   Форма для создания лидов в BCRM вывела на страницу об ошибке: %suN   Данные запроса, которые привели к ошибке: %s   )indentu!   Страница ошибки: %suY   Не удалось зарегистрировать лида из-за ответа BCRMu+   ActiveCRM вообще недоступна)r   r   r   requestsZpostdebugZstatus_codeZcontenturlerrorr'   dumpstext
exceptionsConnectionError)
r
   Zcompanyr   Zform_idactionrE   Zorg_namerC   rK   Zrespr   r   r	   r4   t   s2    




r4   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   Обработать одну запись из пула)rQ   defaulthelpz-fz--process-fileu2   Обработать конкретный файл)typerT   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levelZdatefmtz#Choose one of processing targets %sr   )argparseArgumentParseradd_argumentrB   
parse_argsr   ZbasicConfigrJ   DEBUGINFOr   r?   Zprocess_oner1   r<   Zprocess_poolr=   Zstop_on_errorsZprocess_filer   rL   exit)parserargsZpoolr0   r   r   r	   main   s:    ra   __main__)NNNNNNN)rX   r'   r   r   pathlibr   rI   	Exceptionr   r   r   rD   r4   ra   r   r   r   r   r	   <module>   s   N
&