
    bhc                       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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#  ej$                    Z% G d dej&                  Z' G d dej(                  Z(d Z) G d d          Z*dS )    N)copydeepcopy)Decimal)datetimetimezone)LoggerPath)DictIterator)cached_property)*fields
cmf_import
log_configwrapsc                       e Zd Zd ZdS )AnonymousFilterc                 $    t          |dd          S )N	anonymousF)getattr)selfrecords     ./common/models/cmf_import.pyfilterzAnonymousFilter.filter!   s    v{E222    N)__name__
__module____qualname__r    r    r   r   r       s#        3 3 3 3 3r    r   c                   r    e Zd Zej        j        dz   Zej        j        g dz   ZdZdZdZ	 e
d          Zedefd            Zed             Zed	             Zedefd
            Zedefd            Zej        ddfdedefdZ	 	 dSdedededededefdZd ZdefdZd Zde fdZ!d Z"e#d             Z$d Z% fdZ&d  Z'd! Z(d" Z)e#dTd$            Z*ed%             Z+e#d&             Z,e#d'             Z-d(efd)Z.d* Z/dUd+e fd,Z0d- Z1dVd.Z2d/ Z3d0 Z4defd1Z5d2 Z6d3 Z7d4 Z8d5 Z9e#dWd6efd7            Z:e#dXd8            Z;d9 Z< fd:Z= fd;Z>d< Z?de
fd=Z@d> ZAd? ZBd@ ZCdAe defdBZDdC ZEdD ZFdE ZGdYdGZHdH ZIdefdIZJdJ ZKe# eLdKdKdLM          dN                         ZMe#	 	 dZdPedQefdR            ZN xZOS )[	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_settingsCSVNz/tmp/eva_import_worker.flagreturnc                 4    | j                                         S N)r1   existsclss    r   worker_herezCmfImport.worker_here<   s    #**,,,r    c                 8    | j                                          d S rB   )r1   touchrD   s    r   create_worker_flagzCmfImport.create_worker_flag@   s    ""$$$$$r    c                 n    | j                                         r| j                                          d S d S rB   )r1   rC   unlinkrD   s    r   remove_worker_flagzCmfImport.remove_worker_flagD   s>    &&(( 	* '')))))	* 	*r    c                     | j         s2|                     dg           d | j        d         D             | _         | j         S )Njson_settingsc                      i | ]}|d          |S namer$   ).0ss     r   
<dictcomp>z-CmfImport.import_settings.<locals>.<dictcomp>M   s    $a$a$aaQvY$a$a$ar    r0   )_import_settingsload_fieldsrN   r   s    r   r0   zCmfImport.import_settingsI   sM    $ 	bo.///$a$a4;MN_;`$a$a$aD!$$r    c                    t           j        rt          j        nt          j        }t          j                            d|           }|sNt                              d|           }|                                 |j        s|	                    dd           t          j                            d|           }|sNt                              d|           }|                                 |j        s|	                    dd           t          j        |j        ddd	d
          }|                    |           |                    t                              t          j                             t          j        |j        ddd	d
          }|                    |           |                    t                              t          j                             |                    t%                                 t                                          }|                    |           |                    t          j                               t          j                            t.          |||          }|                                 t                              d| j                   }|                    |           d|_        |j        s7|                    t          j                            t.                               |S )uE    Журнал логирования процесса импорта data.logrQ   parentr    F)make_previewzanonymous_data.logutf-8Di@KL    )filenameencodingwhenmaxBytesbackupCountimport_)configDEBUGloggingINFOmodelsCmfAttachmentgetsavefile_existsupload_filer   MyLogsHandlerfull_path_filesetLevelsetFormatter	Formatter	FORMATTER	addFilterr   StreamHandlerCustomFormatterhandlersQueueListener	log_queuer;   	getLoggerid	propagate
addHandlerQueueHandler)	r   levelattachment_logattachment_log_anonfile_handleranonymous_handlerconsole_handlerlistenerr)   s	            r   r)   zCmfImport.loggerP   s    "(?7<  -11z$1OO 	D#11z$1OON!!!!- D**3U*CCC$266<PY]6^^" 	I"("6"6<PY]"6"^"^$$&&&&2 I#//%/HHH "/#2"
 
 
 	e$$$!!'"3"3J4H"I"IJJJ&4(7"
 
 
 	""5)))&&w'8'89M'N'NOOO##O$5$5666 "//11  '''$$Z%?%A%ABBB #11	
 
 	 ""#6TW#6#677  	Hg.;;IFFGGGr    Fmsgr   c                 :     | j         j        ||fd|i|dd| dS )uI  Логируем как обычные лог для веб так и со скрытыми данными для возможности отправки в СТП

        Args:
            msg (str): сообщение
            level (int, optional): уровень логирования. Defaults to logging.INFO.
        r      )extraexc_info
stacklevelN)r)   log)r   r   r   r   r   kwargss         r   r   zCmfImport.log   sP     		
 	*	
 	
 	
 	
 	
 	
 	
r    ERR-0001process
error_codeobj_typeext_href	dump_path
error_typec           
         |                      |t          j                   t                              ||| |||t          j                    |          }|r]|j        |_        |j	        |_
        | j        r>| j                            |          |_        | j                            |          |_        |                                 t#                       dS )u7  Логируем ошибки и записываем их в базу

        Args:
            msg (str): текст ошибки
            error_code (int, optional): Код ошибки для нахождения возможного решения или группировки. Defaults to 1.
        )r   r   )textcoder   r   r   r   	tracebackr   N)r   rh   ERRORrj   CmfImportErrorr   
format_excrQ   title
class_namer   plugincalc_ext_hrefr   calc_dump_pathr   rm   
cmf_commit)	r   r   r   objr   r   r   r   import_errors	            r   	log_errorzCmfImport.log_error   s     	S...,,#2<8<7@8B6>7@7K7M7M6> - / /  	I!$L$'NL!{ I(,(A(A#(F(F%)-)C)CC)H)H&r    c                 J    t           j        | _        t           j        | _        d S rB   )rf   IMPORT_THREADSr-   IMPORT_DOWNLOAD_THREADSr.   rW   s    r   _prepare_multiprocessingz"CmfImport._prepare_multiprocessing   s    #)#8 ,2,J)))r    c                 F   ddl }ddl}|                                }|dz
  }|                     d| dd           |                                j        }t          |dz            }|                     d	| d
d           t          j        rt          t          j        |          }|                     dt          j         dd           t          t          |dz            |          }|                     d| dd           |st          d| d| d          |S )u.  
        Рассчитывает максимальное количество процессов
        для создания нескольких независимых процессов

        Returns:
            int: максимальное количество процессов
        r   N   u4   Количество ядер системы (CPU): u    (не менее 2)T)r      @u%   Доступно памяти (RAM): u!    ГБ (по 2 ГБ на ядро)u/   Количество процессов (MAX): uB    (в параметре 'IMPORT_PROCESS' конфигурации)r   u    (итоговое)uY   Недостаточно системных ресурсов для импорта (CPU: z, RAM: uq    ГБ). За дополнительной информацией обратитесь в техподдержку)multiprocessingpsutil	cpu_countr   virtual_memory	availableintrf   IMPORT_PROCESSmin	Exception)r   r   r   r   r/   available_memoryavailable_memory_gbs          r   get_max_processeszCmfImport.get_max_processes   s    	'&&&&&&& $--//	!Ab9bbb 	 	
 	
 	
 "0022<!"2i"@AAj4Gjjj 	 	
 	
 	
   	F 5}EEMQf>S Q Q Q 	 	
 	
 	
 C 3a 788-HH`m``` 	 	
 	
 	

  	}"} }+>} } }   r    c                     t           j                            d| dg          }|s0t                               d|           }|                                 |j        s| j                            d           |j        S )uK   
        Возвращает путь текущему файлу
        rY   url)rQ   r[   r   rZ   u   Начало)rj   rk   rl   rm   rn   r)   infor   )r   argsr   r   s       r   r7   zCmfImport.get_log_filename   s      -11z$X]W^1__ 	"#11z$1OON!!!) 	-K^,,,!!r    c                      t                               d                                        dd            fdt          j                  D             }|S )u   
        Список файлов после logrotate, чтобы можно было загрузить историю
        T)parentsexist_okc                 &   g | ]}t           j                            t           j                            |                    ?t                              d |          Zt           j                            d                                |          S )z%(?:data|anonymous_data)\.log(\.\d+)?$files)ospathisfilejoinrematchget_files_dir)rR   fdir_pathr   s     r   
<listcomp>z/CmfImport.get_log_filenames.<locals>.<listcomp>  s     P P Prw||Ha'@'@AAP"JANNPRW\\'4+=+=+?+?CC P P Pr    )r
   r   mkdirr   listdir)r   r   r   	file_listr   s   `   @r   r8   zCmfImport.get_log_filenames  s~     **40011td333P P P P PRZX`MaMa P P P	 r    c                 :   dd l }t          |                     d                    }|                    d          }t          j                            |          rt	          j        |           |                    |d          5 }| 	                                D ]7}|
                    dt          j                  }|                    |           8	 d d d            n# 1 swxY w Y   t          j                            d|                                 d          S )Nr   Tall_logs.zipw/filesr   )zipfiler
   r   joinpathr   r   rC   removeZipFiler8   replacerf   
