U
    тe_                     @   s  d dl Z d dlmZmZ d dlmZ d dlmZmZ d dlmZ d dl	Z	d dl
mZ d dlmZmZ d dlZd dlmZ d dlZd dlZd d	lmZ d d
lT d dlmZ d dlmZ d dlmZ d dlZd dlZd dlmZ G dd dej Z dd Z!G dd dZ"e#j$%e j& dS )    N)copydeepcopy)Decimal)datetimetimezone)LoggerPath)DictIterator)cached_property)commit_all_ds)*fields
cmf_import
log_configwrapsc                       s  e Zd Zejjd ZdZdZdZe	e
dddZeedddZejd	feed
ddZdd Zdd ZedddZdd Zdd Z fddZdd Zdd Zdd Zed\d d!Zed"d# Z ed$d% Z!ed&d' Z"d(d) Z#d]ed*d+d,Z$d-d. Z%d/d0 Z&d1d2 Z'e(dd3d4Z)d5d6 Z*d7d8 Z+d9d: Z,d;d< Z-ed=d> Z.eddd?d@Z/dAdB Z0 fdCdDZ1 fdEdFZ2dGdH Z3e4ddIdJZ5dKdL Z6dMdN Z7dOdP Z8eedQdRdSZ9dTdU Z:dVdW Z;ee<dXdXdYdZd[ Z=  Z>S )^	CmfImport)
CSV_SETTING_NAMEcsv_import_settings_fieldslogger_last_stats	threadingqueuethreading_max_forksdownload_threading_max_forksmax_processesimport_settingsZCSVNreturnc                 C   s"   | j sdd | jd D | _ | j S )Nc                 S   s   i | ]}|d  |qS name ).0sr&   r&   ./common/models/cmf_import.py
<dictcomp>"   s      z-CmfImport.import_settings.<locals>.<dictcomp>r!   )_import_settingsjson_settingsselfr&   r&   r)   r!      s    zCmfImport.import_settingsc           	      C   s  G dd dt j}t j}tjr$t j}|  }t |}|| d|_|j	st
tj|}|jddd |d}tj|ddd	d
d}|| |t tj || |d}tj|ddd	d
d}|| |t tj ||  || tj|d
d	|dS )uE    Журнал логирования процесса импорта c                   @   s   e Zd Zdd ZdS )z)CmfImport.logger.<locals>.AnonymousFilterc                 S   s   t |ddS )N	anonymousF)getattr)r.   recordr&   r&   r)   filter)   s    z0CmfImport.logger.<locals>.AnonymousFilter.filterN)__name__
__module____qualname__r2   r&   r&   r&   r)   AnonymousFilter(   s   r6   FT)parentsexist_okzdata.logutf-8Di@KL    )filenameencodingZwhenmaxBytesbackupCountzanonymous_data.log)r?   r>   level)loggingZFilterINFOconfigDEBUGget_files_dir	getLoggerZsetLevelZ	propagatehandlersr	   
UPLOAD_DIRjoinpathmkdirr   ZMyLogsHandlerZsetFormatterZ	FormatterZ	FORMATTERZ
addHandlerZ	addFilterZ
get_logger)	r.   r6   r@   log_pathZapp_logZpath_logZfile_name_logZfile_handlerZanonymous_handlerr&   r&   r)   r   %   sB    







zCmfImport.loggerF)msgr@   c                 K   s"   | j j||fdd|ii| dS )uI  Логируем как обычные лог для веб так и со скрытыми данными для возможности отправки в СТП

        Args:
            msg (str): сообщение
            level (int, optional): уровень логирования. Defaults to logging.INFO.
        Zextrar/   N)r   log)r.   rL   r@   r/   kwargsr&   r&   r)   rM   K   s    zCmfImport.logc                 C   s   dd l }dd l}dd l}dd l}|| _ || _tj| _tj| _|	 d | _
