U
    Jg2P                    @   s0  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
Z
d dlmZ d dlmZmZ d dlZd dlZd dlmZ d dlZd dlZd dl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'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ejjdddddddd	d
ddddg ZdZdZdZ	e
dZeedddZedd Zedd ZeedddZeedddZejddfeeddd Zdeeeeeed#d$d%Zd&d' Zd(d) Zedd*d+Z d,d- Z!e"d.d/ Z#d0d1 Z$ fd2d3Z%d4d5 Z&d6d7 Z'd8d9 Z(e"dd;d<Z)ed=d> Z*e"d?d@ Z+e"dAdB Z,dCdD Z-dedEdFdGZ.dHdI Z/dJdK Z0dLdM Z1dNdO Z2eddPdQZ3dRdS Z4dTdU Z5dVdW Z6dXdY Z7e"dZd[ Z8e"ddd\d]Z9d^d_ Z: fd`daZ; fdbdcZ<ddde Z=e
ddfdgZ>dhdi Z?djdk Z@dldm ZAeedndodpZBdqdr ZCddtduZDdvdw ZEeddxdyZFdzd{ ZGe"eHd|d|d}d~dd ZI  ZJS )	CmfImport)CSV_SETTING_NAMEcsv_import_settings_fieldslogger_last_stats	threadingqueuethreading_max_forksdownload_threading_max_forksmax_processesimport_settingsworker_flag_filecalc_import_settingscancelcheck_projectsdelete_dumpget_all_logs_by_zipget_log_filenameget_log_filenames
pg_restorepreviewstartstoptake_import_statstmplt_import_settingsZCSVNz/tmp/eva_import_worker.flagreturnc                 C   s
   | j  S N)r"   existscls r6   ./common/models/cmf_import.pyworker_here4   s    zCmfImport.worker_herec                 C   s   | j   d S r2   )r"   touchr4   r6   r6   r7   create_worker_flag8   s    zCmfImport.create_worker_flagc                 C   s   | j  r| j   d S r2   )r"   r3   unlinkr4   r6   r6   r7   remove_worker_flag<   s    
zCmfImport.remove_worker_flagc                 C   s.   | j s(| dg dd | jd D | _ | j S )Njson_settingsc                 S   s   i | ]}|d  |qS namer6   ).0sr6   r6   r7   
<dictcomp>E   s      z-CmfImport.import_settings.<locals>.<dictcomp>r!   )_import_settingsload_fieldsr=   selfr6   r6   r7   r!   A   s    zCmfImport.import_settingsc           	      C   sj  G dd dt j}t j}tjr$t j}tjjd| d}|s^tjd| d}|  |j	s^|
d tjjd| d}|stjd| d}|  |j	s|
d t |jj}|| d|_|jsftj|jdd	d
dd}|| |t tj || tj|jdd	d
dd}|| |t tj ||  || t tj}|t  || |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)rF   recordr6   r6   r7   filterL   s    z0CmfImport.logger.<locals>.AnonymousFilter.filterN)__name__
__module____qualname__rJ   r6   r6   r6   r7   AnonymousFilterK   s   rN   data.logr?   parent    zanonymous_data.logFutf-8Di@KL    )filenameencodingZwhenZmaxBytesZbackupCount)loggingZFilterINFOconfigDEBUGmodelsCmfAttachmentgetsavefile_existsZupload_file	getLoggeridvalueZsetLevelZ	propagatehandlersr   ZMyLogsHandlerZfull_path_fileZsetFormatterZ	FormatterZ	FORMATTERZ
addHandlerZ	addFilterZStreamHandlersysstdoutZCustomFormatter)	rF   rN   levelattachment_logZattachment_log_anonZapp_logZfile_handlerZanonymous_handlerZconsole_handlerr6   r6   r7   r   H   sV    







zCmfImport.loggerFmsgrg   c                 K   s$   | j j||fd|i|d| dS )uI  Логируем как обычные лог для веб так и со скрытыми данными для возможности отправки в СТП

        Args:
            msg (str): сообщение
            level (int, optional): уровень логирования. Defaults to logging.INFO.
        rG   )Zextraexc_infoN)r   log)rF   rj   rg   rG   rk   kwargsr6   r6   r7   rl   x   s    zCmfImport.logERR-0001process)rj   
error_codeobj_typeext_href	dump_path
error_typec           	   
   C   sz   | j |tjd tj||| |||t |d}|rd|j|_|j	|_
| jrd| j||_| j||_|  |j  dS )u7  Логируем ошибки и записываем их в базу

        Args:
            msg (str): текст ошибки
            error_code (int, optional): Код ошибки для нахождения возможного решения или группировки. Defaults to 1.
        ri   )textcoder   rs   rt   rq   	tracebackrr   N)rl   rX   ERRORr\   CmfImportErrorrw   
