
    ?jp                       d dl m Z  d dlmZ d dlmZmZ d dlmZ d dlZd dlm	Z	 d dl
Z
d dlZd dlm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T d d
lmZ d dlmZ d dlmZ d dlZd dlZd dlmZ  ej                    Z ej                     Z! G d dej"                  Z# G d d          Z$ G d d          Z% G d de$e%ej&                  Z&d Z' G d d          Z(dS )    )copy)Decimal)datetimetimezone)LoggerNPath)BeautifulSoup)cached_property)*fields
cmf_import
log_configwrapsc                       e Zd Zd ZdS )AnonymousFilterc                 $    t          |dd          S )N	anonymousF)getattr)selfrecords     ./common/models/cmf_import.pyfilterzAnonymousFilter.filter#   s    v{E222    N)__name__
__module____qualname__r    r   r   r   r   "   s#        3 3 3 3 3r   r   c                       e Zd Zedefd            Zej        dddfdede	fdZ
	 	 	 	 	 	 	 ddededededededefdZedd            Zd ZdefdZd Zd Zd Zd	S )LoggingMixinreturnc                 f   t           j        rt          j        nt          j        }t          j                            d|           }|sOt                              d|           }|                                 |j        s|	                    ddd           t          j                            d|           }|sOt                              d|           }|                                 |j        s|	                    ddd           t          j        |j        ddt           j        t           j        	          }|                    |           |                    t                              t          j                             t          j        |j        ddt           j        t           j        	          }|                    |           |                    t                              t          j                             |                    t)                                 t                                          }|                    |           |                    t          j                               t          j                            t2          |||          }|                                 t                              d
| j                   }|                    |           d|_        |j        s7|                    t          j                            t2                               |S )uE    Журнал логирования процесса импорта data.logname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_queuestart	getLoggerid	propagate
addHandlerQueueHandler)	r   levelattachment_logattachment_log_anonfile_handleranonymous_handlerconsole_handlerlistenerloggers	            r   rZ   zLoggingMixin.logger(   s    "(?7<  -11z$1OO 	V#11z$1OON!!!!- V**3Uu*UUU$266<PY]6^^" 	["("6"6<PY]"6"^"^$$&&&&2 [#//%TY/ZZZ "/#206
 
 
 	e$$$!!'"3"3J4H"I"IJJJ&4(706
 
 
 	""5)))&&w'8'89M'N'NOOO##O$5$5666 "//11  '''$$Z%?%A%ABBB #11	
 
 	 ""#6TW#6#677  	Hg.;;IFFGGGr   F   msgrS   c                 :     | j         j        ||fd|i||d| dS )uI  Логируем как обычные лог для веб так и со скрытыми данными для возможности отправки в СТП

        Args:
            msg (str): сообщение
            level (int, optional): уровень логирования. Defaults to logging.INFO.
        r   )extraexc_info
stacklevelN)rZ   log)r   r\   rS   r   r_   r`   kwargss          r   ra   zLoggingMixin.logh   sP     		
 	*!	
 	
 	
 	
 	
 	
 	
r   ERR-0001Nprocess
error_codeobj_typeext_href	dump_path
error_typerollbackc	           
         t          j                    }	|                     |t          j        d           |rt                       	 t                              ||| ||||	|          }
|r|j        |
_	        |j
        |
_        |                    dg           |j        rL|j        j        r@|j        j        }|                    |          |
_        |                    |          |
_        |
                                 t)                       dS # t*          $ r.}| j                            d| d| d|	            Y d}~dS d}~ww xY w)	u7  Логируем ошибки и записываем их в базу

        Args:
            msg (str): текст ошибки
            error_code (int, optional): Код ошибки для нахождения возможного решения или группировки. Defaults to 1.
           )r\   rS   r`   )textcoder   rh   ri   rf   	tracebackrg   cmf_import.pluginu5   Не удалось сохранить ошибку: u)   . Оригинальная ошибка: z. Traceback: N)ro   
format_excra   r7   ERRORcmf_rollbackr9   CmfImportErrorr)   title
class_namerf   load_fieldsr   plugincalc_ext_hrefrg   calc_dump_pathrh   r<   
cmf_commit	ExceptionrZ   error)r   r\   re   objrf   rg   rh   ri   rj   error_traceimport_errorrx   excs                r   	log_errorzLoggingMixin.log_error   s   "  *,,S!<<< 	NNN	!00#%!%! 1 	 	L  H%(X"(+%!4 5666> Hcn&; H ^2F,2,@,@,E,EL)-3-B-B3-G-GL*LLLLL 	 	 	K, , ,:=, ,), ,        	s   CD 
E#EE c                     d|                      d           d} t                              d|  d|            t          |            d S )Nu1   Ошибка при импорте данных. .ue   . Проверьте загружаемый файл и повторите попытку снова.zCmfImportError: : )stripr7   r}   	cmf_alert)r\   es     r   
_log_errorzLoggingMixin._log_error   sZ     x#))C..  x  x  x33333444#r   c                     t           j                            d| dg          }|s0t                               d|           }|                                 |j        s| j                            d           |j        S )uK   
        Возвращает путь текущему файлу
        r'   url)r)   r*   r   r(   u   Начало)r9   r:   r;   r<   r=   rZ   infor   )r   argsrb   rT   s       r   get_log_filenamezLoggingMixin.get_log_filename   s      -11z$X]W^1__ 	"#11z$1OON!!!) 	-K^,,,!!r   c                      t                               d                                        dd            fdt          j                  D             }|S )u   
        Список файлов после logrotate, чтобы можно было загрузить историю
        T)parentsexist_okc                 &   g | ]}t           j                            t           j                            |                    ?t                              d |          Zt           j                            d                                |          S )z%(?:data|anonymous_data)\.log(\.\d+)?$files)ospathisfilejoinrematchget_files_dir).0fdir_pathr   s     r   
<listcomp>z2LoggingMixin.get_log_filenames.<locals>.<listcomp>   s     P P Prw||Ha'@'@AAP"JANNPRW\\'4+=+=+?+?CC P P Pr   )r	   r   mkdirr   listdir)r   r   rb   	file_listr   s   `   @r   get_log_filenameszLoggingMixin.get_log_filenames   s~     **40011td333P P P P PRZX`MaMa P P P	 r   c                 :   dd l }t          |                     d                    }|                    d          }t          j                            |          rt	          j        |           |                    |d          5 }| 	                                D ]7}|
                    dt          j                  }|                    |           8	 d d d            n# 1 swxY w Y   t          j                            d|                                 d          S )Nr   Tall_logs.zipw/filesr   )zipfiler	   r   joinpathr   r   existsremoveZipFiler   replacer5   
UPLOAD_DIRwriter   )r   r   rb   r   r   zip_pathmyzip	file_paths           r   get_all_logs_by_zipz LoggingMixin.get_all_logs_by_zip   s8   **40011$$^447>>(## 	 Ih__Xs++ 	'u!3355 ' '	%--h8IJJ	I&&&&'	' 	' 	' 	' 	' 	' 	' 	' 	' 	' 	' 	' 	' 	' 	' w||GT%7%7%9%9>JJJs   ACC#&C#c                 z   dd l }t          |                     d                    }|                    t	          j                                        d           d          }|                                 }|r|                    |d          5 }|                                 D ]K}|	                    dt          j                  }|                    |           t          j        |           L	 d d d            n# 1 swxY w Y   t          j                            d|                                 d          S d S )	Nr   Tz
%Y%m%d%H%Mz_all_logs.zipr   r   r   r   )r   r	   r   r   r   nowstrftimer   r   r   r5   r   r   r   r   r   r   )	r   r   rb   r   r   r   log_file_pathsr   r   s	            r   zip_all_logszLoggingMixin.zip_all_logs   se   **40011$$(?(?(M(M%\%\%\]]//11 	O3// )5!%!7!7!9!9 ) )I ) 1 1(F<M N NIKK	***Ii(((()) ) ) ) ) ) ) ) ) ) ) ) ) ) ) 7<<););)=)=~NNN	O 	Os   A!C==DDc           	      N   dd l }dd l}|                    g d          }|                     dt          j                   |D ]Y}|                     d                    |j        d         |j        d         |j        d	                   t          j                   Z|                     d
t          j                   |                    ddg          }|	                    d          }|
                                }|D ]#}|                     |t          j                   $d S )Nr   )pidr)   usernameattrsz==============ps auxrS   z{:<10d} {:<20s} {:<10s}r   r)   r   z==============netstat -pannetstatz-panr-   )psutil
subprocessprocess_iterra   r7   r6   formatr   check_outputdecode
splitlines)	r   r   r   	processesrd   output
output_strlineslines	            r   
log_detailzLoggingMixin.log_detail   s<   ''.I.I.I'JJ	'w}===  	 	GHH)00e1DglSYFZ\c\his\tuum     
 	-W]CCC(()V)<== ]]7++
%%''  	0 	0DHHTH////	0 	0r   )rc   NNNNrd   F)r   )r   r    r!   r   r   rZ   r7   r8   strintra   boolr   staticmethodr   r   listr   r   r   r   r"   r   r   r$   r$   '   sg       = = = = _=D \
 

 
 
 
 
6 %#2 22 2
 2 2 2 2 2 2 2 2h    \

" 
" 
"	D 	 	 	 	K K KO O O0 0 0 0 0r   r$   c                       e Zd Zd Zed             Zd Zd Zd Zd Z	d Z
d Zd	 ZddZddZddZddZddZd ZdedefdZd Zd Zd
efdZddZddZddZdS )CrossLinkMixinc                     g }t           j                            ddg dgdg          }|D ]K}|j        s
|                    t
          j                            |j        j                  j	                   L|S )u   
        Собирает URL из всех плагинов импорта
        для поиска и конвертации абсолютных ссылок
        на уже импортированные объекты
        typeIN)CmfPluginConfluenceCmfPluginJiraCmfPluginTrackerApiCmfPluginYouTrackCmfPluginKaitenCmfPluginZephyrScaleext_urlr   r   )
r9   	CmfPluginr   r   appendurllibparseurlparsevaluehostname)r   urlspluginsrx   s       r   _get_plugin_urlszCrossLinkMixin._get_plugin_urls	  s     "''  
 ; ( 
 
  	N 	NF> KK--fn.BCCLMMMMr   c                     t          | j        d          s|                                 | j        _        | j        j        S )N	_api_urls)hasattr	__class__r   r   r   s    r   api_urlszCrossLinkMixin.api_urls$  s7    t~{33 	?'+'<'<'>'>DN$~''r   c                    |                     d           D ]}|                    d          }|s(| j                            t          j         d           At          j         d| }t          j                            |d          }|s+| j                            t          j         d| d           |	                    t          j
                            |                     d	S )
u=   Заменяет макросы задач YouTrack и Kaitenc                 ,    |                      d          S )Ndata-issue-id)has_attr)tags    r   <lambda>z6CrossLinkMixin._replace_issue_macros.<locals>.<lambda>,  s    S\\/-J-J r   r   uS    Не удалось найти id задачи в атрибуте 'data-issue-id'::Text_idinclude_archivedu:    Не удалось найти задачу по ext_id ''N)find_allr;   rZ   warning
thread_ctxlog_objsource_hashr9   CmfTaskreplace_withCmfPluginCsvcreate_tag_link)r   soupr   issue_idissue_ext_idtasks         r   _replace_issue_macrosz$CrossLinkMixin._replace_issue_macros*  s   ==!J!JKK 	H 	HCww//H ##!)~~~   (4BBBBL>%%\D%QQD ##!)tteqttt   V0@@FFGGGG!	H 	Hr   c           	         |                     ddi          D ]}d}|                    d          }|s(| j                            t          j         d           Ct          j                            ddd	d
| dgdd|ggdgd          }|s+| j                            t          j         d| d           |                    t          j	        
                    |                     dS )u/   Заменяет макросы задач Jirazdata-macro-namejirar   Nzdata-jira-keyuW    Не удалось найти код задачи в атрибуте 'data-jira-key'ORimport_raw_jsonLIKE%"key":""%rn   =Tr   r   r   <    Не удалось найти задачу по коду 'r   )r   r;   rZ   r   r   r   r9   r   r   r  r  )r   r  r   r~   task_keys        r   _replace_jira_macrosz#CrossLinkMixin._replace_jira_macros>  s@   ==(96'B=CC 	G 	GCCww//H ##!)  C  C  C   .$$&0G80G0G0GHS(+
 **!% %  C  ##!)rrgorrr   V0@@EEFFFF3	G 	Gr   c                     	 t           j                            |          S # t          $ r7}| j                            t          j         d| d|            Y d}~dS d}~ww xY w)uf   Безопасно парсит URL и возвращает parsed_url или None при ошибкеu-    Не удалось разобрать URL 'z': N)r   r   r   r|   rZ   r   r   r   )r   r   r   s      r   _parse_url_safelyz CrossLinkMixin._parse_url_safely[  s    	<((--- 	 	 	K%aaTWaa\_aa   44444		s   ! 