| jd| j
d  ddd tjr|ttj| j
| _
| jdtj dd | j}| jdt|d	  d
dd tt|d | j
| _
| j
stdd S )Nr      z
cpu_count=u%   , надо не менее 2 ядерT)r/   zconfig.IMPORT_PROCESS=zavailable_memory=   @u-   Гб, по 2 Гигабайта на ядроl        u   Ресурсов системы недостаточно для импорта, обратитесь в техподдержку для дополнительной информации.)r   r   multiprocessingpsutilrC   ZIMPORT_THREADSr   ZIMPORT_DOWNLOAD_THREADSr   	cpu_countr    rM   ZIMPORT_PROCESSminvirtual_memoryZ	availableint	Exception)r.   r   r   rQ   rR   Zavailable_memoryr&   r&   r)   _prepare_multiprocessingT   s     
z"CmfImport._prepare_multiprocessingc                 O   sF   t j|  tj}t jt jtj|s8| j	
d t jd|S )uK   
        Возвращает путь текущему файлу
        initfiles)ospathjoinrE   r   LOG_NAMEexistsrC   rH   r   info)r.   argsrN   	file_pathr&   r&   r)   get_log_filenamej   s    zCmfImport.get_log_filenamec                    s`   t j tj}t jt jtj|s8j	
d d  fddt  D }|S )u   
        Список файлов после logrotate, чтобы можно было загрузить историю
        rY   Tc                    sB   g | ]:}t jt j |rtd |rt jd |qS )z%(?:data|anonymous_data)\.log(\.\d+)?$rZ   )r[   r\   isfiler]   rematchrE   )r'   fdir_pathr.   r&   r)   
<listcomp>{   s    z/CmfImport.get_log_filenames.<locals>.<listcomp>)r[   r\   r]   rE   r   r^   r_   rC   rH   r   r`   listdir)r.   ra   rN   rb   Z	file_listr&   rh   r)   get_log_filenamess   s    
zCmfImport.get_log_filenamesc              	   O   s   dd l }t| d}|d}tj|r6t| ||d,}| 	 D ]}|
dtj}|| qLW 5 Q R X tjd|  dS )Nr   Tall_logs.zipw/filesrZ   )zipfiler	   rE   rI   r[   r\   r_   removeZipFilerl   replacerC   rH   writer]   )r.   ra   rN   rp   ri   zip_pathmyziprb   r&   r&   r)   get_all_logs_by_zip   s    

zCmfImport.get_all_logs_by_zipc           
   	   O   s   dd l }ddlm} || d}|t d d}|  }|r|	|d6}|  D ]&}	|	
dtj}	||	 t|	 q^W 5 Q R X tjd|  d	S d S )
Nr   r   Tz
%Y%m%d%H%Mz_all_logs.ziprn   ro   rZ   rm   )rp   pathlibr	   rE   rI   r   nowstrftimerl   rr   rs   rC   rH   rt   r[   rq   r\   r]   )
r.   ra   rN   rp   r	   ri   ru   Zlog_file_pathsrv   rb   r&   r&   r)   zip_all_logs   s    
zCmfImport.zip_all_logsc                    s(   | j  s| jjdd| _ t   d S )NZOPENstatus_type)statusloadworkflowget_default_statussuper_calc_statusr-   	__class__r&   r)   r      s    
zCmfImport._calc_statusc                 C   s  | j d rd S | jr(| j | j d< d S | jdkr6d S | j d dtj tjjd | j d dtj	 tj	jd | j d dtj
 tj
jd | j d dtj tjjd | j d dtj tjjd | j d d	tj tjjd d S )
NZmodels_fieldsexcelu   Поля контактов)Zcaptionr   iconu   Поля задачu   Поля заметокu   Поля проектовu"   Поля списков задачu   Поля групп)r,   pluginZcalc_models_settingstypeappendmodels	CmfPersonZimport_shop_fieldsr   CmfTaskZ
CmfComment
CmfProjectCmfListZCmfPersonGroupr-   r&   r&   r)   _calc_models_settings   s>    

zCmfImport._calc_models_settingsc                 K   s\   |  ddddg | jd r d S | jj| d| jd< d| jd< d	| jd
< | j| _|   d S )Nr,   attachmentsr   r   r!   r   Tsend_invitesFremove_conflict_projects)load_fieldsr,   r   calc_import_settingssaver.   rN   r&   r&   r)   r      s    


zCmfImport.calc_import_settingsc                 K   st   |  ddddg | jd r d S | jjdd| jd< | jjdd| jd< | jj| d	| jd< | j| _|   d S )
Nr,   r   r   r   r!   r   Tr   r   )r   r,   valuegetr   tmplt_import_settingsr   r   r&   r&   r)   r      s    
zCmfImport.tmplt_import_settings c                 C   s4   d|  d d} td|  d|  t|  d S )Nu1   Ошибка при импорте данных. .ue   . Проверьте загружаемый файл и повторите попытку снова.zCmfImportError: : )striprA   errorZ	cmf_alert)rL   er&   r&   r)   
_log_error   s    zCmfImport._log_errorc                 C   s:   |  dg | jd D ]}|d | jkr|d   S qg S )Nr,   r!   r%   r   )r   r,   r   )r.   settingsr&   r&   r)   r      s
    z$CmfImport.csv_import_settings_fieldsc                 O   s   t jd|  dS )uJ   
        Запускаем в фоне импорт данных
        startNr   r   