format_excr?   title
class_namerq   pluginZcalc_ext_hrefrr   Zcalc_dump_pathrs   r_   dpcommit)	rF   rj   rp   objrq   rr   rs   rt   Zimport_errorr6   r6   r7   	log_error   s$    	zCmfImport.log_errorc                 C   s   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)rG   zconfig.IMPORT_PROCESS=zavailable_memory=   @u-   Гб, по 2 Гигабайта на ядроl        u   Ресурсов системы недостаточно для импорта, обратитесь в техподдержку для дополнительной информации.)multiprocessingpsutilrZ   ZIMPORT_THREADSr   ZIMPORT_DOWNLOAD_THREADSr   	cpu_countr    rl   ZIMPORT_PROCESSminvirtual_memoryZ	availableint	Exception)rF   r   r   Zavailable_memoryr6   r6   r7   _prepare_multiprocessing   s    
z"CmfImport._prepare_multiprocessingc                 O   sF   t jjd| dgd}|s.t jd| d}|  |js@| jd |jS )uK   
        Возвращает путь текущему файлу
        rO   url)r?   rQ   r   rP   u   Начало)r\   r]   r^   r_   r`   r   infor   )rF   argsrm   rh   r6   r6   r7   r(      s    zCmfImport.get_log_filenamec                    s(    d  fddt D }|S )u   
        Список файлов после logrotate, чтобы можно было загрузить историю
        Tc                    sB   g | ]:}t jt j |rtd |rt jd |qS )z%(?:data|anonymous_data)\.log(\.\d+)?$files)ospathisfilejoinrematchget_files_dir)r@   fdir_pathrF   r6   r7   
<listcomp>   s    z/CmfImport.get_log_filenames.<locals>.<listcomp>)r   r   listdir)rF   r   rm   Z	file_listr6   r   r7   r)      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/filesr   )zipfiler	   r   joinpathr   r   r3   removeZipFiler)   replacerZ   
UPLOAD_DIRwriter   )rF   r   rm   r   r   zip_pathmyzip	file_pathr6   r6   r7   r'      s    

zCmfImport.get_all_logs_by_zipc                 C   s6   ddl m} tjjd }|j| s2|j| dd} | S )Nr   )cmf_hashlibtask_code_prefixZABCDEFGHIJKLMNOPQRSTUVWXYZ)Z	enc_table)Zcmf.utilr   r\   
CmfProjectr   Zregex	fullmatchZshort_str_enc)keyr   r   r6   r6   r7   get_correct_key   s
    zCmfImport.get_correct_keyc           
   	   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.zipr   r   r   r   )r   pathlibr	   r   r   r   nowstrftimer)   r   r   rZ   r   r   r   r   r   r   )
rF   r   rm   r   r	   r   r   Zlog_file_pathsr   r   r6   r6   r7   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_statusrE   	__class__r6   r7   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=   r}   Zcalc_models_settingstypeappendr\   	CmfPersonZimport_shop_fieldsr   CmfTaskZ
CmfCommentr   CmfListZCmfPersonGrouprE   r6   r6   r7   _calc_models_settings   s>    

zCmfImport._calc_models_settingsc                 K   sp   |  ddddg | jd r d S | jj| d| jd< d| jd< d	| jd
< d| jd< d	| jd< | j| _|   d S )Nr=   attachmentsr   r}   r!   r   Tsend_invitesFremove_conflict_projects	pg_backupmerge_identic_names)rD   r=   r}   r#   r_   rF   rm   r6   r6   r7   r#     s    




zCmfImport.calc_import_settingsc                 K   s   |  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	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   Fr   )rD   r=   rc   r^   r}   r/   r_   r   r6   r6   r7   r/      s    
zCmfImport.tmplt_import_settings c                 C   s4   d|  d d} td|  d|  t|  d S )Nu1   Ошибка при импорте данных. .ue   . Проверьте загружаемый файл и повторите попытку снова.zCmfImportError: : )striprX   error	cmf_alert)rj   er6   r6   r7   
_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   )rD   r=   r   )rF   settingsr6   r6   r7   r   2  s
    z$CmfImport.csv_import_settings_fieldsc                 O   s&   t j  t jd|  t j  dS )uJ   
        Запускаем в фоне импорт данных
        r,   N)r\   ZCmfAccessListZactivate_admin_moder   
run_workerr:   	import_id_args_kwargsr6   r6   r7   r,   :  s    
zCmfImport.startc                 O   s   t jd|  dS )uR   
        Останавливаем в фоне импорт данных
        r-   N)r\   r   r   r   r6   r6   r7   r-   D  s    zCmfImport.stopc                 O   s&   dd l }|  }| r"|| d S )Nr   )shutilget_download_pathr3   rmtree)rF   r   rm   r   download_pathr6   r6   r7   r&   K  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   rv   ORr?   ==z**rJ   r   ZRUunionT)rv   r   include_deleted)r?   r   _z%Y%m%d-%H%M%S)r   	enumerater   splitr|   strrH   r   r^   
issubclassZCmfRelationZCmfGenericRelationZrelated_modelssetattrZ
CmfRelBaseZCmfPhonephonenumbersparseZformat_numberZPhoneNumberFormatZINTERNATIONALZ
CmfNumericr   r=   rv   r?   r   r   r   utcr_   )rF   r   model_filterr   result_fieldsisettingZnew_objZnew_coder   ZfieldZrel_objZ	rel_modelvalZphonerv   r6   r6   r7   _process_objR  sp    

zCmfImport._process_objc                 C   s$   |  dg ddd |  D S )Nr}   
c                 S   s   g | ]\}}|qS r6   r6   )r@   r   dr6   r6   r7   r     s     z,CmfImport.check_projects.<locals>.<listcomp>)rD   r   get_confict_projectsrE   r6   r6   r7   r%     s    zCmfImport.check_projectsc           	      C   s  g }| j jjdkr|S | dg | jd d d }dd |d D }|D ]}| |d	 }tjjd
dd|d gdd|gggdddddgd}|rJd }|j	r|j	dg |j	j
}|r| j j jnd }| j jjdkr`|jjdkr
||d| d|j d| df nT|j	r|jr2||d| df n,|r|r||kr||d| df qJ| j jjdkrJ|jjdkr| jd  d d! d"kr||d#| d|j d$|d  d%| d&	f qJ|j	r|jr||d| df qJ|rJ|rJ||krJ||d| df qJ|S )'NCmfPluginCsvplugin.plugin.source_hashZselectedObjectsrc   r   c                 S   s$   g | ]}|d  r|d r|d  qS )r   Z	isCheckedr6   )r@   r   r6   r6   r7   r     s       z2CmfImport.get_confict_projects.<locals>.<listcomp>childrenr   r   r?   ILIKEr   r   Tlogic_prefixr   cmf_deleted)rJ   r   r   ext_idCmfPluginJirazproject.wikiu4   В системе уже есть Wiki-проект u    с кодом «uj   ». Измените префикс кода задач и код проекта у Wiki-проекта «uv   » и его название в системе и запустите импорт Agile-проекта ещё раз.uI   В системе обнаружен одноименный проект u   . Для запуска импорта необходимо удалить данный проект (проект будут удалён безвозвратно) или отменить его выбор.u  , импортированный из другого источника. Для запуска импорта необходимо удалить данный проект (проект будут удалён безвозвратно) или отменить его выбор.CmfPluginConfluenceproject.agileZimport_typerb   projectu5   В системе уже есть Agile-проект uB   ». Для объединения Wiki-пространства «u   » с Agile-проектом u    запустите импорт ещё раз с опцией «Импортировать в Документы Agile проекта» на втором шаге импорта.)r}   rc   r|   rD   r!   r   r\   r   r^   r   r  source_hashr   r   r   r   )	rF   r   rootZselected_projectsZprjZproject_keydupZdup_shZself_shr6   r6   r7   r     sD    
  
