
    91iݯ                       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 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jH                         Z% G d dejL                        Z' G d dejP                        Z(d Z) G d d      Z*y)    N)copydeepcopy)Decimal)datetimetimezone)LoggerPath)DictIterator)cached_property)*fields
cmf_import
log_configwrapsc                       e Zd Zd Zy)AnonymousFilterc                     t        |dd      S )N	anonymousF)getattr)selfrecords     ./common/models/cmf_import.pyfilterzAnonymousFilter.filter!   s    v{E22    N)__name__
__module____qualname__r    r    r   r   r       s    3r    r   c                   B    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j0                  dddfdedefdZ	 	 dOdedededededefdZd ZdPd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#dQd#       Z*ed$        Z+e#d%        Z,e#d&        Z-d'efd(Z.d) Z/dRd*e fd+Z0d, Z1dSd-Z2d. Z3d/ Z4defd0Z5d1 Z6d2 Z7d3 Z8d4 Z9e#dTd5efd6       Z:e#dUd7       Z;d8 Z< fd9Z= fd:Z>d; Z?de
fd<Z@d= ZAd> ZBd? ZCd@e defdAZDdB ZEdC ZFdD ZGdVdEZHdF ZIdefdGZJdH ZKe# eLdddIJ      dK               ZMe#	 	 dWdLedMefdN       ZN xZOS )X	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                 6    | j                   j                         S N)r1   existsclss    r   worker_herezCmfImport.worker_here<   s    ##**,,r    c                 8    | j                   j                          y rB   )r1   touchrD   s    r   create_worker_flagzCmfImport.create_worker_flag@   s    ""$r    c                 n    | j                   j                         r| j                   j                          y y rB   )r1   rC   unlinkrD   s    r   remove_worker_flagzCmfImport.remove_worker_flagD   s+    &&(  '') )r    c                     | j                   s8| j                  dg       | j                  d   D ci c]  }|d   |
 c}| _         | j                   S c c}w )Njson_settingsr0   name)_import_settingsload_fieldsrN   )r   ss     r   r0   zCmfImport.import_settingsI   sU    $$o./;?;M;MN_;`$aaQvY\$aD!$$$ %bs   Ac                 8   t         j                  rt        j                  nt        j                  }t        j
                  j                  d|       }|sGt        j                  d|       }|j                          |j                  s|j                  ddd       t        j
                  j                  d|       }|sGt        j                  d|       }|j                          |j                  s|j                  ddd       t        j                  |j                  ddt         j                  t         j                  	      }|j                  |       |j!                  t        j#                  t        j$                               t        j                  |j                  ddt         j                  t         j                  	      }|j                  |       |j!                  t        j#                  t        j$                               |j'                  t)                      t        j+                         }|j                  |       |j!                  t        j,                                t        j.                  j1                  t2        |||      }|j5                          t        j7                  d
| j8                         }|j                  |       d|_        |j.                  s2|j=                  t        j.                  j?                  t2                     |S )uE    Журнал логирования процесса импорта data.logrO   parentr    F)make_preview
mark_dirtyzanonymous_data.logutf-8D)filenameencodingwhenmaxBytesbackupCountimport_) configDEBUGloggingINFOmodelsCmfAttachmentgetsavefile_existsupload_filer   MyLogsHandlerfull_path_fileIMPORT_LOG_MAX_BYTESIMPORT_LOG_BACKUP_COUNT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   sq    "(7<<  --11z$1O#11z$1ON!!--**3Uu*U$2266<PY]6^""("6"6<PY]"6"^$$&&22#//%TY/Z "//#220066
 	e$!!'"3"3J4H4H"IJ&44(770066
 	""5)&&w'8'89M9M'NO##O$56 "//1  '$$Z%?%?%AB ##11	
 	 ""WTWWI#67 g..;;IFGr    F   msgr~   c                 L     | j                   j                  ||fd|i||d| y)uI  Логируем как обычные лог для веб так и со скрытыми данными для возможности отправки в СТП

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

        Args:
            msg (str): текст ошибки
            error_code (int, optional): Код ошибки для нахождения возможного решения или группировки. Defaults to 1.
           )r   r~   r   )textcoder   r   r   r   	tracebackr   N)r   rc   ERRORre   CmfImportErrorr   
format_excrO   title
class_namer   plugincalc_ext_hrefr   calc_dump_pathr   rh   
cmf_commit)	r   r   r   objr   r   r   r   import_errors	            r   	log_errorzCmfImport.log_error   s     	S!<,,#2<8<7@8B6>7@7K7K7M6> - / !$L$'NNL!{{(,(A(A#(F%)-)C)CC)H&r    c                 X    t         j                  | _        t         j                  | _        y rB   )ra   IMPORT_THREADSr-   IMPORT_DOWNLOAD_THREADSr.   r   s    r   _prepare_multiprocessingz"CmfImport._prepare_multiprocessing   s    #)#8#8 ,2,J,J)r    Tc                     ddl }ddl}|j                         }|dz
  }|r| j                  d| dd       |j	                         j
                  }t        |dz        }|r| j                  d	| d
d       t        j                  rt        t        j                  |      }|r%| j                  dt        j                   dd       t        t        |dz        |      }|r| j                  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intra   IMPORT_PROCESSmin	Exception)r   r   r   r   r   r/   available_memoryavailable_memory_gbs           r   get_max_processeszCmfImport.get_max_processes   sW    	' $--/	!AHHFykQef   "002<<!"2i"@AHH78K7LLmn      5 5}EMHHA&BWBWAX YT U   C 3a 78-HHHA-Pcd  
 "7+>*? @|}  r    c                     t         j                  j                  d| dg      }|s't         j                  d|       }|j                          |j                  s| j
                  j                  d       |j                  S )uK   
        Возвращает путь текущему файлу
        rT   url)rO   rV   r   rU   u   Начало)re   rf   rg   rh   ri   r)   infor   )r   argsr   r   s       r   r7   zCmfImport.get_log_filename  sp      --11z$X]W^1_#11z$1ON!))KK^,!!!r    c           	         t        | j                  d            }|j                  dd       t        j                  |      D cg c]  }t        j
                  j                  t        j
                  j                  ||            rEt        j                  d|      r/t        j
                  j                  d| j                         |       }}|S c c}w )u   
        Список файлов после logrotate, чтобы можно было загрузить историю
        T)parentsexist_okz%(?:data|anonymous_data)\.log(\.\d+)?$files)
r
   get_files_dirmkdiroslistdirpathisfilejoinrematch)r   r   r   dir_pathf	file_lists         r   r8   zCmfImport.get_log_filenames  s     **401td3MOZZX`Ma Prww||Ha'@A"JAN WW\\'4+=+=+?C P	 P Ps   B	Cc                    dd l }t        | j                  d            }|j                  d      }t        j
                  j                  |      rt	        j                  |       |j                  |d      5 }| j                         D ]3  }|j                  dt        j                        }|j                  |       5 	 d d d        t        j
                  j                  d| j                         d      S # 1 sw Y   8xY w)Nr   Tall_logs.zipw/filesr   )zipfiler
   r   joinpathr   r   rC   removeZipFiler8   replacera   
UPLOAD_DIRwriter   )r   r   r   r   r   zip_pathmyzip	file_paths           r   r6   zCmfImport.get_all_logs_by_zip  s    **401$$^477>>(#IIh__Xs+ 	'u!335 '	%--h8I8IJ	I&'	' ww||GT%7%7%9>JJ		' 	's   6AC55C>c                     ddl m} t        j                  j                  d   }|j
                  j                  |       s|j                  | d      } | S )Nr   )cmf_hashlibtask_code_prefixABCDEFGHIJKLMNOPQRSTUVWXYZ)	enc_table)cmf.utilr   re   