run_worker	import_id_args_kwargsr&   r&   r)   r      s    zCmfImport.startc                 O   s   t jd|  dS )uR   
        Останавливаем в фоне импорт данных
        stopNr   r   r&   r&   r)   r      s    zCmfImport.stopc                 O   s&   dd l }|  }| r"|| d S )Nr   )shutilget_download_pathr_   rmtree)r.   ra   rN   r   download_pathr&   r&   r)   delete_dump   s    zCmfImport.delete_dump)rowc              	   C   s4  d}|dkr|j }|sg }i }t| jD ]Z\}}|d r(|| r(|d d dd |jkr^q(|d d |kr(|| ||d d < q(|s|S || d}	tt|	d	}
|D ]}|j|}t	|tj
st	|tjr,d}| D ]8}|jd
dd|| gd	d|| ggdgd}|r qq|r,t|	|| qt	|tjr<qt|	|||  || }t	|tjr~t|d}t|tjj}t	|tjrq||d|g q| jd r|j|dgd}|s0|d	}|r|j|dgdd}|r|
|	_|j|	jdgd}|r$|	j dttjd|	_|	}|  |S )u  
        Импортируем объект

        :param list row: Строка из файла
        :param models.* model: Модель для создания объекта
        :param list _filter: Для фильтрации объекта
        :param str key: Ключевое имя для сопоставления модели

        :return: Новый или найденный объект
        :rtype: Optional[models.*]
        Nmodel_fieldfield_qualnamer   r   verbose_name
field_namer   codeORr%   ==z**r2   r   ZRUunionT)r   r   include_deleted)r%   r   _z%Y%m%d-%H%M%S)r   	enumerater   split
class_namestrr0   r   r   
issubclassZCmfRelationZCmfGenericRelationZrelated_modelssetattrZ
CmfRelBaseZCmfPhonephonenumbersparseZformat_numberZPhoneNumberFormatZINTERNATIONALZ
CmfNumericr   r,   r   r%   r   ry   r   utcr   )r.   r   model_filterkeyresult_fieldsisettingZnew_objZnew_coder   ZfieldZrel_objZ	rel_modelvalZphoner   r&   r&   r)   _process_obj   sp    

zCmfImport._process_objc                 C   s   d dd |  D S )N
c                 S   s   g | ]}d | qS )u;   Обнаружен конфликтующий проект r&   )r'   pr&   r&   r)   rj   C  s     z,CmfImport.check_projects.<locals>.<listcomp>)r]   get_confict_projectsr-   r&   r&   r)   check_projectsB  s    zCmfImport.check_projectsc                 C   s   g }| j d d d }dd |d D }|D ]R}tjjddd	|d gd
d|d ggdddd gdddgggdd}|r,|| q,|S )NZselectedObjectsr   r   c                 S   s$   g | ]}|d  r|d r|d  qS )objZ	isCheckedr&   )r'   r   r&   r&   r)   rj   H  s       z2CmfImport.get_confict_projects.<locals>.<listcomp>Zchildrenr   r%   ZILIKEZtask_code_prefixr   r   r   Z
cmf_deletdTr2   r   )r!   r   r   r   r   )r.   r   rootZselected_projectsZprjdupr&   r&   r)   r   E  s    zCmfImport.get_confict_projectsc              
   C   sV  |  dddddg | jr>zt  | jjdrx|  }|rx|D ]0}| jd| t	j
d |jd	d
 |j  qF| jjtjj| jdddgddW  5 Q R  W S Q R X W n tk
r< } zl| dt  }t| t| dt|jd  }| j| || _| jjdd| _|   W Y dS d}~X Y nX | j dkrR| ! S dS )u9   
        Импортируем файл в бд
        r   r,   	first_rowr   r   r   u7   Удаляем конфликтующий проект r@   T)TEXKOM_db_deleter   plugin.plugin.*zplugin.*idr   r   r   r   import-errorstatus_codeFN)"r   r   cmfutilenable_import_moder,   r   r   r   rM   rA   WARNINGdeleteZdpZcommitprocess_importr   r   r   rW   	traceback