A",AA"c                     |j         r|j         | j        vrdS |j        r|j                            d          sdS |j        s	|j         rdS dS )uO   Определяет, нужно ли обрабатывать данный URLFhttpT)r   r   scheme
startswith)r   
parsed_urls     r   _should_process_urlz"CrossLinkMixin._should_process_urle  sn      	:#6dm#K#K5  	Z%6%A%A&%I%I 	5   	Z%8 	5tr   c           
      f   |                     d          }|                     d          }|j        }t          j                            |j                  }d}d}	d}
|dk    r|dvrt          j         d| }t          j	                             |dgd	          }|s:t          j
                             d
ddt          j         dgddd| dgg          }|s,| j                            dt          j         d|            dS |                     d          r|d                             d          }
	n|dk    r\|dvrXt          j
                             d
dd| dgdg          }|s+| j                            t          j         d|            dS 	n|                    d          rd}t                               d|          D ]B}t          j         d|dd          }t          j	                             |dgd	          }|r nC|s,| j                            t          j         d| d           dS |s,| j                            t          j         d| d           dS |j        }
n|                    d          rt                               d|          }|s,| j                            t          j         d | d           dS |                    d!          dd         }t          j                             d"ddd#| dgd$d%|ggdgd&          }|s,| j                            t          j         d'| d           dS n|                    d(          rt                               d)|          }|sdS |                    d          }t          j                            |                    d*                    }|rt          j	                            d+d|gg d,gg d-d&          }|D ]}d}|j        r=|j        j        r1t5          |j        j        j                             d.                    }|sa|j        rZt5          |j        j                             d/i                                dd0                              d1          d2                   }||k    r|} nn+t          j
                             g d3dd4d#| dgg          }|s3| j                            t          j         d5|rd6nd7 d8| d           dS |j        r5|j                            d9d0                              d:d          d2         }
n|                    d;          r|                     d<          r|d<         d!         }t          j	                            d
dd| gd
gd&          }|D ]:}t5          |j                                      t          j         d          r|} n;|r|d!         }|s,| j                            t          j         d=| d           dS |j        r5|j                            d9d0                              d:d          d2         }
n|                    d>          r|                    d1d?          }t          j	                            ddd@| dgdgd&          }|D ]=}|j        j                             dAi                                dB          }||k    r|}>|s,| j                            t          j         d=| d           dS n|                    dC          r||                     dD          rg|dD         d!         }t          j                             d
dd| g          }|s/| j                            t          j         dE| dF| d           dS nv|                    dG          r|                     dH          r|dH         d!         }t          j                              d
dd| g          }|s/| j                            t          j         dI| dF| d           dS |j!                            dJdHd          }	n|                    dK          rdL|v rt           "                    dM|          }|sdS |                    d          }t          j
                             g dNdd4d#| dgg          }|s/| j                            t          j         dO| dP| d           dS t          j#                             ||dQdRdS          }|s/| j                            t          j         dT| dF| d           dS dUdVdWdXdYdZd[d\}|                     dHdg          d!         }|r|d]k    r|}n|                     |          }|s2| j                            t          j         d^| d_| d`| d           dS t          j                              ||a          }|s2| j                            t          j         db| d_| dc| d           dS |}n|j$        rdd|j$        v rt           "                    de|          rt                               df|          }|sdS |                    d          } t          j                            d
dd|  gdddg|  dhggdgd&          }!|!D ]1}"t5          |"j        di                   t5          |           k    r|"} n2|s+| j                            t          j         dj|             dS ndS ||	|
dkS )lu   
        Определяет объект, на который ведет ссылка, и возвращает информацию о ссылке.
        Возвращает словарь с ключами: obj, href, anchor.
        zdata-linked-resource-typezdata-linked-resource-idNpage)Nnullr   hrefT)r   r   r   r   r  %::::%r  %"homepage":{"id":"r  r   r   u9    Не удалось найти документ по id zdata-anchor#spacer   uA    Не удалось найти пространство по id z/wiki/z\/\d+   u:    Не удалось найти id документа в 'u:    Не удалось найти документ по id 'z/browse/z	\/\w+-\d+u8    Не удалось найти код задачи в 'r   r
  r  rn   r  r  r  z	/display/z+/display/([~]?[A-Za-z0-9]+)+(?:/)?([^?#]*)?r[   r)   r   !=N)r  r  zparent.import_raw_jsonkey_expandabler   /)logic_prefixr  project.wikiILIKEu     Не удалось найти u   документu   проектu    по ссылке 'zid--z/pages/viewpage.actionpageIdu7    Не удалось найти документ по 'z/x/z\\/z%"tinyui":"_linkstinyuiz/secure/RapidBoard.jspa	rapidViewu+    Не удалось найти доску u    по 'z/issues/r   u8    Не удалось найти фильтр задач projectz
/projects/z/issuesz"^/projects/([^/]+)/issues(?:/.*)?$)r-  r(  r.  u.    Не удалось найти проект 'u   ' по 'u   Задачиr   )tree_parentr*   r)   r   systemuG    Не удалось найти реестр задач проекта u$   Мои открытые задачиu   Сообщено мнойu   Открытые задачиu#   Выполненные задачиu!   Недавно созданныеu   Недавно решенныеu%   Недавно обновленные)myopenissuesreportedbymeallopenissues
doneissuesaddedrecentlyresolvedrecentlyupdatedrecently	allissuesu    Фильтр задач 'u   ' проекта u3    не поддерживается. Ссылка: ')r6  r)   u9    Не удалось найти фильтр задач 'u   . Ссылка: 'kaitenz%^(?:/\d+|/space/\d+/boards/card/\d+)$z(\d+)$z%"id":z,%rO   u<    Не удалось найти задачу Kaiten по id )r~   r  anchor)%r;   r   r   r   parse_qsqueryr   r   r9   CmfDocument
CmfProjectrZ   r   r   lstripr  r   findallfragmentsearchgroupr   unquote_plusr   r*   r  r   r   splitr   r   CmfKanbanBoardCmfBqlFilterr  r   CmfRegistryr   )#r   r   r  original_urlresource_typeresource_idurl_path
url_paramsr~   r  rA  r   ext_coder  r   	space_key	page_namedocsdoc	doc_spacepage_idtinyui_liker3  board_id	filter_idproject_keyr5  task_registryfilter_type_mapfilter_typefilter_nametask_filtertask_idobjsrows#                                      r   _resolve_link_infoz!CrossLinkMixin._resolve_link_infou  s   
  ;<<gg788?\**:+;<<
F""{.'H'H".??+??F$((x!% )  C  '++!6+L1G+L+L+LM*F4Z;4Z4Z4Z[ ,    ##r
*rreprr   tww}%% 8]+22377g%%+^*K*K#'' &*@*@*@*@Ax (  C  ##!)yylwyy   t	
   ** }	F**X|<<  &2BBfQRRjBB(,,!"8%) -  
  E ##!)tteqttt   t ##!)nneknnn   t(FF  ,, g	yy|<<H ##!)rrcorrr   t~~a((,H.$$&0G80G0G0GHS(+
 **!% %  C  ##!)rrgorrr   t	
   -- Q	IILl[[E tAI11%++a..AAI ")..3222  
 &* /      C $Iz Ucj&@ U$'
(B(H(L(LU(S(S$T$T	$ )< $'/5 S33 S"--"U3ZZ,% %	 !I--! . '++===*G5M	5M5M5MN ,    ##!) p p-6J))Np p`lp p p   t" R#,44UB??EEc1MMbQ  !9:: \	z~~h?W?W \	 *1-G%** &///: z!% +  D
  " "sz??--1G.K.K.KLL CE  "q'C ##!)qqbnqqq   t" R#,44UB??EEc1MMbQ  '' E	"**388K%**)63P3P3P3PQ)*!% +  D
   ,266xDDHHRRX%%C ##!)qqbnqqq   t	
   !:;; u	
{@[@[ u	!+.q1H'++ &*:*:*:; ,  C  ##!)vvV^vvgsvvv   t	
   ,, k	1I1I k	"8,Q/I%)) &*;	*;*;< *  C  ##!) Q Q/8Q QAMQ Q Q   t8##Ix;;DD  .. _	93H3HHHBHMME t++a..K'++:::&1KK1K1K1KL ,  G  ##!) J J%0J J:FJ J J   t".22## 3  M ! ##!) F F&-F F6BF F F   t !G ;!@C!D$E#J
 
O %..D6::1=K "+"<"<#-11+>>"  K''%- v v v v*1v vfrv v v    4$155 -$ 6   #  K''%- | |4?| |RY| |lx| | |    4! 	%-1D%D%DA8LL &E IIi22E tkk!nnG>&&vW7&0D0D0D0DE **!% '  D   s*4011S\\AACE B  ##!)ppgnpp   t	 4DF;;;r   c                 f   |d         |d         }|d         d}|                     dd          }|t          j                  t          j                  fvrd}|j        |j        r
d	|j        z   nd
z   |j        r
d|j        z   nd
z                       d          }|rBt          	                    |          }d| d}	fd}
t          
                    |	|
|          }t          j                            |||                    d          ||                    dd
                    S )ui   Создает новый тег ссылки на основе полученной информацииr~   r  rA  rm    T)r   r   ?r   r$  r+  z(https?://[^/]+)?(/?\bz\b)c                     rj          d nj         }|                     d          }t          j                            t          t          |                    |          }|S )Nz##r&  full_url)r  rJ  r   r   urljoinapp_base_hrefr   )r   	link_textdomainrA  r~   s      r   replacerz1CrossLinkMixin._create_link_tag.<locals>.replacer  si    ;A O38 7 7v 7 7 7sxI"[[^^F & 4 4%tF||<<<!! !I %$r   target)rm   r  rA  rt  	view_moderP  )get_textr   r)   rn   r   rC  rH  rF  r   escapesubr9   r  r  r;   )r   r   r  	link_infor  ru  tag_textrelative_urlescaped_urlpatternrs  rA  r~   s              @@r   _create_link_tagzCrossLinkMixin._create_link_tag  sg    8$	<<4<00CMM3sx==999 I
 -7-=E3)))2G0:0CK3,,,M fSkk	 
  ? ii55DKDDD% % % % % % 66'8X>>"22778$$,, 3 
 
 	
r   c                    |                     d          D ]}|j                            d          r|                    dd                                          }|sH|                     |          }|s`|                     |          sv|                     |||          }|s|                     |||          }|                    |           dS )u1   Заменяет обычные HTML-ссылкиacmf_convertedr  r   N)	r   r   r;   r   r  r  rh  r~  r   )r   r  r   r   r  ry  new_tags          r   _replace_regular_linksz%CrossLinkMixin._replace_regular_links  s    ==%% 	& 	&Cy}}_-- ''&"%%++--C //44J ++J77 //ZEEI ++CYGGGW%%%%)	& 	&r   r%   Nc                     |                      |           |                     |           |                     |           dS )uU   Заменяет макросы задач и ссылки в HTML-документеN)r  r  r  )r   r  s     r   _replace_linkszCrossLinkMixin._replace_links  sF     	""4(((!!$'''##D)))))r   c           	      &   |                     ddi          D ]v}|j                            d          r|j                            d          }|s*| j                            t
          j         d|            d|j                            d          }t
          j         d| }t          j	                            |d	
          }|s:t          j
                            dddt
          j         dgddd| dgg          }|r_t                              |          }|j        j        |d<   |j        j        |d<   t                              |          |d<   d|d<   |d= M| j                            t
          j         d|            xdS )ut   
        Заменяет ссылку на корневую страницу в макросе 'Page Tree'
        data-macrosz	page-treer   r  data-macro-parametersu7    Макрос 'Page Tree' без параметров: root_page_originalr   Tr   r   r  r   r!  r  r"  r  r#  root
rootLocaletrueuh    В макросе 'Page Tree' не удалось найти корневую страницу по id N)r   r   r;   rZ   r   r   r   r   r9   rD  rE  jsonloadsrO   r   r)   dumps)r   r  r   data_macro_parametersroot_page_idroot_page_ext_id	root_pagemacro_paramss           r   _replace_page_tree_root_linksz,CrossLinkMixin._replace_page_tree_root_links  s    =={'C=DD "	 "	Cy}}_-- $'IMM2I$J$J!( ##!)ggbegg   9==)=>>L","8JJLJJ*..6FY].__I "-11!6+L1G+L+L+LM*F4[<4[4[4[\ 2  	  #zz*?@@'0|'9V$-6^-A\*/3zz,/G/G+,'-O$,--##!) P PAMP P   ?"	 "	r   c           	      ~   |                     ddi          D ]"}|                    dd                                          dk    r0|                    d          }|                    dd	          }t                              |          }|                    d
          }t          j                            dddt          j
         dgddd| dggdg          }|s+| j                            t          j         d| d           |j        |d
<   t                              |dd          |d<   d|d<   $d S )Nr  wikilivesearchr   r  falser  zdata-macros-parametersz&quot;"currentSpaceKeyr   r  r   r!  r  r/  r  r  --r   u    При конвертации макроса 'Livesearch' (Динамический поиск) не найдено пространство с ключом 'A   '. Возможно оно еще не импортированоF,:ensure_ascii
separators)r   r;   lowerr   r  r  r9   rE  sgetr   r   rZ   r   r   rO   r  )r   r  r   macros_parametersparamsrV  r5  s          r   _replace_livesearch_space_linksz.CrossLinkMixin._replace_livesearch_space_links  s   ==7G'H=II 	* 	*Cww006688FBB #(@ A A 1 9 9(C H HZZ 122F

#455I',,v'HZ-C'H'H'HI&1II1I1I1IJ v -  G  ##!) V VU^V V V   (/
F$%,0JJ"% -7 - -C()
 $*C  =	* 	*r   c           	      \   |                     dddgi          D ]}|                    d          }|                    d          p|                    d          }t          j                            dd	d
t          j         dgddd| dgg          }|s+| j                            t          j         d| d           t          j	                            ||d          }|rt          |j                  |d<   | j                            t          j         d| d           dS )uT   
        Добавляет ID документа в макрос 'Include'
        r  zinclude-excerptzinclude-pager   zdata-param-projectkeyzdata-param-pagenamezdata-param-page-labelr   r  r   r!  r  r/  r  r  r#  u_    В макросе 'Include' не удалось найти пространство по key 'r  Tr)   r*   r   zdata-param-pageidu^    В макросе 'Include' не удалось найти страницу по имени 'uA   '. Возможно она еще не импортированаN)r   r;   r9   rE  r   r   rZ   r   r   rD  r   rO   )r   r  r   r_  rW  r5  excerpt_pages          r   _replace_include_page_linksz*CrossLinkMixin._replace_include_page_links;  s    ==8I>7Z'[=\\ 	 	C''"9::K 566Z#''BY:Z:ZI'++v'HZ-C'H'H'HI&1KK1K1K1KL ,  G  ##!) V V vAV V V  
 !-11!% 2  L
  +.|+?+?'((##!) V Vt}V V V   5	 	r   c           	      >   |                     ddi          D ]}|                    d          dk    rd}d}d}d}|                    d          }|rtt          d |                    d	          D                       }|                    d
          r3|d
         }	|	dk    r|}n"d|	v r|	                    dd          \  }}n|}|	}|rht          j                            dddt          j         dgddd| dgg          }|s,| j        	                    t          j
         d| d           |rPt          j                            ||d          }|s,| j        	                    t          j
         d| d           l|p|}
|
r|                    d          }d|
j         |_        |                    d           }t                              |          }t#          |
j                  |d!<   t                              |d"d#$          |d <   d|d<   dS )%u   
        Добавляет ID документа в параметр 'Родительская страница' макроса 'Отображение дочерних'
        r  zchildren-docsr   r  r  Nzoriginal-data-macro-parametersc              3      K   | ]A}t          |                    d d                    dk    )|                    d d          V  BdS )r  r&  r[   N)lenrL  )r   params     r   	<genexpr>z@CrossLinkMixin._replace_childpages_page_links.<locals>.<genexpr>n  s]       1 15;;sA..//144 KKQ''44441 1r   |r  r+  r  r&  r   r  r   r!  r  r/  r  r  r#  u    При конвертации макроса 'Отображение дочерних' не найдено пространство с ключом 'r  Tr  u~    При конвертации макроса 'Отображение дочерних' не найдена страница 'u9   '.Возможно она не импортированаzextension-object-name)class_z | r  
documentIdFr  r  )r   r;   dictrL  r9   rE  r   r   rZ   r   r   rD  findr)   stringr  r  r   rO   r  )r   r  current_projectr   r5  documentrV  pagenameoriginal_macro_parametersr  parent_pagespan_object_namemacro_parametersr  s                 r   _replace_childpages_page_linksz-CrossLinkMixin._replace_childpages_page_links_  s    =='G=HH G	* G	*Cww''611GHIH(+0P(Q(Q%( (,0 1 1!:!@!@!E!E1 1 1 - -)
 -0088 (4V<Ds{{"1.2jja.@.@+	88"1#'  +//!6+L1G+L+L+LM*G5M	5M5M5MN 0    K''%- Z ZYbZ Z Z    !-11!"%) 2  
   K''%- S SAIS S S   "-gK #&883J8#K#K *B0@*B*B '#&77+B#C#C $455'*;>':':|$/3zz!&) 0: 0 0+,
 $*C  OG	* G	*r   c                    |                                 D ]}|s|                                D ]\  }}|st                              dt          j                  }|                    |          sDt          |d          }|                     |           d                    d |j	        j
        D                       ||<   |S )u   
        Конвертирует ссылки, которые могут быть в макросе "Свойства страницы"
        z
<a .+?</a>)flagslxmlr   c                 ,    g | ]}t          |          S r"   r   r   xs     r   r   z9CrossLinkMixin._replace_details_links.<locals>.<listcomp>  s    &P&P&P!s1vv&P&P&Pr   )valuesitemsr   compileIrI  r
   r  r   bodychildren)r   detailsdetailr)  r   r}  
value_soups          r   _replace_details_linksz%CrossLinkMixin._replace_details_links  s     nn&& 	R 	RF $llnn 
R 
R
U **]"$*??~~e,, *5&99
##J/// gg&P&Pz7O&P&P&PQQs
R r   task_raw_datalocal_linksc                    |pg }t          |t                    s|S 	 |                    dg           D ]}|d         }|d         }|                    d          dk    s/|                    d          dk    s|                    dd	          r[t                              d
|d                   }|r]|                    d          }t          j                            ddd| gd          }|s||vr|                    |           d|d<   n=# t          $ r0}	| 
                    t          j         d|	 d           Y d}	~	nd}	~	ww xY w|S )u   
        Создает связь задач, импортированных из Jira,
        с документами, импортированными из Confluence
        remotelinksobjectapplicationr   zcom.atlassian.confluencerelationshipz	Wiki Page	processedFz$/pages/viewpage.action\?pageId=(\d+)r   r&  r   r  r   T)r   r   uO    Не удалось создать связи с документами Wiki. ERR-0034)re   N)
isinstancer  r;   r   rI  rJ  r9   rD  r   r|   r   r   r   )
r   r  r  
remotelinkremotelink_objremotelink_appr   r[  rY  r   s
             r   _get_remotelinkszCrossLinkMixin._get_remotelinks  s   
 "'R-.. 		+//rBB 3 3
!+H!5!+M!: #&&v..2LLL!~~n55DD!~~k599 E  		"I>Z_K`aa 
3#kk!nnG ,00 (&///B)- 1  C  ! +--#**3///.2J{+/30  	 	 	NN%{{vy{{%         	 s   C2D 
E
&EE
c                    d}	 |j         j        pd}t          |d          }|j        sd S |                     |           d                    d |j        j        D                       |_         |j        r$|	                    d           t                       nC# t          $ r6}|                     t          j         d| d| d	d
           d}Y d }~nd }~ww xY wt          |          S )NFr   r  c                 ,    g | ]}t          |          S r"   r  r  s     r   r   z?CrossLinkMixin._process_comment_cross_links.<locals>.<listcomp>      #G#G#GqCFF#G#G#Gr   T	only_datauQ    Не удалось обработать ссылки в комментарии z. r  )re   rj   )rm   r   r
   htmlr  r   r  r  