CmfProjectr   regex	fullmatchshort_str_enc)keyr   r   s      r   get_correct_keyzCmfImport.get_correct_key$  sN    ( ",,334FG%%//4++C;W+XC
r    c                 8   dd l }ddlm}  || j                  d            }|j	                  t        j                         j                  d       d      }| j                         }|r|j                  |d      5 }| j                         D ]H  }	|	j                  dt        j                        }	|j                  |	       t        j                  |	       J 	 d d d        t        j                   j#                  d| j                         d	      S y # 1 sw Y   9xY w)
Nr   r	   Tz
%Y%m%d%H%Mz_all_logs.zipr   r   r   r   )r   pathlibr
   r   r   r   nowstrftimer8   r   r   ra   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_logs2  s     **401$$(?(?(M'Nm%\]//13/ )5!%!7!7!9 )I ) 1 1(F<M<M NIKK	*IIi()) 77<<););)=~NN ) )s   ;ADDc                     | j                   j                         s!| j                  j                  d      | _         t        |           y )NOPENstatus_type)statusloadworkflowget_default_statussuper_calc_statusr   	__class__s    r   r   zCmfImport._calc_statusA  s7    {{!--::v:NDKr    c                    | j                   d   ry | j                  r(| j                  j                         | j                   d<   y | j                  dk7  ry | j                   d   j	                  dt
        j                  j                         t
        j                  j                  d       | j                   d   j	                  dt
        j                  j                         t
        j                  j                  d       | j                   d   j	                  dt
        j                  j                         t
        j                  j                  d       | j                   d   j	                  dt
        j                  j                         t
        j                  j                  d       | j                   d   j	                  dt
        j                  j                         t
        j                  j                  d       | j                   d   j	                  d	t
        j                  j                         t
        j                  j                  d       y )
Nmodels_fieldsexcelu   Поля контактов)captionr   iconu   Поля задачu   Поля заметокu   Поля проектовu"   Поля списков задачu   Поля групп)rN   r   calc_models_settingstypeappendre   	CmfPersonimport_shop_fieldsr   CmfTask
CmfCommentr   CmfListCmfPersonGroupr   s    r   _calc_models_settingszCmfImport._calc_models_settingsF  s   o.;;26++2R2R2TD/99?+22?\>D>N>N>a>a>c<B<L<L<Q<Q4S 	T 	?+22?T>Dnn>_>_>a<BNN<O<O4Q 	R 	?+22?X>D>O>O>b>b>d<B<M<M<R<R4T 	U 	?+22?Z>D>O>O>b>b>d<B<M<M<R<R4T 	U 	?+22?c>Dnn>_>_>a<BNN<O<O4Q 	R 	?+22?T>D>S>S>f>f>h<B<Q<Q<V<V4X 	Yr    c                 t   | j                  g d       | j                  d   ry | j                  j                  |       | j                  d<   d| j                  d<   d| j                  d<   d| j                  d<   d| j                  d	<   d| j                  d
<   | j                  | _        | j	                          y )NrN   attachmentsr   r   r0   r   Tsend_invitesFremove_conflict_projects
add_suffix	pg_backupmerge_identic_names)rQ   rN   r   r2   rh   r   r   s     r   r2   zCmfImport.calc_import_settingsa  s    KL/0040P0P\`0P0a,--1>*9>56+0<(*.;'4901!//		r    c                    | j                  g d       | j                  d   ry | j                  j                  j                  dd      | j                  d<   | j                  j                  j                  dd      | j                  d<   | j                  j                  j                  dd      | j                  d<   | j                  j                  j                  dd      | j                  d<   | j                  j                  j                  d	d      | j                  d	<   | j                  j                  | 
      | j                  d<   | j                  | _        | j                          y )Nr  r0   r	  Tr
  r  Fr  r  r   )rQ   rN   valuerg   r   r>   rh   r  s     r   r>   zCmfImport.tmplt_import_settingsp  s4   KL/0-1-?-?-E-E-I-I.Z^-_>*9=9K9K9Q9Q9U9UVprv9w56+/+=+=+C+C+G+GV[+\<(*.*<*<*B*B*F*F{TX*Y;'484F4F4L4L4P4PQfhm4n01040Q0Q]a0Q0b,-!//		r    c                 z    d| j                  d       d} t        j                  d|  d|        t        |        y )Nu1   Ошибка при импорте данных. .ue   . Проверьте загружаемый файл и повторите попытку снова.zCmfImportError: : )striprc   error	cmf_alert)r   es     r   
_log_errorzCmfImport._log_error}  sB    A#))C.AQ  Rw  x(Rs34#r    c                     | j                  dg       | j                  d   D ]  }|d   | j                  k(  s|d   c S  g S )NrN   r0   rO   r   )rQ   rN   r'   )r   settingss     r   r(   z$CmfImport.csv_import_settings_fields  sS    /*+**+<= 	*H4#8#88))	* 	r    c                     t         j                  j                          t         j                  j	                  d|        t         j                  j                          y)uJ   
        Запускаем в фоне импорт данных
        r;   N)re   CmfAccessListactivate_admin_moder&   
run_workerrI   	import_id_args_kwargss      r   r;   zCmfImport.start  s>     	002##GY7++-r    c                 D    t         j                  j                  d|        y)uR   
        Останавливаем в фоне импорт данных
        r<   N)re   r&   r  r  s      r   r<   zCmfImport.stop  s    
 	##FI6r    entity_typec                 8   | j                  dg       d}||v r4| j                  j                  j                  dk7  rt	        d| dd       d|i}t
        j                  j                  d	| j                  |
       t
        j                  j                          y)u   
        Запускает отдельную обработку сущностей (фильтры, связи, ссылки и др.)

        Args:
            entity_type (str): тип сущности (filters, relations, links, etc.)
        r   filters	relationsCmfPluginJirau4   Запуск отдельной обработки 'u?   ' возможен только для импорта из JiraTabortr$  process_entity)paramsN)
rQ   r   r  r   r  re   r&   r  rz   rI   )r   r$  jira_entitiesr-  s       r   r,  zCmfImport.process_entity  s     	($
 =(!!,,?F{m TP Q  -##$4dggf#M++-r    c                 p    dd l }| j                         }|j                         r|j                  |       y y )Nr   )shutilget_download_pathrC   rmtree)r   r   r   r0  download_paths        r   r5   zCmfImport.delete_dump  s0    ..0!MM-( "r    rowc           
         d}||j                   }|sg }i }t        | j                        D ]Q  \  }}|d   r,||   r'|d   d   j                  d      d   |j                  k7  r8|d   d   |k(  sD||   ||d   d   <   S |s|S  ||       }	t        t        |	d	            }
|D ]^  }|j                  j                  |      }t        |t        j                        st        |t        j                        rNd}|j                         D ])  }|j                  d
dd||   gd	d||   ggdg      }|s) n |rt        |	||       t        |t        j                        rt        |	|||          ||   }t        |t        j                        rDt!        j"                  |d      }t!        j$                  |t         j&                  j(                        }t        |t        j*                        rK|j-                  |d|g       a | j.                  d   r|j                  |dg      }|s|j                  d	      }|r|j                  |dgd      }|r|
|	_        |j                  |	j2                  dg      }|r8|	j2                   dt5        j6                  t8        j:                        d|	_        |	}|j=                          |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   ORrO   ==z**r   r   RUunionT)r   r   include_deleted)rO   r   _z%Y%m%d-%H%M%S)r8  	enumerater(   splitr   strr   r   rg   
issubclassCmfRelationCmfGenericRelationrelated_modelssetattr
CmfRelBaseCmfPhonephonenumbersparseformat_numberPhoneNumberFormatINTERNATIONAL
CmfNumericr   rN   r   rO   r   r   r   utcrh   )r   r4  model_filterr   result_fieldsisettingnew_objnew_coder9  fieldrel_obj	rel_modelvalphoner   s                     r   _process_objzCmfImport._process_obj  s    ;$$CG#D$C$CD 	GJAw=)Q}-.>?EEcJ1MQVQaQaa}%n5<@CA.|<=	G M4(ww/0! 	4JLL$$Z0E%!3!34
5&JcJc8d!&!5!5!7 I'mmD64Q[I\:]5;T7:CV4W4Ybfag , iG	
 GZ9%!2!23GZ)<=*%C%1$**35"008V8V8d8de%!2!23NNJc23/	42 g&YYgtfY=F;;v&DdVTR' YYGLL$Y@F"),,qhll1KM0Z[FKKMr    c                 &    | j                  d      S )um   
        Ручка фронта для проверки конфликтующих проектов
        T)as_msg)get_conflict_projectsr   s    r   r4   zCmfImport.check_projects  s     )))66r    c           
         | j                  dg       | j                  j                  j                  dk(  ryg }ddd}| j                  d   d   d	   }|d
   D cg c]  }|d   s	|d   s|d    }}|D ]  }| j                  |d         }|j                  d      xs |d   }	| j                  j                  j                   d|d    }
t        j                  j                  ddd|
gddd|
 dggdg d      }|r8|j                  j                  d      xs |j                  j                  d      }|rK| j                  j                  j                  dk(  r|j                  dk(  s|	k(  r|j                  d   |k(  rt        j                  j                  ddd|	gdd|ggdg d       }|D ]  }d}t        |j                  xr7 |j                  j                   | j                  j                  j                  k7        }| j                  j                  j                  dk7  r2|j                  d!k(  r#d"|j"                   d#|j$                   d$|d%<   |}n| j                  j                  j                  dk(  rf|j                  d!k7  rW|j                  dk(  r+| j                  d&   d   d   d'k(  r|j&                  sd(|d)<   d*|	 d#|j)                          d$|d%<   |}n|j                  r|j&                  s|r|}|sR|j"                   d+|j$                   d,}|j                  dk(  r|d-z  }n|j                  d!k(  r|d.z  }|j&                  r|d/z  }n|r|d0z  }|j+                  ||f         d1}|rCd2d1j-                  d3 |D               d4d1j-                  d5 |j/                         D               d6}|r|S |D cg c]  \  }}|	 c}}S c c}w c c}}w )7u  
        Возвращает список конфликтующих проектов или текст сообщения для предупреждения

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

        Return:
            list, str: список проектов или текст сообщения
        plugin.plugin.source_hashCmfPluginCsvNu^   отменить выбор аналогичных импортируемых проектовu   удалить существующие проекты (проекты и все их данные будут безвозвратно удалены))r3   deleteselectedObjectsr  r   childrenr   	isCheckedr   original_namerO   ::rz   r:  ext_id=LIKE%::::%T)--logic_prefiximport_raw_json)r   r?  r   r   CmfPluginConfluenceproject.agileILIKEr   )rr  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> u               <p><strong>В системе уже существуют проекты с аналогичными названиями или кодами:</strong></p>
            <ul>c              3   .   K   | ]  \  }}d | d  ywz<li>z</li>Nr$   ).0project_namer@  s      r   	<genexpr>z2CmfImport.get_conflict_projects.<locals>.<genexpr>  s     `a4~U3`s   u   </ul>
            <br />
            <p><strong>Для продолжения импорта вы можете:</strong></p>
            <ul>c              3   (   K   | ]
  }d | d  ywr  r$   )r  actions     r   r  z2CmfImport.get_conflict_projects.<locals>.<genexpr>  s     M&4xu-Ms   z</ul>
            )rQ   r   r  r   r0   r   rg   source_hashre   r   sgetrs  rr  listboolr   rl  rO   r   rw  upperr   r   values)r   ra  conflicting_projectsactionsrootr]  selected_projectsprjselected_project_keyselected_project_nameselected_project_ext_idry  r  matching_projectsmatching_projectconflicting_projectother_sourcer   r@  s                      r   rb  zCmfImport.get_conflict_projects  s    	567;;''>9! w o

 ##$56w?B37
3CgCs5zVYZeVfSZgg$ m	UC#'#7#7E
#C $'GGO$<$KF!)-););)G)G(H3t9+&V# '',,s$;<v-D,ES'IJ
 !% - G &66::6BjgF]F]FaFabiFj ))448MM#00OC %(==#33E:>RR  !' 1 1 6 6W&;<'2FG
 !% !7 ! %6 6U &*##$// ](33::dkk>P>P>\>\\ 
 KK%%004II(55GAAQAVAV@W X,==>fF L)
 +;'KK%%004II(55G'44G//>wGMQZZ$/;;#z $I.
++@*A B06689A L)
 +;'(33'33# +;'&&9&>&>%?rBUBfBfAggh#iL*77?J$(FF,99^K$(EE*66$(RR%$(ss(//?R0STm6Uom	U^ `K_``a b MGNN<LMMN OC sR=Q"Rzq'7"RRw hv #Ss   
O%O+OO#c                     t         j                  j                         D ]J  }| j                  j                  j                         |v s*t         j                  j                  |      c S  t        dd       y )Nbackup_nameu   Бекап для данного импорта не существует. Воспользуйтесь функционалом "Отмена".Tr*  )re   CmfGlobalSettingspg_backup_lsr   r  lowerr9   r  )r   bk_names     r   r9   zCmfImport.pg_restore  sm    //<<> 	PGyy$$&'1//::w:OO	P 	  e  mq  	rr    c                 .   | j                  g d       d}| j                  r	 t        j                         5  | j                  j
                  j                  d      rBt        j                  j                  | j                  j
                  j                                | j                  j
                  j                  d      rY| j                         }|rG|D ]B  }| j                  d| t        j                         |j!                  d	       t#                D d