format_excr   r   	format_tb__traceback__r   	exception	error_msgr   r   r~   r   r   _process_import_excel)r.   Zprojectsprojecterrerr_msg
error_textr&   r&   r)   r   Q  s2    
"zCmfImport.process_importc           4      C   sd  ddl m} | jr| jd s dS d}zi }i }i }i }i }i }i }	|  }
t|
D ]&\}}|dkrr| jd rrqTi }i }d}d}t| jD ],\}}|d r|| sq|d d d	d }||i }|d d
 d	}|d }|| }|dkr|}qn|dkr|}qt	|dkrP|dkr2|||d < q||i }|| ||d < nZ|dkrt|dkrt|
|| }n6|dkr||| }n|dkrd||| i}|||< |||< q|di }|dd}||d}|s|| tj|\}}|||d< || tj|\}}|di }|drD|d |d< |di }|r|	|}|s|dkrtjjddtjjddd}ntjjddtjjddd}||	|< ||d < ||d< ||d!< ||d"< d#d$d%|jgdd%|d gg}|| tj||\} }| j| |   | ||d < |rH||g }!|!|  |!||< |rt||d g }"|"| |"||d < |d&i d'd}#|#r|# d(|jj }$||$i }%||%d!< |#|%d'< |%d)g }&|&|  |&|%d)< |%||$< ||d}'|'sftjjd#d*d%|jgd'd%d+ggd,}(d#d*d%|(jgd'd%d-gg})d-||(d.d/}*|j| tj|*|)d0\}'}|'||d< || tj|'| d1 qT| D ]\}$}+tjjd#d*d%|+d! jgd'd%d2ggd,}(d#d*d%|(jgd'd%|+d' gdd3d4gg})tjj|)d,},|,stj|+d! |(|+d' tj jd5dd6},|,  |+d) D ]} |,| _!| jd7d8 q q| D ]>\}}-||}.|.rF|-D ]}/|/j!"  |.|/_!|/  qbqF| D ]N\}}0||}.|.r|0D ].}1||1}/|/r|/j!"  |.|/_!|/  qqW n~ t#k
r^ }2 z^t$|2 d9| d:|2 d;t%&|2j'd<  }3| j()|3 |3| _*| j+j,d=d>| _-|   W Y dS d?}2~2X Y nX d7S )@u   
        Запуск импорта из CSV

        :return: Истина в случае успешного импорта
        r   )CmfPluginImportMixinr!   Fr   r   r   r   r   r   parent_taskZchild_tasksrO   	executorslogic_prefixr   priorityr~   r}   zproject.agiler   r   Z
cmf_authorZ	cmf_ownerzproject.basez
task.base%baser   )Z	cmf_modelprefixZactivityztask.agile:softdev%Zsoftdevr   r   parentZANDZ	parent_idr   r   r%   r   tasksZtree_parent_idZSprints)r2   u
   ДоскаZkanban)r%   r   tree_parentZ	list_type)r   r   
obj_fields
filter_obj)leftrightZEpics=z	task.epicztask.epic:default)r   r   r%   Z
logic_typeTZ	only_datau   Строка r   r   r   r   r   N).Z%common.models.cmf_plugin_import_mixinr   r   r,   Z	_get_filer   r   r   r   lenZget_logic_prefixZget_priorityZget_status_type
setdefaultZprocess_any_table_fieldsr   r   r   CmfWorkflowZcalc_workflowZCmfActivityr   r   r   r   r   r   r   Z	CmfFolderr   ZCmfListCmfTaskitemsZCmfLogicTyper   r   rW   r   r   r   r   r   r   r   r   r   r~   )4r.   r   Z
number_rowZall_parent_taskZall_child_tasksZall_epic_tasksZ	all_tasksZ
cash_boardZcash_projectZcash_workflow_taskZ	file_readr   executorr   Zparent_task_codeZchild_tasks_codeidxr   
model_nameZ_rowZfields_namer   r   Zproject_fieldsr   r   r   Zexecutor_objZtask_fieldsZvalue_statusr   Zfilter_taskZtask_objZtmp_parent_tasksZtmp_child_tasksZ	epic_nameZepic_keyZtmp_dataZ	tmp_tasksZlist_objZparent_folderr   r   dataZepic_objr   r   Zsub_taskZ
tasks_codeZsub_task_coder   r   r&   r&   r)   r   o  sL   








 




 




"zCmfImport._process_import_excelc                 C   s>  |  |tj}|r|sdS d}| jD ] }|d r$|d d dkr$|}q$|dg tjj|jt|d |j	jdgd}|stj|t|d |j	| d	}|
  |jjd