&0zCmfImport.get_confict_projectsc                 C   sB   t j D ]&}| jj |kr
t jj|d  S q
tddd d S )NZbackup_nameu   Бекап для данного импорта не существует. Воспользуйтесь функционалом "Отмена".T)abort)r\   CmfGlobalSettingsZpg_backup_lsrv   rc   lowerr*   r   )rF   Zbk_namer6   r6   r7   r*     s    zCmfImport.pg_restorec           
      C   s  |  dddg d}| jrdzzLt	
 8 | jjdrVtjj| jj d | jjdr|  }|r|D ]4\}}| jd	| tjd
 |jdd |j  qtdtjd< d| _d| _| jjjj| _|   | j  dtjd< | jD ]P}| j| D ]@}d}|dkr0t | ! " r0| j| | }| #||| qqtj$j%dd| gd | jj&| d}W 5 Q R X W n\ t'k
r } z<| j(  t)| dt*+|j,d  }	| -d |	| _.W 5 d}~X Y nX W 5 |  | _|   tjj  |  S X  | j/dkr| 0 S dS )u9   
        Импортируем файл в бд
        r   plugin.plugin.*zplugin.*FNr   r	  r   u7   Удаляем конфликтующий проект rg   T)TEXKOM_db_deleter   ZNO_CACHEr   1
downloadedr   r   rJ   r   r   u(   Ошибка работы импортаr   )1rD   r}   get_redis_import_statsimport_statsr_   cmfapp	CMF_CACHEflushdbcmfutilenable_import_moder=   rc   r^   r\   r  r   rv   r  r   rl   rX   ZWARNINGdeleter~   r   r   environZimported_object_countprogressr  r  listr   iterdirinc_statry   Zbulk_deleteprocess_importr   Zrollbackr   rw   	format_tb__traceback__r   	error_msgr   _process_import_excel)
rF   r   Zprojectsr  r   obj_nameopr   err
error_textr6   r6   r7   r"    sP    







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!   FZ	first_rowr   r   r   r   r   parent_taskZchild_tasksr   	executorsr   r   priorityr   r   r  rv   r   Z
cmf_authorZ	cmf_ownerzproject.basez
task.base%baserv   )Z	cmf_modelprefixZactivityztask.agile:softdev%Zsoftdevr   r  rQ   ZANDZ	parent_idr   r   r?   r   tasksZtree_parent_idZSprintsr  u
   ДоскаZkanban)r?   rQ   tree_parentZ	list_type)r   r   