t$        j&                  d<   d| _        d| _        | j                  j                  j,                  j
                  | _        | j1                          t#                dt$        j&                  d<   | j2                  D ]i  }| j2                  |   D ]U  }d}|dk(  r9t5        | j7                         j9                               r| j2                  |   |   }| j;                  |||       W k t        j<                  j?                  dd| g       | j                  jA                  |       }ddd       | jS                         | _        | j1                          tT        jV                  jX                  j[                          |S | j\                  dk(  r| j_                         S y# 1 sw Y   xxY w# tB        $ r_}tE                tG        |       dtI        jJ                  |jL                        d    }| jO                  d|        || _(        Y d}~d}~ww xY w# | jS                         | _        | j1                          tT        jV                  jX                  j[                          |c cY S xY w)u9   
        Импортируем файл в бд
        )r   plugin.plugin.*zplugin.*Fr  r  r
  u7   Удаляем конфликтующий проект r~   T)TEXKOM_db_deleter}  NO_CACHEr   1
downloadedr   r;  r   r   N
u*   Ошибка работы импорта: r   )0rQ   r   cmfutilenable_import_moderN   r  rg   re   r  r  r   r  rb  r   rc   WARNINGrf  r   r   environimported_object_countprogressr  rl  rh   import_statsr  r1  iterdirinc_statr   bulk_deleteprocess_importr   cmf_rollbackrC  r   	format_tb__traceback__r   	error_msgget_redis_import_statscmfapp	CMF_CACHEflushdbr   _process_import_excel)	r   rT  projectsry  obj_nameopr]  err
error_texts	            r   r  zCmfImport.process_import  s    	=>;;&//1 I))//33K@00::tyyG\G\G^:_))//334NO#'#=#=#?#+3 - $+bcjbk)lt{  uD  uD  !E ' E *- .0BJJz*12D.$%DM"&++"4"4"@"@"F"FDKIIKL-0BJJz*$($5$5 ="&"3"3H"= =B"#C!\1d4;Q;Q;S;[;[;]6^&*&7&7&A"&E MM(B<	== ))55lDRV=W5X![[7747HF5IB %)$?$?$A!		!!))+99--//  OI I6  , #CzI,?,?@Q@Q,RSU,V+WX
!KC5QR!+	, %)$?$?$A!		!!))+sC   K HK	K 	KK 	L=AL83M  8L==M   ANc           	      |   ddl m} | j                  r| j                  d   syd}	 i }i }i }i }i }i }i }	| j	                         }
t        |
      D ]  \  }}|dk(  r| j                  d   ri }i }d}d}t        | j                        D ]  \  }}|d   r||   s|d   d   j                  d	      d   }|j                  |i       }|d   d
   j                  d	      }|d   }||   }|dk(  r|}g|dk(  r|}ot        |      dkD  r,|dk(  r	|||d   <   |j                  |i       }||   ||d   <   nT|dk(  r|dk(  r|j                  ||         }n5|dk(  r|j                  ||         }n|dk(  rd|j                  ||         i}|||<   |||<   	 |j                  di       }|j                  dd      }|j                  |j                  d            }|s8|j                  | t        j                   |      \  }}|||j                  d      <   |j                  | t        j"                  |      \  }}|j                  di       }|j                  d      r|d   |d<   |j                  di       }|r|	j                  |      }|s|dk(  rAt        j$                  j'                  ddt        j(                  j                  d            }n@t        j$                  j'                  ddt        j(                  j                  d            }||	|<   ||d <   ||d<   ||d!<   ||d"<   d#d$d%|j*                  gdd%|d   gg}|j                  | t        j,                  ||      \  } }| j.                  j1                  |       | j3                          | ||d   <   |r(|j                  |g       }!|!j1                  |        |!||<   |r.|j                  |d   g       }"|"j1                  |       |"||d   <   |j                  d&i       j                  d'd      }#|#rd|# d(|j4                  j6                   }$|j                  |$i       }%||%d!<   |#|%d'<   |%j                  d)g       }&|&j1                  |        |&|%d)<   |%||$<   |j                  |j                  d            }'|'st        j8                  j                  d#d*d%|j*                  gg d+g,      }(d#d*d%|(j*                  gg d-g})d.||(d/d0}*|j                  | t        j:                  |*|)1      \  }'}|'||j                  d      <   |j                  | t        j<                  |'| d2        |j?                         D ]  \  }$}+t        j8                  j                  d#d*d%|+d!   j*                  gg d3g,      }(d#d*d%|(j*                  gd'd%|+d'   gg d4g})t        j,                  j                  |),      },|,sMt        j-                  |+d!   |(|+d'   t        j@                  j                  d5      6      },|,j3                          |+d)   D ]  } |,| _!        | j3                  d78         |j?                         D ]Q  \  }}-|j                  |      }.|.s|-D ]3  }/|/jB                  jE                          |.|/_!        |/j3                          5 S |j?                         D ]e  \  }}0|j                  |      }.|.s|0D ]G  }1|j                  |1      }/|/s|/jB                  jE                          |.|/_!        |/j3                          I g 	 y7# tF        $ r}2tI        |2       d9| d:|2 d;tK        jL                  |2jN                        d<    }3| jP                  jS                  |3       |3| _*        | jV                  jY                  d=>      | _-        | j3                          Y d?}2~2yd?}2~2ww xY w)@u   
        Запуск импорта из CSV

        :return: Истина в случае успешного импорта
        r   )CmfPluginImportMixinr0   F	first_rowr}  r6  r7  r  r9  parent_taskchild_tasksr   	executorsrr  r   priorityr   r   ru  r   r  
cmf_author	cmf_ownerzproject.basez
task.base%base)r   )	cmf_modelprefixactivityztask.agile:softdev%softdevr   ry  rV   AND	parent_idr;  r  rO   r@  taskstree_parent_id)rO   r;  Sprintsr  )rO   r;  
   Доскаr  kanban)rO   rV   tree_parent	list_type)r   rR  
obj_fields
filter_obj)leftright)rO   r;  Epics)rr  rm  z	task.epicztask.epic:default)rV   r  rO   
logic_typeT	only_datau   Строка r  r  r  import-errorstatus_codeN).%common.models.cmf_plugin_import_mixinr  r  rN   	_get_filerA  r(   rB  rg   lenget_logic_prefixget_priorityget_status_type
setdefaultprocess_any_table_fieldsre   r   r   CmfWorkflowcalc_workflowCmfActivityrz   r  r  r   rh   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_readr4  executorrU  parent_task_codechild_tasks_codeidxrW  
model_name_rowfields_namer9  r  project_fieldsrr  ry  r@  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t'9'9:K'L
q	 O ONIJL!#(I#,Y#7 {e
C?t'9'9+'F#% #% $-d.M.M$N /LC"=1S !(!78H!I!O!OPS!TUV!WJ";;z26D")-"8"F"L"LS"QK!,QJHE!]2+0( #}4+0( ;'!+%47<H[^4$ $R 803Ck!n-%7J,<V$8$I$I#c($SE':5$8$E$Ec#h$OE'83%24H4X4XY\]`Ya4b$cE',D$*.GJ'?/B ")\2!>-88Y&**>+=+=f+EF!5!N!NtU[UfUfhv!wJGQ?FL!3!3F!;<"6"O"OPTV\VfVfhp"qa%kk)R8??<0/:</HK,*x<155lCH#'>9'-'9'9'G'GR[dpQWQcQcQgQgmsQgQt (H (vH (.'9'9'G'GR[OdQWQcQcQgQgmvQgQw (H (yH <D*<8/7L,,8K))0I&(/H%${D'**&EPTVabhViGjk2KKDRXR`R`LWYdf!"")),719	+f-. $'6':':;KR'P$$++H58HO$45 $&5&9&9+f:Mr&RO#**+;<;JOK$78
 $KK	26::62F	"+Agll.@.@-ABH-11(B?H*1HY''0HV$ (Wb 9I$$X.(1HW%/7N8, &>>.*<*<V*DE$*$4$4$8$8IY[_ahakakHlAZA\$8 %]M"'*:D-BRBR)S">"@J*6,31>/7"9J #7"O"O[_V\VdVd[e[e #P #gKHa >FJ~11&9:$==dFDYDYGOZb>ceu{e| #1"6"6"8 2$ & 0 0 4 4UEUW[]abk]l]o]oDp=T=V 4 !W $&6m>N>N%O%tT&\:<^`
!>>--Z-@%~~T)_R_37<9?9L9L9P9PVi9P9j  .  lH MMO $W 2H+3H(MMDM122$ ,;+@+@+B (' %'mm,<=$) ( ,,113/:, (( 1@0E0E0G ,, *'mm,<=)3 ,#,==#?#$005573>H0$MMO,,$   	(Bse2i>Q>QRURcRc>deg>h=ijJKK!!*-'DN--::~:VDKIIK	s,   Y\ +A#\ \ (5\ 	^;(B	^66^;c           	      :   | j                  |t        j                        }|r|syd}| j                  D ]  }|d   s	|d   d   dk(  s|} |j	                  dg       t        j
                  j                  |j                  t        |d         |j                  j                  dg      }|s?t        j                  |t        |d         |j                  | 	      }|j                          |j                  j                  d
       t        |j                  j                        D ][  }|j                   j                  | j                  k(  r'|j#                          |j                  j                  j%                  |       ] | j                  |t        j&                  t        j                  j(                  dd|j                  gdd|j                  gg      }|j	                  ddg       ||_        ||_        |j.                  r|j                          |S )u;   
        Импорт товара в сделку
        Nr6  r7  zCmfProduct.pricescurrencyfile_valprice)
product_idr  currency_idr   )productr  r  r   T)forcedeal_idr;  r  )r   rS  r  sales_order)r_  re   
CmfProductr(   rQ   CmfPricerg   rz   r   r  rh   pricesr   r   
deal_itemsr  r   rf  r   CmfDealItemsr8  dealr  
is_changed)r   r4  r&  r  price_settingr  r  items           r   _process_productzCmfImport._process_product  s    ##C):):;777 	)H&8M+BCS+TXk+k (	) 	*&##wzzWaIbAc040@0@' $ TOOG7=Q[C\;]hlhuhu/3 $ 5EJJL$'../ 	/D!!TWW,KKMOO!!((.		/
   f&9&9v?P?P?]?]+4dDGG*D|UY[b[e[eFf)g ! i)]34	??IIKr    c                    |s|r|j                   sy d }| j                  D ]  }|d   s	|d   d   dk(  s|} |sy g }t        j                  j	                  |d         }|s)t        j                  |d         }|j                          |j                  dd|j                  g       |r|j                  dd|j                  g       n(|j                  dd|j                   j                  g       | j                  |t        j                  |      }|j                  d	d