d t|jjD ]*}|jj| jkrq|  |jj| q| j |tjtjjdd|jgdd|jggd}|ddg ||_||_|jr:|
  |S )u;   
        Импорт товара в сделку
        Nr   r   zCmfProduct.pricescurrencyfile_valprice)
product_idr  Zcurrency_idr   )productr  r	  r   T)forceZdeal_idr   r  )r   r   r  Zsales_order)r   r   Z
CmfProductr   r   ZCmfPricer   r   r   r	  r   Zpricesr   r   Z
deal_itemsr   r   r   rq   ZCmfDealItemsr   dealr  
is_changed)r.   r   r  r  Zprice_settingr   r  itemr&   r&   r)   _process_product0  s@    
 zCmfImport._process_productc           	      C   s  |s|r|j sd S d }| jD ] }|d r|d d dkr|}q|sFd S g }tjj|d d}|sxtj|d d}|  |dd|jg |r|dd|jg n|dd|j jg | |tj	|}|
d	d
g |j s|r||_ n|j |_ |js||_|jr
|  |S )Nr   r   zCmfDeal.pipeliner
  r$   Zpipeline_idr   Z
company_idcompanypipeline)r  r   r   ZCmfPipeliner   r   r   r   r   ZCmfDealr   r  r  )	r.   r   Zcontactr  Zpipeline_settingr   r   r  r  r&   r&   r)   _process_dealQ  s8    
zCmfImport._process_dealc                 C   s   dd l }dd l}dd l}| jr4|  | j dk r4d S |  | _t }z6||j|j}|d | d |d< |	  W n t
k
r   d|d< Y nX z| |d< W n t
k
r   d|d< Y nX | |d< ||  |d	< | jd
|  d S )Nr      )z8.8.8.8P   ZipzIP unavailabler   )r   r   r   ZmemoryZdiskzSTATS )timerR   socketr   dictZAF_INETZ
SOCK_DGRAMZconnectZgetsocknamecloseOSError
getloadavgrU   
disk_usager   r   r`   )r.   r  rR   r  Zstatsr(   r&   r&   r)   	get_statst  s*    

zCmfImport.get_statsc                 C   s   dd l }tj  |  }||\}}}|d }tjj| j	ddgd}|dk rd|_
|jrj|  t  | jd| d	 d
S |   |j
jdks|jdkrd|_
|jr|  t  | jd d
S dS )Nr   rP   r~   cache_status_typer   
   r   u8   Импорт прерван, место на диске z < 10GbTimport-stoppingIN_PROGRESSimport-pauseduA   **** Импорт остановлен пользователемF)r   r   r   Zimport_heartbeatr   r  r   r   r   r   r~   r  r   commit_with_eventr   r   r  r   r   warning)r.   r   r   totalusedfreeZfree_gbr   r&   r&   r)   	is_cancel  s,    
zCmfImport.is_cancelc              	   C   sB   dd l }|jdddd|  d| dgddtd	d
tdd
d d S )Nr   z/usr/bin/python3z	manage.pyshellzHfrom common.models.cmf_import import CmfImportWorker; CmfImportWorker().z("z")Tz"/var/log/eva-import-subprocess.logza+z&/var/log/eva-import-subprocess.err.log)Z	close_fdsZstart_new_sessionstdoutstderr)
subprocessPopenopen)methodr   r.  r&   r&   r)   r     s      zCmfImport.run_workerc                  O   s   t jd|d  dS )/   
        Отменяем импорт
        cancelr   Nr   )ra   rN   r&   r&   r)   r3    s    zCmfImport.cancelc                 O   s    |  ddddg | jj| dS )uk   
        Предварительный просмотр получившихся объектов
        r,   r   r   r   r   )r   r   preview)r.   ra   rN   r&   r&   r)   r4    s    zCmfImport.previewc                    s   t   ddddg S )Nr,   r   r   r   )r   save_preload_fieldsr-   r   r&   r)   r5    s    zCmfImport.save_preload_fieldsc                    s   |    t jf |S N)r   r   r   r   r   r&   r)   r     s    zCmfImport.savec                 C   s@   | j r
d S | jr,| jjdkr,tjjdd| _ tjjdd| _ d S )NZCmfPluginJirazimport.system.jira:defaultr   zimport.system:default)r   r   r   r   r  r   r-   r&   r&   r)   _calc_workflow  s
    zCmfImport._calc_workflowc                 C   sZ   |  dg ttj| jj  d}| jjjj	rH|| jjjj	}|j
ddd |S )Nzplugin.plugin.source_hashZ	_raw_dataT)r8   r7   )r   r	   rC   rH   rI   r   Zui_namelowersource_hashr   rJ   )r.   resr&   r&   r)   r     s    zCmfImport.get_download_pathc                 C   s   | j |  d S r6  )r   download_datar-   r&   r&   r)   r;    s    zCmfImport.download_datac                 C   s   | j |  d S r6  )r   download_filesr-   r&   r&   r)   r<    s    zCmfImport.download_filesc           	   	   C   s   dd l }dd l}|jdddgd}| d |D ]*}| d|jd |jd |jd  q0| d |d	d
g}|d}| }|D ]}| | qd S )Nr   pidr%   Zusername)attrsz==============ps auxz{:<10d} {:<20s} {:<10s}z==============netstat -panZnetstatz-panr9   )	rR   r.  Zprocess_iterrM   formatr`   Zcheck_outputdecode
splitlines)	r.   rR   r.  Z	processesZprocessoutputZ
output_strlinesliner&   r&   r)   
log_detail  s    
(

zCmfImport.log_detail)api_urlr#   c           
   
      sV  ddl m} ddlm  td fdd}d}|dd  rLq>| }|d	kr`q>z| tj	|d
dddgd}t
|dr||jj|_|jr|  |  n ||jj|_|jr|jdd |jD ]0}	|	jdkrq||	jj|	_|	jr|	jdd qW q@   jd| tjddd |d7 }Y q@X q@W 5 Q R X || d S )Nr   cmf_context)BeautifulSoup)textc                    s  | s| S  | d}| dD ]}|jdr0q|jddrd }d|jd krtd|jd }|sjd|jd  tjd	 qj	j	j
 d
|ddd   }tjj|dgd}|sڈjd| tjd	 qnd|jd krtd|jd }|s jd|jd  tjd	 qtjjddd|ddd   dgdgd}|D ].}|jd |ddd  krR|} qqR|sjd|ddd   tjd	 qnq|tj| qt|S )Nzhtml.parseraZcmf_convertedZhrefr   z/wiki/z\/\d+u:   Не удалось найти ид документа в r   z::r   rO   )ext_idr   u:   Не удалось найти документ по ид z/browse/z	\/\w+-\d+u4   Не удалось найти ид задачи в import_raw_jsonZLIKEz%"key":"z"%r   r   u:   Не удалось найти задачу по коду )Zfind_allr>  r   
startswithre   searchrM   rA   r   r   r9  groupr   ZCmfDocumentr   listrM  Zreplace_withZCmfPluginCsvZcreate_tag_linkr   )rJ  Zsouptagr   rL  Zext_codeobjsr   rI  rF  r.   r&   r)   check_links  sJ    
"
$z.CmfImport.obj_check_links.<locals>.check_linksF)Zinit_views_and_dsDONErJ  zcomments.log_levelzcomments.text
text_draftr   Tr      uZ   Не удалось конвертировать перекрестные ссылки в )r/   exc_inforO   )cmf.apprH  Zbs4rI  r   r*  r   rM   r   Zget_obj_by_idhasattrrJ  r   rW  r  r   Z
do_approveZcommentsZ	log_levelrA   ERRORput)
r.   rF  	obj_queueobj_queue_errorsrH  rU  
has_errorsZobj_idr   Zcommentr&   rT  r)   obj_check_links  s>    '




zCmfImport.obj_check_linksc                 C   s*  ddl m} dd l}t  t  t  |   d}tt	| }| 
d|j d| d|  | j }	| j }
g }| 
d| j  |j }t| jD ]H}| jj| jd| |	|
|dd	}|| |  | 
d
|  qd}ddd gdddgg}|j|ddg||| gd}|D ]*}|  rB qZ|d7 }|	|j q.|D ]}|	d q^| 
d |D ]}|  q~|j | }| 
d||   d d}|
 s||
 7 }q| 
d|  |W  5 Q R  W  5 Q R  W  5 Q R  S Q R X W 5 Q R X W 5 Q R X d S )Nr   rG  u)   Конвертируем ссылки в uB    на локальные задачи и документы start=z limit=uJ   Обрабатываем ссылки в несколько тредов: ra  )r^  r_  rF  )targetr%   rN   u.   Параллельный обработчик r   z!=Zimport_originalr   Tz--r   )r2   r   slicerO   rV  u(   Ждем обработки ссылокu*   ------------------------ скорость u#    обьектов в секундуuA   Закончили обработку ссылок, ошибок )rZ  rH  r   r   disable_acldisable_notifyr   rX   varsr   rM   r   r   ZQueuer   ry   ranger   Threadra  r   r   Zslistr*  r]  r   r]   Ztotal_secondsemptyr   )r.   rF  r  r   limitrH  r   r`  r   r^  r_  Zobj_processr(   r   procZcntr   rS  r   Zdiffr&   r&   r)   process_cross_links=  sV    $