obj_fields
filter_obj)leftrightZEpics=z	task.epicztask.epic:default)rQ   r3  r?   Z
logic_typeTZ	only_datau   Строка r   r   r  import-errorstatus_codeN).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CmfActivityrb   r   r-  r   r_   rv   rc   Z	CmfFolderr   ZCmfListCmfTaskitemsZCmfLogicTyper,  r   r   r   rw   r#  r$  r   	exceptionr%  r   r   r   )4rF   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   rc   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_folderr5  r4  dataZepic_objr2  r,  Zsub_taskZ
tasks_codeZsub_task_coder)  r*  r6   r6   r7   r&    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_idrH  Zcurrency_idr   )productrH  rF  r   T)forceZdeal_idr   rI  )r   r   rJ  Zsales_order)r   r\   Z
CmfProductr   rD   ZCmfPricer^   rb   r   rF  r_   Zpricesr   r   Z
deal_itemsrc   r   r  r   ZCmfDealItemsr   dealrJ  
is_changed)rF   r   rL  rJ  Zprice_settingr   rH  itemr6   r6   r7   _process_product  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.pipelinerG  r>   Zpipeline_idr   Z
company_idcompanypipeline)rP  r   r\   ZCmfPipeliner^   r_   r   rb   r   ZCmfDealrD   rQ  rM  )	rF   r   ZcontactrP  Zpipeline_settingr   r   rQ  rL  r6   r6   r7   _process_deal  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   ipzIP unavailabler   )r  r   r   ZmemoryZdiskzSTATS )timer   socketr   dictZAF_INETZ
SOCK_DGRAMZconnectZgetsocknamecloseOSError
getloadavgr   
disk_usager   r   r   )rF   rV  r   rW  ZstatsrA   r6   r6   r7   	get_stats  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r|  t  | jd|d	d
 dS |j
jdks|jdkrd|_
|jr|  t  | jd dS |   dS )Nr   r   r   cache_status_typerb   r   
   r:  u8   Импорт прерван, место на диске z.2fz	Gb < 10GbTimport-stoppingIN_PROGRESSimport-pauseduA   **** Импорт остановлен пользователемF)r   r  r  Zimport_heartbeatr   r\  r\   r   r^   rb   r   rM  r_   commit_with_eventr   r   rv   r^  warningr]  )rF   r   r   totalusedfreeZfree_gbr   r6   r6   r7   	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_sessionrf   stderr)
subprocessPopenopen)methodr   rl  r6   r6   r7   r   ;  s      zCmfImport.run_workerc                  O   s    t jd|d  t j  dS )/   
        Отменяем импорт
        r$   rb   N)r\   r   r   r:   )r   rm   r6   r6   r7   r$   B  s    zCmfImport.cancelc                 O   s    |  ddddg | jj| dS )uk   
        Предварительный просмотр получившихся объектов
        r=   r   r   r}   r   )rD   r}   r+   )rF   r   rm   r6   r6   r7   r+   K  s    zCmfImport.previewc                    s   t   ddddg S )Nr=   r   r   r}   )r   save_preload_fieldsrE   r   r6   r7   rq  R  s    zCmfImport.save_preload_fieldsc                    s   |    t jf |S r2   )r   r   r_   r   r   r6   r7   r_   U  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 )Nr  zimport.system.jira:defaultr0  zimport.system:default)r   r}   r|   r\   r?  r^   rE   r6   r6   r7   _calc_workflowY  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 )Nr   Z	_raw_dataT)exist_okparents)rD   r	   rZ   r   r   r}   Zui_namer  r  rc   mkdir)rF   resr6   r6   r7   r   a  s    zCmfImport.get_download_pathc                 C   s   | j |  d S r2   )r}   download_datarE   r6   r6   r7   rw  i  s    zCmfImport.download_datac                 C   s   | j |  d S r2   )r}   download_filesrE   r6   r6   r7   rx  l  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?   usernameattrsz==============ps auxz{:<10d} {:<20s} {:<10s}z==============netstat -panZnetstatz-panrS   )	r   rl  Zprocess_iterrl   formatr   Zcheck_outputdecode
splitlines)	rF   r   rl  Z	processesro   outputZ
output_strlinesliner6   r6   r7   
log_detailo  s    
(

zCmfImport.log_detail)api_urlsr1   c                    s  ddl m} ddlm  d dfddd dfdd}d dfd	d
}d dfdd}ttddd} fdd}	d}
|dd  rqn| }|dkrqnzd|  t	j
|dddddddddg	d}|jjpd } |d!}|jrd| jjjd"krJ|jd#krJ|| || ||| |	| d d$d% |jjD |_jjjd"kr|jd&kr||jj|jj|_|jrt|dr|jd'd( n|jd'd) |jD ]p}|jd*krܐq|jjpd } |d!}|js qȈ| d d+d% |jjD |_|jr|jd'd) qW q   jd,| tjd'd'd- |
d.7 }
Y qX qW 5 Q R X ||
 d S )/Nr   cmf_context)BeautifulSoupr0   c                    sP  |  dd D ]n}|d}|s.jd qjjj d| }tjj|d}|sjjd| d q|tj	