g       |j                   s|r||_         n|j                   |_         |j                  s||_        |j                  r|j                          |S )Nr6  r7  zCmfDeal.pipeliner  )rO   pipeline_idr;  
company_idcompanypipeline)r.  r(   re   CmfPipelinerg   rh   r   rz   r_  CmfDealrQ   r/  r'  )	r   r4  contactr.  pipeline_settingr  rS  r/  r&  s	            r   _process_dealzCmfImport._process_deal  sU   w77 	,H&8M+BCS+TXj+j#+ 	,  %%))/?
/K)L))/?
/K)LHMMOtX[[9:NNL$

;<NNL$0B0BCD  fnng>)Z01||&&}}$DM??IIKr    c                    dd l }dd l}dd l}| j                  r" |j                          | j                  z
  dk  ry  |j                          | _        t	               }	 |j                  |j
                  |j                        }|j                  d       |j                         d   |d<   |j                          	 |j                         |d<   |j                         |d<   |j                  | j                               |d	<   | j                  j!                  d
|        y # t        $ r d|d<   Y xw xY w# t        $ r d|d<   Y xw xY w)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_usager1  r)   r   )r   r;  r   r<  statsrR   s         r   	get_statszCmfImport.get_stats  s(    t/?/?!?1 D$499;		+ fnnf.?.?@AIIo&--/!,E$KGGI	'"--/E&M !//1h))$*@*@*BCf6%)*  	+*E$K	+
  	'&E&M	's%   AD! :D5 !D21D25EEc                    dd l }t        j                  j                          | j	                         }|j                  |      \  }}}|dz  }t        j                  j                  | j                  ddg      }|dk  rNd|_
        |j                  r:|j                          t                | j                  j                  d|d	d
       y|j                  j                   dk(  s|j"                  dk7  rId|_
        |j                  r5|j                          t                | j                  j%                  d       yt                | j'                          y)Nr   r   r   cache_status_typerz   r   
   r  u8   Импорт прерван, место на диске z.2fz	Gb < 10GbTimport-stoppingIN_PROGRESSimport-pauseduA   **** Импорт остановлен пользователемF)r0  r  r  import_heartbeatr1  rE  re   r&   rg   rz   r   r'  rh   r   r)   r  r   rI  warningrG  )r   r0  r3  totalusedfreefree_gbr   s           r   	is_cancelzCmfImport.is_cancel  s   ""335..0"--m<tT'"""dggxAT6U"VR<'CJ~~
!!$\]deh\iir"st::??//33H3HM3Y(CJ~~
##$ghr    r-  c           
      $   ddl }d| dg}t        |t              r/|j                         D ]  \  }}|j	                  | d| d        dj                  |      }|j                  dddd	|  d
| dgddt        dd      t        dd             y)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
isinstancer=  r  r   r   Popenopen)methodr   r-  re  params_lkvs          r   r  zCmfImport.run_worker  s     		{!$%fd# .11#Rs!-.(#"K%%+HAfXQ8
 "<dC@$G 	 
	
r    c                      t         j                  j                  d|d          t         j                  j                          y)/   
        Отменяем импорт
        r3   rz   N)re   r&   r  rI   )r   r   s     r   r3   zCmfImport.cancel8  s0    
 	##HfTl;++-r    c                 `    | j                  g d       | j                  j                  |       S )uk   
        Предварительный просмотр получившихся объектов
        r  r   )rQ   r   r:   r   r   r   s      r   r:   zCmfImport.previewA  s+     	KL{{""d"33r    c                 *    t         |          g dz   S )Nr  )r   save_preload_fieldsr   s    r   rr  zCmfImport.save_preload_fieldsH  s    w*,/aaar    c                 B    | j                          t        |   di |S )Nr$   )r  r   rh   )r   r   r   s     r   rh   zCmfImport.saveK  s!    ""$w|%f%%r    c                    | j                   ry | j                  r@| j                  j                  dk(  r't        j                  j                  ddg      | _         t        j                  j                  ddg      | _         y )Nr)  zimport.system.jira:defaultsave_eval_code)r   r   zimport.system:default)r   r   r   re   r  rg   r   s    r   _calc_workflowzCmfImport._calc_workflowO  sh    ==;;4;;11_D"..228T^n]o2pDM**..4KUeTf.gr    c                    | j                  dg       t        t        j                        j	                  | j
                  j                  j                          d      }| j
                  j
                  j                  j                  r9|j	                  | j
                  j
                  j                  j                        }|j                  dd       |S )Nrd  	_raw_dataT)r   r   )rQ   r
   ra   r   r   r   ui_namer  r  r  r   )r   ress     r   r1  zCmfImport.get_download_pathW  s    567**+448K8K8Q8Q8S7TT]5^_;;))//,,t{{11==CCDC		4	.
r    c                 :    | j                   j                  |        y rB   )r   download_datar   s    r   r|  zCmfImport.download_data_  s    !!$'r    c                 :    | j                   j                  |        y rB   )r   download_filesr   s    r   r~  zCmfImport.download_filesb  s    ""4(r    c           	      8   dd l }dd l}|j                  g d      }| j                  dt        j
                         |D ][  }| j                  dj                  |j                  d   |j                  d   |j                  d	         t        j
                         ] | j                  d
t        j
                         |j                  ddg      }|j                  d      }|j                         }|D ]#  }| j                  |t        j
                         % y )Nr   )pidrO   usernameattrsz==============ps auxr  z{:<10d} {:<20s} {:<10s}r  rO   r  z==============netstat -pannetstatz-panrY   )r   re  process_iterr   rc   rb   formatr   check_outputdecode
splitlines)	r   r   re  	processesprocessoutput
output_strlineslines	            r   
log_detailzCmfImport.log_detaile  s    ''.I'J	'w}}=  	GHH)00e1DgllSYFZ\c\h\his\tumm  	 	-W]]C(()V)<= ]]7+
%%'  	0DHHTH/	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  	  j                         rn|j                         }|dk(  rn	 t        j                  |g d      } j                  j                  d| d|j                   d       |j                  j                  xs d} |d      }|j                  r ||        j                   j                  j"                  dk(  r;|j"                  dk(  r, |||        |||        |||        |||        |
|       dj%                  |j&                  j(                  D cg c]  }t+        |       c}      |_         j                   j                  j"                  dk(  rQ|j"                  dk(  rB|j,                  r6 |	|j,                  j                  |j.                  j                        |_        |j0                  r1t3        |d      r|j5                  d       n|j5                  d       |j6                  D ]  }|j8                  dk(  r|j                  j                  xs d} |d      }|j                  sC ||       dj%                  |j&                  j(                  D cg c]  }t+        |       c}      |_        |j0                  s|j5                  d        	 d d d        |j=                  |       y c c}w c c}w #   j;                  dd !       |d"z  }Y CxY w# 1 sw Y   ExY w)$Nr   cmf_context)BeautifulSoupc           
         |j                  d       D ]  }|j                  d      }|sj                  j                  |  d       5j                  j                  j
                   d| }t        j                  j                  |      }|s"j                  j                  |  d| d       |j                  t        j                  j                  |              |j                  dd	i
      D ]  }d }|j                  d      }|sj                  j                  |  d       7t        j                  j                  ddd| dgdg      }|D ]  }|j                  d   |k(  s|} n |s"j                  j                  |  d| d       |j                  t        j                  j                  |              |j                  d      D ]N  }|j                  j                  d      r |j                  j                  d      }	|	sGj                  j                  |  dt        j                  j!                  t#        |                    	 t        j                  j%                  |	      }
|
j(                  s|
j*                  r+|
j(                  j-                  d      s|
j*                  v sd }d }|j                  d      }|j                  d      }|dk(  r|dvr|j                  j                  j
                   d| }t        j.                  j                  |dg       }|sNt        j0                  j                  d!dd"j                  j                  j
                   d#gddd$| dgg%      }|s"j                  j                  |  d&|        |j2                  t#        |j4                        k7  st7        |t        j0                        r|j8                  }|j                  d'      r8t        j                  j;                  |d'   j=                  d(            }| d)| }d*|j                  d<   |	|j                  d+<   ||j                  d<   |d,k(  r|rt        j0                  j                  d!dd"| d#gdg      }|s"j                  j                  |  d-|        d*|j                  d<   |	|j                  d+<   |j8                  |j                  d<   !d.|	v rt>        jA                  d/|	      D ]P  }j                  j                  j
                   d|d0d   }t        j.                  j                  |dg       }|sP n |s"j                  j                  |  d1|	        |slj                  j                  |  d&|        d2|	v rt>        jC                  d3|	      }|s"j                  j                  |  d4|	        t        j                  j                  ddd|jE                  d5      d0d   dgdg      }|D ]*  }|j                  d   |jE                  d5      d0d  k(  s(|} n |sj                  j                  |  d6|jE                  d5      d0d          d7|	v rt>        jC                  d8|	      }|s|jE                  d0      }t        j                  j!                  |jE                  d9            }t        j.                  j                  d:d|gg d;gg d<      }|D ]  }d }|jF                  rN|jF                  j                  r8t#        |jF                  j                  jH                  j                  d            }|s]|j                  rQt#        |j                  jH                  j                  d=i       j                  d,d>      jK                  d?      d@         }||k(  s|} n |s%j                  j                  |  dA|d5           0d*|j                  d<   |	|j                  d+<   |j8                  |j                  d<   idB|	v rt>        jC                  dC|	      }|s|jE                  d0      }t        j.                  j                  j                  j                  j
                   d|       }|s"j                  j                  |  dD|	        d*|j                  d<   |	|j                  d+<   |j8                  |j                  d<   8dE|
j*                  v rt>        jM                  dF|
jN                        rt>        jC                  dG|
jN                        }|s|jE                  d0      }t        j                  j                  d!dd"| gdddH| dIggdg      }|D ]*  }t#        |j                  dJ         t#        |      k(  s(|} n |s$j                  j                  |  dK|        !|j                  t        j                  j                  |             Q y # t&        $ r.}j                  j                  |  d|	 d|        Y d }~d }~ww xY w)LNc                 $    | j                  d      S )Ndata-issue-id)has_attr)tags    r   <lambda>z@CmfImport.obj_check_links.<locals>.check_links.<locals>.<lambda>  s    o1N r    r  uT   : Не удалось найти id задачи в атрибуте 'data-issue-id'rk  rl  u;   : Не удалось найти задачу по ext_id ''zdata-macro-namejirar  zdata-jira-keyuX   : Не удалось найти код задачи в атрибуте 'data-jira-key'rs  rn  %"key":""%r<  r   u=   : Не удалось найти задачу по коду "rW  acmf_convertedhrefu#   : Ссылка без адреса u9   : Не удалось разобрать URL-адрес 'z': httpzdata-linked-resource-typezdata-linked-resource-idpage)Nnull)rl  r   rl  ro  rp  %"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   rO   r   z!=N)r  rs  zparent.import_raw_json_expandabler}  /r  uD   : Не удалось найти документ по ссылке z/pages/viewpage.action$/pages/viewpage.action\?pageId=(\d+)uE   : Не удалось найти документ по ссылке: kaitenz%^(?:/\d+|/space/\d+/boards/card/\d+)$z(\d+)$z%"id":z,%rz   u=   . Не удалось найти задачу Kaiten по ID )(find_allrg   r)   rP  r   r  re   r  replace_withre  create_tag_linkr  rs  r  urllibrL  unquote_plusrC  urlparser   schemehostname
startswithCmfDocumentr   stringrO   rf  r  quotelstripr   findallsearchgrouprV   r  rB  r   r   )main_objsoupr  issue_idissue_ext_idtaskr   task_keyr  r   
parsed_urlexcrl  resource_typeresource_idtag_hrefanchor_nameext_codeobjsr4  r   	space_key	page_namedocsdoc	doc_spacepage_idtask_idr  r   s                               r   check_linksz.CmfImport.obj_check_links.<locals>.check_links  sg
   }}%NO L77?3KK''#*$xy "&++"4"4"@"@!AH:N~~)))>KK''#*$_`l_mmno   !4!4!D!DT!JK!L& }},=v+F}G K77?3KK''#*$|} ++-v(27NO-. , 
 " D++E2h>" KK''#*$abjakklm   !4!4!D!DS!IJ3K6 }}S) LO99==1iimmF+KK''#*$GHaHabefibjHkGlm 
!'!6!6s!;J $**j.A.A"))44V<ATATX`A`C!F$'GG,G$HM"%''*C"DK$.;n3T$(KK$6$6$B$B#C2k]!S$0044FF84T  #"("3"3"7"7%-vT[[=O=O=[=[<\\_7`$a%6BVWbVcce@f$g(" #8 #C  # KK//#+*,hiohp q % ::SXX6*S&J[J[:\'*xxH"ww}5.4ll.@.@]ASAZAZ[^A_.`.6Zr++G9=CIIo658CIIk208CIIf-$&'1k$//33HfPST_S``cNd;e<B8 4 E" KK//#+*,pq|p} ~ %59		/214		+.,/HH		&) !S&(jj3&? &F(,(:(:(F(F'Gr&QRQS*%VF"("4"4"8"8PVx"8"XC" %	&
  & KK//#+*,hilhm n %" KK//#+*,hiohp q %#s*#%99\3#?' KK//#+*,dehdi j %%~~22$5v(..YZJ[\]\^J_I``b?c#d$5#6  3  
 $( &C"2259X^^A=Nqr=RR&) %&  # KK//#+*,hiqiwiwxyiz{|{}i~h  !A %$+ "		*XZ] ^$$$)KKN	$*LL$=$=ekk!n$M	%1166!' ; :$$  7 
  $( &C(,I"zzcjj.H.H,/

0J0J0P0P0T0TUZ0[,\	#,1D1D,/$'$7$7$=$=%(S%;%(S"%5%*U3Z%4-"	  )I5&) %&  # KK//#+*,pqvwxqypz { %59		/214		+.,/HH		&) 1S8 "		*QSV W$$"'++a.$0044&*kk&8&8&D&D%ERy#Q 5   # KK//#+*,qruqv w %59		/214		+.,/HH		&)  J$7$77HH%Mz_ "		)Z__ E$$"'++a.%~~22!)6S	? C!2FfWIR<P Q$ %6#6  3   $( &C"3#6#6t#<=WM&) %&  # KK//#+*,ijqir s % $$V%8%8%H%H%MNYLO  ! KK''#*$]^a]bbefiejk 	s   h++	i"4#ii"c           	      f   |j                  ddi      D ]  }|j                  j                  d      r |j                  j                  d      }|s!j                  j	                  |  d|        ^|j                  j                  d      }j
                  j
                  j                   d| }t        j                  j                  |	      }|sNt        j                  j                  d
ddj
                  j
                  j                   dgddd| dgg      }|rit        j                  |      }|j                  j                  |d<   |j                  j                  |d<   t        j                  |      |d<   d|d<   |d= yj                  j	                  |  d|         y)uz   
            Заменяет ссылку на корневую страницу в макросе Page Tree
            data-macrosz	page-treer  r  data-macro-parametersu5   : Макрос Page Tree без параметров root_page_originalrk  r  rl  rn  ro  rp  rs  r  r  r  r  
rootLocaletrueug   : В макросе Page Tree не удалось найти корневую страницу по ID N)r  r  rg   r)   rP  r   r  re   r  r   jsonloadsrz   r  rO   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_root  s    }}M;+G}H  99==1(+		6M(N%,KK''8*4ijmin(op"yy}}-AB&*kk&8&8&D&D%ER~#V  & 2 2 6 6>N 6 O$$*$5$5$9$9%vT[[5G5G5S5S4TTW/XY.:N|n\^8_`  %: %M !#'::.C#DL+8+;+;+A+AL(1>1C1C1I1IL.37::l3KC/0+1C(01KK''#* %@ AM  @NO; r    c           	      \   |j                  ddi      D ]  }|j                  dd      j                         dk(  r(|j                  d      }|j                  dd	      }t        j                  |      }|j                  d
      }t        j                  j                  dddj                  j                  j                   dgddd| dggdg      }|s"j                  j                  |  d| d       |j                  |d
<   t        j                  |dd      |d<   d|d<    y )Nr  wikilivesearchr  r  falser  zdata-macros-parametersz&quot;rW  currentSpaceKeyrl  rn  ro  rp  rs  rv  r  r  rq  r<  u   : При конвертации макроса 'Livesearch' (Динамический поиск) не найдено пространство с ключем 'A   '. Возможно оно еще не импортированоFrX  :ensure_ascii
separators)r  rg   r  r   r  r  re   r   r  r   r  r)   rP  rz   r  )r  r  r  macros_parametersr-  r  ry  r   s          r   check_livesearchz3CmfImport.obj_check_links.<locals>.check_livesearch  sY   }}M;K+L}M .77?G4::<F$'GG,D$E!$5$=$=h$L!$56"JJ'89	 ++00!6S1C1C1O1O0PPS+TU*Gx	{"5MN !6 1  KK''#* %YYbXc dYZ ,3JJ()04

!&) 1; 1,-
 (.O$=.r    c           	      H   |j                  dddgi      D ]  }|j                  d      }|j                  d      xs |j                  d      }t        j                  j                  dd	d
j                  j                  j
                   dgddd| dgg      }|s"j                  j                  |  d| d       t        j                  j                  ||      }|rt        |j                        |d<   j                  j                  |  d| d       
 y)u\   
            Добавляет ID документа в макрос "Include"
            r  zinclude-excerptzinclude-pager  zdata-param-projectkeyzdata-param-pagenamezdata-param-page-labelrl  rn  ro  rp  rs  rv  r  r  r  u`   : В макросе "Include" не удалось найти пространство по key "uA   ". Возможно оно еще не импортированоrU   zdata-param-pageidu_   : В макросе "Include" не удалось найти страницу по имени "u@   ".Возможно она еще не импортированаN)r  rg   re   r   r   r  r)   rP  r  rC  rz   )r  r  r  
projectkeyr  ry  excerpt_pager   s          r   check_includez0CmfImport.obj_check_links.<locals>.check_include  s[    }}M<M~;^+_}`  WW%<=
GG$9:^cggF]>^	 ++//!6S1C1C1O1O0PPS+TU*Gx
|25NO 0  KK''#* %y zD  yE EYZ
 %11559W5U/2<??/CC+,KK''#* %x yB  xC CYZ-r    c           	         |j                  ddi      D ]  }|j                  d      dk(  rd}d}d}d}|j                  d      }|rqt        d |j                  d	      D              }|j                  d
      r?|d
   }|dk(  r| j                  }n(d|v r|j                  dd      \  }}n| j                  }|}|rst
        j                  j                  dddj                  j                  j                   dgddd| dgg      }|s#j                  j                  |  d| d       |rFt
        j                  j                  ||      }|s#j                  j                  |  d| d       b|xs |}	|	r|j                  d      }
d|	j                   |
_        |j                  d      }t        j!                  |      }t#        |	j$                        |d <   t        j'                  |d!d"#      |d<   d|d<    y)$u   
            Добавляет ID документа в параметр 'Родительская страница' макроса 'Отображение дочерних'
            r  zchildren-docsr  r  r  Nzoriginal-data-macro-parametersc              3   |   K   | ]4  }t        |j                  d d            dk(  r|j                  d d       6 yw)rm  r   r   N)r  rB  )r  params     r   r  zFCmfImport.obj_check_links.<locals>.check_childpages.<locals>.<genexpr>  s;      5!u{{323q8 C+5s   :<|r  r  r  r   rl  rn  ro  rp  rs  rv  r  r  r  u   : При конвертации макроса 'Отображение дочерних' не найдено пространство с ключем 'r  rU   u   : При конвертации макроса 'Отображение дочерних' не найдена страница 'u9   '.Возможно она не импортированаzextension-object-name)class_z | r  
documentIdFr  r  )r  rg   r=  rB  rV   re   r   r   r  r)   rP  r  findrO   r  r  r  rC  rz   r  )r   r  r  ry  documentspacekeypagenameoriginal_macro_parametersr  parent_pagespan_object_namemacro_parametersr-  r   s                r   check_childpagesz3CmfImport.obj_check_links.<locals>.check_childpages  sY    }}M?+K}L C.77?+v5,/GG4T,U),04 5%>%D%DS%I5 1-
 144V<8@3;&)jjG D[15C1C.Hh&)jjG'+H$//33%vT[[5G5G5S5S4TTW/XY.8H:R9PQ  4 G #++"e $]]e\f g]^ !%11558G5TH#++"e $EEMJ OVW !&1''*xx7Nx'O$03K4D4D3E.F$+'*ww/F'G$!ZZ(89F+.{~~+>F<(37::%*#- 4> 4C/0
 (.O$GC.r    task_raw_datalocal_linksc                    |xs g }| j                  dg       D ]  }|d   }|d   }|j                  d      dk7  s&|j                  d      dk7  s|j                  dd	      rHt        j                  d
|d         }|sd|j                  d      }t        j
                  j                  ddd| g      }|s||vr|j                  |       d|d<    |S )Nremotelinksobjectapplicationr   zcom.atlassian.confluencerelationshipz	Wiki Page	processedFr  r   r   rl  rn  ro  r  T)rg   r   r  r  re   r  r   )r  r  
remotelinkremotelink_objremotelink_appr   r  r  s           r   check_remotelinksz4CmfImport.obj_check_links.<locals>.check_remotelinks1  s    %+K+//rB 3
!+H!5!+M!: #&&v.2LL!~~n5D!~~k59 		"I>Z_K`a#kk!nG ,,006SQXPY?8[0\C +-#**3/.2J{+)3, r    c           
         | j                   sy| j                   d   }|j                         D ]  }|s|j                         D ]  \  }}|s	t        j	                  dt        j
                        }|j                  |      s@ |d      } 	| |       dj                  |j                  j                  D cg c]  }t        |       c}      ||<     d|i| _         d|i| _        yc c}w )u   
            Конвертирует ссылки, которые могут быть в макросе "Свойства страницы"
            Ndetailsz
<a .+?</a>)flagslxmlr}  )	macros_dbr  r  r   compileIr  r   bodyrh  rC  macros_db_draft)
r   r  detailr   r  pattern
value_soupxr  r  s
           r   check_macros_dbz2CmfImport.obj_check_links.<locals>.check_macros_dbL  s     ==mmI.G!..* V"(,,. VJC   jjbddjCG">>%0 !.uf!=JZ0"$'':??;S;S*Ta3q6*T"UF3KVV '0CM#,g"6C +Us   9C,F)init_views_and_dsTDONE)	rV   r   zcomments.log_levelzcomments.text
text_draftr  rs  r  r  r   u5   Конвертируем ссылки объекта r{  r|  r}  r  rt  r  r  r   )save_importr  r   uV   Не удалось конвертировать перекрестные ссылкиzERR-0034)r   r   r   r@   N)cmf.appr  bs4r  r=  r  rU  rg   r  get_obj_by_idr)   debugr   r   r  htmlr   r   r   r  rh  rC  rs  r  r'  hasattrrh   comments	log_levelr   put)r   r  	obj_queueobj_queue_errorsr  r  r  r  r  r  r  
has_errorsobj_idr   obj_textr  r  commentcomment_textr  r  s   ``                 @@r   obj_check_linkszCmfImport.obj_check_links  s    '%|	O|$	L	.B	@G	.R	T 	 	6	7, 
51 J	$>>#"V#A$!//
  0 C KK%%(]^d]eeghkhphpgqqr&st"xx~~3H(6:Dyy#C. KK--88<QQ #- ?/T:,S$7)#t4,S$7+C0#%77DII<N<N+OqCF+O#P ))448MMNNi7//*;//55OO11+
 ~~"35HHH6HHtH4#&<< 
9",,1$'.||'9'9'?R,\6B#yy$#C.')ww		@R@R/S1A/S'T"--#LL4L8
9q J	$X 	Z(K ,P4 0T$NNp#- # 
 !OJUJ	$ J	$sJ   +M=C>L+;L!
D8L+L&L+0L+M!
L++MMMc                 6   ddl m} dd l}t        j	                         5  t        j                         5  t        j                         5  | j                          d}t        t              |   }t        j                  j                  ddg dgdg      }g }	|D ]i  }
|
j                  s|	j                  t        j                  j!                  |
j                  j"                        j$                  j'                                k | j)                  d|j*                   d	| d
|        t-        j.                         }t-        j.                         }g }| j)                  d| j0                          |j                  j3                         }t5        | j0                        D ]`  }t7        j8                  | j:                  d| |||	d      }|j                  |       |j=                          | j)                  d|        b d}g dg dg}|j?                  |ddg|||z   g      }|D ]4  }| jA                         r n"|dz  }|jC                  |jD                         6 |D ]  }|jC                  d        | j)                  d|j*                          |D ]  }|jG                           |j                  j3                         |z
  }| j)                  d||jI                         z   d       d}|jK                         s$||jM                         z  }|jK                         s$| j)                  d|j*                   d|        |cd d d        cd d d        cd d d        S # 1 sw Y   nxY wd d d        n# 1 sw Y   nxY wd d d        y # 1 sw Y   y xY w)Nr   r  r   IN)rt  r)  CmfPluginTrackerApiCmfPluginYouTrackCmfPluginKaitenCmfPluginZephyrScaleext_urlr<  u)   Конвертируем ссылки в uB    на локальные задачи и документы start=z limit=uJ   Обрабатываем ссылки в несколько тредов: r3  )r,  r-  r  )targetrO   r   u.   Параллельный обработчик r  import_originalr;  Trq  rz   )r   r   slicer   r  u,   Ждем обработки ссылок в u*   ------------------------ скорость u#    обьектов в секундуu6   Закончили обработку ссылок в u   . Ошибок: )'r#  r  r   r  disable_acldisable_notifyr  r   varsre   	CmfPluginr  r:  r   r  rL  r  r  netlocr  r   r8  r,   Queuer-   r   ranger+   Threadr3  r;   slistrU  r+  rz   r   total_secondsemptyrg   )r   r  r;   limitr  r   r.  rR  pluginsr  r   r,  r-  obj_processrR   rV  proccntrS  r  r   diffs                         r   process_cross_links_by_modelz&CmfImport.process_cross_links_by_model  s   '  " E	G$:$:$< E	g>X>X>Z E	))+JL,E
 &&++D
 "{ , G H! \~~ 5 5fnn6J6J K R R X X Z[\
 HH@ASAS@T  UW  X]  W^  ^e  fk  el  m  nI${{}KHHabfbzbza{|}!!%%'A4334 R ''//*1#.%.,<$, ""4(

I$PQR C13RSG;;gtTl',eem&<  >D &>>#qcff%	&
 $ &f%&HHCEDVDVCWXY# 		$$((*Q.DHHA#HZHZH\B\A]  ^A  B  CJ&,,..2244
 ',,.HHMeN`N`Maaqr|q}~KE	 E	 E	 E	 E	 E	 E	 E	 E	 E	 E	sG   NM:	KM%'"M%		M:	N%M.*M:1	N:N	?NNc                    dd l }|j                  dddd| j                   d| d| dt        j                   d		gd
d
t        dd      t        dd            }| j                  j                  d|j                   d| d| d       |S )Nr   rY  rZ  r[  z&cmf_import = models.CmfImport.get(id='z,');cmf_import.process_cross_links_by_model('z', z, z);Tr]  r^  r_  r`  u1   Запущен process_cross_links_by_model (pid=z model_name=z start=r|  )	re  rg  rz   ra   IMPORT_OBJ_CNTrh  r)   r   r  )r   r  r;   re  rM  s        r   _execute_cross_linkszCmfImport._execute_cross_links  s    "K8	 B<<F<s5'QSTZTiTiSjjln
 "<dC@$G   

 	HH:\*WUG1F	

 r    c           	      D   d}	 | j                         | _        t	        j
                         }g dg dg}dD ]   }t        t              |   }|j                  |      }|s+t                | j                  j                  d|j                   d	| d
| j                          t	        j
                         }d}	g }
t        | j                        D ]?  }| j                  ||	      }|
j                  |       |	t         j"                  z  }	|	|kD  s? n | j%                          |	|k  rt	        j&                  d       t)        |
      D ]q  }|j+                         }|||z  }|
j-                  |       | j                  ||	      }|
j                  |       |	t         j"                  z  }	| j%                          s |	|k  rt)        |
      D ].  }|j/                          |j0                  s ||j0                  z  }0 t	        j
                         |z
  }| j                  j                  d| d|dd        t	        j
                         |z
  }| j                  j                  d|dd|        |S # t        $ r }| j                  d|        |cY d}~S d}~ww xY w)u   
        Обработка ссылок на задачи и документы в тексте импортированных объектов
        r   u.   Ошибка обработки ссылок: Nr  r<  )r  r  r   r  r  u5   Обработка ссылок в объектах 'z' (u,   ) в несколько процессов: r   u$   Обработка ссылок в 'u   ' завершена за z.3fu    сек.uA   Обработка всех ссылок завершена за u    сек. Ошибок: )r   r/   r   r   r;  	monotonicrA  re   countr   r)   r   r8  rE  rS  r   ra   rR  r  sleepr  pollr   communicate
returncode)r   errorsr  total_t1rS  r  rR  obj_cntmodel_t1r;   r  r@  rM  rZ  new_procmodel_t2total_t2s                    r   process_cross_linkszCmfImport.process_cross_links  s    	!%!7!7!9D >>#-/NOO 1	BJL,Ekkk1GLKKGHZHZG[[^_i^j k==A=O=O<PR ~~'H EG4--. 00UCt$...7? OO'/

1 M 
*D!%J!-*,t,#'#<#<Z#Ox0!6!66)
*	 '/" W .  "??doo-F.
 ~~'(2HKKCJ<Oijrsviww  A  Bc1	Bf >>#h.\]efi\j  kB  CI  BJ  K  	L  	NN@F M		s   I6 6	J?JJJc                    d|v rt        d      d}| d| d| j                   }t        j                  }| j                   d| d}|j                  j                  |d      }|j                          	 |j                  j                         5 }	|	j                  | j                  j                  |       ||	j                  |||       n7|j                  |      r|	j                  |       n|	j                  |d|       |	j                          d d d        	 |j                          |dk7  r|sd| d| j                   }| d}|j                  j                  |d      }|j                          	 |j                  |      sd| j*                  j                  j-                  |i       v r}|j                  j                         5 }	|	j                  | j                  j                  |       |	j                  || j*                  |   d   |       |	j                          d d d        	 |j                          y y y # 1 sw Y   3xY w# t        j                  j                   $ r=}
t"        j%                  d	|
 d
|j&                   d|j(                          Y d }
~
zd }
~
ww xY w# 	 |j                          w # t        j                  j                   $ r<}
t"        j%                  d	|
 d
|j&                   d|j(                          Y d }
~
w d }
~
ww xY wxY w# 1 sw Y   xY w# t        j                  j                   $ r<}
t"        j%                  d	|
 d
|j&                   d|j(                          Y d }
~
y d }
~
ww xY w# 	 |j                          w # t        j                  j                   $ r<}
t"        j%                  d	|
 d
|j&                   d|j(                          Y d }
~
w d }
~
ww xY wxY w)N-uA   Нельзя использовать "-" в obj_name: {obj_name}i:	 z.lock   )timeout)exr   zlock release error z, lock_name z
, timeout r  zdownloaded-)r   rz   APPREDIS_DBredislockacquirer/  saddr  setrC   increxecuterelease
exceptions	LockErrorgr&  rO   rf  r  rg   )r   r  r  r  ttlr   redis_dblock_keyrk  piper  s              r   r  zCmfImport.inc_statY  sj   (?_``AhZq	*<<ggYauE*~~""8R"8	b((* d		$''---$HHS%CH0__S)IIcNHHS!H,b ez477)4Ce}H>>&&x&<DLLNf  s+@Q@Q@W@W@[@[\dfh@i0i!002 'd		$''--5d&7&7&A,&OTWX'
fLLN ',  ##-- b-aSTYYKzRVR^R^Q_`aabb##-- b-aSTYYKzRVR^R^Q_`aab' ' ''11 fGG1!L:VZVbVbUcdeeffLLN''11 fGG1!L:VZVbVbUcdeefs   6J0 BIJ0 I <AN
 AL"*N
 3L. IJ0 J-02J((J-0L2KLL 2LLLL"L+'N
 .N2NN
O9NO9O6:2O1,O91O66O9c                 d   t         j                  }i }|j                  j                  | j                  j
                        D ]k  }|j                         }|j                  |      }|j                  d      ^}}}|j                  |      st               ||<   |j                         ||   |<   m |S )Nrd  )
rh  ri  rj  smembersrz   r  r  rg   rB  r=  )r   rv  rT  r   r  r  r  r@  s           r   r  z CmfImport.get_redis_import_stats  s    <<>>**477==9 	2C**,CLL%E"yy~B1::h'#'6x #(<<>F8R 	2 r    c                     | j                  ddg       | j                  dk7  r| j                  j                  S | j	                         S )NrI  r  rM  )rQ   rI  r  r  r  r   s    r   r=   zCmfImport.take_import_stats  sE    -~>?!!]2$$*****,,r    c                    | j                  g d       | j                  dk7  s| j                  j                  dk(  ryt        j
                  j                         st               }|j                         sld}| j                  |t        j                         || _        | j                  j                  d      | _        | j                          | j!                          yy	)
Nr   r  rI  r   rM  import-plannedFu   Импорт прерван по неизвестной причине. Проверьте системные требования.r  r  r  T)rQ   rI  r   r   r  r  import_is_runningCmfImportWorker
is_runningr   rc   r   r  r   r   rh   rL   )r   workerr  s      r   r  zCmfImport.is_running  s    QR!!]2dkk6F6FJZ6Z));;=$&F$$& b	'--8!*"mm>>>>Z		'')r    z	@minutely)	only_once
system_jobschedulec                     t         j                  j                         sy t        j	                  d       t         j                  j                  g ddddgggg d      D ])  } | j                         rt        j                  d|        + y )	Nz&cmf_deferred_job: CmfImport.cron_checkrI  r;  rM  zstatus.codezNOT INr~  r}  r<  uH   Импорт прерван по неизвестным причинам)	re   r&   rF   rt  r&  r  r  r  admin_alert)r   s    r   
cron_checkzCmfImport.cron_check  s     ++-	89##((:+;*<= L ) 
 		uC >>###$npst		ur    project_identifierreport_file_namec                    t         j                  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                  j                  d      }|s%|j                  j                  j                  d      }|st        d| d      t        |      j                         st        d| d| d      |8t        j                  t              }|j                  t        j                         ||_        |j!                  d| d       t#        j$                         }|j'                  |      }t#        j$                         }||z
  }	t        |      j)                  |      }
t+        |
d      5 }t,        j/                  ||       ddd       |j0                  j3                  d      r|D ]`  }|d   }|d   }|d   }|d   }|d    }|j!                  | d!| d"| d#| d$       |s<|j5                  d%|j7                          d&|        b |j!                  d'|	d(d)t9        d*+       t;        |
      j=                  t>        j@                  d,       d       |j!                  d-       yd.d/l!m!} d0 }g }|D ]  }|jE                   ||              g d1}|j!                  d2 |||d34      z          |j!                  d'|	d(       |j!                  d5t9        d*+       t;        |
      j=                  t>        j@                  d,       d       y# 1 sw Y   xY w)6u  
        Собирает статистику количества сдампленных и обработанных объектов
        по проекту

        Args:
            project_identifier (str): ext_id, код, префикс кода задач или название проекта
            report_file_name (str, optional): имя файла отчета. Defaults to "report.json".
            logger (Logger, optional): вывод данных отчета.
        r:  rl  rn  %r   rm  r   rO   r  zcmf_import.pluginrs  r<  u   Проект 'u   ' не найденu   Проект u.    не содержит данных дампаproject_dirr   u*   В данных дампа проекта uA    отсутствует путь до каталога дампаu@   Отсутствует каталог дампа проекта z: 'r  Nu3   Сбор статистики по проекту 'zw+r`   entitydumpedr  r   unprocessedu,    (сдамплено/обработано): z / r{  r|  u   Необработанные r  u   Выполнено за z.4fu,   . Ссылка на файл отчета: 'T)full_urlzrdisk/file/z2--------------------------------------------------r   )tabulatec                 \    | j                         D cg c]  \  }}|dv r| c}}S c c}}w )N)r  r  r  r   )r  )
stats_datark  rl  s      r   	data_listz*CmfImport.project_stats.<locals>.data_list  s8    ","2"2"4!QGG   s   ()r}  u   Сдампленоu   Обработаноu   Результатr  grid)headerstablefmtu*   Ссылка на файл отчета: ')#re   r   rg   r   rs  r   r   r  r
   rC   rc   ry   r!   ro   rb   r)   r   r;  perf_counterproject_statsr   rh  r  dumprO   r  rP  r  app_base_hrefrC  r   ra   r   r  r   )r  r  r)   ry  r   r  
start_timerF  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'@AS"45'.@AS"45 +	 $! ( 
  n-?,@@STUU&&mG94bcdd##**--3377F!1177;;FCK<WI  FG  H  K '')RSZR[[^_j^kklm  >&&x0FOOGMM*I'RSTU&&(
$$W-$$&*, ;'001AB+t$ 	 IIeQ	  ;;!!), % d%h/%h/(5	%h/*=9vh&RSYRZZ]^g]hhjkqjrrstuNN%B6<<>BRRTU`Ta#bcd KK*<*< ===JTX=Y<Z{#++F,=,=}MNaQ
 KK!) D % 5Il345^GKKxgOOPKK2<2DEFKK<]TX=Y<Z{#++F,=,=}MNaQE	  	 s   M&&M0)zERR-0001NNNNr  )T)r}  )NN)FrB   r"  )r  N)zreport.jsonN)Pr!   r"   r#   r   r&   ui_meta_skipapi_methodsr'   r*   rP   r
   r1   classmethodr  rF   rI   rL   propertyr=  r0   r   r   r)   rc   rd   rC  r   r   r   r   r   r7   r  r8   r6   staticmethodr   r   r   r  r2   r>   r  r(   r;   r<   r,  r5   r_  r4   rb  r9   r  r  r*  r4  rG  rU  r  r3   r:   rr  rh   rv  r1  r|  r~  r  r3  rP  rS  rb  r  r  r=   r  cmf_deferred_jobr  r  __classcell__)r   s   @r   r&   r&   $   s?   ''44 8P PL &&22 6
 
K K9:-D - - % % * * % % % = = =D \\

 
0 gk5>C C s be 148K7S 7r
"	D 	
K  O
Y6  
   . . 7 7.# .:)L L\7QSfr00dt BB!F+:2 
d 
 
: . .4b&h4 ()04p) p)c p)dHT*GR*fX-4 -" Lu M u  !.ccc cr    r&   c                 .     t                fd       }|S )Nc                     	  | g|i |}t                | j                  j                  d       t        j	                          |S #  t                | j                  j                  d       Y y xY w)Nu*   Импорт завершил работуu&   Ошибка работы демона)r   r)   r   r&   rL   r  r  )r   r   r   rz  fns       r   wrappedz!catch_exceptions.<locals>.wrapped#  sd    	KS)$)&)CLJJOOHI((*J	KNJJ  !IJs   AA
 
'A3r   )r  r  s   ` r   catch_exceptionsr  "  s"    
2Y	K 	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y)r  c                     ddl m} dd l}ddlm} |j                  |      | _         |j                  | j                   |d| d      |j                          |d| d      | _	        y )	Nr   r   r	   z/var/logz.logr  z	/var/run/z.pid)
cmf.modules.logsr   rc   r   r
   ry   r)   init_loggerrd   r  )r   r  r   rc   r
   s        r   __init__zCmfImportWorker.__init__2  s^    / '',
t{{DuD\,JRYR^R^_	#d+,r    c                 X   | j                   j                  d       t        j                  j	                  ddd|gdd|ggg d      }|j                          |j                  d       |j                  j                  d	d
      |_	        |j                          t                t        j                         5  t        j                         5  t        j                         5  |j!                         }t"        j%                  d       d d d        d d d        d d d        t        j                  j	                  |j&                  g d      }t        j(                  j+                  dd|g      }|j                  j,                  d
k(  r|sM|j                   j                  d       |j                  j                  d      |_	        |j                          ni|j                  j.                  dk7  rP|j                   j                  d| d       |j                  j                  d      |_	        |j                          t        j0                  j	                  d|      }t3        |j4                        j7                  t8        j:                  d      }t        j<                  j?                  ||j@                  |jB                  d|j,                   dtE        jF                  tH        jJ                        dd| dd        y # 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   xY w)!Nu   Импорт запущенr:  rz   r;  r   r   r   r  r  r<  u%   ***Запускаем импорт***rM  import-startedr   r  r   rJ  r   r  u2   ***Импорт успешно завершен***import-completedr  CLOSEDu6   ***Импорт завершен с ошибками: u,   . Подробности в отчете.***r  rT   rU   /files/u   Импорт данных 'u   ' завершен %d.%m.%Y %H:%Mz (UTC), <a href=(   >Журнал логирования</a>Tr   personrO   r   force_notify_current_person)&r)   r   re   r&   rg   r   r   r   r   r   rh   r   r  r?  r@  r  r  geventrW  rz   r   rV  r   r   rf   rC  rl   r   ra   r   	CmfNotifyplace_notifyr  rO   r   r   r   rQ  )r   r   r   rz  r[  log_filelog_paths          r   runzCmfImportWorker.run:  s   67""4$i1H6SWYbJc*d.c # e78\\44\l4m

  " 	G$:$:$< 	g>X>X>Z 	$$&CLLO	 	 	 ""cff+` # b&&,,\44M,N::??..

 TU \\<<I[<\

''83

"XY_X`  aM  !N  O \\<<<X

''++C+Hx../778I8I9U%%>>-chhZ7J8<<X`XdXdKeftJu v#*$LN(, 	& 	.%	 	 	 	 	 	s<   9LL#&L	LLL
LL	LL)c           
      l   | j                   j                  d       t        j                         5  t        j	                         5  t        j                         5  t        j                  j                  ddd|gdd|ggg d      }|j                  d       |j                  j                  d	d
      |_        |j                          t                |j                         }|j!                         }t        j"                  j%                  dd|g      }|rQ|rO|sM|j                   j                  d       |j                  j                  d      |_        |j                          ni|j                  j&                  dk7  rP|j                   j                  d| d       |j                  j                  d      |_        |j                          |j                   j(                  d   j*                  j-                  t.        j0                  d      }d d d        d d d        d d d        t        j2                  j5                  t6        j8                  |j:                  dt=        j>                  t@        jB                        dd dd       y # 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   xY w)Nu   Дамп запущенr:  rz   r;  r   r  r<  u!   ***Запускаем дамп***rM  r  r  r   r  u.   ***Дамп успешно завершен***r  r   u2   ***Дамп завершен с ошибками: z***r  r  r   r  u'   Дамп данных завершен r  z
, <a href=r  Tr  )"r)   r   r  r?  r@  r  re   r&   rg   r   r   r   r   rh   r   r|  r~  r   rV  r   rv   baseFilenamer   ra   r   r  r  rt  current_personrO   r   r   r   rQ  )r   r   r   rz  res2r[  r  s          r   	dump_datazCmfImportWorker.dump_data_  sE   23  " 	aG$:$:$< 	ag>X>X>Z 	a""&&tdD)5LvW[]fNg.h.c ' eC GG7888]`p8qCJHHJL##%C%%'D**00tS8Q0RFtF

 PQ \\<<<R

''83

"TU[T\\_ `a \\<<<X

zz**1-::BB6CTCTV_`H+	a 	a 	a, 	%%##9(,,x||:TUc9d e#*$LN(, 	& 	.-	a 	a 	a 	a 	a 	as<   J*JF:JJJ*JJJ'	#J**J3Nc           
         | j                   j                  d       t        j                         5  t        j	                         5  t        j                         5  t        j                  j                  ddd|gdd|ggddgd	      }|j                  j                  d
      |_        |j                          t                	 d}d}|j                   j                  d       t        j                  j                  dd|gd      D ]>  }	 |j                   j                  d|        |j!                  dd       t                @ t        j                  j                  ddd|gdd|ggg dd	      }|j&                  D ]>  }	 |j                   j                  d|        |j!                  dd       t                @ |s=|j                  j                  d      |_        |j                   j                  d       n?|j                   j)                  d|        |j                  j                  d      |_        |j                          t0        j2                  j4                  j7                          	 ddd       ddd       ddd       y#  t#                |dz  }|j                   j%                  d| d       Y xY w#  t#                |dz  }|j                   j%                  d       Y vxY w# t*        $ re}t#        |       |j                   j%                  d        t-        |      |_        |j                  j                  d      |_        Y d}~#d}~ww xY w# |j                          t0        j2                  j4                  j7                          w xY w# 1 sw Y   1xY w# 1 sw Y   6xY w# 1 sw Y   yxY w)rn  u   Отмена запущенаr:  rz   r;  r   r   r   T)r   r   r?  zimport-cancelingr  r   Nu#   ***** Отменяем импортr   )r   r?  u   Удаляем )r  r  r   u#   Не удалось удалить uW   , видимо обьект использовали вне данных импорта)r   r   import_objectsuy   Не удалось удалить, видимо обьект использовали вне данных импортаzimport-canceledu,   Успешно отменили импортu#   Количество ошибок: r  u   Ошибка удаления )r)   r   r  r?  r@  r  re   r&   rg   r   r   r   rh   r   r   r  rf  r  r  r  r  r   rC  r  r  r  r  r  )r   r   r   r[  r4  r  s         r   _cancel_importzCmfImportWorker._cancel_import  s\    	89  " +	,G$:$:$< +	,g>X>X>Z +	,""&&tdD)5LvW[]fNg.h/7.DVZ ' \C88EW8XCJHHJL%,

"EG!,,11,c9Rdh1i uCuJJOOocU,CDJJDJI&L	u &&**4$i9PSY[_ajRk2l.Vhl + n-- jCj

/#(?@

D
E"	j !$!@!@M^!@!_CJJJOO$RSJJ$$'J6(%ST!$!@!@^!@!\CJ 
!!))+W+	, +	, +	, +	,u(N"QJFJJ003VWZV[  \s  2t  uj$	

,,  .i  j  YQ

$$'EcU%KL #A \\<<<X

	Y 
!!))+W+	, +	, +	, +	, +	, +	,s   ON5A)N(AK:;J>K:;K B K: 8N(9N5O0KK:,K74K::	M(	AM#	M+#M(	(M++:N%	%N((N2-N55N?	:OOc                 @   t         j                  j                  ddd|gdd|ggg d      }dd|j                  d	i}|j                  j
                  j                  d
k(  rLd|j                  j                  |dddd|j                  j                  |dddd}|j                  |       |j                  |      }|s |j                  j                  d| d       y |d   }|j                  di       }|j                  j                  dd      |_        |j                          t                | j                  j!                  |d    d       t"        j%                         5  t"        j'                         5  t"        j)                         5   |d$i | t*        j-                  d       d d d        d d d        d d d        t         j                  j                  |j.                  g d      }t         j0                  j3                  dd|g      }	|j                  j4                  dk(  r~|	s2|j                  j                  d       |_        |j                          nJ|j                  j6                  d!k7  r1|j                  j                  d"       |_        |j                          t8        j:                  j<                  j?                          | j                  j!                  |d    d#       y # 1 sw Y   KxY w# 1 sw Y   PxY w# 1 sw Y   UxY w)%Nr:  rz   r;  r   r  r<  linksu   Обработка ссылок)rO   ri  r)  u   Импорт фильтров_process_filters)r   process_method)rO   ri  r   u3   Обработка связей всех задач_process_relationsr&  uC   Конфигурация для запуска обработки 'u   ' не найденаri  r   rM  r  r  rO   u    запущенаr   rJ  r   r  r  r  r  r  u    завершенаr$   ) re   r&   rg   rb  r   r  r   r,  updater)   r  r   r   r   rh   r   r   r  r?  r@  r  r  rW  rz   r   rV  r   r   r  r  r  r  )
r   r   r$  r   process_configsprocess_jira_configsprocess_configri  method_kwargsr[  s
             r   _process_entityzCmfImportWorker._process_entity  s   ""tY'y)
 # 
 911
 ::&&/9 <!jj77&)*< R!jj77&)*>$ $ ""#78(,,[9JJbcnbo  pE  F  G)&**8R8\\44%( 5 

 	
N6233DEF  " 	G$:$:$< 	g>X>X>Z 	#]#LLO	 	 	 ""vv # 
 &&,,\44M,N::??.. \\<<I[<\

''83 \\<<<X

!!#N6233FGH/	 	 	 	 	 	s<   (L=LK90L8L9L>LL	LLc                    | j                   j                         rt        d      | j                   j                  t	        t        j                                       | j                  |  | j                   j                          y Nu"   Импорт уже запущен)	r  rC   r   
write_textrC  r   getpidr  rK   r   r   s     r   r;   zCmfImportWorker.start	  sT    88??@AAC		,-$r    c                    | j                   j                         rt        d      | j                   j                  t	        t        j                                       | j                  |  | j                   j                          y r  )	r  rC   r   r  rC  r   r  r  rK   r  s     r   r  zCmfImportWorker.dump	  sU    88??@AAC		,-r    c                    | j                   j                         rt        d      | j                   j                  t	        t        j                                       | j                  |  | j                   j                          y r  )	r  rC   r   r  rC  r   r  r  rK   r  s     r   r3   zCmfImportWorker.cancel	  sW    88??@AAC		,-T"r    c                 p   t         j                  j                  g dg d      }|r;| j                         r|j                  j                  d       |j                  j                  d      |_        |j                          t                t        d      D ]U  }t        j                  d       t         j                  j                  |j                  d	d
g      }|j                  dk7  sU n n|j                  j                  d       |j                  j                  d      |_        |j                          t                |j                  j!                  d       | j"                  j%                         s| j                  j!                  d       y | j                  j!                  d       	 t'        j(                  t+        | j"                  j-                               t.        j0                         | j"                  j5                          y #  | j                  j3                  d       Y :xY w)Nr  r  r<  uQ   Пытаемся остановить импорт, таймаут 1 минутаrL  r  <   r   rI  r   rJ  rM  u"   Импорт уже прерванrN  u<   Импорт остановлен пользователемu    Импорт не запущенu'   Останавливаем импортuK   Не удалось завершить процесс, он запущен?)re   r&   rg   r  r)   rP  r   r   r   rh   r   rE  r  rW  rz   rI  r   r  rC   r   killr   	read_textsignalSIGTERMr  rK   )r   r   r   rV  s       r   r<   zCmfImportWorker.stop	  s   ""*T  ^S"  T 

""#vw \\<<IZ<[

r ALLO **..#&&BUWaAb.cC,,=	 

""#GH88_8UCJHHJLJJOOZ[xx KK?@BC	qGGC**,-v~~> 		qKK!!"ops   6AH H5c                    | j                   j                         rt        d      | j                   j                  t	        t        j                                       | j                  |i | | j                   j                          y r  )	r  rC   r   r  rC  r   r  r  rK   rp  s      r   r,  zCmfImportWorker.process_entity<	  s\    88??@AAC		,-d-f-r    c                     | j                   j                         rRt        j                  t	        | j                   j                                     ry| j                   j                          y y )NT)r  rC   r  check_process_runningr   r  rK   r   s    r   r  zCmfImportWorker.is_runningD	  sF    88??,,S1C1C1E-FGHHOO r    )zeva-import-workerr"  )r!   r"   r#   r  r  r  r  r  r  r;   r  r3   r<   r,  r  r$   r    r   r  r  1  s    -#.J.@0,dSIj        :  r    r  )+csvr   r   decimalr   r   r   rc   r   sysr   r   r
   typingr   r   rj  rK  r   xlrdopenpyxlr;  r+   r,   r  cmf.includer  r   common.fieldsr   r  r   r   r  	functoolsr   rD  rx   Filterr   r&   r  r  r$   r    r   <module>r     s    
   '  
   !   +         $ '   EKKM	3gnn 3{
$$ {|?W Wr    