zCmfImport.process_cross_linksc                 C   sr   |  ddddg | jdkr dS tj snt }| snd}| j|tj	d || _
| jjd	d
| _|   dS dS )Nr~   r   r   r   r#  Fu   Импорт прерван по неизвестной причине. Проверьте системные требования.r   r   r   T)r   r   r   r   Zimport_is_runningCmfImportWorker
is_runningrM   rA   r\  r   r   r   r~   r   )r.   Zworkerr   r&   r&   r)   rn  i  s    

zCmfImport.is_runningT)Z	only_onceZ
system_jobc                  C   sF   t d tjjdddgddddgdD ]} |  s(td	|  q(d S )
Nz&cmf_deferred_job: CmfImport.cron_checkr   r   r#  r~   r   r   r   uH   Импорт прерван по неизвестным причинам)gdebugr   r   rQ  rn  r   Zadmin_alert)r   r&   r&   r)   
cron_checky  s    


zCmfImport.cron_check)r   )NN)?r3   r4   r5   r   r   Zui_meta_skipr   r   r+   propertyr  r!   r   r   r   rA   rB   r   rV   rM   rX   rc   rQ  rl   rw   r{   r   r   r   r   staticmethodr   r   r   r   r   r   r   r   r   boolr   r  r  r  r*  r   r3  r4  r5  r   r7  r	   r   r;  r<  rE  ra  rl  rn  Zcmf_deferred_jobrq  __classcell__r&   r&   r   r)   r      sn   %		