| q| j d	d
idD ]}d }|d}|sjd qtjjddd| dgdgd}|D ]}|jd |kr|} qq|sjd| d q|tj	
| q|  dD ]}|jdrDq,|jd}|sljd|  q,tj|}	|	js|	jr|	jdr,|	j kr,d }d }
|d}|d}|dkr|dkrЈjjj d| }
tjj|
dgd}|s2tjjd dd!jjj d"gddd#| dggd$}|sNjd%|
  q,|jt|jksnt|tjr6|j}|d&rtj|d& d'}| d(| }d)|jd< |jd |jd*< ||jd< q,nf|d+krJ|rJtjjd dd!| d"gdgd}|sjd,|  q,d)|jd< |jd |jd*< |j|jd< q,nd-|jd krtd.|jd D ]@}
jjj d|
d/d   }
tjj|
dgd}|rl qql|
sЈjd0|jd   q,|s6jd%|
  q,nFd1|jd krtd2|jd }|s4jd3|jd   q,tjjddd| d4d/d   dgdgd}|D ].}|jd | d4d/d  krf|} qqf|s6jd5| d4d/d    q,nrd6|jd krtd7|}|sq,| d/}tj!| d8}tjjd9d|gd:d;d ggdd<gd}|D ]&}t|j"jd |kr.|} qVq.|svjd=|d4   q,d)|jd< |jd |jd*< |j|jd< q,nd>|kr,td?|}|sq,| d/}tjjjjj d| d}|sjd@|  q,d)|jd< |jd |jd*< |j|jd< q,nq,|tj	
| q,d S )ANc                 S   s
   |  dS )Ndata-issue-id)Zhas_attr)tagr6   r6   r7   <lambda>  rR   z@CmfImport.obj_check_links.<locals>.check_links.<locals>.<lambda>r  uR   Не удалось найти id задачи в атрибуте 'data-issue-id'::r  u9   Не удалось найти задачу по ext_id ''zdata-macro-nameZjirar{  zdata-jira-keyuV   Не удалось найти код задачи в атрибуте "data-jira-key"import_raw_jsonLIKE%"key":""%r   r   u;   Не удалось найти задачу по коду ""acmf_convertedhrefu!   Ссылка без адреса httpzdata-linked-resource-typezdata-linked-resource-idpage)NZnull)r  r   r  %::::%%"homepage":{"id":"r  u:   Не удалось найти документ по ид zdata-anchor#z##TZ	href_origspaceuB   Не удалось найти пространство по ид z/wiki/z\/\d+r   u:   Не удалось найти ид документа в z/browse/z	\/\w+-\d+u6   Не удалось найти код задачи в r   u:   Не удалось найти задачу по коду z	/display/z'/display/([~]?[A-Za-z0-9]+)+(?:/)?(.*)?   r?   r   !=zparent.import_raw_jsonuB   Не удалось найти документ по ссылке z/pages/viewpage.action$/pages/viewpage.action\?pageId=(\d+)uC   Не удалось найти документ по ссылке: )#find_allr^   r   re  r}   r  r\   r   Zreplace_withr   Zcreate_tag_linkr  r  r|  urllibr   urlparseschemenetloc
startswithCmfDocumentr   stringr   r?   
isinstancer  quotelstripr   findallsearchgroupunquote_plusrQ   )soupr  Zissue_idZissue_ext_idZtaskr   Ztask_keyr2  r   Z
parsed_urlr  Zresource_typeZresource_idZtag_hrefZanchor_nameZext_codeobjsr   r   Z	space_key	page_nameZdocsdocpage_id)r  rF   r6   r7   check_links  s*   




 




 





z.CmfImport.obj_check_links.<locals>.check_linksc                    s  | j ddidD ]}|jdr"q|jd}|sF jd|  q|jd} jjj d| }tjj|d	}|stj	jd
dd jjj dgddd| dggd}|rt
|}|jj|d< |jj|d< t
||d< d|d< |d= q jd|  qdS )uz   
            Заменяет ссылку на корневую страницу в макросе Page Tree
            data-macrosz	page-treer{  r  data-macro-parametersu3   Макрос Page Tree без параметров Zroot_page_originalr  r  r  r  r  r  r  r  r  r  r  Z
rootLocaletrueue   В макросе Page Tree не удалось найти корневую страницу по ID N)r  r|  r^   r   re  r}   r  r\   r  r   jsonloadsrb   rc   r?   dumps)r  r  Zdata_macro_parametersZroot_page_idZroot_page_ext_idZpagetree_rootZmacro_paramsrE   r6   r7   check_pagetree_root?  s4    
z6CmfImport.obj_check_links.<locals>.check_pagetree_rootc                    s   | j dddgidD ]}|d}|dp4|d}tjjdd	d
 jjj dgddd| dggd}|s jd| d qtjj||d}|rt	|j
|d< q jd| d qdS )u\   
            Добавляет ID документа в макрос "Include"
            r  zinclude-excerptzinclude-pager{  zdata-param-projectkeyzdata-param-pagenamezdata-param-page-labelr  r  r  r  r  r   r  r  r  u^   В макросе "Include" не удалось найти пространство по key "uA   ". Возможно оно еще не импортированоrP   zdata-param-pageidu]   В макросе "Include" не удалось найти страницу по имени "u@   ".Возможно она еще не импортированаN)r  r^   r\   r   r}   r  r   re  r  r   rb   )r  r  Z