UPLOAD_DIRwriter   )r   r   r   r   r   zip_pathmyzip	file_paths           r   r6   zCmfImport.get_all_logs_by_zip  s8   **40011$$^447>>(## 	 Ih__Xs++ 	'u!3355 ' '	%--h8IJJ	I&&&&'	' 	' 	' 	' 	' 	' 	' 	' 	' 	' 	' 	' 	' 	' 	' w||GT%7%7%9%9>JJJs   ACC#&C#c                     ddl m} t          j        j        d         }|j                            |           s|                    | d          } | S )Nr   )cmf_hashlibtask_code_prefixABCDEFGHIJKLMNOPQRSTUVWXYZ)	enc_table)cmf.utilr   rj   
CmfProjectr   regex	fullmatchshort_str_enc)keyr   r   s      r   get_correct_keyzCmfImport.get_correct_key  s`    (((((( ",34FG%//44 	Y++C;W+XXC
r    c                 ~   dd l }ddlm}  ||                     d                    }|                    t          j                                        d           d          }|                                 }|r|	                    |d          5 }|                                 D ]K}	|	
                    dt          j                  }	|                    |	           t          j        |	           L	 d d d            n# 1 swxY w Y   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strftimer8   r   r   rf   r   r   r   r   r   r   )
r   r   r   r   r
   r   r   log_file_pathsr   r   s
             r   zip_all_logszCmfImport.zip_all_logs'  sy         4**40011$$(?(?(M(M%\%\%\]]//11 	O3// )5!%!7!7!9!9 ) )I ) 1 1(F<M N NIKK	***Ii(((()) ) ) ) ) ) ) ) ) ) ) ) ) ) ) 7<<););)=)=~NNN	O 	Os   A!C??DDc                     | j                                         s | j                            d          | _         t	                                                       d S )NOPENstatus_type)statusloadworkflowget_default_statussuper_calc_statusr   	__class__s    r   r   zCmfImport._calc_status6  sP    {!! 	O-::v:NNDKr    c                 F   | j         d         rd S | j        r#| j                                        | j         d<   d S | j        dk    rd 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 )
Nmodels_fieldsexcelu   Поля контактов)captionr   iconu   Поля задачu   Поля заметокu   Поля проектовu"   Поля списков задачu   Поля групп)rN   r   calc_models_settingstypeappendrj   	CmfPersonimport_shop_fieldsr   CmfTask
CmfCommentr   CmfListCmfPersonGrouprW   s    r   _calc_models_settingszCmfImport._calc_models_settings;  s3   o. 	F; 	26+2R2R2T2TD/F9F?+22?\>D>N>a>a>c>c<B<L<Q4S 4S 	T 	T 	T 	?+22?T>Dn>_>_>a>a<BN<O4Q 4Q 	R 	R 	R 	?+22?X>D>O>b>b>d>d<B<M<R4T 4T 	U 	U 	U 	?+22?Z>D>O>b>b>d>d<B<M<R4T 4T 	U 	U 	U 	?+22?c>Dn>_>_>a>a<BN<O4Q 4Q 	R 	R 	R 	?+22?T>D>S>f>f>h>h<B<Q<V4X 4X 	Y 	Y 	Y 	Y 	Yr    c                 <   |                      g d           | j        d         rd S | j                            |           | j        d<   d| j        d<   d| j        d<   d| j        d<   d| j        d	<   d| j        d
<   | j        | _        |                                  d S )NrN   attachmentsr  r   r0   r   Tsend_invitesFremove_conflict_projects
add_suffix	pg_backupmerge_identic_names)rV   rN   r   r2   rm   r   r   s     r   r2   zCmfImport.calc_import_settingsV  s    KKKLLL/0 	F040P0P\`0P0a0a,--1>*9>56+0<(*.;'4901!/		r    c                 h   |                      g d           | 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	d          | j        d	<   | j                            | 
          | j        d<   | j        | _        |                                  d S )Nr  r0   r  Tr  r  Fr  r  r   )rV   rN   valuerl   r   r>   rm   r  s     r   r>   zCmfImport.tmplt_import_settingse  s)   KKKLLL/0 	F-1-?-E-I-I.Z^-_-_>*9=9K9Q9U9UVprv9w9w56+/+=+C+G+GV[+\+\<(*.*<*B*F*F{TX*Y*Y;'484F4L4P4PQfhm4n4n01040Q0Q]a0Q0b0b,-!/		r     c                     d|                      d           d} t                              d|  d|            t          |            d S )Nu1   Ошибка при импорте данных. .ue   . Проверьте загружаемый файл и повторите попытку снова.zCmfImportError: : )striprh   error	cmf_alert)r   es     r   
_log_errorzCmfImport._log_errorr  sZ     x#))C..  x  x  x33333444#r    c                     |                      dg           | j        d         D ]}|d         | j        k    r
|d         c S g S )NrN   r0   rQ   r   )rV   rN   r'   )r   settingss     r   r(   z$CmfImport.csv_import_settings_fieldsx  s_    /*+++*+<= 	* 	*H4#888)))) 9	r    c                     t           j                                         t           j                            d|            t           j                                         dS )uJ   
        Запускаем в фоне импорт данных
        r;   N)rj   CmfAccessListactivate_admin_moder&   
run_workerrI   	import_id_args_kwargss      r   r;   zCmfImport.start  sM     	00222##GY777++-----r    c                 F    t           j                            d|            dS )uR   
        Останавливаем в фоне импорт данных
        r<   N)rj   r&   r$  r%  s      r   r<   zCmfImport.stop  s#    
 	##FI66666r    entity_typec                 $   |                      dg           d}||v r*| j        j        j        dk    rt	          d| dd           d|i}t
          j                            d	| j        |
           t
          j        	                                 dS )u   
        Запускает отдельную обработку сущностей (фильтры, связи, ссылки и др.)

        Args:
            entity_type (str): тип сущности (filters, relations, links, etc.)
        r   filters	relationsCmfPluginJirau4   Запуск отдельной обработки 'u?   ' возможен только для импорта из JiraTabortr*  process_entity)paramsN)
rV   r   r  r   r  rj   r&   r$  r}   rI   )r   r*  jira_entitiesr3  s       r   r2  zCmfImport.process_entity  s     	($$$
 =((!,??Q{ Q Q Q     -##$4dgf#MMM++-----r    c                     dd l }|                                 }|                                r|                    |           d S d S )Nr   )shutilget_download_pathrC   rmtree)r   r   r   r6  download_paths        r   r5   zCmfImport.delete_dump  sR    ..00!! 	)MM-(((((	) 	)r    rowc           
         d}||j         }|sg }i }t          | j                  D ]o\  }}|d         r8||         r0|d         d                             d          d         |j        k    rF|d         d         |k    r||         ||d         d         <   p|s|S  ||           }	t          t          |	d	                    }
|D ]p}|j                            |          }t          |t          j
                  st          |t          j                  r^d}|                                D ]3}|                    d
dd||         gd	d||         ggdg          }|r n4|rt          |	||           t          |t          j                  rt          |	|||                    ||         }t          |t          j                  r9t!          j        |d          }t!          j        |t           j        j                  }t          |t          j                  rX|                    |d|g           r| j        d         r|                    |dg          }|s|                    d	          }|r|                    |dgd          }|r|
|	_        |                    |	j        dg          }|r.|	j         dt5          j        t8          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   r   ORrQ   ==z**r   r   RUunionT)r   r   include_deleted)rQ   r   _z%Y%m%d-%H%M%S)r>  	enumerater(   splitr   strr   r   rl   
issubclassCmfRelationCmfGenericRelationrelated_modelssetattr
CmfRelBaseCmfPhonephonenumbersparseformat_numberPhoneNumberFormatINTERNATIONAL
CmfNumericr  rN   r   rQ   r   r   r   utcrm   )r   r:  model_filterr   result_fieldsisettingnew_objnew_coder?  fieldrel_obj	rel_modelvalphoner   s                     r   _process_objzCmfImport._process_obj  sT    ;$C 	G#D$CDD 	G 	GJAw=) Q }-.>?EEcJJ1MQVQaaa}%n5<<@CA.|<= 	M%4(((ww//00! 	4 	4JL$$Z00E%!344 	
5&Jc8d8d 	!&!5!5!7!7  I'mmD64Q[I\:]5;T7:CV4W4Ybfag , i iG  GZ999%!233 GZ)<===*%C%11 f$*355"08V8dee%!233 NNJc23333g& 	>YYgtfY==F 	;;v&&D SdVTRR (' YYGL$Y@@F \"),[[hl1K1K[[[FKKMMMr    c                 .    |                      d          S )um   
        Ручка фронта для проверки конфликтующих проектов
        T)as_msg)get_conflict_projectsrW   s    r   r4   zCmfImport.check_projects  s     )))666r    c           
      H   |                      dg           | j        j        j        dk    rdS g }ddd}| j        d         d         d	         }d
 |d         D             }|D ]W}|                     |d                   }|                    d          p|d         }| j        j        j         d|d          }	t          j	        
                    ddd|	gddd|	 dggdg d          }
|
rC| j        j        j        dk    r|
j        dk    s"|
j        d         |k    r|
j        d         |k    rt          j	                            ddd|gdd|ggdg d          }|D ]Y}d}t          |j        o|j        j        | j        j        j        k              }| j        j        j        dk    r$|j        dk    rd |j         d!|j         d"|d#<   |}n| j        j        j        dk    ra|j        dk    rV|j        dk    r*| j        d$         d         d         d%k    r|j        sd&|d'<   d(| d!|                                 d"|d#<   |}n|j        r	|j        s|r|}|r^|j         d)|j         d*}|j        dk    r|d+z  }n|j        dk    r|d,z  }|j        r|d-z  }n|r|d.z  }|                    ||f           [Yd/}|rUd0d/                    d1 |D                        d2d/                    d3 |                                D                        d4}|r|nd5 |D             S )6u  
        Возвращает список конфликтующих проектов или текст сообщения для предупреждения

        Args:
            as_msg (bool, optional): возвращать в виде текста для сообщения. Defaults to False.

        Return:
            list, str: список проектов или текст сообщения
        plugin.plugin.source_hashCmfPluginCsvNu^   отменить выбор аналогичных импортируемых проектовu   удалить существующие проекты (проекты и все их данные будут безвозвратно удалены))r3   deleteselectedObjectsr  r   c                 >    g | ]}|d          
|d         |d          S )r   	isCheckedr$   )rR   rc  s     r   r   z3CmfImport.get_conflict_projects.<locals>.<listcomp>  s1    gggCs5zgVYZeVfgSZgggr    childrenr   original_namerQ   ::r}   r@  ext_id=LIKE%::::%T)--logic_prefiximport_raw_json)r   rE  r   CmfPluginConfluenceproject.agileILIKEr   )ry  r   zcmf_import.ext_idcmf_deletedzproject.wikiu   добавить суффикс 'Wiki' к названию или коду существующих Wiki-проектов (пример: 'z Wiki' (zWIKI))r  import_typeprojectu   объединить с существующими Agile-проектами, запустив импорт с опцией 'Импортировать в Документы Agile проекта'combineu   импортировать с добавлением 'Wiki' к названию или коду проекта (пример: ' ()u    <em>Agile-проект</em>u    <em>Wiki-проект</em>u(    <em>удален в корзину</em>uI    <em>импортирован из другого источника</em>r  u               <p><strong>В системе уже существуют проекты с аналогичными названиями или кодами:</strong></p>
            <ul>c              3   (   K   | ]\  }}d | dV  dS z<li>z</li>Nr$   )rR   project_namerF  s      r   	<genexpr>z2CmfImport.get_conflict_projects.<locals>.<genexpr>  s2      ``a3333``````r    u   </ul>
            <br />
            <p><strong>Для продолжения импорта вы можете:</strong></p>
            <ul>c              3   "   K   | ]
}d | dV  dS r  r$   )rR   actions     r   r  z2CmfImport.get_conflict_projects.<locals>.<genexpr>  s.      MM&----MMMMMMr    z</ul>
            c                     g | ]\  }}|S r$   r$   )rR   rF  r  s      r   r   z3CmfImport.get_conflict_projects.<locals>.<listcomp>  s    "R"R"Rzq'7"R"R"Rr    )rV   r   r  r   r0   r   rl   source_hashrj   r   sgetry  rz  listboolr   rs  rQ   r   r~  upperr  r   values)r   rg  conflicting_projectsactionsrootselected_projectsprjselected_project_keyselected_project_nameselected_project_ext_idr  matching_projectsmatching_projectconflicting_projectother_sourcer  r   s                    r   rh  zCmfImport.get_conflict_projects	  s    	56777;'>99F! w o
 

 #$56w?Bgg4
3Cggg$ k	U k	UC#'#7#7E
#C#C $'GGO$<$<$KF!)-);)G&V&V3t9&V&V# ',,s$;<v'I-D'I'I'IJ
 !%   -  G  )48MMM#0OCC  /7;PPP#3E:>RRR  !' 1 6 6W&;<'2FG
 !%   !7 ! ! %6 6U 6U &*##$/ ](3:dk>P>\\   
 K%04III(5GGFAQAVF F,=F F F L)
 +;''K%04III(5GG'4GG/>wGMQZZZ$/; !{ $I.
A+@A A06688A A A L)
 +;''(3;'3; $; +;'& U&9&>#i#iBUBf#i#i#iL*7?JJ$(FF,9^KK$(EE*6 t$(RR% t$(ss(//?R0STTTm6Up  	``K_````` 
 MMGNN<L<LMMMMM  C Rss"R"R=Q"R"R"RRr    c                     t           j                                        D ]D}| j        j                                        |v r"t           j                            |          c S Et          dd           d S )Nbackup_nameu   Бекап для данного импорта не существует. Воспользуйтесь функционалом "Отмена".Tr0  )rj   CmfGlobalSettingspg_backup_lsr   r  lowerr9   r  )r   bk_names     r   r9   zCmfImport.pg_restore  s    /<<>> 	P 	PGy$$&&'11/::w:OOOOO 2  e  mq  	r  	r  	r  	r  	r  	rr    c                 4   |                      g d           d}| j        rW	 t                                          5  | j        j                            d          r<t          j        	                    | j
        j                                                   | j        j                            d          rc|                                 }|rM|D ]J}|                     d| t          j                   |                    d	           t#                       Kd