is_changedr<   r{   r|   r   r   r   r   )r   comment	has_errorcomment_textr  r   s         r   _process_comment_cross_linksz+CrossLinkMixin._process_comment_cross_links  s0   		"<-3L v66D9 %%%77#G#GDI4F#G#G#GHHGL! t,,, 	 	 	NN%  I  Ix  I  I  DG  I  I%    
 IIIIII	 9~~s   %B A.B 
C$,CCc                    d}d }d| dt           _        	 t                              |g d          }d|j         dt           _        |j        r.t          |j                                      dd          d         nd	t           _        | j	        
                    t           j         d
           |j        j        pd}t          |d          }|j        r|                     |           |j        dk    rZ|                     |           |                     |           |                     |           |                     ||j                   d                    d |j        j        D                       |_        |j        dk    rc|j        r\|j        j        }|j        j        }|                    d          }|r-|                     |          }||d<   ||d<   ||_        ||_        |j        dk    r6|j        r/|                     |j        j        |j        j                  |_        |j         rKtC          |d          r|"                    d           n|"                    d           tG                       |j$        D ]#}	|	j%        dk    r| &                    |	           $nA# tN          $ r4}
| (                    t           j         d|
 d|d           d}Y d }
~
nd }
~
ww xY wtS          |          S )NF[])
r*   rm   
text_draftr  	macros_dbmacros_db_draftr  r   zcomments.log_levelzcomments.textr   r   r&  r   %u/    Обработка ссылок объектаr   r  rD  c                 ,    g | ]}t          |          S r"   r  r  s     r   r   z;CrossLinkMixin._process_obj_cross_links.<locals>.<listcomp>)  r  r   r  r   r  T)save_importr  r[   uQ    Не удалось обработать перекрестные ссылки. r  )re   r~   rj   )*r   r   cmfutilget_obj_by_idrn   r   r   rL  r   rZ   debugrm   r   r
   r  r  rv   r  r  r  r  r*   r   r  r  r  r  r;   r  r  r  r  r  r   r<   r{   comments	log_levelr  r|   r   r   )r   obj_idr  r~   obj_textr  r  r  r  r  r   s              r   _process_obj_cross_linksz'CrossLinkMixin._process_obj_cross_links  s8   	*]]]
C	''   (  C "1SXJJM*%]S__%:%:4%C%CA%F%FZ]J"K!3dddeeex~+H 622Dy I##D)))>]2266t<<<88>>>44T:::77cjIII77#G#GDI4F#G#G#GHH~..3=.M/	"%"5";#--	22 :"99'BBG+2Ii(18OI.$-CM*9C'~**s/B*"&"7"7'-O)# #
 ~ 3-- -HHH....HHtH,,,< ; ;$))11'::::;  	 	 	NN%}}x{}}%	     IIIIII	 9~~s   JJ+ +
K)5*K$$K)c                    ddl m} d} |d          5  	 |                                 rn4|                                }|dk    rn||                     |          z  }Id d d            n# 1 swxY w Y   |                    |           d S )Nr   )cmf_contextF)init_views_and_dsTDONE)cmf.appr  	is_cancelr;   r  put)r   	obj_queueerror_queuer  error_countr  s         r   _cross_links_workerz"CrossLinkMixin._cross_links_workerR  s    ''''''[5111 		E 		EE>>## "V##t<<VDDDE		E 		E 		E 		E 		E 		E 		E 		E 		E 		E 		E 		E 		E 		E 		E 	$$$$$s   AA,,A03A0c                 v   t                                           5  t                                           5  t                                           5  t                                           5  |                                  |                                 | _        d}t          t                    |         }d }|r t          j
                            |          }|                     d|j         d| d|            t          j                    }t          j                    }	g }
|                     d| j                    t#          j                    }t'          | j                  D ]e}t)          j        | j        d| ||	d	          }|
                    |           |                                 |                     d
|            f|                     d|j         d           d}g dg dg}|r|                    dd|g           |                    |ddg|||z   g          }|D ]7}|                                 r n |dz  }|                    |j                   8|
D ]}|                    d           |
D ]}|                                 t#          j                    |z
  }|                     d|j         dd d||z  dd           |	                                s+||	                                z  }|	                                +|                     d|j         d|            |cd d d            cd d d            cd d d            cd d d            S # 1 swxY w Y   d d d            n# 1 swxY w Y   d d d            n# 1 swxY w Y   d d d            d S # 1 swxY w Y   d S )Nr   )rO   r  uc   ] Обработка ссылок на локальные задачи и документы start=z limit=uJ   Обрабатываем ссылки в несколько тредов: r  )r  r  )rt  r)   rb   u.   Параллельный обработчик u2   ] Ожидание обработки ссылокr'  import_original==Tr*   r  r  rO   )r   r   slicer&  r  z] z
----------u    скорость .3fu#    объектов в секундуuD   ] Завершена обработка ссылок. Ошибок: )r  disable_acldisable_notifyenable_import_modeensure_recursion_limit_prepare_multiprocessingr   r   varsr9   rE  r;   ra   verbose_namequeueQueuethreading_max_forkstimeperf_counterrange	threadingThreadr  r   rM   slistr  r   rO   r   empty)r   
model_namerM   limit
project_idr  modelr5  r  r  threads
start_timeithreadcnt_filterrf  r~   elapsed_times                      r   process_cross_links_by_modelz+CrossLinkMixin.process_cross_links_by_modelc  s     "" D	 D	##%%D	 D	''))D	 D	 ++--D	 D	 ))+++!2244DNKLL,EG ? +//:/>>HH/E& / // /',/ /   I+--KGHH|bfbz||}}}*,,J4344 T T")32q22%.'2    v&&&R&RRSSSSHH_+___```C1113R3R3RSG 9#w7888;;d|eem,   D
  & &>>## Eqcf%%%%! & &f%%%%!  ,..;LHHE&&C,DV   "'')) 1{000 "'')) 1HH~+~~q|~~ID	 D	 D	 D	 D	 D	 D	 D	 D	 D	 D	 D	 D	 D	 D	 D	 D	 D	 D	 D	 D	 D	 D	 D	 D	 D	 D	 D	 D	 D	 D	 D	 D	 D	 D	 D	 D	 D	 D	 D	 D	 D	 D	 D	 D	 D	 D	 D	 D	 D	 D	 D	 D	 D	 D	 D	 D	 D	 D	 D	 D	 D	 D	 D	 D	 D	 D	 D	 D	 D	 D	 D	 D	 D	 D	 D	 D	 D	 D	 D	 D	 D	 D	 D	 D	s   N.NM?(KM(	7M?NN.(M,,M?/M,0M?3N?NNNN