projectkeyr  r  Zexcerpt_pagerE   r6   r7   check_included  s&    


z0CmfImport.obj_check_links.<locals>.check_includec                    s  |j ddidD ]|}|ddkr&qd}d}d}d}|d}|rtdd	 |d
D }|dr|d }|dkr~| j}n$d|kr|dd\}}n
| j}|}|rtjjddd jjj dgddd| dggd}|s j	
d| d q|r&tjj||d}|s& j	
d| d q|p.|}	|	r|jdd}
d|	j |
_|d }t|}t|	j|d!< tj|d"d#d$|d < d|d< qdS )%u   
            Добавляет ID документа в параметр 'Родительская страница' макроса 'Отображение дочерних'
            r  zchildren-docsr{  r  r  Nzoriginal-data-macro-parametersc                 s   s.   | ]&}t |d ddkr|d dV  qdS )r8  r   r  N)r=  r   )r@   Zparamr6   r6   r7   	<genexpr>  s   zFCmfImport.obj_check_links.<locals>.check_childpages.<locals>.<genexpr>|r  /:r   r  r  r  r  r  r   r  r  r  u   При конвертации макроса 'Отображение дочерних' не найдено пространство с ключем 'uA   '. Возможно оно еще не импортированоrP   u}   При конвертации макроса 'Отображение дочерних' не найдена страница 'u9   '.Возможно она не импортированаzextension-object-name)class_z | r  Z
documentIdF),r  )Zensure_asciiZ
separators)r  r^   rX  r   rQ   r\   r   r}   r  r   re  r  findr?   r  r  r  r   rb   r  )r   r  r  r  ZdocumentZspacekeyZpagenameZoriginal_macro_parametersr  Zparent_pageZspan_object_nameZmacro_parametersparamsrE   r6   r7   check_childpages  sf    







z3CmfImport.obj_check_links.<locals>.check_childpages)task_raw_datalocal_linksc                 S   s   |pg }|  dg D ]}|d }|d }| ddks| ddks| dd	rRqtd
|d }|r|d}tjj ddd| gd}|sq||kr|| d|d< q|S )NZremotelinksobjectZapplicationr   zcom.atlassian.confluenceZrelationshipz	Wiki PageZ	processedFr  r   r   r  r  r  r  T)r^   r   r  r  r\   r  r   )r  r  Z
remotelinkZremotelink_objZremotelink_appr   r  r  r6   r6   r7   check_remotelinks  s*    



z4CmfImport.obj_check_links.<locals>.check_remotelinksc                    s   | j s
dS | j d }| D ]l}|s&q| D ]X\}}|s<q.tjdtjd}||sXq. |d}| ddd |jj	D ||< q.qd|i| _ d|i| _
dS )	u   
            Конвертирует ссылки, которые могут быть в макросе "Свойства страницы"
            Ndetailsz
<a .+?</a>)flagslxmlr   c                 S   s   g | ]}t |qS r6   r   r@   xr6   r6   r7   r     s     zFCmfImport.obj_check_links.<locals>.check_macros_db.<locals>.<listcomp>)	macros_dbvaluesr@  r   compileIr  r   bodyr   macros_db_draft)r   r  Zdetailr   rc   patternZ
value_soup)r  r  r6   r7   check_macros_db  s"    


 
z2CmfImport.obj_check_links.<locals>.check_macros_dbF)Zinit_views_and_dsDONEu5   Конвертируем ссылки объекта rQ   ru   zcomments.log_levelzcomments.textZ
text_draftr  r  r  r  r   r   r  r  r  c                 S   s   g | ]}t |qS r6   r  r  r6   r6   r7   r   !  s     z-CmfImport.obj_check_links.<locals>.<listcomp>r   T)Zsave_importr9  r  c                 S   s   g | ]}t |qS r6   r  r  r6   r6   r7   r   :  s     uZ   Не удалось конвертировать перекрестные ссылки в )rG   rk   r   )cmf.appr  Zbs4r  rX  r  ri  r^   rl   r  Zget_obj_by_idru   rc   Zhtmlr}   r|   r   r  r   r  r  rM  hasattrr_   ZcommentsZ	log_levelrX   rx   put)rF   r  	obj_queueobj_queue_errorsr  r  r  r  r  r  
has_errorsZobj_idr   Zobj_textr  ZcommentZcomment_textr6   )r  r  r  rF   r7   obj_check_links  s     6%G