t$          j        d<   d| _        d| _        | j        j        j        j        | _        |                                  t#                       dt$          j        d<   | j        D ]w}| j        |         D ]g}d}|dk    rFt5          |                                                                           r| j        |         |         }|                     |||           hxt          j                            dd| g           | j                             |           }ddd           n# 1 swxY w Y   nu# tB          $ rh}tE                       tG          |           dtI          j%        |j&                  d          }| '                    d|            || _(        Y d}~nd}~ww xY w| )                                | _        |                                  tT          j+        j,        -                                 |S # | )                                | _        |                                  tT          j+        j,        -                                 |c cY S xY w| j.        dk    r| /                                S dS )u9   
        Импортируем файл в бд
        )r   plugin.plugin.*zplugin.*Fr  r  r  u7   Удаляем конфликтующий проект r   T)TEXKOM_db_deleter  NO_CACHEr   1
downloadedr   rA  r   r   N
u*   Ошибка работы импорта: r   )0rV   r   cmfutilenable_import_moderN   r  rl   rj   r  r  r   r  rh  r   rh   WARNINGrl  r   r   environimported_object_countprogressr  rs  rm   import_statsr  r7  iterdirinc_statr   bulk_deleteprocess_importr   cmf_rollbackrI  r   	format_tb__traceback__r   	error_msgget_redis_import_statscmfapp	CMF_CACHEflushdbr  _process_import_excel)	r   rZ  projectsr  obj_nameoprc  err
error_texts	            r   r  zCmfImport.process_import  s    	===>>>; '	&//11 I I)/33K@@ `0::tyG\G\G^G^:___)/334NOO -#'#=#=#?#?# -+3 - - $)lcj)l)lt{  uD  !E  !E  !E ' E E E *-/BJz*12D.$%DM"&+"4"@"FDKIIKKKLLL-0BJz*$($5 = ="&"3H"= = =B"#C!\11d4;Q;Q;S;S;[;[;];]6^6^1&*&7&A"&E MM(B<<<<	= )55lDRV=W5XXX![7747HHF5I I I I I I I I I I I I I I I6  , , , #CXXI,?@Q,R,RSU,VXX
QCQQRRR!+	, %)$?$?$A$A!		!))+++	 %)$?$?$A$A!		!))+++9--///  sU   I HI I II II L 
K
"AK L K

L AM6c           	         ddl m} | j        r| j        d         sdS d}	 i }i }i }i }i }i }i }	|                                 }
t          |
          D ]\  }}|dk    r| j        d         ri }i }d}d}t          | j                  D ][\  }}|d         r||         s|d         d                             d	          d         }|                    |i           }|d         d
                             d	          }|d         }||         }|dk    r|}|dk    r|}t          |          dk    r:|dk    r|||d         <   |                    |i           }||         ||d         <   nm|dk    r"|dk    r|
                    ||                   }nE|dk    r|                    ||                   }n#|dk    rd|                    ||                   i}|||<   |||<   ]|                    di           }|                    dd          }|                    |                    d                    }|s<|                    | t          j        |          \  }}|||                    d          <   |                    | t          j        |          \  }}|                    di           }|                    d          r|d         |d<   |                    di           }|r|	                    |          }|s|dk    rAt          j                            ddt          j                            d                    }n@t          j                            ddt          j                            d                    }||	|<   ||d <   ||d<   ||d!<   ||d"<   d#d$d%|j        gdd%|d         gg}|                    | t          j        ||          \  } }| j                            |           |                                  | ||d         <   |r0|                    |g           }!|!                    |            |!||<   |r<|                    |d         g           }"|"                    |           |"||d         <   |                    d&i                               d'd          }#|#rf|# d(|j        j         }$|                    |$i           }%||%d!<   |#|%d'<   |%                    d)g           }&|&                    |            |&|%d)<   |%||$<   |                    |                    d                    }'|'st          j                            d#d*d%|j        gg d+g,          }(d#d*d%|(j        gg d-g})d.||(d/d0}*|                    | t          j        |*|)1          \  }'}|'||                    d          <   |                    | t          j        |'| d2           |                                D ]\  }$}+t          j                            d#d*d%|+d!         j        gg d3g,          }(d#d*d%|(j        gd'd%|+d'         gg d4g})t          j                            |),          },|,s\t                              |+d!         |(|+d'         t          j                             d5          6          },|,                                 |+d)         D ]} |,| _!        |                     d78            |                                D ]U\  }}-|                    |          }.|.r9|-D ]6}/|/j!        "                                 |.|/_!        |/                                 7V|                                D ]l\  }}0|                    |          }.|.rP|0D ]M}1|                    |1          }/|/r4|/j!        "                                 |.|/_!        |/                                 Nmn# tF          $ r}2tI          |2           d9| d:|2 d;tK          j&        |2j'                  d<          }3| j(        )                    |3           |3| _*        | j+        ,                    d=>          | _-        |                                  Y d?}2~2dS d?}2~2ww xY wd7S )@u   
        Запуск импорта из CSV

        :return: Истина в случае успешного импорта
        r   )CmfPluginImportMixinr0   F	first_rowr  r<  r=  r  r?  parent_taskchild_tasksr   	executorsry  r   priorityr   r   r|  r   r  
cmf_author	cmf_ownerzproject.basez
task.base%baser   )	cmf_modelprefixactivityztask.agile:softdev%softdevr   r  r[   AND	parent_idrA  r  rQ   rF  taskstree_parent_id)rQ   rA  Sprintsr  )rQ   rA  
   Доскаr  kanban)rQ   r[   tree_parent	list_type)r   rX  
obj_fields
filter_obj)leftright)rQ   rA  Epics)ry  rt  z	task.epicztask.epic:default)r[   r  rQ   
logic_typeT	only_datau   Строка r  r  r  import-errorstatus_codeN).%common.models.cmf_plugin_import_mixinr  r  rN   	_get_filerG  r(   rH  rl   lenget_logic_prefixget_priorityget_status_type
setdefaultprocess_any_table_fieldsrj   r   r  CmfWorkflowcalc_workflowCmfActivityr}   r  r  r  rm   r   r  	CmfFolderr  CmfListCmfTaskitemsCmfLogicTyper  r   r   r  r   r  r  r)   	exceptionr  r   r   r   )4r   r  
number_rowall_parent_taskall_child_tasksall_epic_tasks	all_tasks
cash_boardcash_projectcash_workflow_task	file_readr:  executorr[  parent_task_codechild_tasks_codeidxr]  
model_name_rowfields_namer?  r  project_fieldsry  r  rF  executor_objtask_fieldsvalue_statusr   filter_tasktask_objtmp_parent_taskstmp_child_tasks	epic_nameepic_keytmp_data	tmp_taskslist_objparent_folderr  r  dataepic_objr  r  sub_task
tasks_codesub_task_coder  r  s4                                                       r   r  zCmfImport._process_import_excel  s'
    	ONNNNN 	t'9:K'L 	5
q	 O ONIJL!#((I#,Y#7#7 {e {e
C??t'9+'F?#% #% $-d.M$N$N / /LC"=1 !S ! !(!78H!I!O!OPS!T!TUV!WJ";;z266D")-"8"F"L"LS"Q"QK!,QJHE!]22+0( #}44+0( ;''!++%447<H[^4$ $R 8 803Ck!n--%77J,<V<V$8$I$I#c($S$SEE':55$8$E$Ec#h$O$OEE'833%24H4X4XY\]`Ya4b4b$cE',D$*.GJ''!(\2!>!>-88YY&**>+=+=f+E+EFF G!5!N!NtU[Ufhv!w!wJGQ?FL!3!3F!;!;<"6"O"OPTV\Vfhp"q"qa%kk)R88??<00 I/:</HK,*x<< 9155lCCH# D'>99'-'9'G'GR[dpQWQcQgQgmsQgQtQt (H (v (vHH (.'9'G'GR[OdQWQcQgQgmvQgQwQw (H (y (yH <D*<8/7L,,8K))0I&(/H%${D'*&EPTVabhViGjk2KKDRXR`LWYdf f!")),77719	+f-. $ I'6':':;KR'P'P$$++H5558HO$45 $ K&5&9&9+f:Mr&R&RO#**+;<<<;JOK$78
 $KK	266::62FF	 8"+BBgl.@BBH-11(B??H*1HY''0HV$ (Wb 9 9I$$X...(1HW%/7N8, &>>.*<*<V*D*DEE F$*$4$8$8IY[_ahakHlAZAZAZA\$8 %] %]M"'*:D-BR)S">">">"@J*6,31>/7"9 "9J #7"O"O[_V\Vd[e[e #P #g #gKHa >FJ~11&99:$==dFDYGOZb>c>ce e e e #1"6"6"8"8 2 2$ & 0 4 4UEUW[]abk]l]oDp=T=T=T=V 4 !W !W $&6m>N%O%tT&\:<^<^<^`
!>--Z-@@ $%~~T)_R_37<9?9L9P9PVi9P9j9j  .  l  lH MMOOO $W 2 2H+3H(MMDM11112
 ,;+@+@+B+B ( (' %'mm,<== ($) ( ( ,11333/:, 0?0E0E0G0G , ,, *'mm,<== ,)3 , ,#,==#?#?# ,$0557773>H0$MMOOO,  	 	 	jjjsjji>QRURc>d>deg>hjjJK!!*---'DN-::~:VVDKIIKKK55555	 ts   ^=_ 
a?(Ba::a?c           	         |                      |t          j                  }|r|sdS d}| j        D ]}|d         r|d         d         dk    r|}|                    dg           t          j                            |j        t          |d                   |j	        j        dg          }|sJt                              |t          |d                   |j	        | 	          }|
                                 |j                            d
           t          |j        j                  D ]K}|j        j        | j        k    r|                                 |j        j                            |           L|                      |t          j        t          j        j        dd|j        gdd|j        gg          }|                    ddg           ||_        ||_        |j        r|
                                 |S )u;   
        Импорт товара в сделку
        Nr<  r=  zCmfProduct.pricescurrencyfile_valprice)