N B!#
J,
r   c                    s   t   fdd}|S )Nc                    sL   z( | f||}t   | jd |W S    | jd t  Y nX d S )Nu*   Импорт завершил работуu&   Ошибка работы демона)r%  r   r`   r   rollback_purge_event)r   ra   rN   r:  fnr&   r)   wrapped  s    z!catch_exceptions.<locals>.wrappedr   )rx  ry  r&   rw  r)   catch_exceptions  s    	rz  c                   @   sl   e Zd ZdddZdd Zdd Zdd	d
dZedd Zedd Z	edd Z
edd Zdd ZdS )rm  eva-import-workerc                 C   sb   ddl m} dd l}ddlm} ||| _|j| j|d| d|jd |d| d| _	d S )	Nr   r   r   z/var/logz.logr   z	/var/run/z.pid)
cmf.modules.logsr   rA   rx   r	   rF   r   Zinit_loggerrB   r=  )r.   Zappr   rA   r	   r&   r&   r)   __init__  s     zCmfImportWorker.__init__c                 C   s  | j d tjjddd|gdd|ggdddd	gd
}|  |d |jjddd|_	|
  t  t @ t , t  | }td W 5 Q R X W 5 Q R X W 5 Q R X tjj|jdddd	gd}|j	jdkr<|r
|j d |jjdd|_	|
  n2|j	jdkr<|j d |jjdd|_	|
  |j jd jtjd}tjj|tj|jdt !t"j#dd| ddd d S )Nu   Импорт запущенr   r   r   r   r   r~   progressr   r   u%   ***Запускаем импорт***r#  import-startedr}   r   rO   r   u2   ***Импорт успешно завершен***CLOSEDr|   u7   ***Импорт завершен с ошибками***r   r   r   /files/u+   Импорт данных завершен %d.%m.%Y %H:%M
, <a href=(   >Журнал логирования</a>Tr   Zpersonr%   rL   Zforce_notify_current_person)$r   r`   r   r   r   r{   rM   r   r   r~   r   r%  r   rd  re  r   r   geventsleepr   r   r}   rG   baseFilenamers   rC   rH   	CmfNotifyplace_notifyro  current_personr%   r   ry   r   r   )r.   r   r   r:  rK   r&   r&   r)   run  s@    