zCmfImport.obj_check_linksc                 C   s  ddl m} dd l}t Z t D t . |   d}tt	| }t	j
jddddddggd	gd
}	g }
|	D ]$}|jsqx|
tj|jjj qx| d|j d| d|  t }t }g }| d| j  |j }t| jD ]F}tj| jd| |||
dd}|| |  | d|  qd}ddd gdddgg}|j|ddg||| gd}|D ]*}|  r q|d7 }| |j! qv|D ]}| d q| d|j  |D ]}|"  q|j | }| d||#   d d}|$ s$||% 7 }q
| d |j 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   r  r   INr  r  ZCmfPluginTrackerApiZCmfPluginYouTrackext_urlr   u)   Конвертируем ссылки в uB    на локальные задачи и документы start=z limit=uJ   Обрабатываем ссылки в несколько тредов: r  )r  r  r  )targetr?   rm   u.   Параллельный обработчик r   r  Zimport_originalr   Tz--rb   )rJ   r   slicer   r  u,   Ждем обработки ссылок в u*   ------------------------ скорость u#    обьектов в секундуu6   Закончили обработку ссылок в u   . Ошибок: )&r  r  r   r  disable_acldisable_notifyr  r   varsr\   Z	CmfPluginr  r  r   r  r   r  rc   r  rl   r   r   ZQueuer   r   ranger   Threadr  r,   Zslistri  r  rb   r   Ztotal_secondsemptyr^   )rF   Zapi_urlrD  r,   limitr  r   r  r   Zpluginsr  r}   r  r  Zobj_processrA   r   procZcntr   r  r   Zdiffr6   r6   r7   process_cross_linksD  s|    $ 	
	



zCmfImport.process_cross_linksr  c                 C   s6  d|krt dd}| d| d| j }tj}| j d| d}|jj|dd}|  zr|j ^}
|
| jj| |d k	r|
j|||d
 n&||r|
| n|
j|d|d
 |
  W 5 Q R X W 5 z|  W nH tjj	k
r" }	 z$t
d|	 d|j d	|j  W 5 d }	~	X Y nX X |dkr2|s2d| d| j }| d}|jj|dd}|  zn||sd| jj|i kr|j 8}
|
| jj| |
j|| j| d |d
 |
  W 5 Q R X W 5 z|  W nH tjj	k