N.N	N.N	N..N25N2c           
         dd l }d| d|t          j        ||n
d|j         dd}d                    d |                                D                       }|                    dddd	| j         d
| dgddt          dd          t          dd                    }| j        	                    d|j
         dd                    d |                                D                        d           |S )Nr   r   )r  rM   r  r  , c                 ,    g | ]}t          |          S r"   r  )r   ps     r   r   z7CrossLinkMixin._execute_cross_links.<locals>.<listcomp>  s    @@@1A@@@r   /usr/bin/python3	manage.pyshellz&cmf_import = models.CmfImport.get(id='z+');cmf_import.process_cross_links_by_model(z);T"/var/log/eva-import-subprocess.loga+&/var/log/eva-import-subprocess.err.log	close_fdsstart_new_sessionstdoutstderrz[PID u.   ] Запущен process_cross_links_by_model(c                 "    g | ]\  }}| d | S )r  r"   r   kvs      r   r   z7CrossLinkMixin._execute_cross_links.<locals>.<listcomp>  s&    AAA$!Qa::!::AAAr   ))r   r5   IMPORT_OBJ_CNTrO   r   r  PopenopenrZ   r   r   r  )r   r  rM   r5  r   r  
params_strprocs           r   _execute_cross_linksz#CrossLinkMixin._execute_cross_links  s\    ,j+++*%,_'':Kgj:K:K:K	
 
 YY@@@@@AA
"KJ J J;EJ J J
 "<dCC@$GG   

 

 	FDH F F		AA&,,..AAABBF F F	
 	
 	

 r   c                 ,	   d}|rK	 t          |t                    rt                              |          }t          |t          j        t          j        f          rt          j                    }t          	                                5  || 
                    |j                  z  }ddd           n# 1 swxY w Y   t          j                    |z
  }| j                            d| d|dd|            nt          d|j        j         d          n9# t          $ r,}|                     d| d	| d
           |dz  }Y d}~nd}~ww xY w|S 	 |                                 | _        n1# t          $ r$}|                     d|            |cY d}~S d}~ww xY wd}|\|}t          j                            ddd|gdd|gdd|gdd|gddd| dggg dg          }|s|                     d| d           |S t          j                    }	g dg dg}
|r|
                    dd|g           d| }dD ]}t/          t                    |         }|                    |
          }|s6t3                       | j                            d | d!|j         d"| d#| d$| j         
           t          j                    }d}g }t9          | j                  D ]E}|                     |||          }|                    |           |t<          j        z  }||k    r nF|                                   ||k     rt          j!        d           tE          |          D ]}|#                                }|i||z  }|$                    |           |                     |||          }|                    |           |t<          j        z  }|                                   ||k     tE          |          D ]'}|%                                 |j&        r
||j&        z  }(t          j                    |z
  }| j                            d%| d| d&|dd'           !t          j                    |	z
  }| j                            d(| d&|dd|            |S ))u   
        Обработка ссылок на задачи и документы в тексте импортированных объектов
        r   Nr  u:   ] Обработка ссылок завершена за r
  u    сек. Ошибок: u5   Обработка ссылок в объектах 'u#   ' не поддерживаетсяu?   ] Ошибка обработки ссылок объекта: Trj   r&  u.   Ошибка обработки ссылок: r   r
  task_code_prefixr  rn   r)   rO   r   r  r  r'  r#  u    Не найден проект 'r   r  r*   u    проекта )r   rD  u#   Обработка ссылок в u    объектах 'z' (r;  u+    в несколько процессов: u$   Обработка ссылок в 'u    завершена за u    сек.u(   Обработка всех ссылок)'r  r   r  r  r9   r   rD  r  r  r  r  rO   rZ   r  r|   r   r   r   get_max_processesmax_processesrE  r;   r   r  countr{   r   r  r  rA  r5   r<  r   sleepr   pollr   communicate
returncode)r   r5  r~   errorst1t2r   log_projectproject_identtotal_t1r%  r  r  obj_cntmodel_t1rM   rd   _r@  rK  new_procmodel_t2total_t2s                          r   process_cross_linksz"CrossLinkMixin.process_cross_links  s      	c3'' 5!//44CcFNF4F#GHH *,,B 7799 H H$"?"?"G"GGH H H H H H H H H H H H H H H*,,r1BK%%2C 2 2[]l 2 2)/2 2   
 $ LPSP]Pf  L  L  L      aaa\_aa!     ! M	!%!7!7!9!9D 	 	 	NNFFF   MMMMMM		 #M'++ +S-@m4m4sM2!6+?}+?+?+?@ /..
 ,  G  G}GGG   $&&---/N/N/NO 	7NNHc734446W66K4 4	 4	JLL,Ekkk11G LLLK`g ` `RWRd ` `is ` `` `KOK]` `   (**H EG4-..  00UGLLt$$$..7??E # OO'// 
1 MM 
* 
*D!%J!-*,t,,,#'#<#<ZPW#X#Xx000!66))) '//$ W . .  """? .do-F(**X5HK Az  A  AK  A  Ajr  A  A  A  A    $&&1&{ & &]et & &#& &	
 	
 	
 s[   BD B2&D 2B66D 9B6:AD 
E "EEE, ,
F6FFFr%   NNNN)r   r    r!   r   propertyr   r  r  r  r  rh  r~  r  r  r  r  r  r  r  r  r   r  r  r  r   r  r'  rA  rX  r"   r   r   r   r     s         6 ( ( X(
H H H(G G G:     p< p< p<d	*
 *
 *
X& & &0* * * *& & & &P* * * *B" " " "HK* K* K* K*Z  ,)d ) ) ) ) )V  0K K KZ%S % % % %"E E E EN   :B B B B B Br   r   c                       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d Zd=defdZed             Z fdZd Zd Zd Zed             Zed             Zed             Z de!fdZ"d Z#d>de$fdZ%d Z&d?dZ'd Z(d Z)defd Z*d! Z+d" Z,d# Z-d$ Z.ed@d%efd&            Z/edAd'            Z0d( Z1 fd)Z2d* Z3d+ Z4 fd,Z5d- Z6de
fd.Z7d/ Z8d0 Z9dBd2Z:d3 Z;defd4Z<d5 Z=e e>ddd67          d8                         Z?e	 	 dCd:e!d;e!fd<            Z@ xZAS )D	CmfImport)CSV_SETTING_NAMEcsv_import_settings_fieldsrZ   _last_statsr  r  r  download_threading_max_forksrF  import_settingsworker_flag_file)calc_import_settingscancelcheck_projectsdelete_dumpr   r   r   
pg_restorepreviewrM   stoptake_import_statstmplt_import_settingsCSVNz/tmp/eva_import_worker.flagr%   c                 4    | j                                         S rZ  )rd  r   clss    r   worker_herezCmfImport.worker_heren  s    #**,,,r   c                 8    | j                                          d S rZ  )rd  touchrp  s    r   create_worker_flagzCmfImport.create_worker_flagr  s    ""$$$$$r   c                 n    | j                                         r| j                                          d S d S rZ  )rd  r   unlinkrp  s    r   remove_worker_flagzCmfImport.remove_worker_flagv  s>    &&(( 	* '')))))	* 	*r   c                     | j         s2|                     dg           d | j        d         D             | _         | j         S )Njson_settingsc                      i | ]}|d          |S r)   r"   )r   ss     r   
<dictcomp>z-CmfImport.import_settings.<locals>.<dictcomp>  s    $a$a$aaQvY$a$a$ar   rc  )_import_settingsrw   rz  r   s    r   rc  zCmfImport.import_settings{  sM    $ 	bo.///$a$a4;MN_;`$a$a$aD!$$r   c                 J    t           j        | _        t           j        | _        d S rZ  )r5   IMPORT_THREADSr  IMPORT_DOWNLOAD_THREADSrb  r   s    r   r  z"CmfImport._prepare_multiprocessing  s    #)#8 ,2,J)))r   Tc                 V   ddl }ddl}|                                }|dz
  }|r|                     d| dd           |                                j        }t          |dz            }|r|                     d	| d
d           t          j        rt          t          j        |          }|r%|                     dt          j         dd           t          t          |dz            |          }|r|                     d| dd           |st          d| d| d          |S )u.  
        Рассчитывает максимальное количество процессов
        для создания нескольких независимых процессов

        Returns:
            int: максимальное количество процессов
        r   Nr&  u4   Количество ядер системы (CPU): u    (не менее 2)T)r      @u%   Доступно памяти (RAM): u!    ГБ (по 2 ГБ на ядро)u/   Количество процессов (MAX): uB    (в параметре 'IMPORT_PROCESS' конфигурации)r[   u    (итоговое)uY   Недостаточно системных ресурсов для импорта (CPU: z, RAM: uq    ГБ). За дополнительной информацией обратитесь в техподдержку)multiprocessingr   	cpu_countra   virtual_memory	availabler   r5   IMPORT_PROCESSminr|   )r   ra   r  r   r  rF  available_memoryavailable_memory_gbs           r   rE  zCmfImport.get_max_processes  s    	'&&&&&&& $--//	!A 	HHfyfff     "0022<!"2i"@AA 	HHn8Knnn       	F 5}EEM 	HHU&BW U U U     C 3a 788-HH 	HHd-ddd    
  	}"} }+>} } }   r   c           	         ddl m} d}t          j        j        d         }|j                            |           s|                    | d|          }|                     d          st          |           dk    r|                    | |	          } n.t                              d
d|                                           } t          j                            dd| gdddd| dgg dggdg          }|r| |z  } | S )Nr   )cmf_hashlibABCDEFGHIJKLMNOPQRSTUVWXYZrD     )char_length	enc_table~    )r  z	[^A-Z0-9]r   r/  r
  r   zNOT LIKEr  )r   r  Nr  r   )cmf.utilr  r9   rE  r   regex	fullmatchshort_str_encr  r  r   rx  upperr  )r)  r   r  	ENC_TABLErD  hash_suffixr5  s          r   get_correct_keyzCmfImport.get_correct_key  s/   ((((((0	 ",34FG%//44 	#%33CQR[3\\K~~c"" <c#hhmm "//y/II ff\2syy{{;; ',,'#6!:}6}}}=--- v - 
 
G  #{"
r   c                     | j                                         s | j                            d          | _         t	                                                       d S )NOPENstatus_type)statusloadworkflowget_default_statussuper_calc_statusr   r   s    r   r  zCmfImport._calc_status  sP    {!! 	O-::v:NNDKr   c                 F   | j         d         rd S | j        r#| j                                        | j         d<   d S | j        dk    rd S | j         d                             dt
          j                                        t
          j        j        d           | j         d                             dt
          j	                                        t
          j	        j        d           | j         d                             dt
          j
                                        t
          j
        j        d           | j         d                             dt
          j                                        t
          j        j        d           | j         d                             dt
          j                                        t
          j        j        d           | j         d                             d	t
          j                                        t
          j        j        d           d S )
Nmodels_fieldsexcelu   Поля контактов)captionr   iconu   Поля задачu   Поля заметокu   Поля проектовu"   Поля списков задачu   Поля групп)rz  rx   calc_models_settingsr   r   r9   	CmfPersonimport_shop_fieldsr  r   
CmfCommentrE  CmfListCmfPersonGroupr   s    r   _calc_models_settingszCmfImport._calc_models_settings  s3   o. 	F; 	26+2R2R2T2TD/F9F?+22?\>D>N>a>a>c>c<B<L<Q4S 4S 	T 	T 	T 	?+22?T>Dn>_>_>a>a<BN<O4Q 4Q 	R 	R 	R 	?+22?X>D>O>b>b>d>d<B<M<R4T 4T 	U 	U 	U 	?+22?Z>D>O>b>b>d>d<B<M<R4T 4T 	U 	U 	U 	?+22?c>Dn>_>_>a>a<BN<O4Q 4Q 	R 	R 	R 	?+22?T>D>S>f>f>h>h<B<Q<V4X 4X 	Y 	Y 	Y 	Y 	Yr   c                 <   |                      g d           | j        d         rd S | j                            |           | j        d<   d| j        d<   d| j        d<   d| j        d<   d| j        d	<   d| j        d
<   | j        | _        |                                  d S )Nrz  attachmentsr   rx   rc  r   Tsend_invitesFremove_conflict_projects
add_suffix	pg_backupmerge_identic_names)rw   rz  rx   re  r<   r   rb   s     r   re  zCmfImport.calc_import_settings  s    KKKLLL/0 	F040P0P\`0P0a0a,--1>*9>56+0<(*.;'4901!/		r   c                 h   |                      g d           | j        d         rd S | j        j                            dd          | j        d<   | j        j                            dd          | j        d<   | j        j                            dd          | j        d<   | j        j                            dd          | j        d<   | j        j                            d	d          | j        d	<   | j                            | 
          | j        d<   | j        | _        |                                  d S )Nr  rc  r  Tr  r  Fr  r  r   )rw   rz  r   r;   rx   rm  r<   r  s     r   rm  zCmfImport.tmplt_import_settings  s)   KKKLLL/0 	F-1-?-E-I-I.Z^-_-_>*9=9K9Q9U9UVprv9w9w56+/+=+C+G+GV[+\+\<(*.*<*B*F*F{TX*Y*Y;'484F4L4P4PQfhm4n4n01040Q0Q]a0Q0b0b,-!/		r   c                     |                      dg           | j        d         D ]}|d         | j        k    r
|d         c S g S )Nrz  rc  r)   r   )rw   rz  r_  )r   settingss     r   r`  z$CmfImport.csv_import_settings_fields"  s_    /*+++*+<= 	* 	*H4#888)))) 9	r   c                     t           j                                         t           j                            d|            t           j                                         dS )uJ   
        Запускаем в фоне импорт данных
        rM   N)r9   CmfAccessListactivate_admin_moder^  