(


zCmfImportWorker.runc                 C   sZ  | j d t  t  t  tjjddd|gdd|ggdddd	gd
}|	d |j
jddd|_|  t  | }| }|r|r|j d |j
jdd|_|  n0|jjdkr|j d |j
jdd|_|  |j jd jtjd}W 5 Q R X W 5 Q R X W 5 Q R X tjj|tj|jdttjdd| ddd d S )Nu   Дамп запущенr   r   r   r   r   r~   r~  r   r   u!   ***Запускаем дамп***r#  r  r  u.   ***Дамп успешно завершен***r  r|   u3   ***Дамп завершен с ошибками***r   r   r   r  u'   Дамп данных завершен r  r  r  Tr  ) r   r`   r   rd  re  r   r   r   r   rM   r   r   r~   r   r%  r;  r<  r}   rG   r  rs   rC   rH   r  r  ro  r  r%   r   ry   r   r   )r.   r   r   r:  Zres2rK   r&   r&   r)   	dump_data  s6     


6zCmfImportWorker.dump_dataNr"   c                 C   sN  | j d t . t  tjjddd|gdd|ggddgdd	}|jj	d
d|_
|  t  zz^d}d}|j d tjjdd|gddD ]^}z*|j d|  |jddd t  W q   |d7 }t  |j d| d Y qX qtjjddd|gdd|ggdddgdd	}|jD ]X}z*|j d|  |jddd t  W n&   |d7 }t  |j d Y nX q,|s|jj	dd|_
|j d n"|j d|  |jj	dd|_
W nX tk
r& } z8|j d|  t| t||_|jj	dd|_
W 5 d}~X Y nX W 5 |  X W 5 Q R X W 5 Q R X dS )r2  u   Отмена запущенаr   r   r   r   r~   r   T)r2   r   r   zimport-cancelingr   r   Nu#   ***** Отменяем импортr   r   u   Удаляем )r   r  rO   u#   Не удалось удалить uW   , видимо обьект использовали вне данных импортаimport_objectsuy   Не удалось удалить, видимо обьект использовали вне данных импортаzimport-canceledu,   Успешно отменили импортu#   Количество ошибок: r   u   Ошибка удаления )r   r`   r   rd  re  r   r   r   r   r   r~   r   r%  r   rQ  r   rv  r   r  r   rW   r   r   r   )r.   r   r   errorsr   r   r&   r&   r)   _cancel_import  s\     
 


&zCmfImportWorker._cancel_importc                 G   s>   | j  rtd| j tt  | j|  | j   d S Nu"   Импорт уже запущен)	r=  r_   rW   
write_textr   r[   getpidr  unlinkr.   ra   r&   r&   r)   r     s
    

zCmfImportWorker.startc                 G   s>   | j  rtd| j tt  | j|  | j   d S r  )	r=  r_   rW   r  r   r[   r  r  r  r  r&   r&   r)   dump  s
    

zCmfImportWorker.dumpc                 G   s>   | j  rtd| j tt  | j|  | j   d S r  )	r=  r_   rW   r  r   r[   r  r  r  r  r&   r&   r)   r3    s
    

zCmfImportWorker.cancelc                 G   s2  t jjdddgddddgd}|r|  r|jd	 |jjd
d|_|	  t
  tdD ]2}td t jj|jddgd}|jdkr\ qq\n|jd |jjdd|_|	  t
  |jd | j s| jd d S | jd ztt| j tj W n   | jd Y nX | j  d S )Nr   r   r#  r   r~   r~  r   r   uQ   Пытаемся остановить импорт, таймаут 1 минутаr"  r   <   rO   r   u"   Импорт уже прерванr$  u<   Импорт остановлен пользователемu    Импорт не запущенu'   Останавливаем импортuK   Не удалось завершить процесс, он запущен?)r   r   r   rn  r   r&  r   r   r~   r   r%  rg  r  r  r   r   r`   r=  r_   r[   killrV   	read_textsignalSIGTERMr   r  )r.   ra   r   r   r&   r&   r)   r   &  s4    


zCmfImportWorker.stopc                 C   s0   | j  r,tt| j  r"dS | j   d S )NT)r=  r_   r   Zcheck_process_runningrV   r  r  r-   r&   r&   r)   rn  D  s    
zCmfImportWorker.is_running)r{  )r3   r4   r5   r}  r  r  r  rz  r   r  r3  r   rn  r&   r&   r&   r)   rm    s   
#1



rm  )'Zcsvr   r   Zdecimalr   r   r   rA   r   r   rx   r	   typingr
   r   r   r   ZxlrdZopenpyxlZcmf.data_providers.baser   Zcmf.includeZcmfr   Zcommon.fieldsr   r|  r   r[   r  	functoolsr   r   rz  rm  ZAPPZHOOK_CRON_MINUTELYr   rq  r&   r&   r&   r)   <module>   s:         s 9