product_idr!  currency_idr   )productr!  r  r   T)forcedeal_idrA  r"  )r   rY  r$  sales_order)re  rj   
CmfProductr(   rV   CmfPricerl   r}   r   r  rm   pricesr   r   
deal_itemsr  r   rl  r   CmfDealItemsr>  dealr$  
is_changed)r   r:  r-  r$  price_settingr   r!  items           r   _process_productzCmfImport._process_product  s
    ##C):;; 	7 	47 	) 	)H& )8M+BCS+TXk+k+k (*&&&##wzWaIbAcAc040@' $ T T 	OOG7=Q[C\;];]hlhu/3 $ 5 5EJJLLL$'''.// 	/ 	/D!TW,,KKMMMO!((....  f&9v?P?]+4dDG*D|UY[b[eFf)g ! i i)]3444	? 	IIKKKr    c                    |s|r|j         sd S d }| j        D ]}|d         r|d         d         dk    r|}|sd S g }t          j                            |d                   }|s5t                              |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   rP   pipeline_idrA  
company_idcompanypipeline)r5  r(   rj   CmfPipelinerl   rm   r  r}   re  CmfDealrV   r6  r.  )	r   r:  contactr5  pipeline_settingr   rY  r6  r-  s	            r   _process_dealzCmfImport._process_deal  s    	 	w 	47 	, 	,H& ,8M+BCS+TXj+j+j#+  	4%))/?
/K)LL 	))/?
/K)LLHMMOOOtX[9::: 	ENNL$
;<<<<NNL$0BCDDD  fng>>)Z0111| 	/ /&&} 	%$DM? 	IIKKKr    c                    dd l }dd l}dd l}| j        r |j                     | j        z
  dk     rd S  |j                     | _        t	                      }	 |                    |j        |j                  }|                    d           |                                d         |d<   |	                                 n# t          $ r d|d<   Y nw xY w	 |                                |d<   n# t          $ r d|d<   Y nw xY w|                                |d<   |                    |                                           |d	<   | j                            d
|            d S )Nr      )z8.8.8.8P   ipzIP unavailabler   )r  r   r   memorydiskzSTATS )timer   socketr*   dictAF_INET
SOCK_DGRAMconnectgetsocknamecloseOSError
getloadavgr   
disk_usager7  r)   r   )r   rB  r   rC  statsrS   s         r   	get_statszCmfImport.get_stats  s     	t/?!?1 D DF$49;;		+ fnf.?@@AIIo&&&--//!,E$KGGIIII 	+ 	+ 	+*E$KKK	+	'"--//E&MM 	' 	' 	'&E&MMM	' //11h))$*@*@*B*BCCf)%))*****s%   A&B; ;CCC) )C;:C;c                    dd l }t          j                                         |                                 }|                    |          \  }}}|dz  }t          j                            | j	        ddg          }|dk     rQd|_
        |j        rA|                                 t                       | j                            d|d	d
           dS |j
        j        dk    s|j        dk    rLd|_
        |j        r<|                                 t                       | j                            d           dS t                       |                                  dS )Nr   r   r   cache_status_typer}   r   
   r  u8   Импорт прерван, место на диске z.2fz	Gb < 10GbTimport-stoppingIN_PROGRESSimport-pauseduA   **** Импорт остановлен пользователемF)r6  r  r  import_heartbeatr7  rL  rj   r&   rl   r}   r   r.  rm   r   r)   r  r   rP  warningrN  )r   r6  r9  totalusedfreefree_gbr   s           r   	is_cancelzCmfImport.is_cancel  sS   "33555..00"--m<<tT'"""dgxAT6U"VVR<<'CJ~ u


!!"s]d"s"s"s"sttt4:?///33HM3Y3Y(CJ~ i


##$ghhh4ur    r3  c           
      \   ddl }d| dg}t          |t                    r5|                                D ] \  }}|                    | d| d           !d                    |          }|                    dddd	|  d
| dgddt          dd          t          dd                     dS )ul  
        Запускает выполнение метода импорта в отдельном процессе 

        Args:
            method (str): метод импорта
            import_id (str): ID импорта (CmfImport)
            params (dict, optional): параметры запускаемого метода. Defaults to None.
        r   N"z=",/usr/bin/python3	manage.pyshellzHfrom common.models.cmf_import import CmfImportWorker; CmfImportWorker().(r  T"/var/log/eva-import-subprocess.loga+&/var/log/eva-import-subprocess.err.log	close_fdsstart_new_sessionstdoutstderr)
subprocess
isinstancerD  r  r  r   Popenopen)methodr&  r3  rl  params_lkvs          r   r$  zCmfImport.run_worker  s     	$	$$$%fd## 	. . .11----(##"K8%+8 8.48 8 8
 "<dCC@$GG 	 
	
 
	
 
	
 
	
 
	