run_workerru  	import_id_args_kwargss      r   rM   zCmfImport.start*  sM     	00222##GY777++-----r   c                 F    t           j                            d|            dS )uR   
        Останавливаем в фоне импорт данных
        rk  N)r9   r^  r  r  s      r   rk  zCmfImport.stop4  s#    
 	##FI66666r   entity_typec                 x   |                      dg           d}||v r*| j        j        j        dk    rt	          d| dd           d|i}g }|                                D ]S\  }}t          |t          t          t          f          s,|
                    | d	t          |          j                    T|r)t	          d
d                    |           dd           n|                    |           t          j                            d| j        |           t          j                                         dS )u   
        Запускает отдельную обработку сущностей (фильтры, связи, ссылки и др.)

        Args:
            entity_type (str): тип сущности (filters, relations, links, etc.)
        rx   filters	relationscode_historyr   u4   Запуск отдельной обработки 'u?   ' возможен только для импорта из JiraTabortr  r   uP   Недопустимые типы значений для параметров: r)  ud   . Значения параметров должны быть строками или числамиprocess_entity)r  N)rw   rx   r   rv   r   r  r  r   r   floatr   r   r   r   updater9   r^  r  rO   ru  )r   r  rb   jira_entitiesr  invalid_kwargsr)  r   s           r   r  zCmfImport.process_entity;  s    	($$$
 =((!,??Q{ Q Q Q     - ,,.. 	H 	HJCec3%677 H%%&F&FU0D&F&FGGG 	"vcgclclm{c|c| v v v     MM&!!!##$4dgf#MMM++-----r   c                     dd l }|                                 }|                                r|                    |           d S d S )Nr   )shutilget_download_pathr   rmtree)r   r   rb   r  download_paths        r   rh  zCmfImport.delete_dumpg  sR    ..00!! 	)MM-(((((	) 	)r   rg  c           
         d}||j         }|sg }i }t          | j                  D ]o\  }}|d         r8||         r0|d         d                             d          d         |j        k    rF|d         d         |k    r||         ||d         d         <   p|s|S  ||           }	t          t          |	d	                    }
|D ]p}|j                            |          }t          |t          j
                  st          |t          j                  r^d}|                                D ]3}|                    d
dd||         gd	d||         ggdg          }|r n4|rt          |	||           t          |t          j                  rt          |	|||                    ||         }t          |t          j                  r9t!          j        |d          }t!          j        |t           j        j                  }t          |t          j                  rX|                    |d|g           r| j        d         r|                    |dg          }|s|                    d	          }|r|                    |dgd          }|r|
|	_        |                    |	j        dg          }|r.|	j         dt5          j        t8          j                  d|	_        |	}|                                 |S )u  
        Импортируем объект

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

        :return: Новый или найденный объект
        :rtype: Optional[models.*]
        Nmodel_fieldfield_qualnamer   r   r  
field_namer   rn   r
  r)   r  z**r   RUunionT)rn   r   include_deleted)r)   r   rT  z%Y%m%d-%H%M%S)r  	enumerater`  rL  rv   r   r   r   r;   
issubclassCmfRelationCmfGenericRelationrelated_modelssetattr
CmfRelBaseCmfPhonephonenumbersr   format_numberPhoneNumberFormatINTERNATIONAL
CmfNumericr   rz  rn   r)   r   r   r   utcr<   )r   rg  r  r%  r)  result_fieldsr"  settingnew_objnew_coder  fieldrel_obj	rel_modelvalphonern   s                     r   _process_objzCmfImport._process_objm  sT    ;$C 	G#D$CDD 	G 	GJAw=) Q }-.>?EEcJJ1MQVQaaa}%n5<<@CA.|<= 	M%4(((ww//00! 	4 	4JL$$Z00E%!344 	
5&Jc8d8d 	!&!5!5!7!7  I'mmD64Q[I\:]5;T7:CV4W4Ybfag , i iG  GZ999%!233 GZ)<===*%C%11 f$*355"08V8dee%!233 NNJc23333g& 	>YYgtfY==F 	;;v&&D SdVTRR (' YYGL$Y@@F \"),[[hl1K1K[[[FKKMMMr   c                 .    |                      d          S )um   
        Ручка фронта для проверки конфликтующих проектов
        T)as_msg)get_conflict_projectsr   s    r   rg  zCmfImport.check_projects  s     )))666r   Fc           
         |                      dg           | j        j        j        dk    rdS g }ddd}| j        d         d         d	         }d
 |d         D             }|D ]}|d         }|                    d          p|d         }| j        j        j         d|d          }	t          j        	                    ddd|	gddd|	 dggdg d          }
|
r4|
j
                            d          p|
j
                            d          }|
r8| j        j        j        dk    r|
j        dk    s||k    r|
j
        d         |k    r|                     ||	          }t          j                            ddd|gdd|ggdg d          }|D ]Y}d}t          |j        o|j        j        | j        j        j        k              }| j        j        j        dk    r$|j        d k    rd!|j         d"|j         d#|d$<   |}n| j        j        j        dk    ra|j        d k    rV|j        dk    r*| j        d%         d         d         d&k    r|j        sd'|d(<   d)| d"|                                 d#|d$<   |}n|j        r	|j        s|r|}|r^|j         d*|j         d+}|j        dk    r|d,z  }n|j        d k    r|d-z  }|j        r|d.z  }n|r|d/z  }|                    ||f           [d0}|rUd1d0                    d2 |D                        d3d0                    d4 |                                D                        d5}|r|nd6 |D             S )7u  
        Возвращает список конфликтующих проектов или текст сообщения для предупреждения

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

        Return:
            list, str: список проектов или текст сообщения
        plugin.plugin.source_hashr  Nu^   отменить выбор аналогичных импортируемых проектовu   удалить существующие проекты (проекты и все их данные будут безвозвратно удалены))rf  deleteselectedObjectsr   r   c                 >    g | ]}|d          
|d         |d          S )r~   	isCheckedr"   )r   r  s     r   r   z3CmfImport.get_conflict_projects.<locals>.<listcomp>  s1    gggCs5zgVYZeVfgSZgggr   r  r)  original_namer)   r   rO   r
  r   r  r  r   r!  T)r  r-  r  )r   r  r   ru   r   project.agiler/  rD  )r-  rD  zcmf_import.ext_idcmf_deletedr.  u   добавить суффикс 'Wiki' к названию или коду существующих Wiki-проектов (пример: 'z Wiki' (zWIKI))r  import_typer5  u   объединить с существующими Agile-проектами, запустив импорт с опцией 'Импортировать в Документы Agile проекта'combineu   импортировать с добавлением 'Wiki' к названию или коду проекта (пример: ' (r;  u    <em>Agile-проект</em>u    <em>Wiki-проект</em>u(    <em>удален в корзину</em>uI    <em>импортирован из другого источника</em>r   u               <p><strong>В системе уже существуют проекты с аналогичными названиями или кодами:</strong></p>
            <ul>c              3   (   K   | ]\  }}d | dV  dS z<li>z</li>Nr"   )r   project_namerT  s      r   r  z2CmfImport.get_conflict_projects.<locals>.<genexpr>Q  s2      ``a3333``````r   u   </ul>
            <br />
            <p><strong>Для продолжения импорта вы можете:</strong></p>
            <ul>c              3   "   K   | ]
}d | dV  dS r  r"   )r   actions     r   r  z2CmfImport.get_conflict_projects.<locals>.<genexpr>T  s.      MM&----MMMMMMr   z</ul>
            c                     g | ]\  }}|S r"   r"   )r   rT  r5  s      r   r   z3CmfImport.get_conflict_projects.<locals>.<listcomp>W  s    "R"R"Rzq'7"R"R"Rr   )rw   rx   r   rv   rc  r;   r   r9   rE  r  r  r-  r  r   r   r   r   r)   rD  r  r  r   r   r  )r   r  conflicting_projectsactionsr  selected_projectsprjselected_project_keyselected_project_nameselected_project_ext_idr5  r  normalized_project_keymatching_projectsmatching_projectconflicting_projectother_sourcer\   s                     r   r  zCmfImport.get_conflict_projects  s	    	56777;'>99F! w o
 

 #$56w?Bgg4
3Cggg$ r	U r	UC#&u: $'GGO$<$<$KF!)-);)G&V&V3t9&V&V# ',,s$;<v'I-D'I'I'IJ
 !%   -  G  k&6::6BBjgF]FaFabiFjFj )48MMM#0OCC %(===#3E:>RRR %)%9%9$'& &" !' 1 6 6W&;<'2HI
 !%   !7 ! ! %6 6U 6U &*##$/ ](3:dk>P>\\   
 K%04III(5GGFAQAVF F,=F F F L)
 +;''K%04III(5GG'4GG/>wGMQZZZ$/; !{ $I.
A+@A A06688A A A L)
 +;''(3;'3; $; +;'& U&9&>#i#iBUBf#i#i#iL*7?JJ$(FF,9^KK$(EE*6 t$(RR% t$(ss(//?R0STTTm6Up  	``K_````` 
 MMGNN<L<LMMMMM  C Rss"R"R=Q"R"R"RRr   c                     t           j                                        D ]D}| j        j                                        |v r"t           j                            |          c S Et          dd           d S )Nbackup_nameu   Бекап для данного импорта не существует. Воспользуйтесь функционалом "Отмена".Tr  )r9   CmfGlobalSettingspg_backup_lsrn   r   r  ri  r   )r   bk_names     r   ri  zCmfImport.pg_restoreY  s    /<<>> 	P 	PGy$$&&'11/::w:OOOOO 2  e  mq  	r  	r  	r  	r  	r  	rr   c                    |                      g d           d}| j        rK	 t                                          5  | j        j                            d          r<t          j        	                    | j
        j                                                   | j        j                            d          rc|                                 }|rM|D ]J}|                     d| t          j                   |                    d	           t#                       Kd
t$          j        d<   d| _        d| _        | j        j        j        j        | _        |                                  t#                       dt$          j        d<   | j        D ]w}| j        |         D ]g}d}|dk    rFt5          |                                                                           r| j        |         |         }|                     |||           hxt          j                            dd| g           | j                             |           }ddd           n# 1 swxY w Y   ni# tB          $ r\}tE          |           dtG          j$        |j%                  d          }| &                    d| d           || _'        Y d}~nd}~ww xY w| (                                | _        |                                  tR          j*        j+        ,                                 |S # | (                                | _        |                                  tR          j*        j+        ,                                 |c cY S xY w| j-        dk    r| .                                S dS )u9   
        Импортируем файл в бд
        )r   plugin.plugin.*zplugin.*Fr  r  r  u7   Удаляем конфликтующий проект r   T)TEXKOM_db_deleter   NO_CACHEr   1