r. }	 z$t
d|	 d|j d	|j  W 5 d }	~	X Y nX X d S )N-uA   Нельзя использовать "-" в obj_name: {obj_name}i:	 z.lock   )timeoutzlock release error z, lock_name z
, timeout )exr   r  zdownloaded-)r   rb   APPREDIS_DBredislockacquirerelease
exceptionsZ	LockErrorgdebugr?   r  rQ  Zsaddrc   setr3   ZincrZexecuter  r^   )rF   r'  r(  rc   Zttlr   redis_dbZlock_keyr  r   piper6   r6   r7   r!    sH    
4
"zCmfImport.inc_statc                 C   sj   t j}i }|j| jjD ]J}| }||}|d^}}}||sTt	 ||< | || |< q|S )Nr  )
r  r  r  Zsmembersrb   rc   r~  r^   r   rX  )rF   r  r   r   rc   r(  r'  r   r6   r6   r7   r    s    


z CmfImport.get_redis_import_statsc                 C   s(   |  ddg | jdkr | jjS |  S )Nr^  r  rb  )rD   r^  r  rc   r  rE   r6   r6   r7   r.     s    
zCmfImport.take_import_statsc                 C   s   |  ddddg | jdks(| jjdkr,dS tj st }| sd}| j	|t
jd	 || _| jjd
d| _|   |   dS dS )Nr   r%  r^  r   rb  import-plannedFu   Импорт прерван по неизвестной причине. Проверьте системные требования.r  r:  r;  T)rD   r^  r   rv   r  r  Zimport_is_runningCmfImportWorker
is_runningrl   rX   rx   r%  r   r   r_   r<   )rF   Zworkerr%  r6   r6   r7   r    s    
zCmfImport.is_runningTz	@minutely)Z	only_onceZ
system_jobZschedulec                  C   s`   t j sd S td t jjdddgdddgggdd	dd
gdD ]} |  sBtd|  qBd S )Nz&cmf_deferred_job: CmfImport.cron_checkr^  r   rb  zstatus.codezNOT INr  r   r%  r   r   uH   Импорт прерван по неизвестным причинам)	r\   r   r8   r  r  r  r  r  Zadmin_alert)r   r6   r6   r7   
cron_check  s    




zCmfImport.cron_check)rn   NNNNro   )r   )NN)r  N)KrK   rL   rM   r   r   Zui_meta_skipZapi_methodsr   r   rC   r	   r"   classmethodboolr8   r:   r<   propertyrX  r!   r   r   r   rX   rY   r   r   rl   r   r   r(   r  r)   r'   staticmethodr   r   r   r   r#   r/   r   r   r,   r-   r&   r   r%   r   r*   r"  r&  rO  rR  r]  ri  r   r$   r+   rq  r_   rr  r   rw  rx  r  r  r  r!  r  r.   r  Zcmf_deferred_jobr   __classcell__r6   r6   r   r7   r      s   

/	    
 



	
N%2 B!#
   AH
-r   c                    s   t   fdd}|S )Nc                    sT   z0 | f||}t   | jd t  |W S    | jd t  Y nX d S )Nu*   Импорт завершил работуu&   Ошибка работы демона)rd  r   r   r   r<   rA  rollback_purge_event)r   r   rm   rv  fnr6   r7   wrapped  s    z!catch_exceptions.<locals>.wrappedr   )r  r	  r6   r  r7   catch_exceptions  s    
r
  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 )r  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   rX   r   r	   ra   r   Zinit_loggerrY   ry  )rF   r  r   rX   r	   r6   r6   r7   __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}tjjdd|gd}|j	jdkrX|s|j d |jjdd|_	|
  n:|j	jdkrX|j d| 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   rb   r   rv   r   r   r  r  r   u%   ***Запускаем импорт***rb  import-startedr   r<  r   r_  r   r  u2   ***Импорт успешно завершен***zimport-completedr;  CLOSEDu6   ***Импорт завершен с ошибками: u,   . Подробности в отчете.***r:  r   /files/u+   Импорт данных завершен %d.%m.%Y %H:%M
, <a href=(   >Журнал логирования</a>Tr   Zpersonr?   rj   Zforce_notify_current_person)&r   r   r\   r   r^   r   rl   r   r   r   r_   rd  r  r  r  r  r"  geventsleeprb   ry   countrv   r   rd   baseFilenamer   rZ   r   	CmfNotifyplace_notifyr  current_personr?   r   r   r   r   )rF   r   r   rv  errorslog_pathr6   r6   r7   run  sB    

(


zCmfImportWorker.runc                 C   s  | 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  | }| }tjjdd|gd}|r|r|s|j d |j
jdd|_|  n:|jjdkr|j d| 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   rb   r   rv   r   r   r  r  r   u!   ***Запускаем дамп***rb  r  r  r   r  u.   ***Дамп успешно завершен***r  r   u2   ***Дамп завершен с ошибками: z***r:  r;  r   r  u'   Дамп данных завершен r  r  r  Tr  )"r   r   r  r  r  r  r\   r   r^   rl   r   r   r   r_   rd  rw  rx  ry   r  r   rd   r  r   rZ   r   r  r  r  r  r?   r   r   r   r   )rF   r   r   rv  Zres2r  r  r6   r6   r7   	dump_data,  s8    $


6zCmfImportWorker.dump_dataNr0   c                 C   sp  | j d t P 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 q8|s|j	j
dd|_|j d n"|j d|  |j	j
dd|_W nX tk
r2 } z8|j d|  t| t||_|j	j
dd|_W 5 d}~X Y nX W 5 |  tjj  X W 5 Q R X W 5 Q R X W 5 Q R X dS )rp  u   Отмена запущенаr   rb   r   rv   r   r   T)rJ   r   r   zimport-cancelingr;  r   Nu#   ***** Отменяем импортr   )rJ   r   u   Удаляем )r  rK  r   u#   Не удалось удалить uW   , видимо обьект использовали вне данных импортаimport_objectsuy   Не удалось удалить, видимо обьект использовали вне данных импортаzimport-canceledu,   Успешно отменили импортu#   Количество ошибок: r:  u   Ошибка удаления )r   r   r  r  r  r  r\   r   r^   r   r   r   r_   rd  r  r  r  r  r   r  r  r  rA  r!  r   r   r   r   r%  )rF   r   r   r  r   r   r6   r6   r7   _cancel_importL  s^    $ 
 


&zCmfImportWorker._cancel_importc                 G   s>   | j  rtd| j tt  | j|  | j   d S Nu"   Импорт уже запущен)	ry  r3   r   
write_textr   r   getpidr  r;   rF   r   r6   r6   r7   r,   ~  s
    

zCmfImportWorker.startc                 G   s>   | j  rtd| j tt  | j|  | j   d S r#  )	ry  r3   r   r$  r   r   r%  r   r;   r&  r6   r6   r7   dump  s
    

zCmfImportWorker.dumpc                 G   s>   | j  rtd| j tt  | j|  | j   d S r#  )	ry  r3   r   r$  r   r   r%  r"  r;   r&  r6   r6   r7   r$     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   rb  r   r   r  r  r   uQ   Пытаемся остановить импорт, таймаут 1 минутаra  r;  <   r   r_  u"   Импорт уже прерванrc  u<   Импорт остановлен пользователемu    Импорт не запущенu'   Останавливаем импортuK   Не удалось завершить процесс, он запущен?)r\   r   r^   r  r   re  r   r   r   r_   rd  r  r  r  rb   r^  r   ry  r3   r   killr   	read_textsignalSIGTERMrA  r;   )rF   r   r   r   r6   r6   r7   r-     s4    


zCmfImportWorker.stopc                 C   s0   | j  r,tt| j  r"dS | j   d S )NT)ry  r3   r  Zcheck_process_runningr   r*  r;   rE   r6   r6   r7   r    s    
zCmfImportWorker.is_running)r  )rK   rL   rM   r  r  r   r"  r
  r,   r'  r$   r-   r  r6   r6   r6   r7   r    s   
$ 2



r  )(Zcsvr   r   decimalr   r   r   rX   r   re   rw   r   r	   typingr
   r   r  r   r   ZxlrdZopenpyxlr   r   r  Zcmf.data_providers.baser   Zcmf.includer  r   Zcommon.fieldsr   r  r   r   r+  	functoolsr   r   r
  r  r6   r6   r6   r7   <module>   sJ              _