r    c                      t           j                            d|d                    t           j                                         dS )/   
        Отменяем импорт
        r3   r}   N)rj   r&   r$  rI   )r   r   s     r   r3   zCmfImport.cancel+  s<    
 	##HfTl;;;++-----r    c                 f    |                      g d           | j                            |           S )uk   
        Предварительный просмотр получившихся объектов
        r  r   )rV   r   r:   r   r   r   s      r   r:   zCmfImport.preview4  s8     	KKKLLL{""d"333r    c                 N    t                                                      g dz   S )Nr  )r   save_preload_fieldsr   s    r   ry  zCmfImport.save_preload_fields;  s%    ww**,,/a/a/aaar    c                 ^    |                                    t                      j        di |S )Nr$   )r
  r   rm   )r   r   r   s     r   rm   zCmfImport.save>  s1    ""$$$uww|%%f%%%r    c                     | j         rd S | j        r5| j        j        dk    r%t          j                            d          | _         t          j                            d          | _         d S )Nr/  zimport.system.jira:defaultr  zimport.system:default)r   r   r   rj   r  rl   rW   s    r   _calc_workflowzCmfImport._calc_workflowB  sg    = 	F; 	V4;1_DD".228T2UUDM*..4K.LLr    c                 t   |                      dg           t          t          j                                      | j        j                                         d          }| j        j        j        j	        r)|                    | j        j        j        j	                  }|
                    dd           |S )Nrj  	_raw_dataT)r   r   )rV   r
   rf   r   r   r   ui_namer  r  r  r   )r   ress     r   r7  zCmfImport.get_download_pathJ  s    56777*++448K8Q8Q8S8S5^5^5^__;)/ 	E,,t{1=CDDC		4	...
r    c                 :    | j                             |            d S rB   )r   download_datarW   s    r   r  zCmfImport.download_dataR  s    !!$'''''r    c                 :    | j                             |            d S rB   )r   download_filesrW   s    r   r  zCmfImport.download_filesU  s    ""4(((((r    c           	      N   dd l }dd l}|                    g d          }|                     dt          j                   |D ]Y}|                     d                    |j        d         |j        d         |j        d	                   t          j                   Z|                     d
t          j                   |                    ddg          }|	                    d          }|
                                }|D ]#}|                     |t          j                   $d S )Nr   )pidrQ   usernameattrsz==============ps auxr  z{:<10d} {:<20s} {:<10s}r  rQ   r  z==============netstat -pannetstatz-panr]   )r   rl  process_iterr   rh   rg   formatr   check_outputdecode
splitlines)	r   r   rl  	processesr   output
output_strlineslines	            r   
log_detailzCmfImport.log_detailX  s<   ''.I.I.I'JJ	'w}===  	 	GHH)00e1DglSYFZ\c\his\tuum     
 	-W]CCC(()V)<== ]]7++
%%''  	0 	0DHHTH////	0 	0r    api_urlsc                     ddl m} ddlm d& fdd& fd}d& fd}d& fd}d& fd	}d
t          dt
          fd}	fd}
d} |d          5  	                                  rn]|                                }|dk    rnA	 t          	                    |g d          } j
                            d| d|j         d           |j        j        pd} |d          }|j        r ||            j        j        j        dk    rF|j        dk    r; |||            |||            |||            |||            |
|           d                    d |j        j        D                       |_         j        j        j        dk    r7|j        dk    r,|j        r% |	|j        j        |j        j                  |_        |j        r=t1          |d          r|                    d           n|                    d           |j        D ]}|j        d k    r|j        j        pd} |d          }|j        s0 ||           d                    d! |j        j        D                       |_        |j        r|                    d           n$#                       d"d#|$           |d%z  }Y nxY wsd d d            n# 1 swxY w Y   |                    |           d S )'Nr   cmf_context)BeautifulSoupr@   c           
         |                     d           D ]}|                    d          }|sj                            |  d           7j        j        j         d| }t          j                            |          }|s!j                            |  d| d           |                    t          j	        
                    |                     |                     dd	i
          D ]}d }|                    d          }|sj                            |  d           9t          j                            ddd| dgdg          }|D ]}|j        d         |k    r|} n|s!j                            |  d| d           |                    t          j	        
                    |                     |                     d          D ].}|j                            d          r|j                            d          }	|	sJj                            |  dt          j                            t#          |                                	 t          j                            |	          }
n9# t&          $ r,}j                            |  d|	 d|            Y d }~d }~ww xY w|
j        s|
j        r%|
j                            d          r'|
j        v rd }d }|                    d          }|                    d          }|dk    r`|dvr[j        j        j         d| }t          j                            |dg           }|s?t          j                            d!dd"j        j        j         d#gddd$| dgg%          }|s!j                            |  d&|            |j        t#          |j                  k    st7          |t          j                  r|j        }|                    d'          r?t          j                            |d'                             d(                    }| d)| }d*|j        d<   |j        d         |j        d+<   ||j        d<   nV|d,k    r~|r|t          j                            d!dd"| d#gdg          }|s!j                            |  d-|            d*|j        d<   |j        d         |j        d+<   |j        |j        d<   *d.|j        d         v rt>                               d/|j        d                   D ]F}j        j        j         d|d0d           }t          j                            |dg           }|r nG|s,j                            |  d1|j        d                     |s!j                            |  d&|            nd2|j        d         v rt>          !                    d3|j        d                   }|s,j                            |  d4|j        d                     ]t          j                            ddd|"                    d5          d0d           dgdg          }|D ]2}|j        d         |"                    d5          d0d          k    r|} n3|s<j                            |  d6|"                    d5          d0d                      nd7|j        d         v rt>          !                    d8|	          }|sE|"                    d0          }t          j                            |"                    d9                    }t          j                            d:d|gg d;gdd<g          }|D ])}t#          |j#        j        d                   |k    r|} n*|s'j                            |  d=|d5                     d*|j        d<   |j        d         |j        d+<   |j        |j        d<   ;d>|	v rt>          !                    d?|	          }|s^|"                    d0          }t          j                            j        j        j         d|           }|s!j                            |  d@|	            d*|j        d<   |j        d         |j        d+<   |j        |j        d<   |                    t          j	        
                    |                     0d S )ANc                 ,    |                      d          S )Ndata-issue-id)has_attr)tags    r   <lambda>z@CmfImport.obj_check_links.<locals>.check_links.<locals>.<lambda>x  s    o1N1N r    r  uT   : Не удалось найти id задачи в атрибуте 'data-issue-id'rr  rs  u;   : Не удалось найти задачу по ext_id ''zdata-macro-namejirar  zdata-jira-keyuX   : Не удалось найти код задачи в атрибуте 'data-jira-key'rz  ru  %"key":""%rB  r   u=   : Не удалось найти задачу по коду "r^  acmf_convertedhrefu#   : Ссылка без адреса u9   : Не удалось разобрать URL-адрес 'z': httpzdata-linked-resource-typezdata-linked-resource-idpage)Nnull)rs  r   rs  rv  rw  %"homepage":{"id":"r  u<   : Не удалось найти документ по ид zdata-anchor#z##T	href_origspaceuD   : Не удалось найти пространство по ид z/wiki/z\/\d+r   u<   : Не удалось найти ид документа в z/browse/z	\/\w+-\d+u8   : Не удалось найти код задачи в r   u<   : Не удалось найти задачу по коду z	/display/z+/display/([~]?[A-Za-z0-9]+)+(?:/)?([^?#]*)?r   rQ   r   z!=Nzparent.import_raw_jsonuD   : Не удалось найти документ по ссылке z/pages/viewpage.action$/pages/viewpage.action\?pageId=(\d+)uE   : Не удалось найти документ по ссылке: )$find_allrl   r)   rW  r   r  rj   r  replace_withrk  create_tag_linkr  rz  r  urllibrR  unquote_plusrI  urlparser   schemenetloc
startswithCmfDocumentr   stringrQ   rm  r  quotelstripr   findallsearchgroupr[   )main_objsoupr  issue_idissue_ext_idtaskr   task_keyr  r   
parsed_urlexcrs  resource_typeresource_idtag_hrefanchor_nameext_codeobjsr:  r   	space_key	page_namedocsdocpage_idr  r   s                             r   check_linksz.CmfImport.obj_check_links.<locals>.check_linksv  s   }}%N%NOO L L77?33 K''#yyy   "&+"4"@NNHNN~)))>> K''#oo`looo     !4!D!DT!J!JKKKK }},=v+F}GG K K77?33 K''#}}}   ++-v7N(7N7N7NO-. ,  
 "  D+E2h>>" ?  K''#mmbjmmm     !4!D!DS!I!IJJJJ}}S)) dO dO9==11 immF++ K''#mmHaHabefibjbjHkHkmm   
!'!6!6s!;!;JJ    K''#kk^akkfikk   HHHH	 $*NO.8.?NO")44V<<NOAKARV^A^A^C!F$'GG,G$H$HM"%''*C"D"DK$..;n3T3T$(K$6$B!S!Sk!S!S$044FF84TT  # "("3"7"7%-v7`T[=O=[7`7`7`$a%6@fWb@f@f@f$g(" #8 # #C  # % K//#+ q qio q q   % :SX66*S&J[:\:\6'*xH"ww}55 H.4l.@.@]ASAZAZ[^A_A_.`.`.6+G+G++G+G9=CIo658Yv5FCIk208CIf-$ 7 ''11k1$/33HfNdT_NdNdNd;e<B8 4 E E" % K//#+ ~ ~q| ~ ~   %59	/21461B	+.,/H	&) !SYv%666&(jj39V;L&M&M & &F(,(:(F%V%V&QRQSQS*%V%VF"("4"8"8PVx"8"X"XC" & %&% % K//#+ | |ilirsyiz | |   %" % K//#+ q qio q q   %	%
 $sy'888#%99\39V;L#M#M' % K//#+ x xehenouev x x   %%~22$5v?c(..YZJ[J[\]\^\^J_?c?c?c#d$5#6  3    
 $( & &C"259X^^A=N=Nqrr=RRR&) %  S  # % K//#+  !A  !Aiqiwiwxyiziz{|{}{}i~  !A  !A   %	%
 %	&(999 "		*XZ] ^ ^$ %$$)KKNN	$*L$=$=ekk!nn$M$M	%166!' ; : : :$ %+,D#E  7     $( & &C"3:#=e#DEERR&) %  S  # % K//#+ { {qvwxqy { {   %59	/21461B	+.,/H	&) 1S88 "		*QSV W W$ %$"'++a..$044&*k&8&D#Q#Q#Q#Q 5    # % K//#+ w wru w w   %59	/21461B	+.,/H	&)  $$V%8%H%H%M%MNNNIdO dOs   I??
J5	"J00J5c           	         |                     ddi          D ]k}|j                            d          r|j                            d          }|s j                            |  d|            Z|j                            d          }j        j        j         d| }t          j                            |	          }|s?t          j	                            d
ddj        j        j         dgddd| dgg          }|r_t                              |          }|j        j        |d<   |j        j        |d<   t                              |          |d<   d|d<   |d= Lj                            |  d|            mdS )uz   
            Заменяет ссылку на корневую страницу в макросе Page Tree
            data-macrosz	page-treer  r  data-macro-parametersu5   : Макрос Page Tree без параметров root_page_originalrr  r  rs  ru  rv  rw  rz  r  r  r  r  
rootLocaletrueug   : В макросе Page Tree не удалось найти корневую страницу по ID N)r  r  rl   r)   rW  r   r  rj   r  r   jsonloadsr}   r  rQ   dumps)	r  r  r  data_macro_parametersroot_page_idroot_page_ext_idpagetree_rootmacro_paramsr   s	           r   check_pagetree_rootz6CmfImport.obj_check_links.<locals>.check_pagetree_rootL  s    }}M;+G}HH    9==11 (+	6M(N(N%, K''8(o(ojm(o(oppp"y}}-ABB&*k&8&D#V#V#V#V  & 2 6 6>N 6 O O$ $*$5$9$9%v/XT[5G5S/X/X/XY.8_|8_8_8_`  %: % %M ! #'::.C#D#DL+8+;+AL(1>1C1IL.37::l3K3KC/0+1C(011K''# O O AMO O   ;   r    c           	      v   |                     ddi          D ]}|                    dd                                          dk    r0|                    d          }|                    dd	          }t                              |          }|                    d
          }t          j                            dddj	        j	        j
         dgddd| dggdg          }|s!j                            |  d| d           |j        |d
<   t                              |dd          |d<   d|d<   d S )Nr  wikilivesearchr  r  falser  zdata-macros-parametersz&quot;r^  currentSpaceKeyrs  ru  rv  rw  rz  r}  r  r  rx  rB  u   : При конвертации макроса 'Livesearch' (Динамический поиск) не найдено пространство с ключем 'A   '. Возможно оно еще не импортированоFr_  :ensure_ascii
separators)r  rl   r  r   r  r  rj   r   r  r   r  r)   rW  r}   r  )r  r  r  macros_parametersr3  r  r  r   s          r   check_livesearchz3CmfImport.obj_check_links.<locals>.check_livesearchr  s   }}M;K+L}MM . .77?G44::<<FF$'GG,D$E$E!$5$=$=h$L$L!$566"JJ'899	 +00!6+T1C1O+T+T+TU*G5M	5M5M5MN !6 1    K''# Z ZYbZ Z Z   ,3J()04

!&) 1; 1 1,-
 (.O$$=. .r    c           	      :   |                     dddgi          D ]}|                    d          }|                    d          p|                    d          }t          j                            dd	d
j        j        j         dgddd| dgg          }|s!j                            |  d| d           t          j                            ||          }|rt          |j
                  |d<   މj                            |  d| d           dS )u\   
            Добавляет ID документа в макрос "Include"
            r  zinclude-excerptzinclude-pager  zdata-param-projectkeyzdata-param-pagenamezdata-param-page-labelrs  ru  rv  rw  rz  r}  r  r  r  u`   : В макросе "Include" не удалось найти пространство по key "uA   ". Возможно оно еще не импортированоrZ   zdata-param-pageidu_   : В макросе "Include" не удалось найти страницу по имени "u@   ".Возможно она еще не импортированаN)r  rl   rj   r   r   r  r)   rW  r  rI  r}   )r  r  r  
projectkeyr  r  excerpt_pager   s          r   check_includez0CmfImport.obj_check_links.<locals>.check_include  s    }}M<M~;^+_}``   WW%<==
GG$9::^cggF]>^>^	 +//!6+T1C1O+T+T+TU*G5N
5N5N5NO 0    K''# Z Z zDZ Z Z  
 %1559W5UU /2<?/C/CC+,,K''# Z Z yBZ Z Z   - r    c           	      4   |                     ddi          D ]}|                    d          dk    rd}d}d}d}|                    d          }|r~t          d |                    d	          D                       }|                    d
          r=|d
         }|dk    r| j        }n'd|v r|                    dd          \  }}n	| j        }|}|rct
          j                            dddj        j        j         dgddd| dgg          }|s"j	        
                    |  d| d           |rEt
          j                            ||          }|s"j	        
                    |  d| d           f|p|}	|	r|                    d          }
d|	j         |
_        |                    d          }t                              |          }t#          |	j                  |d <   t                              |d!d"#          |d<   d|d<   dS )$u   
            Добавляет ID документа в параметр 'Родительская страница' макроса 'Отображение дочерних'
            r  zchildren-docsr  r  r  Nzoriginal-data-macro-parametersc              3      K   | ]A}t          |                    d d                    dk    )|                    d d          V  BdS )rt  r   r   N)r  rH  )rR   params     r   r  zFCmfImport.obj_check_links.<locals>.check_childpages.<locals>.<genexpr>  s]       5 5!u{{32233q88 C++88885 5r    |r  /r  r   rs  ru  rv  rw  rz  r}  r  r  r  u   : При конвертации макроса 'Отображение дочерних' не найдено пространство с ключем 'r  rZ   u   : При конвертации макроса 'Отображение дочерних' не найдена страница 'u9   '.Возможно она не импортированаzextension-object-name)class_z | r  
documentIdFr  r  )r  rl   rD  rH  r[   rj   r   r   r  r)   rW  r  findrQ   r  r  r  rI  r}   r  )r   r  r  r  documentspacekeypagenameoriginal_macro_parametersr  parent_pagespan_object_namemacro_parametersr3  r   s                r   check_childpagesz3CmfImport.obj_check_links.<locals>.check_childpages  s    }}M?+K}LL C. C.77?++v55,/GG4T,U,U), ,04 5 5%>%D%DS%I%I5 5 5 1 1-
 144V<< ,8@3;;&)jGG D[[15C1C1C.Hhh&)jG'+H !$/33%v/XT[5G5S/X/X/XY.9PH9P9P9PQ  4  G # !++" ^ ^]e^ ^ ^   ! 	!%1558G5TTH# !++" W WEMW W W   !&1' '*xx7Nx'O'O$.FK4D.F.F$+'*ww/F'G'G$!ZZ(899F+.{~+>+>F<(37::%*#- 4> 4 4C/0
 (.O$$GC. C.r    task_raw_datalocal_linksc                    |pg }|                      dg           D ]}|d         }|d         }|                     d          dk    s/|                     d          dk    s|                     dd	          r[t                              d
|d                   }|r\|                    d          }t          j                             ddd| g          }|s||vr|                    |           d|d<   |S )Nremotelinksobjectapplicationr  zcom.atlassian.confluencerelationshipz	Wiki Page	processedFr  r   r   rs  ru  rv  r  T)rl   r   r  r  rj   r  r  )r  r  
remotelinkremotelink_objremotelink_appr   r  r  s           r   check_remotelinksz4CmfImport.obj_check_links.<locals>.check_remotelinks  s#   %+K+//rBB 3 3
!+H!5!+M!: #&&v..2LLL!~~n55DD!~~k599 E  		"I>Z_K`aa 3#kk!nnG ,006?QX??8[0\\C ! +--#**3///.2J{+r    c                    | j         sdS | j         d         }|                                D ]}|s|                                D ]\  }}|st                              dt          j                  }|                    |          sD |d          } | |           d                    d |j        j	        D                       ||<   d|i| _         d|i| _
        dS )u   
            Конвертирует ссылки, которые могут быть в макросе "Свойства страницы"
            Ndetailsz
<a .+?</a>)flagslxmlr  c                 ,    g | ]}t          |          S r$   rI  rR   xs     r   r   zFCmfImport.obj_check_links.<locals>.check_macros_db.<locals>.<listcomp>)  s    *T*T*Ta3q66*T*T*Tr    )	macros_dbr  r  r   compileIr  r   bodyrp  macros_db_draft)	r   r  detailr   r  pattern
value_soupr  r  s	          r   check_macros_dbz2CmfImport.obj_check_links.<locals>.check_macros_db  s    = mI.G!..** V V "(,,.. V VJC  !  jjbdjCCG">>%00 ! !.uf!=!=JKZ000"$''*T*T:?;S*T*T*T"U"UF3KKV '0CM#,g"6Cr    F)init_views_and_dsTDONE)	r[   r   zcomments.log_levelzcomments.text
text_draftr  rz  r  r  r   u5   Конвертируем ссылки объекта r  r  r  r  r{  r  c                 ,    g | ]}t          |          S r$   r  r  s     r   r   z-CmfImport.obj_check_links.<locals>.<listcomp>U  s    +O+O+OqCFF+O+O+Or    r  r$  )save_importr  r   c                 ,    g | ]}t          |          S r$   r  r  s     r   r   z-CmfImport.obj_check_links.<locals>.<listcomp>o  s    /S/S/S1A/S/S/Sr    uV   Не удалось конвертировать перекрестные ссылкиzERR-0034)r   r   r   r@   N)cmf.appr  bs4r  rD  r  r\  rl   r  get_obj_by_idr)   debugr   r   r  htmlr   r   r   r  rp  rz  r  r.  hasattrrm   comments	log_levelr   put)r   r  	obj_queueobj_queue_errorsr  r  r  r  r  r  r!  
has_errorsobj_idr   obj_textr  commentcomment_textr  r  s   ``                @@r   obj_check_linkszCmfImport.obj_check_linksr  s   ''''''%%%%%%T	O T	O T	O T	O T	O T	O T	Ol$	 $	 $	 $	 $	 $	L	. 	. 	. 	. 	. 	.B	 	 	 	 	 	@G	. G	. G	. G	. G	. G	.R	T 	 	 	 	 	6	7 	7 	7 	7 	7 	7, 
[5111 J	$ J	$I$>>## "V##A$!//
  
  
  0  C K%%&s^d&s&shkhp&s&s&sttt"x~3H(=6::Dy Q#C... K-8<QQQ #- ? ?//T:::,,S$777)M#t444,,S$777+OC000#%77+O+ODI<N+O+O+O#P#P )48MMMNi77/ 8 +<*;/5O1+ +
 ~ 5"355 5HHH6666HHtH444#&< 
9 
9",11$'.|'9'?R,}\6BB#y %$#C...')ww/S/S	@R/S/S/S'T'T"- 9#LL4L888
9$NNq#- #   
 !OJJJSI$J	$ J	$ J	$ J	$ J	$ J	$ J	$ J	$ J	$ J	$ J	$ J	$ J	$ J	$ J	$X 	Z(((((s+   4KHJ%$K%KKKKc                 x   ddl m} dd l}t                                          5  t                                          5  t                                          5  |                                  d}t          t                    |         }t          j
                            ddg dgdg          }g }	|D ]K}
|
j        s
|	                    t          j                            |
j        j                  j                   L|                     d|j         d	| d
|            t+          j                    }t+          j                    }g }|                     d| j                    |j                                        }t3          | j                  D ]f}t5          j        | j        d| |||	d          }|                    |           |                                 |                     d|            gd}g dg dg}|                    |ddg|||z   g          }|D ]7}|                                 r n |dz  }|                     |j!                   8|D ]}|                     d           |                     d|j                    |D ]}|"                                 |j                                        |z
  }|                     d||#                                z   d           d}|$                                s+||%                                z  }|$                                +|                     d|j         d|            |cd d d            cd d d            cd d d            S # 1 swxY w Y   d d d            n# 1 swxY w Y   d d d            d S # 1 swxY w Y   d S )Nr   r  r  IN)r{  r/  CmfPluginTrackerApiCmfPluginYouTrackext_urlrB  u)   Конвертируем ссылки в uB    на локальные задачи и документы start=z limit=uJ   Обрабатываем ссылки в несколько тредов: r9  )r2  r3  r  )targetrQ   r   u.   Параллельный обработчик r  import_originalrA  Trx  r}   )r   r   slicer   r#  u,   Ждем обработки ссылок в u*   ------------------------ скорость u#    обьектов в секундуu6   Закончили обработку ссылок в u   . Ошибок: )&r)  r  r   r  disable_acldisable_notifyr  r   varsrj   	CmfPluginr  r>  r  r  rR  r  r  r  r   r>  r,   Queuer-   r   ranger+   Threadr9  r;   slistr\  r1  r}   r   total_secondsemptyrl   )r   r  r;   limitr  r   r4  rX  pluginsr  r   r2  r3  obj_processrS   r\  proccntrY  r  r   diffs                         r   process_cross_links_by_modelz&CmfImport.process_cross_links_by_model|  s   ''''''  "" C	 C	G$:$:$<$< C	 C	g>X>X>Z>Z C	 C	))+++JLL,E
 &++D   "{ ,  G H! T T~  5 5fn6J K K RSSSSHH  mAS  m  m  X]  m  m  fk  m  m  n  n  nI${}}KHH|bfbz||}}}!%%''A4344 R R '/.1..%.,<$,    ""4(((

P$PPQQQQC1113R3R3RSG;;gtTl',eem&<  > >D & &>>## Eqcf%%%%# & &f%%%%HHXEDVXXYYY#  		$((**Q.DHH  B#HZHZH\H\B\  B  B  B  C  C  CJ&,,.. 5.22444
 ',,.. 5HH~eN`~~r|~~GC	 C	 C	 C	 C	 C	 C	 C	 C	 C	 C	 C	 C	 C	 C	 C	 C	 C	 C	 C	 C	 C	 C	 C	 C	 C	 C	 C	 C	 C	 C	 C	 C	 C	 C	 C	 C	 C	 C	 C	 C	 C	 C	 C	 C	 C	 C	 C	 C	 C	 C	 C	 C	 C	 C	 C	 C	 C	 C	 C	 C	 C	 C	s_   N/NLN N'N/ NNNNN/N	N/N	N//N36N3c                    dd l }|                    dddd| j         d| d| dt          j         d		gd
d
t          dd          t          dd                    }| j                            d|j         d| d| d           |S )Nr   r`  ra  rb  z&cmf_import = models.CmfImport.get(id='z,');cmf_import.process_cross_links_by_model('z', z, z);Trd  re  rf  rg  u1   Запущен process_cross_links_by_model (pid=z model_name=z start=r  )	rl  rn  r}   rf   IMPORT_OBJ_CNTro  r)   r   r  )r   r  r;   rl  rP  s        r   _execute_cross_linkszCmfImport._execute_cross_links  s   "Kn n n<Fn nKPn nTZTin n n
 "<dCC@$GG   

 

 	FHF F*4F F=BF F F	
 	
 	

 r    c           	      v   d}	 |                                  | _        n1# t          $ r$}|                     d|            |cY d}~S d}~ww xY wt	          j                    }g dg dg}dD ]}t          t                    |         }|                    |          }|s6t                       | j
                            d|j         d	| d
| j                    t	          j                    }d}	g }
t          | j                  D ]D}|                     ||	          }|
                    |           |	t           j        z  }	|	|k    r nE|                                  |	|k     rt	          j        d           t)          |
          D ]}|                                }|h||z  }|
                    |           |                     ||	          }|
                    |           |	t           j        z  }	|                                  |	|k     t)          |
          D ]'}|                                 |j        r
||j        z  }(t	          j                    |z
  }| j
                            d| d|dd           t	          j                    |z
  }| j
                            d|dd|            |S )u   
        Обработка ссылок на задачи и документы в тексте импортированных объектов
        r   u.   Ошибка обработки ссылок: Nr  r@  )r  r  r   r  r  u5   Обработка ссылок в объектах 'z' (u,   ) в несколько процессов: r   u$   Обработка ссылок в 'u   ' завершена за z.3fu    сек.uA   Обработка всех ссылок завершена за u    сек. Ошибок: )r   r/   r   r   rB  	monotonicrE  rj   countr   r)   r   r>  rH  rV  r  rf   rU  r  sleepr  pollr   communicate
returncode)r   errorsr  total_t1rY  r  rX  obj_cntmodel_t1r;   r   rF  rP  r]  new_procmodel_t2total_t2s                    r   process_cross_linkszCmfImport.process_cross_links  st    	!%!7!7!9!9D 	 	 	NNFFF   MMMMMM		 >##---/N/N/NOO 1	B 1	BJLL,Ekkk11G LLLKRHZ R R_i R R=A=OR R   ~''H EG4-..  00UCCt$$$..7??E # OO'//
1 MM 
* 
*D!%J!-*,t,,,#'#<#<Z#O#Ox000!66))) '//" W . .  """? .do-F~''(2HK  AJ  A  Ajr  A  A  A  A  B  B  B  B>##h.  K]e  K  K  K  CI  K  K  	L  	L  	Ls    
AAAAr  c                    d|v rt          d          d}| d| d| j         }t          j        }| j         d| d}|j                            |d          }|                                 	 |j                                        5 }	|	                    | j        j	        |           ||	
                    |||           nC|                    |          r|	                    |           n|	
                    |d|           |	                                 d d d            n# 1 swxY w Y   	 |                                 n# t          j        j        $ r7}
t"                              d	|
 d
|j         d|j                    Y d }
~
npd }
~
ww xY w# 	 |                                 w # t          j        j        $ r7}
t"                              d	|
 d
|j         d|j                    Y d }
~
w d }
~
ww xY wxY w|dk    r|sd| d| j         }| d}|j                            |d          }|                                 	 |                    |          sd| j        j	                            |i           v r|j                                        5 }	|	                    | j        j	        |           |	
                    || j        |         d         |           |	                                 d d d            n# 1 swxY w Y   	 |                                 d S # t          j        j        $ r8}
t"                              d	|
 d
|j         d|j                    Y d }
~
d S d }
~
ww xY w# 	 |                                 w # t          j        j        $ r7}
t"                              d	|
 d
|j         d|j                    Y d }
~
w d }
~
ww xY wxY wd S d S )N-uA   Нельзя использовать "-" в obj_name: {obj_name}i:	 z.lock   )timeout)exr   zlock release error z, lock_name z
, timeout r  zdownloaded-)r   r}   APPREDIS_DBredislockacquirer6  saddr  setrC   increxecuterelease
exceptions	LockErrorgr,  rQ   ri  r  rl   )r   r  r  r  ttlr   redis_dblock_keyrn  piper  s              r   r  zCmfImport.inc_stat"  s   (??_```**h****<g*****~""8R"88	b((** d		$'----$HHS%CH0000__S)) -IIcNNNNHHS!H,,,              b#- b b b`a``TY``RVR^``aaaaaaaabb#- b b b`a``TY``RVR^``aaaaaaaab e4444744C}}}H>&&x&<<DLLNNNf  s++ '@Q@W@[@[\dfh@i@i0i0i!0022 'd		$'-555d&7&A,&OTWXXX' ' ' ' ' ' ' ' ' ' ' ' ' ' '
fLLNNNNN'1 f f fGGd!ddddVZVbddeeeeeeeeeffLLNNNN'1 f f fGGd!ddddVZVbddeeeeeeeef! s   /F BD'F 'D++F .D+/F 3E F-FFG;F-,G;-G8-G3.G;3G88G;AM6 AL9M6 L		M6 L	M6 L' 'M3;-M..M36O8NOO!-OOOOc                 x   t           j        }i }|j                            | j        j                  D ]}|                                }|                    |          }|                    d          ^}}}|                    |          st                      ||<   |                                ||         |<   |S )Nrg  )
rk  rl  rm  smembersr}   r  r  rl   rH  rD  )r   ry  rZ  r   r  r  r  rF  s           r   r  z CmfImport.get_redis_import_statsN  s    <>**47=99 	2 	2C**,,CLL%%E"yy~~B1::h'' *#'66x #(<<>>F8R  r    c                     |                      ddg           | j        dk    r| j        j        S |                                 S )NrP  r  rT  )rV   rP  r  r  r  rW   s    r   r=   zCmfImport.take_import_stats[  sH    -~>???!]22$****,,,r    c                    |                      g d           | j        dk    s| j        j        dk    rdS t          j                                        st                      }|                                std}| 	                    |t          j                   || _        | j                            d          | _        |                                  |                                  dS d	S )
Nr   r  rP  r   rT  import-plannedFu   Импорт прерван по неизвестной причине. Проверьте системные требования.r  r  r  T)rV   rP  r   r   r  r  import_is_runningCmfImportWorker
is_runningr   rh   r   r  r   r   rm   rL   )r   workerr  s      r   r  zCmfImport.is_runningb  s    QQQRRR!]22dk6FJZ6Z6Z5);;== 		$&&F$$&&  b	'-888!*"m>>>>ZZ		'')))utr    Tz	@minutely)	only_once
system_jobschedulec                  4   t           j                                        sd S t                              d           t           j                            g ddddgggg d          D ]1} |                                 st                              d|            2d S )	Nz&cmf_deferred_job: CmfImport.cron_checkrP  rA  rT  zstatus.codezNOT INr  r  rB  uH   Импорт прерван по неизвестным причинам)	rj   r&   rF   rw  r,  r  r  r  admin_alert)r   s    r   
cron_checkzCmfImport.cron_checks  s     ++-- 	F	8999#((:::+;*<= LKK ) 
 
 		u 		uC >>## u##$npsttt		u 		ur    report.jsonproject_identifierreport_file_namec                    t           j                            dddd|  dgdd| gdd| gdd| ggg d	gd
dg          }|st          d|  d          |j        st          d| d          |j        j        }|j        j                            d          }|s|j        j                            d          }|st          d| d          t          |          	                                st          d| d| d          t          j                    }|                    |          }t          j                    }||z
  }	t          |                              |          }
t          |
d          5 }t                              ||           ddd           n# 1 swxY w Y   t#          |t$          j                  r|D ]z}|d         }|d         }|d         }|d         }|d         }|                    | d| d | d!| d"           |r-|                    d#|                                 d$|            {|                    d%|	d&d't/          d()           t1          |
                              t4          j        d*           d           |                    d+           dS d,d-lm} d. }g }|D ] }|                     ||                     !g d/}t=           |||d01                     t=          d%|	d&           t=          d2t/          d()           t1          |
                              t4          j        d*           d           dS )3u  
        Собирает статистику количества сдампленных и обработанных объектов
        по проекту

        Args:
            project_identifier (str): ext_id, код, префикс кода задач или название проекта
            report_file_name (str, optional): имя файла отчета. Defaults to "report.json".
            stdout (Logger, optional): вывод данных отчета.
        r@  rs  ru  %r   rt  r   rQ   r  zcmf_import.pluginrz  rB  u   Проект 'u   ' не найденu   Проект u.    не содержит данных дампаproject_dirr   u*   В данных дампа проекта uA    отсутствует путь до каталога дампаu@   Отсутствует каталог дампа проекта z: 'r  zw+Nentitydumpedr  r   unprocessedu,    (сдамплено/обработано): z / r  r  u   Необработанные r  u   Выполнено за z.4fu,   . Ссылка на файл отчета: 'T)full_urlzrdisk/file/z2--------------------------------------------------r   )tabulatec                 >    d |                                  D             S )Nc                      g | ]\  }}|d v 	|S ))r  r  r  r   r$   )rR   rr  rs  s      r   r   z>CmfImport.project_stats.<locals>.data_list.<locals>.<listcomp>  s2       !QGGG GGGr    )r  )
stats_datas    r   	data_listz*CmfImport.project_stats.<locals>.data_list  s/     ","2"2"4"4   r    )r  u   Сдампленоu   Обработаноu   Результатgrid)headerstablefmtu*   Ссылка на файл отчета: ')rj   r   rl   r   rz  r   r   r  r
   rC   rB  perf_counterproject_statsr   ro  r  dumprm  rh   r   r   rW  r  app_base_hrefrI  r   rf   r   r  r  print)r  r  rj  r  r   r  
start_timerM  end_timeelapsed_timereport_filer   entity_statsr  r  r  r   r  r  r  r  r  s                         r   r  zCmfImport.project_stats  s    #'' v'@+='@'@'@AS"45'.@AS"45 +**	 $! ( 
 
   	VT-?TTTUUU& 	ecGcccddd#*-377FF 	D!17;;FCCK 	 HW  H  H  H   K  '')) 	mSZmm_jmmm   &((
$$W--$&&*, ;''001ABB+t$$ 	 IIeQ	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  fgn-- "	 % d d%h/%h/(5	%h/*=9vttSYtt^gttkqtttuuu dNN#b6<<>>#b#bU`#b#bcccKKQ<? Q Q=JTX=Y=Y=YQ{##++F,=}MMQ Q Q  
 KK!!!!!))))))   D % 5 5IIl334444^^^G((46BBBCCC?\???@@@Q]TX=Y=Y=Y Q{##++F,=}MMQ Q Q    s   6FF"%F")r   NNNNr   )r  )NN)FrB   r(  )r  N)r  N)Pr!   r"   r#   r   r&   ui_meta_skipapi_methodsr'   r*   rU   r
   r1   classmethodr  rF   rI   rL   propertyrD  r0   r   r   r)   rh   ri   rI  r   r   r   r   r   r7   r  r8   r6   staticmethodr   r   r   r
  r2   r>   r  r(   r;   r<   r2  r5   re  r4   rh  r9   r  r  r1  r;  rN  r\  r$  r3   r:   ry  rm   r|  r7  r  r  r  r9  rS  rV  re  r  r  r=   r  cmf_deferred_jobr  r  __classcell__)r   s   @r   r&   r&   $   s       '4 8P PL &2 6
 6
 6
 
K Kt9::-D - - - [- % % [% * * [* % % % % X% = = = = _=@ (/|uu 
 
s 
3 
 
 
 
  gk5> C C s be 14   8K K K33 3 3 3 3j
" 
" 
"	D 	 	 	 	
K 
K 
K   \O O O    
Y Y Y6        \
   _ . . \. 7 7 \7.# . . . .:) ) )L L L L L L\7 7 7OS OS OS OSbr r r00 00 00dt    B  B! ! !F+ + +:  2 
 
d 
 
 
 \
: . . . \.4 4 4b b b b b& & & & &M M M4    ( ( () ) )0 0 04H) H)c H) H) H) H)TF F FP  *G G GR*f *f *f *fX  -4 - - - -  " LLLu u ML \u  !.] ]]] ] ] \] ] ] ] ]r    r&   c                 <     t                      fd            }|S )Nc                    	  | g|R i |}t                       | j                            d           t                                           |S #  t                       | j                            d           Y d S xY w)Nu*   Импорт завершил работуu&   Ошибка работы демона)r   r)   r   r&   rL   r  r  )r   r   r   r  fns       r   wrappedz!catch_exceptions.<locals>.wrapped  s    	K"S)$)))&))CLLLJOOHIII((***J	KNNNJ  !IJJJJJJs   AA *A?r   )r  r  s   ` r   catch_exceptionsr    s8    
2YY	K 	K 	K 	K Y	K Nr    c                       e Zd ZddZd Zd ZddZd Zed	             Z	ed
             Z
ed             Zed             Zed             Zd ZdS )r  eva-import-workerc                     ddl m} dd l}ddlm} |                    |          | _         |j        | j         |d| d          |j                    |d| d          | _	        d S )	Nr   r   r	   z/var/logz.logr  z	/var/run/z.pid)
cmf.modules.logsr   rh   r   r
   r|   r)   init_loggerri   r  )r   r  r   rh   r
   s        r   __init__zCmfImportWorker.__init__  s    //////      '',,
t{DD\\\,J,JRYR^____+#+++,,r    c                 b   | j                             d           t          j                            ddd|gdd|ggg d          }|                                 |                    d           |j                            d	d
          |_	        |
                                 t                       t                                          5  t                                          5  t                                          5  |                                }t"                              d           d d d            n# 1 swxY w Y   d d d            n# 1 swxY w Y   d d d            n# 1 swxY w Y   t          j                            |j        g d          }t          j                            dd|g          }|j	        j        d
k    r|sO|j                             d           |j                            d          |_	        |
                                 nb|j	        j        dk    rR|j                             d| d           |j                            d          |_	        |
                                 t          j                            d|          }t3          |j                                      t8          j        d          }t          j                            ||j         |j!        d|j         dtE          j#        tH          j%                  dd| dd            d S )!Nu   Импорт запущенr@  r}   rA  r   r   r   r  r  rB  u%   ***Запускаем импорт***rT  import-startedr   r  r   rQ  r   r  u2   ***Импорт успешно завершен***import-completedr  CLOSEDu6   ***Импорт завершен с ошибками: u,   . Подробности в отчете.***r  rY   rZ   /files/u   Импорт данных 'u   ' завершен %d.%m.%Y %H:%Mz (UTC), <a href=(   >Журнал логирования</a>Tr   personrQ   r   force_notify_current_person)&r)   r   rj   r&   rl   r   r   r   r   r   rm   r   r  rC  rD  r  r  geventrZ  r}   r   rY  r   r   rk   rI  rq   r   rf   r   	CmfNotifyplace_notifyr  rQ   r   r   r   rW  )r   r&  r   r  r^  log_filelog_paths          r   runzCmfImportWorker.run  s   6777""4$i1H6SWYbJc*d.c.c.c # e e7888\44\l4mm



  "" 	 	G$:$:$<$< 	 	g>X>X>Z>Z 	 	$$&&CLLOOO	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 ""cf+`+`+` # b b&,,\44M,NN:?... 
 TUUU \<<I[<\\




'833
  !NY_  !N  !N  !N  O  O  O \<<<XX



'++C+HHx.//778I9UU%%>Nch N N8<X`XdKeKe~ N N#N N N(, 	& 	. 	. 	. 	. 	.sZ   E)&E /D;/E;D??ED?EE)E	E)E	E))E-0E-c           
         | j                             d           t                                          5  t                                          5  t                                          5  t          j                            ddd|gdd|ggg d          }|	                    d           |j
                            d	d
          |_        |                                 t                       |                                }|                                }t          j                            dd|g          }|rS|rQ|sO|j                             d           |j
                            d          |_        |                                 nb|j        j        dk    rR|j                             d| d           |j
                            d          |_        |                                 |j         j        d         j                            t.          j        d          }d d d            n# 1 swxY w Y   d d d            n# 1 swxY w Y   d d d            n# 1 swxY w Y   t          j                            |t6          j        |j        dt=          j        t@          j!                  dd| dd           d S )Nu   Дамп запущенr@  r}   rA  r   r  rB  u!   ***Запускаем дамп***rT  r  r  r   r  u.   ***Дамп успешно завершен***r  r   u2   ***Дамп завершен с ошибками: z***r  r  r   r  u'   Дамп данных завершен r  z
, <a href=r  Tr  )"r)   r   r  rC  rD  r  rj   r&   rl   r   r   r   r   rm   r   r  r  r   rY  r   ry   baseFilenamer   rf   r   r  r  rw  current_personrQ   r   r   r   rW  )r   r&  r   r  res2r^  r  s          r   	dump_datazCmfImportWorker.dump_data"  s   2333  "" 	a 	aG$:$:$<$< 	a 	ag>X>X>Z>Z 	a 	a"&&tdD)5LvW[]fNg.h.c.c.c ' e eC GG788888]`p8qqCJHHJJJLLL##%%C%%''D*00tS8Q0RRF t F 
 PQQQ \<<<RR




'833
 `U[ ` ` `aaa \<<<XX



z*1-:BB6CTV_``H+	a 	a 	a 	a 	a 	a 	a 	a 	a 	a 	a 	a 	a 	a 	a 	a 	a 	a 	a 	a 	a 	a 	a 	a 	a 	a 	a 	a 	a 	a 	a 	a 	a 	a 	a 	a 	a 	a 	a 	a 	a 	a 	a 	a 	a, 	%%#N(,x|:T:Tg N N#N N N(, 	& 	. 	. 	. 	. 	.sZ   II(F<H0$I0H44I7H48I;II	II	II"%I"r@   Nc           
         | j                             d           t                                          5  t                                          5  t                                          5  t          j                            ddd|gdd|ggddgd	          }|j	        
                    d
          |_        |                                 t                       	 d}d}|j                             d           t          j                            dd|gd          D ]}}	 |j                             d|            |                    dd           t                       F#  t#                       |dz  }|j                             d| d           Y {xY wt          j                            ddd|gdd|ggg dd	          }|j        D ]y}	 |j                             d|            |                    dd           t                       F#  t#                       |dz  }|j                             d           Y wxY w|s;|j	        
                    d          |_        |j                             d           n=|j                             d|            |j	        
                    d          |_        nw# t*          $ rj}t#          |           |j                             d|            t-          |          |_        |j	        
                    d          |_        Y d}~nd}~ww xY w|                                 t0          j        j                                         n<# |                                 t0          j        j                                         w xY w	 ddd           n# 1 swxY w Y   ddd           n# 1 swxY w Y   ddd           dS # 1 swxY w Y   dS )ru  u   Отмена запущенаr@  r}   rA  r   r   r   T)r   r   rE  zimport-cancelingr  r   Nu#   ***** Отменяем импортr   )r   rE  u   Удаляем )r  r%  r   u#   Не удалось удалить uW   , видимо обьект использовали вне данных импорта)r   r   import_objectsuy   Не удалось удалить, видимо обьект использовали вне данных импортаzimport-canceledu,   Успешно отменили импортu#   Количество ошибок: r  u   Ошибка удаления )r)   r   r  rC  rD  r  rj   r&   rl   r   r   r   rm   r   r   r  rl  r  r  r  r  r   rI  r  r  r  r  r  )r   r&  r   r^  r:  r  s         r   _cancel_importzCmfImportWorker._cancel_importB  s    	8999  "" +	, +	,G$:$:$<$< +	, +	,g>X>X>Z>Z +	, +	,"&&tdD)5LvW[]fNg.h/7.DVZ ' \ \C88EW8XXCJHHJJJLLL%,
 FGGG!,11,c9Rdh1ii u uCuJOO,Cc,C,CDDDJJDJIII&LLLLu(NNN"QJFJ00  2tWZ  2t  2t  2t  u  u  u  u  u&**4$i9PSY[_ajRk2l.V.V.Vhl + n n- j jCj
(?#(?(?@@@

D
EEE"j$	
,,  .i  j  j  j  j  j ]!$!@!@M^!@!_!_CJJOO$RSSSSJ$$%S6%S%STTT!$!@!@^!@!\!\CJ Y Y YQ
$$%Kc%K%KLLL #A \<<<XX





	Y 


!))++++ 


!))+++++W+	, +	, +	, +	, +	, +	, +	, +	, +	, +	, +	, +	, +	, +	, +	, +	, +	, +	, +	, +	, +	, +	, +	, +	, +	, +	, +	, +	, +	, +	, +	, +	, +	, +	, +	, +	, +	, +	, +	, +	, +	, +	, +	, +	, +	, +	, +	, +	,s   O)O(A0N:AKAE! K!3F;KAHK/IA?KM1
L6	A L1	,M11L6	6M198N:19N*	*N:.O:N>>ON>OO)O	O)O	O))O-0O-c                 0   t           j                            ddd|gdd|ggg d          }dd|j        d	i}|j        j        j        d
k    r<d|j        j        |dddd|j        j        |dddd}|                    |           |                    |          }|s |j	        
                    d| d           d S |d         }|                    di           }|j                            dd          |_        |                                 t                       | j	                            |d          d           t"                                          5  t"                                          5  t"                                          5   |d$i | t*                              d           d d d            n# 1 swxY w Y   d d d            n# 1 swxY w Y   d d d            n# 1 swxY w Y   t           j                            |j        g d          }t           j                            dd|g          }	|j        j        dk    r{|	s5|j                            d           |_        |                                 nD|j        j        d!k    r4|j                            d"           |_        |                                 t8          j        j                                         | j	                            |d          d#           d S )%Nr@  r}   rA  r   r  rB  linksu   Обработка ссылок)rQ   rp  r/  u   Импорт фильтров_process_filters)r   process_method)rQ   rp  r   u3   Обработка связей всех задач_process_relationsr,  uC   Конфигурация для запуска обработки 'u   ' не найденаrp  r   rT  r  r  rQ   u    запущенаr   rQ  r   r  r  r  r  r  u    завершенаr$   ) rj   r&   rl   re  r   r  r   r2  updater)   r  r   r   r   rm   r   r   r  rC  rD  r  r  rZ  r}   r   rY  r   r   r  r  r  r  )
r   r&  r*  r   process_configsprocess_jira_configsprocess_configrp  method_kwargsr^  s
             r   _process_entityzCmfImportWorker._process_entityt  s/   ""tY'y)
   # 
 
 91 
 :&/99 <!j7&)*<   R!j7&)*>  $ $ $ ""#7888(,,[99 	J  Fcn  F  F  F  G  G  GF)&**8R88\44%( 5 
 

 	


N62EEEFFF  "" 	 	G$:$:$<$< 	 	g>X>X>Z>Z 	 	F##]###LLOOO	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 ""v   # 
 
 &,,\44M,NN:?...  \<<I[<\\




'833 \<<<XX



!!###N62GGGHHHHHsZ   G/8G#G5GGGG	GG/G	G/G	 G//G36G3c                    | j                                         rt          d          | j                             t	          t          j                                          | j        |  | j                                          d S Nu"   Импорт уже запущен)	r  rC   r   
write_textrI  r   getpidr  rK   r   r   s     r   r;   zCmfImportWorker.start  so    8?? 	B@AAAC	,,---$r    c                    | j                                         rt          d          | j                             t	          t          j                                          | j        |  | j                                          d S r  )	r  rC   r   r  rI  r   r  r  rK   r  s     r   r  zCmfImportWorker.dump  sq    8?? 	B@AAAC	,,---r    c                    | j                                         rt          d          | j                             t	          t          j                                          | j        |  | j                                          d S r  )	r  rC   r   r  rI  r   r  r  rK   r  s     r   r3   zCmfImportWorker.cancel  sr    8?? 	B@AAAC	,,---T""r    c                    t           j                            g dg d          }|rH|                                 r|j                            d           |j                            d          |_        |	                                 t                       t          d          D ]Q}t                              d           t           j                            |j        d	d
g          }|j        dk    r nRn|j                            d           |j                            d          |_        |	                                 t                       |j                            d           | j                                        s| j                            d           d S | j                            d           	 t'          j        t+          | j                                                  t.          j                   n!#  | j                            d           Y nxY w| j                                         d S )Nr  r  rB  uQ   Пытаемся остановить импорт, таймаут 1 минутаrS  r  <   r   rP  r   rQ  rT  u"   Импорт уже прерванrU  u<   Импорт остановлен пользователемu    Импорт не запущенu'   Останавливаем импортuK   Не удалось завершить процесс, он запущен?)rj   r&   rl   r  r)   rW  r   r   r   rm   r   rH  r  rZ  r}   rP  r   r  rC   r   killr   	read_textsignalSIGTERMr  rK   )r   r   r   r\  s       r   r<   zCmfImportWorker.stop  s   ""*T*T*T  ^S  ^S  ^S"  T  T 	\   I
""#vwww \<<IZ<[[



r  ALLOOO *..#&BUWaAb.ccC,== > 
""#GHHH88_8UUCJHHJJJLLLJOOZ[[[x   	K?@@@FBCCC	qGC**,,--v~>>>>	qK!!"oppppps   AH H#c                    | j                                         rt          d          | j                             t	          t          j                                          | j        |i | | j                                          d S r  )	r  rC   r   r  rI  r   r  r  rK   rw  s      r   r2  zCmfImportWorker.process_entity  sz    8?? 	B@AAAC	,,---d-f---r    c                     | j                                         r[t                              t	          | j                                                             rdS | j                                          d S d S )NT)r  rC   r  check_process_runningr   r  rK   rW   s    r   r  zCmfImportWorker.is_running	  si    8?? 	,,S1C1C1E1E-F-FGG tHOO	 	r    )r  r(  )r!   r"   r#   r  r  r  r  r  r  r;   r  r3   r<   r2  r  r$   r    r   r  r    s       - - - -#. #. #.J. . .@0, 0, 0, 0,dSI SI SIj            :       r    r  )+csvr   r   decimalr   r   r   rh   r   sysr   r   r
   typingr   r   rm  rQ  r   xlrdopenpyxlrB  r+   r,   r  cmf.includer  r   common.fieldsr   r  r   r   r  	functoolsr   rG  r{   Filterr   r&   r  r  r$   r    r   <module>r     s)   



               ' ' ' ' ' ' ' '       



           ! ! ! ! ! ! ! !      + + + + + +                    $ $ $ $ $ $ ' ' ' ' ' '               EKMM	3 3 3 3 3gn 3 3 3~ ~ ~ ~ ~
$ ~ ~ ~B>  W W W W W W W W W Wr    