downloadedr   r  r#  r   N
r,  u*   Ошибка работы импорта: rC  r  )/rw   rx   r  r  rz  r   r;   r9   r  r  rn   r  r  ra   r7   WARNINGr   r{   r   environimported_object_countprogressr   r   r<   import_statsr   r  iterdirinc_statrt   bulk_deleteprocess_importr|   r   ro   	format_tb__traceback__r   	error_msgget_redis_import_statscmfapp	CMF_CACHEflushdbr   _process_import_excel)	r   r  projectsr5  obj_nameopr  err
error_texts	            r   r1  zCmfImport.process_import_  s    	===>>>; )	(//11 I I)/33K@@ `0::tyG\G\G^G^:___)/334NOO -#'#=#=#?#?# -+3 - - $)lcj)l)lt{  uD  !E  !E  !E ' E E E *-/BJz*12D.$%DM"&+"4"@"FDKIIKKKLLL-0BJz*$($5 = ="&"3H"= = =B"#C!\11d4;Q;Q;S;S;[;[;];]6^6^1&*&7&A"&E MM(B<<<<	= )55lDRV=W5XXX![7747HHF5I I I I I I I I I I I I I I I6  , , , #CXXI,?@Q,R,RSU,VXX
FFF!     ",, %)$?$?$A$A!		!))+++	 %)$?$?$A$A!		!))+++9--///  sU   I HI I II II L 
J>"AJ94L 9J>>L AM*c           	         ddl m} | j        r| j        d         sdS d}	 i }i }i }i }i }i }i }	|                                 }
t          |
          D ]\  }}|dk    r| j        d         ri }i }d}d}t          | j                  D ][\  }}|d         r||         s|d         d                             d	          d         }|                    |i           }|d         d
                             d	          }|d         }||         }|dk    r|}|dk    r|}t          |          dk    r:|dk    r|||d         <   |                    |i           }||         ||d         <   nm|dk    r"|dk    r|
                    ||                   }nE|dk    r|                    ||                   }n#|dk    rd|                    ||                   i}|||<   |||<   ]|                    di           }|                    dd          }|                    |                    d                    }|s<|                    | t          j        |          \  }}|||                    d          <   |                    | t          j        |          \  }}|                    di           }|                    d          r|d         |d<   |                    di           }|r|	                    |          }|s|dk    rAt          j                            ddt          j                            d                    }n@t          j                            ddt          j                            d                    }||	|<   ||d <   ||d<   ||d!<   ||d"<   d#d$d%|j        gdd%|d         gg}|                    | t          j        ||          \  } }| j                            |           |                                  | ||d         <   |r0|                    |g           }!|!                    |            |!||<   |r<|                    |d         g           }"|"                    |           |"||d         <   |                    d&i                               d'd          }#|#rf|# d(|j        j         }$|                    |$i           }%||%d!<   |#|%d'<   |%                    d)g           }&|&                    |            |&|%d)<   |%||$<   |                    |                    d                    }'|'st          j                            d#d*d%|j        gg d+g,          }(d#d*d%|(j        gg d-g})d.||(d/d0}*|                    | t          j        |*|)1          \  }'}|'||                    d          <   |                    | t          j        |'| d2           |                                D ]\  }$}+t          j                            d#d*d%|+d!         j        gg d3g,          }(d#d*d%|(j        gd'd%|+d'         gg d4g})t          j                            |),          },|,s\t                              |+d!         |(|+d'         t          j                             d5          6          },|,                                 |+d)         D ]} |,| _!        |                     d78            |                                D ]U\  }}-|                    |          }.|.r9|-D ]6}/|/j!        "                                 |.|/_!        |/                                 7V|                                D ]l\  }}0|                    |          }.|.rP|0D ]M}1|                    |1          }/|/r4|/j!        "                                 |.|/_!        |/                                 Nmn# tF          $ r}2tI          |2           d9| d:|2 d;tK          j&        |2j'                  d<          }3| j(        )                    |3           |3| _*        | j+        ,                    d=>          | _-        |                                  Y d?}2~2dS d?}2~2ww xY wd7S )@u   
        Запуск импорта из CSV

        :return: Истина в случае успешного импорта
        r   )CmfPluginImportMixinrc  F	first_rowr   r  r  r   r  parent_taskchild_tasksr&  	executorsr-  rE  priorityr  r  r  rn   r   
cmf_author	cmf_ownerzproject.basez
task.base%base)rn   )	cmf_modelprefixactivityztask.agile:softdev%softdevr  r5  r*   AND	parent_idr  r  r)   rT  taskstree_parent_id)r)   r  Sprintsr#  )r)   r  
   ДоскаrS  kanban)r)   r*   r6  	list_type)r   r  
obj_fields
filter_obj)leftright)r)   r  Epics)r-  r  z	task.epicztask.epic:default)r*   r6  r)   
logic_typeTr  u   Строка r   r(  r,  import-errorstatus_codeN).%common.models.cmf_plugin_import_mixinrA  r  rz  	_get_filer  r`  rL  r;   r  get_logic_prefixget_priorityget_status_type
setdefaultprocess_any_table_fieldsr9   rE  r  CmfWorkflowcalc_workflowCmfActivityrO   r   rE  r   r<   rn   r   	CmfFolderr  CmfListCmfTaskr  CmfLogicTyperC  r  r|   rs   ro   r2  r3  rZ   	exceptionr4  r  r  r  )4r   rA  
number_rowall_parent_taskall_child_tasksall_epic_tasks	all_tasks
cash_boardcash_projectcash_workflow_task	file_readrg  executorr  parent_task_codechild_tasks_codeidxr  r  _rowfields_namer  r   project_fieldsr-  r5  rT  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_folderrW  rV  dataepic_objrP  rC  sub_task
tasks_codesub_task_coder>  r?  s4                                                       r   r:  zCmfImport._process_import_excel  s'
    	ONNNNN 	t'9:K'L 	5
q	 O ONIJL!#((I#,Y#7#7 {e {e
C??t'9+'F?#% #% $-d.M$N$N / /LC"=1 !S ! !(!78H!I!O!OPS!T!TUV!WJ";;z266D")-"8"F"L"LS"Q"QK!,QJHE!]22+0( #}44+0( ;''!++%447<H[^4$ $R 8 803Ck!n--%77J,<V<V$8$I$I#c($S$SEE':55$8$E$Ec#h$O$OEE'833%24H4X4XY\]`Ya4b4b$cE',D$*.GJ''!(\2!>!>-88YY&**>+=+=f+E+EFF G!5!N!NtU[Ufhv!w!wJGQ?FL!3!3F!;!;<"6"O"OPTV\Vfhp"q"qa%kk)R88??<00 I/:</HK,*x<< 9155lCCH# D'>99'-'9'G'GR[dpQWQcQgQgmsQgQtQt (H (v (vHH (.'9'G'GR[OdQWQcQgQgmvQgQwQw (H (y (yH <D*<8/7L,,8K))0I&(/H%${D'*&EPTVabhViGjk2KKDRXR`LWYdf f!")),77719	+f-. $ I'6':':;KR'P'P$$++H5558HO$45 $ K&5&9&9+f:Mr&R&RO#**+;<<<;JOK$78
 $KK	266::62FF	 8"+BBgl.@BBH-11(B??H*1HY''0HV$ (Wb 9 9I$$X...(1HW%/7N8, &>>.*<*<V*D*DEE F$*$4$8$8IY[_ahakHlAZAZAZA\$8 %] %]M"'*:D-BR)S">">">"@J*6,31>/7"9 "9J #7"O"O[_V\Vd[e[e #P #g #gKHa >FJ~11&99:$==dFDYGOZb>c>ce e e e #1"6"6"8"8 2 2$ & 0 4 4UEUW[]abk]l]oDp=T=T=T=V 4 !W !W $&6m>N%O%tT&\:<^<^<^`
!>--Z-@@ $%~~T)_R_37<9?9L9P9PVi9P9j9j  .  l  lH MMOOO $W 2 2H+3H(MMDM11112
 ,;+@+@+B+B ( (' %'mm,<== ($) ( ( ,11333/:, 0?0E0E0G0G , ,, *'mm,<== ,)3 , ,#,==#?#?# ,$0557773>H0$MMOOO,  	 	 	jjjsjji>QRURc>d>deg>hjjJK!!*---'DN-::~:VVDKIIKKK55555	 ts   ^=_ 
a?(Ba::a?c           	         |                      |t          j                  }|r|sdS d}| j        D ]}|d         r|d         d         dk    r|}|                    dg           t          j                            |j        t          |d                   |j	        j        dg          }|sJt                              |t          |d                   |j	        | 	          }|
                                 |j                            d
           t          |j        j                  D ]K}|j        j        | j        k    r|                                 |j        j                            |           L|                      |t          j        t          j        j        dd|j        gdd|j        gg          }|                    ddg           ||_        ||_        |j        r|
                                 |S )u;   
        Импорт товара в сделку
        Nr  r  zCmfProduct.pricescurrencyfile_valprice)
product_idr  currency_idr   )productr  r  r   T)forcedeal_idr  r  )r)  r%  r  sales_order)r  r9   
CmfProductr`  rw   CmfPricer;   rO   r   r  r<   pricesr  r   
deal_itemsr   r   r   r   CmfDealItemsr  dealr  r  )r   rg  r  r  price_settingr  r  items           r   _process_productzCmfImport._process_productT  s
    ##C):;; 	7 	47 	) 	)H& )8M+BCS+TXk+k+k (*&&&##wzWaIbAcAc040@' $ T T 	OOG7=Q[C\;];]hlhu/3 $ 5 5EJJLLL$'''.// 	/ 	/D!TW,,KKMMMO!((....  f&9v?P?]+4dDG*D|UY[b[eFf)g ! i i)]3444	? 	IIKKKr   c                    |s|r|j         sd S d }| j        D ]}|d         r|d         d         dk    r|}|sd S g }t          j                            |d                   }|s5t                              |d                   }|                                 |                    dd|j        g           |r|                    dd|j        g           n"|                    dd|j         j        g           |                     |t          j	        |          }|
                    d	d
g           |j         s|r||_         n|j         |_         |j        s||_        |j        r|                                 |S )Nr  r  zCmfDeal.pipeliner  r|  pipeline_idr  
company_idcompanypipeline)r  r`  r9   CmfPipeliner;   r<   r   rO   r  CmfDealrw   r  r  )	r   rg  contactr  pipeline_settingr  r%  r  r  s	            r   _process_dealzCmfImport._process_dealu  s    	 	w 	47 	, 	,H& ,8M+BCS+TXj+j+j#+  	4%))/?
/K)LL 	))/?
/K)LLHMMOOOtX[9::: 	ENNL$
;<<<<NNL$0BCDDD  fng>>)Z0111| 	/ /&&} 	%$DM? 	IIKKKr   c                    dd l }dd l}dd l}| j        r |j                     | j        z
  dk     rd S  |j                     | _        t	                      }	 |                    |j        |j                  }|                    d           |                                d         |d<   |	                                 n# t          $ r d|d<   Y nw xY w	 |                                |d<   n# t          $ r d|d<   Y nw xY w|                                |d<   |                    |                                           |d	<   | j                            d
|            d S )Nr      )z8.8.8.8P   ipzIP unavailabler  )r,  r   r   memorydiskzSTATS )r  r   socketra  r  AF_INET
SOCK_DGRAMconnectgetsocknamecloseOSError
getloadavgr  
disk_usager  rZ   r   )r   r  r   r  statsr}  s         r   	get_statszCmfImport.get_stats  s     	t/?!?1 D DF$49;;		+ fnf.?@@AIIo&&&--//!,E$KGGIIII 	+ 	+ 	+*E$KKK	+	'"--//E&MM 	' 	' 	'&E&MMM	' //11h))$*@*@*B*BCCf)%))*****s%   A&B; ;CCC) )C;:C;c                    dd l }t          j                                         |                                 }|                    |          \  }}}|dz  }t          j                            | j	        ddg          }|dk     rQd|_
        |j        rA|                                 t                       | j                            d|d	d
           dS |j
        j        dk    s|j        dk    rLd|_
        |j        r<|                                 t                       | j                            d           dS t                       |                                  dS )Nr   r  r  cache_status_typerO   r   
   r\  u8   Импорт прерван, место на диске z.2fz	Gb < 10GbTimport-stoppingIN_PROGRESSimport-pauseduA   **** Импорт остановлен пользователемF)r  r  r  import_heartbeatr  r  r9   r^  r;   rO   r  r  r<   r{   rZ   r}   rn   r  r   r  )r   r  r  totalusedfreefree_gbr~   s           r   r  zCmfImport.is_cancel  sS   "33555..00"--m<<tT'"""dgxAT6U"VVR<<'CJ~ u


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


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

        Args:
            method (str): метод импорта
            import_id (str): ID импорта (CmfImport)
            params (dict, optional): параметры запускаемого метода. Defaults to None.
        r   Nr  z="r  r,  r-  r.  zHfrom common.models.cmf_import import CmfImportWorker; CmfImportWorker().(r;  Tr/  r0  r1  r2  )r   r  r  r  r   r   r=  r>  )methodr  r  r   params_lr9  r:  s          r   r  zCmfImport.run_worker  s     	$	$$$%fd## 	. . .11----(##"K8%+8 8.48 8 8
 "<dCC@$GG 	 
	
 
	
 
	
 
	
 
	
r   c                      t           j                            d|d                    t           j                                         dS )/   
        Отменяем импорт
        rf  rO   N)r9   r^  r  ru  )r   rb   s     r   rf  zCmfImport.cancel  s<    
 	##HfTl;;;++-----r   c                 f    |                      g d           | j                            |           S )uk   
        Предварительный просмотр получившихся объектов
        r  r   )rw   rx   rj  r   r   rb   s      r   rj  zCmfImport.preview  s8     	KKKLLL{""d"333r   c                 N    t                                                      g dz   S )Nr  )r  save_preload_fieldsr  s    r   r  zCmfImport.save_preload_fields  s%    ww**,,/a/a/aaar   c                    	 | j         j                                        }d}|                    |d|i          }d |                                D             S # t
          $ r)}t                              d|            i cY d}~S d}~ww xY w)u   
        Получает значения параметров PostgreSQL.

        Args:
            setting_names: список имен параметров

        Returns:
            dict: {имя_параметра: значение}
        z>SELECT name, setting FROM pg_settings WHERE name = ANY(:names)namesc                 ,    i | ]}|d          |d         S )r   r&  r"   )r   rg  s     r   r~  z4CmfImport._get_postgres_settings.<locals>.<dictcomp>	  s"    @@@sCFCF@@@r   z_get_postgres_settings error: N)dpdata_driverSessionexecutefetchallr|   gr  )r   setting_namessessionrC  r  r   s         r   _get_postgres_settingsz CmfImport._get_postgres_settings  s    		g)1133GTE__UWm,DEEF@@foo.?.?@@@@ 	 	 	GG666   IIIIII		s   AA 
B"B BBc           
      ~   ddd}|                      t          |                                                    }d}d}|                                D ]S\  }}d}t	          |                    |          pd          }d|cxk     r|k     rn nd}d	}d
| d| d| d| d	}	||	z  }T|st          d| d           dS dS )u  
        Проверяет конфигурацию PostgreSQL на соответствие минимальным требованиям.

        Сравнивает текущие значения параметров PostgreSQL
        с предопределенными минимальными требованиями.
        В случае несоответствия генерирует предупреждение cmf_alert().
        i      )max_connectionsmax_locks_per_transactionTr   greenr   Fredz<li><b>z: <span style='color:z'>z</span></b> (min z)</li>u   Конфигурация PostgreSQL не соответствует минимальным системным требованиям: <ul>z</ul>N)r  r   keysr  r   r;   r   )
r   min_requirementscurrent_settingsconfig_validsetting_msgssetting_name	min_valuecolorcurrent_valuesetting_msgs
             r   _check_postgres_configz CmfImport._check_postgres_config	  sW     $),
 

  66t<L<Q<Q<S<S7T7TUU'7'='='?'? 	( 	(#L)E 0 4 4\ B B GaHHM=,,,,9,,,,,$*, * *&+* */<* *!* * * 
 K'LL 	mYem m m    	 	r   c                     | j         r|                                  |                                   t                      j        di |S )Nr"   )is_newr  r  r  r<   )r   rb   r   s     r   r<   zCmfImport.save:	  sM    ; 	*'')))""$$$uww|%%f%%%r   c                     | j         rd S | j        r7| j        j        dk    r't          j                            ddg          | _         t          j                            ddg          | _         d S )Nr   zimport.system.jira:defaultsave_eval_code)rn   r   zimport.system:default)r  rx   rv   r9   rf  r;   r   s    r   _calc_workflowzCmfImport._calc_workflowA	  ss    = 	F; 	q4;1_DD".228T^n]o2ppDM*..4KUeTf.ggr   c                 t   |                      dg           t          t          j                                      | j        j                                         d          }| j        j        j        j	        r)|                    | j        j        j        j	                  }|
                    dd           |S )Nr  	_raw_dataT)r   r   )rw   r	   r5   r   r   rx   ui_namer  r   r   r   )r   ress     r   r  zCmfImport.get_download_pathI	  s    56777*++448K8Q8Q8S8S5^5^5^__;)/ 	E,,t{1=CDDC		4	...
r   c                 :    | j                             |            d S rZ  )rx   download_datar   s    r   r  zCmfImport.download_dataQ	  s    !!$'''''r   c                 :    | j                             |            d S rZ  )rx   download_filesr   s    r   r  zCmfImport.download_filesT	  s    ""4(((((r   r'  c                    d|v rt          d          d}| d| d| j         }t          j        }| j         d| d}|j                            |d          }|                                 	 |j                                        5 }	|	                    | j        j	        |           ||	
                    |||           nC|                    |          r|	                    |           n|	
                    |d|           |	                                 d d d            n# 1 swxY w Y   	 |                                 n# t          j        j        $ r7}
t"                              d	|
 d
|j         d|j                    Y d }
~
npd }
~
ww xY w# 	 |                                 w # t          j        j        $ r7}
t"                              d	|
 d
|j         d|j                    Y d }
~
w d }
~
ww xY wxY w|dk    r|sd| d| j         }| d}|j                            |d          }|                                 	 |                    |          sd| j        j	                            |i           v r|j                                        5 }	|	                    | j        j	        |           |	
                    || j        |         d         |           |	                                 d d d            n# 1 swxY w Y   	 |                                 d S # t          j        j        $ r8}
t"                              d	|
 d
|j         d|j                    Y d }
~
d S d }
~
ww xY w# 	 |                                 w # t          j        j        $ r7}
t"                              d	|
 d
|j         d|j                    Y d }
~
w d }
~
ww xY wxY wd S d S )Nr0  uA   Нельзя использовать "-" в obj_name: {obj_name}i:	 z.lock   )timeout)exr&  zlock release error z, lock_name z
, timeout r'  zdownloaded-)r|   rO   APPREDIS_DBredislockacquirer  saddr   setr   incrr  release
exceptions	LockErrorr  r  r)   r  r-  r;   )r   r<  r=  r   ttlr)  redis_dblock_keyr  piper   s              r   r/  zCmfImport.inc_statW	  s   (??_```**h****<g*****~""8R"88	b((** d		$'----$HHS%CH0000__S)) -IIcNNNNHHS!H,,,              b#- b b b`a``TY``RVR^``aaaaaaaabb#- b b b`a``TY``RVR^``aaaaaaaab e4444744C}}}H>&&x&<<DLLNNNf  s++ '@Q@W@[@[\dfh@i@i0i0i!0022 'd		$'-555d&7&A,&OTWXXX' ' ' ' ' ' ' ' ' ' ' ' ' ' '
fLLNNNNN'1 f f fGGd!ddddVZVbddeeeeeeeeeffLLNNNN'1 f f fGGd!ddddVZVbddeeeeeeeef! s   /F BD'F 'D++F .D+/F 3E F-FFG;F-,G;-G8-G3.G;3G88G;AM6 AL9M6 L		M6 L	M6 L' 'M3;-M..M36O8NOO!-OOOOc                 x   t           j        }i }|j                            | j        j                  D ]}|                                }|                    |          }|                    d          ^}}}|                    |          st                      ||<   |                                ||         |<   |S )Nr0  )
r  r  r  smembersrO   r   r   r;   rL  r  )r   r  r  r)  r   r=  r<  rT  s           r   r5  z CmfImport.get_redis_import_stats	  s    <>**47=99 	2 	2C**,,CLL%%E"yy~~B1::h'' *#'66x #(<<>>F8R  r   c                     |                      ddg           | j        dk    r| j        j        S |                                 S )Nr  r-  r  )rw   r  r-  r   r5  r   s    r   rl  zCmfImport.take_import_stats	  sH    -~>???!]22$****,,,r   c                    |                      g d           | j        dk    s| j        j        dk    rdS t          j                                        st                      }|                                std}| 	                    |t          j                   || _        | j                            d          | _        |                                  |                                  dS d	S )
Nr  r4  r  r  r  import-plannedFu   Импорт прерван по неизвестной причине. Проверьте системные требования.r   r\  r]  T)rw   r  r  rn   r  r  import_is_runningCmfImportWorker
is_runningra   r7   rr   r4  r  r  r<   rx  )r   workerr4  s      r   r  zCmfImport.is_running	  s    QQQRRR!]22dk6FJZ6Z6Z5);;== 		$&&F$$&&  b	'-888!*"m>>>>ZZ		'')))utr   z	@minutely)	only_once
system_jobschedulec                  4   t           j                                        sd S t                              d           t           j                            g ddddgggg d          D ]1} |                                 st                              d|            2d S )	Nz&cmf_deferred_job: CmfImport.cron_checkr  r  r  zstatus.codezNOT INr  r  r   uH   Импорт прерван по неизвестным причинам)	r9   r^  rr  r  r  r   r  r  admin_alert)r~   s    r   
cron_checkzCmfImport.cron_check	  s     ++-- 	F	8999#((:::+;*<= LKK ) 
 
 		u 		uC >>## u##$npsttt		u 		ur   report.jsonproject_identifierreport_file_namec                 2   t           j                            dddd|  dgdd| gdd| gdd| ggg d	gd
dg          }|st          d|  d          |j        st          d| d          |j        j        }|j        j                            d          }|s|j        j                            d          }|st          d| d          t          |          	                                st          d| d| d          |>t                              t                    }|                    t          j                   ||_        |                    d| d           t#          j                    }|                    |          }t#          j                    }||z
  }	t          |                              |          }
t+          |
d          5 }t,                              ||           ddd           n# 1 swxY w Y   |j                            d          r0|D ]}|d         }|d         }|d         }|d         }|                    d           }|d!         }|                    | d"| d#| d$| d%           |r-|                    d&|                                 d'|            |r-|                    d(|                                 d'|            |                    d)|	d*d+t9          d,-           t;          |
                              t>          j         d.           d           |                    d/           dS d0d1l!m!} d2 }g }|D ] }|"                     ||                     !g d3}|                    d4 |||d56          z              |                    d)|	d*           |                    d7t9          d,-           t;          |
                              t>          j         d.           d           dS )8u  
        Собирает статистику количества сдампленных и обработанных объектов
        по проекту

        Args:
            project_identifier (str): ext_id, код, префикс кода задач или название проекта
            report_file_name (str, optional): имя файла отчета. Defaults to "report.json".
            logger (Logger, optional): вывод данных отчета.
        r
  r   r  r  rn   r  rD  r)   r'  rp   r  r   u   Проект 'u   ' не найденu   Проект u.    не содержит данных дампаproject_dirr   u*   В данных дампа проекта uA    отсутствует путь до каталога дампаu@   Отсутствует каталог дампа проекта z: 'r   Nu3   Сбор статистики по проекту 'zw+r4   entitydumpedr  r  undownloadedunprocessedu,    (сдамплено/обработано): z / r	  r;  u   Незагруженные r   u   Необработанные u   Выполнено за z.4fu,   . Ссылка на файл отчета: 'Trm  zrdisk/file/z2--------------------------------------------------r   )tabulatec                 >    d |                                  D             S )Nc                      g | ]\  }}|d v 	|S ))r&  r'  r  r  r"   r8  s      r   r   z>CmfImport.project_stats.<locals>.data_list.<locals>.<listcomp>
  s2       !QGGG GGGr   )r  )
stats_datas    r   	data_listz*CmfImport.project_stats.<locals>.data_list
  s/     ","2"2"4"4   r   )r   u   Сдампленоu   Обработаноu   Результатr(  grid)headerstablefmtu*   Ссылка на файл отчета: ')#r9   rE  r;   r|   r  r   rx   r   r	   r   r7   rN   r   rC   r6   rZ   r   r  r  project_statsr   r>  r  dumpr)   r  r   r  rp  r   r   r5   r   r*  r   )r"  r#  rZ   r5  rx   r%  r!  r  end_timer&  report_filer   entity_statsr&  r'  r  r  r(  r)  r*  r.  r  r0  s                          r   r2  zCmfImport.project_stats	  s\    #'' v'@+='@'@'@AS"45'.@AS"45 +**	 $! ( 
 
   	VT-?TTTUUU& 	ecGcccddd#*-377FF 	D!17;;FCCK 	 HW  H  H  H   K  '')) 	mSZmm_jmmm   >&&x00FOOGM***T'TTTUUU&((
$$W--$&&*, ;''001ABB+t$$ 	 IIeQ	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  ;!!),, %	 % d d%h/%h/(5	%h/+//??*=9vttSYtt^gttkqtttuuu cNN#a#a#aS_#a#abbb dNN#b6<<>>#b#bU`#b#bcccKKQ<? Q Q=JTX=Y=Y=YQ{##++F,=}MMQ Q Q  
 KK!!!!!))))))   D % 5 5IIl334444^^^GKKxxgOOOOPPPKKE<EEEFFFKKQ]TX=Y=Y=Y Q{##++F,=}MMQ Q Q    s   G>>HH)Tr[  )FrZ  rY  )r'  N)r!  N)Br   r    r!   r   r^  ui_meta_skipapi_methodsr_  ra  r  r	   rd  classmethodr   rr  ru  rx  r\  r  rc  r  r   rE  r   r  r  r  re  rm  r   r`  rM   rk  r   r  rh  r   r  rg  r  ri  r1  r:  r  r  r  r  r  rf  rj  r  r  r  r<   r  r  r  r  r/  r5  rl  r  cmf_deferred_jobr   r2  __classcell__)r   s   @r   r^  r^  L  s       '4 8 L &2 6 6 6 K Kt9::-D - - - [- % % [% * * [* % % % % X%K K K7 7S 7 7 7 7r $ $ \$L    
Y Y Y6       _ . . \. 7 7 \7*.# *. *. *. *.X) ) )L L L L L L\7 7 7VS VS VS VSpr r r20 20 20ht    B  B! ! !F+ + +:  2 
 
d 
 
 
 \
: . . . \.4 4 4b b b b b  *% % %N& & & & &h h h4    ( ( () ) )*f *f *f *fX  -4 - - - -  " LLLu u ML \u  !.f fff f f \f f f f fr   r^  c                 <     t                      fd            }|S )Nc                 *   	  | g|R i |}t                       | j                            d           t                                           |S # t
          $ r6}t                       | j                            d|            Y d }~d S d }~ww xY w)Nu*   Импорт завершил работуu(   Ошибка работы демона: )r{   rZ   r   r^  rx  r|   rs   rl  )r   r   rb   r  r   fns        r   wrappedz!catch_exceptions.<locals>.wrapped$
  s    	T"T+D+++F++CLLLKIJJJ((***J 	T 	T 	TNNNK!!"RS"R"RSSSSSSSSS	Ts   AA 
B+BBr   )r>  r?  s   ` r   catch_exceptionsr@  #
  s8    
2YY	T 	T 	T 	T Y	T Nr   c                       e Zd ZddZd Zd ZddZd Zed	             Z	ed
             Z
ed             Zed             Zed             Zd ZdS )r  eva-import-workerc                     ddl m} dd l}ddlm} |                    |          | _         |j        | j         |d| d          |j                    |d| d          | _	        d S )	Nr   r   r   z/var/logz.logr   z	/var/run/z.pid)
cmf.modules.logsr   r7   pathlibr	   rN   rZ   init_loggerr8   r   )r   r7  r   r7   r	   s        r   __init__zCmfImportWorker.__init__3
  s    //////      '',,
t{DD\\\,J,JRYR^____+#+++,,r   c                    | j                             d           t          j                            ddd|gdd|ggg d          }|                                 |                    d           |j                            d	d
          |_	        |
                                 t                       t                                          5  t                                          5  t                                          5  |                                }t"                              d           d d d            n# 1 swxY w Y   d d d            n# 1 swxY w Y   d d d            n# 1 swxY w Y   t          j                            |j        g d          }t          j                            dd|g          }|j	        j        d
k    r|sO|j                             d           |j                            d          |_	        |
                                 nb|j	        j        dk    rR|j                             d| d           |j                            d          |_	        |
                                 |j                             dt0          j                    t          j                            d|          }t7          |j                                      t0          j        d          }t          j                             ||j!        |j"        d|j         dtG          j$        tJ          j&                  dd| dd !           d S )"Nu   Импорт запущенr
  rO   r  rn   r  r  r,  r#  r   u%   ***Запускаем импорт***r  import-startedr  r^  r&  r  r   r#  u2   ***Импорт успешно завершен***import-completedr]  CLOSEDu6   ***Импорт завершен с ошибками: u,   . Подробности в отчете.***r\  u   Текущая версия: r'   r(   /files/u   Импорт данных 'u   ' завершен %d.%m.%Y %H:%Mz (UTC), <a href=(   >Журнал логирования</a>Tr~   personr)   r\   force_notify_current_person)'rZ   r   r9   r^  r;   r   ra   r  r  r  r<   r{   r  r  r  r  r1  geventrH  rO   rt   rG  rn   r  r5   EVA_VERSIONr:   r   r@   r   r   	CmfNotifyplace_notifyrG  r)   r   r   r   r  )r   r  r~   r  rL  log_filelog_paths          r   runzCmfImportWorker.run;
  s   6777""4$i1H6SWYbJc*d.c.c.c # e e7888\44\l4mm



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



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


JOOPF<NPPQQQ'++C+HHx.//778I9UU%%>Nch N N8<X`XdKeKe~ N N#N N N(, 	& 	. 	. 	. 	. 	.sZ   E)&E /D;/E;D??ED?EE)E	E)E	E))E-0E-c           
         | j                             d           t                                          5  t                                          5  t                                          5  t          j                            ddd|gdd|ggg d          }|	                    d           |j
                            d	d
          |_        |                                 t                       |                                }|                                }t          j                            dd|g          }|rS|rQ|sO|j                             d           |j
                            d          |_        |                                 nb|j        j        dk    rR|j                             d| d           |j
                            d          |_        |                                 |j         j        d         j                            t.          j        d          }d d d            n# 1 swxY w Y   d d d            n# 1 swxY w Y   d d d            n# 1 swxY w Y   t          j                            |t6          j        |j        dt=          j        t@          j!                  dd| dd           d S )Nu   Дамп запущенr
  rO   r  rn   rI  r   u!   ***Запускаем дамп***r  rJ  rK  r   r#  u.   ***Дамп успешно завершен***rM  r  u2   ***Дамп завершен с ошибками: z***r\  r]  r   rN  u'   Дамп данных завершен rO  z
, <a href=rP  TrQ  )"rZ   r   r  r  r  r  r9   r^  r;   ra   r  r  r  r<   r{   r  r  rt   rG  r  rJ   baseFilenamer   r5   r   rV  rW  r  current_personr)   r   r   r   r  )r   r  r~   r  res2rL  rY  s          r   	dump_datazCmfImportWorker.dump_dataa
  s   2333  "" 	a 	aG$:$:$<$< 	a 	ag>X>X>Z>Z 	a 	a"&&tdD)5LvW[]fNg.h.c.c.c ' e eC GG788888]`p8qqCJHHJJJLLL##%%C%%''D*00tS8Q0RRF t F 
 PQQQ \<<<RR




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


z*1-:BB6CTV_``H+	a 	a 	a 	a 	a 	a 	a 	a 	a 	a 	a 	a 	a 	a 	a 	a 	a 	a 	a 	a 	a 	a 	a 	a 	a 	a 	a 	a 	a 	a 	a 	a 	a 	a 	a 	a 	a 	a 	a 	a 	a 	a 	a 	a 	a, 	%%#N(,x|:T:Tg N N#N N N(, 	& 	. 	. 	. 	. 	.sZ   II(F<H0$I0H44I7H48I;II	II	II"%I"r%   Nc           
         | j                             d           t                                          5  t                                          5  t                                          5  t          j                            ddd|gdd|ggddgd	          }|j	        
                    d
          |_        |                                 t                       	 d}d}|j                             d           t          j                            dd|gd          D ]}}	 |j                             d|            |                    dd           t                       F#  t#                       |dz  }|j                             d| d           Y {xY wt          j                            ddd|gdd|ggg dd	          }|j        D ]y}	 |j                             d|            |                    dd           t                       F#  t#                       |dz  }|j                             d           Y wxY w|s;|j	        
                    d          |_        |j                             d           n=|j                             d|            |j	        
                    d          |_        nw# t*          $ rj}t#          |           |j                             d|            t-          |          |_        |j	        
                    d          |_        Y d}~nd}~ww xY w|                                 t0          j        j                                         n<# |                                 t0          j        j                                         w xY w	 ddd           n# 1 swxY w Y   ddd           n# 1 swxY w Y   ddd           dS # 1 swxY w Y   dS )r  u   Отмена запущенаr
  rO   r  rn   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   Ошибка удаления )rZ   r   r  r  r  r  r9   r^  r;   r  r  r  r<   r{   rE  r   r   rs   rl  ra  r}   r|   r   r4  r6  r7  r8  r9  )r   r  r~   rL  rg  r   s         r   _cancel_importzCmfImportWorker._cancel_import
  s    	8999  "" +	, +	,G$:$:$<$< +	, +	,g>X>X>Z>Z +	, +	,"&&tdD)5LvW[]fNg.h/7.DVZ ' \ \C88EW8XXCJHHJJJLLL%,
 FGGG!,11,c9Rdh1ii u uCuJOO,Cc,C,CDDDJJDJIII&LLLLu(NNN"QJFJ00  2tWZ  2t  2t  2t  u  u  u  u  u&**4$i9PSY[_ajRk2l.V.V.Vhl + n n- j jCj
(?#(?(?@@@

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





	Y 


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


!))+++++W+	, +	, +	, +	, +	, +	, +	, +	, +	, +	, +	, +	, +	, +	, +	, +	, +	, +	, +	, +	, +	, +	, +	, +	, +	, +	, +	, +	, +	, +	, +	, +	, +	, +	, +	, +	, +	, +	, +	, +	, +	, +	, +	, +	, +	, +	, +	, +	,s   O)O(A0N:AKAE! K!3F;KAHK/IA?KM1
L6	A L1	,M11L6	6M198N:19N*	*N:.O:N>>ON>OO)O	O)O	O))O-0O-c                 ~   t           j                            ddd|gdd|ggg d          }dd|j        d	i}|j        j        j        d
k    rNd|j        j        |dddd|j        j        |dddd|j        j        |dddd}|                    |           |                    |          }|s |j	        
                    d| d           d S |d         }|                    di           }	|	                    |           |j                            dd          |_        |                                 t                       | j	                            |d          d           t"                                          5  t"                                          5  t"                                          5   |d&i |	 t*                              d           d d d            n# 1 swxY w Y   d d d            n# 1 swxY w Y   d d d            n# 1 swxY w Y   t           j                            |j        g d          }t           j                            dd|g           }
|j        j        dk    r{|
s5|j                            d!"          |_        |                                 nD|j        j        d#k    r4|j                            d$"          |_        |                                 t8          j        j                                         | j	                            |d          d%           d S )'Nr
  rO   r  rn   rI  r   linksu   Обработка ссылок)r)   r  r   u   Импорт фильтров_process_filters)r   process_method)r)   r  rb   u3   Обработка связей всех задач_process_relationsu7   Обработка истории кодов задач_process_code_historyr  uC   Конфигурация для запуска обработки 'u   ' не найденаr  rb   r  rJ  rK  r)   u    запущенаr&  r  r   r#  rL  r]  rM  r\  u    завершенаr"   ) r9   r^  r;   rX  rx   r   rv   r  r  rZ   r}   r  r  r  r<   r{   r   r  r  r  r  rT  rH  rO   rt   rG  rn   r  r6  r7  r8  r9  )r   r  r  rb   r~   process_configsprocess_jira_configsprocess_configr  method_kwargsrL  s              r   _process_entityzCmfImportWorker._process_entity
  sk   ""tY'y)
   # 
 
 91 
 :&/99 <!j7&)*<   R!j7&)*>   V!j7&)*A ! !#$ $ 4 ""#7888(,,[99 	J  Fcn  F  F  F  G  G  GF)&**8R88V$$$\44%( 5 
 

 	


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



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


!!###N62GGGHHHHHsZ   HG?9#G(G?(G,,G?/G,0G?3H?H	HH	HHHc                    | j                                         rt          d          | j                             t	          t          j                                          | j        |  | j                                          d S Nu"   Импорт уже запущен)	r   r   r|   
write_textr   r   getpidrZ  rw  r   r   s     r   rM   zCmfImportWorker.start  so    8?? 	B@AAAC	,,---$r   c                    | j                                         rt          d          | j                             t	          t          j                                          | j        |  | j                                          d S ro  )	r   r   r|   rp  r   r   rq  r_  rw  rr  s     r   r3  zCmfImportWorker.dump  sq    8?? 	B@AAAC	,,---r   c                    | j                                         rt          d          | j                             t	          t          j                                          | j        |  | j                                          d S ro  )	r   r   r|   rp  r   r   rq  rb  rw  rr  s     r   rf  zCmfImportWorker.cancel!  sr    8?? 	B@AAAC	,,---T""r   c                    t           j                            g dg d          }|rH|                                 r|j                            d           |j                            d          |_        |	                                 t                       t          d          D ]Q}t                              d           t           j                            |j        d	d
g          }|j        dk    r nRn|j                            d           |j                            d          |_        |	                                 t                       |j                            d           | j                                        s| j                            d           d S | j                            d           	 t'          j        t+          | j                                                  t.          j                   n!#  | j                            d           Y nxY w| j                                         d S )Nr  rI  r   uQ   Пытаемся остановить импорт, таймаут 1 минутаr  r]  <   r&  r  r  r  r  u"   Импорт уже прерванr  u<   Импорт остановлен пользователемu    Импорт не запущенu'   Останавливаем импортuK   Не удалось завершить процесс, он запущен?)r9   r^  r;   r  rZ   r   r  r  r  r<   r{   r  rT  rH  rO   r  r   r   r   r   killr   	read_textsignalSIGTERMrl  rw  )r   r   r~   r"  s       r   rk  zCmfImportWorker.stop)  s   ""*T*T*T  ^S  ^S  ^S"  T  T 	\   I
""#vwww \<<IZ<[[



r  ALLOOO *..#&BUWaAb.ccC,== > 
""#GHHH88_8UUCJHHJJJLLLJOOZ[[[x   	K?@@@FBCCC	qGC**,,--v~>>>>	qK!!"oppppps   AH H#c                    | j                                         rt          d          | j                             t	          t          j                                          | j        |i | | j                                          d S ro  )	r   r   r|   rp  r   r   rq  rm  rw  r  s      r   r  zCmfImportWorker.process_entityG  sz    8?? 	B@AAAC	,,---d-f---r   c                     | j                                         r[t                              t	          | j                                                             rdS | j                                          d S d S )NT)r   r   r  check_process_runningr   rx  rw  r   s    r   r  zCmfImportWorker.is_runningO  si    8?? 	,,S1C1C1E1E-F-FGG tHOO	 	r   )rB  rY  )r   r    r!   rG  rZ  r_  rb  rm  r@  rM   r3  rf  rk  r  r  r"   r   r   r  r  2
  s       - - - -$. $. $.L. . .@0, 0, 0, 0,d\I \I \I|            :       r   r  ))r   decimalr   r   r   r7   r   ro   rE  r	   r  r  bs4r
   r   r  r  r  r   cmf.includer6  r   common.fieldsr   rD  r   r   ry  	functoolsr   localr   r  rL   Filterr   r$   r   r^  r@  r  r"   r   r   <module>r     sh               ' ' ' ' ' ' ' '                            + + + + + +                  $ $ $ $ $ $ ' ' ' ' ' ' 				       Y_
 EKMM	3 3 3 3 3gn 3 3 3
Z0 Z0 Z0 Z0 Z0 Z0 Z0 Z0BA A A A A A A AH"T T T T Tnj.B T T Tn&  a a a a a a a a a ar   