
    iu                       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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_typec           
         |                      |t          j        d           t                              ||| |||t          j                    |          }|rp|j        |_        |j	        |_
        |                    dg           |j        j        }	|	r4|	                    |          |_        |	                    |          |_        |                                 t'                       dS )u7  Логируем ошибки и записываем их в базу

        Args:
            msg (str): текст ошибки
            error_code (int, optional): Код ошибки для нахождения возможного решения или группировки. Defaults to 1.
           )r\   rS   r`   )textcoder   rh   ri   rf   	tracebackrg   cmf_import.pluginN)ra   r7   ERRORr9   CmfImportErrorrn   
format_excr)   title
class_namerf   load_fieldsr   plugincalc_ext_hrefrg   calc_dump_pathrh   r<   
cmf_commit)
r   r\   re   objrf   rg   rh   ri   import_errorrv   s
             r   	log_errorzLoggingMixin.log_error   s      	S!<<<,,#2<8<7@8B6>7@7K7M7M6> - / /  	D!$L$'NL!OO01222^*F D(.(<(<S(A(A%)/)>)>s)C)C&r    c                     d|                      d           d} t                              d|  d|            t          |            d S )Nu1   Ошибка при импорте данных. .ue   . Проверьте загружаемый файл и повторите попытку снова.zCmfImportError: : )stripr7   error	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   )r}   )r   r    r!   r   r   rZ   r7   r8   strintra   r|   staticmethodr   r   listr   r   r   r   r"   r   r   r$   r$   '   sZ       = = = = _=D \
 

 
 
 
 
6 %#$ $$ $
 $ $ $ $ $ $ $L    \

" 
" 
"	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pluginsrv   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":""%rm   =Tr   r   r   <    Не удалось найти задачу по коду 'r   )r   r;   rZ   r   r   r   r9   r   r   r   r   )r   r   r   rz   task_keys        r   _replace_jira_macrosz#CrossLinkMixin._replace_jira_macros0  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   	ExceptionrZ   r   r   r   )r   r   excs      r   _parse_url_safelyz CrossLinkMixin._parse_url_safelyM  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_urlW  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  rm   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    не поддерживается. Ссылка: ')r2  r)   u9    Не удалось найти фильтр задач 'u   . Ссылка: 'kaitenz%^(?:/\d+|/space/\d+/boards/card/\d+)$z(\d+)$z%"id":z,%rO   u<    Не удалось найти задачу Kaiten по id )rz   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_paramsrz   r  r=  r   ext_coder  r   	space_key	page_namedocsdoc	doc_spacepage_idrowtinyui_liker/  board_id	filter_idproject_keyr1  task_registryfilter_type_mapfilter_typefilter_nametask_filtertask_idobjss#                                      r   _resolve_link_infoz!CrossLinkMixin._resolve_link_infog  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   Создает новый тег ссылки на основе полученной информацииrz   r  r=  rl    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  rF  r   r   urljoinapp_base_hrefbool)r   	link_textdomainr=  rz   s      r   replacerz1CrossLinkMixin._create_link_tag.<locals>.replacer  si    ;A O38 7 7v 7 7 7sxI"[[^^F & 4 4%tF||<<<!! !I %$r   target)rl   r  r=  rq  	view_moderL  )get_textr   r)   rm   r   r?  rD  rB  r   escapesubr9   r   r   r;   )r   r   r  	link_infor  rr  tag_textrelative_urlescaped_urlpatternrp  r=  rz   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  rd  r{  r   )r   r   r   r   r  rv  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   r@  rA  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   rA  sgetr   r   rZ   r   r   rO   r  )r   r   r   macros_parametersparamsrR  r1  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   rA  r   r   rZ   r   r   r@  r   rO   )r   r   r   r\  rS  r1  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)lenrH  )r   params     r   	<genexpr>z@CrossLinkMixin._replace_childpages_page_links.<locals>.<genexpr>`  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;   dictrH  r9   rA  r   r   rZ   r   r   r@  findr)   stringr  r  r   rO   r  )r   r   current_projectr   r1  documentrR  pagenameoriginal_macro_parametersr  parent_pagespan_object_namemacro_parametersr  s                 r   _replace_childpages_page_linksz-CrossLinkMixin._replace_childpages_page_linksQ  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IrE  r
   r  r   bodychildren)r   detailsdetailr%  r   rz  
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 }|                     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<   |S )Nremotelinksobjectapplicationr   zcom.atlassian.confluencerelationshipz	Wiki Page	processedFz$/pages/viewpage.action\?pageId=(\d+)r   r"  r   r  r  T)r   r   )r;   r   rE  rF  r9   r@  r   )	r   r  r  
remotelinkremotelink_objremotelink_appr   rW  rU  s	            r   _get_remotelinkszCrossLinkMixin._get_remotelinks  s.   !'R'++M2>> 	/ 	/J'1N'6N ""6**.HHH>>.11[@@>>+u55 A  IIE~V[G\]]E 
/++a..(,,$foGoo>%) -    k))&&s+++*.
;'r   c                    d}	 |j         j        pd}t          |d          }|j        sd S |                     |           d                    d |j        j        D                       |_         |j        r$|	                    d           t                       nP# t          $ rC}t                       |                     t          j         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. ERR-0034)re   )rl   r   r
   htmlr  r   r  r  
is_changedr<   ry   r  cmf_rollbackr|   r   r   r   )r   comment	has_errorcomment_textr   r  s         r   _process_comment_cross_linksz+CrossLinkMixin._process_comment_cross_links  s6   		"<-3L v66D9 %%%77#G#GDI4F#G#G#GHHGL! t,,, 	 	 	NNNNN%  I  Ix  I  I  DG  I  I%     IIIIII	 9~~s   %B A.B 
C'$9C""C'c                    d}d }d| dt           _        	 t                              |g d          }d|j         dt           _        t          |j                                      d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| &                    |           $nN# tN          $ rA}tQ                       | )                    t           j         d| d|           d}Y d }~nd }~ww xY wtU          |          S )NF[])
r*   rl   
text_draftr  	macros_dbmacros_db_draftr  r   zcomments.log_levelzcomments.textr   r   r"  u/    Обработка ссылок объектаr}   r  r@  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   rz   )+r   r   cmfutilget_obj_by_idrm   r   r   rH  r   rZ   debugrl   r   r
   r  r  rt   r  r  r  r  r*   r   r  r  r  r  r;   r  r  r  r  r  r   r<   ry   comments	log_levelr  r  r  r|   r   )r   obj_idr  rz   r   _obj_textr   r  r  r  r  r  s                r   _process_obj_cross_linksz'CrossLinkMixin._process_obj_cross_links  s5   	*]]]
E	''   (  C "1SXJ __224;;NK%0J"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'::::;  	 	 	NNNNN%}}x{}}%    
 IIIIII	 9~~s   J
J! !
K,+7K''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_worker9  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  )rq  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   rA  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   modelr1  r  r  threads
start_timeithreadcnt_filterrc  rz   elapsed_times                      r   process_cross_links_by_modelz+CrossLinkMixin.process_cross_links_by_modelJ  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   r1  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	   d}|rW	 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          nE# t          $ r8}t#                       |                     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 ]}t1          t                    |         }|                    |
          }|s6t5                       | j                            d| d|j         d | d!| d"| j         
           t          j                    }d}g }t;          | j                  D ]E}|                     |||          }|                    |           |t>          j         z  }||k    r nF| !                                 ||k     rt          j"        d
           tG          |          D ]}|$                                }|i||z  }|%                    |           |                     |||          }|                    |           |t>          j         z  }| !                                 ||k     tG          |          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?   ] Ошибка обработки ссылок объекта: r"  u.   Ошибка обработки ссылок: r}   r  task_code_prefixr	  rm   r)   rO   r   r  %r#  r  u    Не найден проект 'r   r  r*   u    проекта )r   r@  u#   Обработка ссылок в u    объектах 'z' (r8  u+    в несколько процессов: u$   Обработка ссылок в 'u    завершена за u    сек.u(   Обработка всех ссылок)(
isinstancer   r  r  r9   r   r@  r  r  r  r  rO   rZ   r  r  r   r   r  r|   get_max_processesmax_processesrA  r;   r   r  country   r   r  r  r>  r5   r9  r   sleepr   pollr   communicate
returncode)r   r1  rz   errorst1t2r  log_projectproject_identtotal_t1r"  r  r  obj_cntmodel_t1rM   rd   r  r=  rI  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      l3llgjllmmm! 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E8 8
F&F!F&!F&r%   NNNN)r   r    r!   r   propertyr   r  r  r  r  rd  r{  r  r  r  r  r  r  r  r  r   r  r  r  r   r  r$  r>  rU  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     <  0M M M^%S % % % %"E E E EN   :@ @ @ @ @ @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_forksrD  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 rW  )ra  r   clss    r   worker_herezCmfImport.worker_hereS  s    #**,,,r   c                 8    | j                                          d S rW  )ra  touchrm  s    r   create_worker_flagzCmfImport.create_worker_flagW  s    ""$$$$$r   c                 n    | j                                         r| j                                          d S d S rW  )ra  r   unlinkrm  s    r   remove_worker_flagzCmfImport.remove_worker_flag[  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>d  s    $a$a$aaQvY$a$a$ar   r`  )_import_settingsru   rw  r   s    r   r`  zCmfImport.import_settings`  sM    $ 	bo.///$a$a4;MN_;`$a$a$aD!$$r   c                 J    t           j        | _        t           j        | _        d S rW  )r5   IMPORT_THREADSr  IMPORT_DOWNLOAD_THREADSr_  r   s    r   r  z"CmfImport._prepare_multiprocessingg  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  rD  available_memoryavailable_memory_gbs           r   rC  zCmfImport.get_max_processesk  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} t          j        j        d         }|j                            |           s|                    | d          } | S )Nr   )cmf_hashlibr@  ABCDEFGHIJKLMNOPQRSTUVWXYZ)	enc_table)cmf.utilr  r9   rA  r   regex	fullmatchshort_str_enc)r%  r  r@  s      r   get_correct_keyzCmfImport.get_correct_key  s`    (((((( ",34FG%//44 	Y++C;W+XXC
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   Поля групп)rw  rv   calc_models_settingsr   r   r9   	CmfPersonimport_shop_fieldsr  r   
CmfCommentrA  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rw  attachmentsr   rv   r`  r   Tsend_invitesFremove_conflict_projects
add_suffix	pg_backupmerge_identic_names)ru   rw  rv   rb  r<   r   rb   s     r   rb  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  r`  r  Tr  r  Fr  r  r   )ru   rw  r   r;   rv   rj  r<   r  s     r   rj  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 )Nrw  r`  r)   r   )ru   rw  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_workerrr  	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   
        Останавливаем в фоне импорт данных
        rh  N)r9   r[  r  r  s      r   rh  zCmfImport.stop   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.)
        rv   filters	relationscode_historyr   u4   Запуск отдельной обработки 'u?   ' возможен только для импорта из JiraTabortr  r   uP   Недопустимые типы значений для параметров: r&  ud   . Значения параметров должны быть строками или числамиprocess_entity)r  N)ru   rv   r   rt   r   r  rB  r   r   floatr   r   r   r   updater9   r[  r  rO   rr  )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   re  zCmfImport.delete_dump3  sR    ..00!! 	)MM-(((((	) 	)r   rX  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   rm   r  r)   r  z**r   RUunionT)rm   r   include_deleted)r)   r   r  z%Y%m%d-%H%M%S)r  	enumerater]  rH  rt   r   r   r   r;   
issubclassCmfRelationCmfGenericRelationrelated_modelssetattr
CmfRelBaseCmfPhonephonenumbersr   format_numberPhoneNumberFormatINTERNATIONAL
CmfNumericr   rw  rm   r)   r   r   r   utcr<   )r   rX  r  r"  r%  result_fieldsr  settingnew_objnew_coder  fieldrel_obj	rel_modelvalphonerm   s                     r   _process_objzCmfImport._process_obj9  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   rd  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   удалить существующие проекты (проекты и все их данные будут безвозвратно удалены))rc  deleteselectedObjectsr   r   c                 >    g | ]}|d          
|d         |d          S )rz   	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   rs   r   project.agiler+  r@  )r)  r@  zcmf_import.ext_idcmf_deletedr*  u   добавить суффикс 'Wiki' к названию или коду существующих Wiki-проектов (пример: 'z Wiki' (zWIKI))r  import_typer1  u   объединить с существующими Agile-проектами, запустив импорт с опцией 'Импортировать в Документы Agile проекта'combineu   импортировать с добавлением 'Wiki' к названию или коду проекта (пример: ' (r8  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_namer  s      r   r  z2CmfImport.get_conflict_projects.<locals>.<genexpr>  s2      ``a3333``````r   u   </ul>
            <br />
            <p><strong>Для продолжения импорта вы можете:</strong></p>
            <ul>c              3   "   K   | ]
}d | dV  dS r  r"   )r   actions     r   r  z2CmfImport.get_conflict_projects.<locals>.<genexpr>  s.      MM&----MMMMMMr   z</ul>
            c                     g | ]\  }}|S r"   r"   )r   r  r1  s      r   r   z3CmfImport.get_conflict_projects.<locals>.<listcomp>  s    "R"R"Rzq'7"R"R"Rr   )ru   rv   r   rt   r`  r  r;   r   r9   rA  r  r  r)  r   rm  r   r   r)   r@  r  upperr   r   r  )r   r  conflicting_projectsactionsr  selected_projectsprjselected_project_keyselected_project_nameselected_project_ext_idr1  r  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$ m	U m	UC#'#7#7E
#C#C $'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  !' 1 6 6W&;<'2FG
 !%   !7 ! ! %6 6U 6U &*##$/ ](3:dk>P>\\   
 K%04III(5GGFAQAVF F,=F F F L)
 +;''K%04III(5GG'4GG/>wGMQZZZ$/; !{ $I.
A+@A A06688A A A L)
 +;''(3;'3; $; +;'& U&9&>#i#iBUBf#i#i#iL*7?JJ$(FF,9^KK$(EE*6 t$(RR% t$(ss(//?R0STTTm6Up  	``K_````` 
 MMGNN<L<LMMMMM  C Rss"R"R=Q"R"R"RRr   c                     t           j                                        D ]D}| j        j                                        |v r"t           j                            |          c S Et          dd           d S )Nbackup_nameu   Бекап для данного импорта не существует. Воспользуйтесь функционалом "Отмена".Tr  )r9   CmfGlobalSettingspg_backup_lsrm   r   r  rf  r   )r   bk_names     r   rf  zCmfImport.pg_restore   s    /<<>> 	P 	PGy$$&&'11/::w:OOOOO 2  e  mq  	r  	r  	r  	r  	r  	rr   c                 4   |                      g d           d}| j        rW	 t                                          5  | j        j                            d          r<t          j        	                    | j
        j                                                   | j        j                            d          rc|                                 }|rM|D ]J}|                     d| t          j                   |                    d	           t#                       Kd
t$          j        d<   d| _        d| _        | j        j        j        j        | _        |                                  t#                       dt$          j        d<   | j        D ]w}| j        |         D ]g}d}|dk    rFt5          |                                                                           r| j        |         |         }|                     |||           hxt          j                            dd| g           | j                             |           }ddd           n# 1 swxY w Y   nu# tB          $ rh}tE                       tG          |           dtI          j%        |j&                  d          }| '                    d|            || _(        Y d}~nd}~ww xY w| )                                | _        |                                  tT          j+        j,        -                                 |S # | )                                | _        |                                  tT          j+        j,        -                                 |c cY S xY w| j.        dk    r| /                                S dS )u9   
        Импортируем файл в бд
        )r   plugin.plugin.*zplugin.*Fr  r  r  u7   Удаляем конфликтующий проект r   T)TEXKOM_db_deleter}   NO_CACHEr   1
downloadedr   r  r  r   N
r(  u*   Ошибка работы импорта: r  )0ru   rv   r  r
  rw  r   r;   r9   r  r  rm   r  r  ra   r7   WARNINGr  ry   r   environimported_object_countprogressr   r   r<   import_statsr   r  iterdirinc_statrq   bulk_deleteprocess_importr  r  r   rn   	format_tb__traceback__r|   	error_msgget_redis_import_statscmfapp	CMF_CACHEflushdbr   _process_import_excel)	r   r  projectsr1  obj_nameopr  err
error_texts	            r   r'  zCmfImport.process_import&  s    	===>>>; '	&//11 I I)/33K@@ `0::tyG\G\G^G^:___)/334NOO -#'#=#=#?#?# -+3 - - $)lcj)l)lt{  uD  !E  !E  !E ' E E E *-/BJz*12D.$%DM"&+"4"@"FDKIIKKKLLL-0BJz*$($5 = ="&"3H"= = =B"#C!\11d4;Q;Q;S;S;[;[;];]6^6^1&*&7&A"&E MM(B<<<<	= )55lDRV=W5XXX![7747HHF5I I I I I I I I I I I I I I I6  , , , #CXXI,?@Q,R,RSU,VXX
QCQQRRR!+	, %)$?$?$A$A!		!))+++	 %)$?$?$A$A!		!))+++9--///  sU   I HI I II II L 
K
"AK L K

L AM6c           	         ddl m} | j        r| j        d         sdS d}	 i }i }i }i }i }i }i }	|                                 }
t          |
          D ]\  }}|dk    r| j        d         ri }i }d}d}t          | j                  D ][\  }}|d         r||         s|d         d                             d	          d         }|                    |i           }|d         d
                             d	          }|d         }||         }|dk    r|}|dk    r|}t          |          dk    r:|dk    r|||d         <   |                    |i           }||         ||d         <   nm|dk    r"|dk    r|
                    ||                   }nE|dk    r|                    ||                   }n#|dk    rd|                    ||                   i}|||<   |||<   ]|                    di           }|                    dd          }|                    |                    d                    }|s<|                    | t          j        |          \  }}|||                    d          <   |                    | t          j        |          \  }}|                    di           }|                    d          r|d         |d<   |                    di           }|r|	                    |          }|s|dk    rAt          j                            ddt          j                            d                    }n@t          j                            ddt          j                            d                    }||	|<   ||d <   ||d<   ||d!<   ||d"<   d#d$d%|j        gdd%|d         gg}|                    | t          j        ||          \  } }| j                            |           |                                  | ||d         <   |r0|                    |g           }!|!                    |            |!||<   |r<|                    |d         g           }"|"                    |           |"||d         <   |                    d&i                               d'd          }#|#rf|# d(|j        j         }$|                    |$i           }%||%d!<   |#|%d'<   |%                    d)g           }&|&                    |            |&|%d)<   |%||$<   |                    |                    d                    }'|'st          j                            d#d*d%|j        gg d+g,          }(d#d*d%|(j        gg d-g})d.||(d/d0}*|                    | t          j        |*|)1          \  }'}|'||                    d          <   |                    | t          j        |'| d2           |                                D ]\  }$}+t          j                            d#d*d%|+d!         j        gg d3g,          }(d#d*d%|(j        gd'd%|+d'         gg d4g})t          j                            |),          },|,s\t                              |+d!         |(|+d'         t          j                             d5          6          },|,                                 |+d)         D ]} |,| _!        |                     d78            |                                D ]U\  }}-|                    |          }.|.r9|-D ]6}/|/j!        "                                 |.|/_!        |/                                 7V|                                D ]l\  }}0|                    |          }.|.rP|0D ]M}1|                    |1          }/|/r4|/j!        "                                 |.|/_!        |/                                 Nmn# tF          $ r}2tI          |2           d9| d:|2 d;tK          j&        |2j'                  d<          }3| j(        )                    |3           |3| _*        | j+        ,                    d=>          | _-        |                                  Y d?}2~2dS d?}2~2ww xY wd7S )@u   
        Запуск импорта из CSV

        :return: Истина в случае успешного импорта
        r   )CmfPluginImportMixinr`  F	first_rowr}   r  r  r   r  parent_taskchild_tasksr"  	executorsr)  rA  priorityr  r  r  rm   r   
cmf_author	cmf_ownerzproject.basez
task.base%base)rm   )	cmf_modelprefixactivityztask.agile:softdev%softdevr  r1  r*   AND	parent_idr  r  r)   r  taskstree_parent_id)r)   r  Sprintsr  )r)   r  
   ДоскаrI  kanban)r)   r*   r2  	list_type)r   r  
obj_fields
filter_obj)leftright)r)   r  Epics)r)  r	  z	task.epicztask.epic:default)r*   r2  r)   
logic_typeTr  u   Строка r   r  r(  import-errorstatus_codeN).%common.models.cmf_plugin_import_mixinr7  r  rw  	_get_filer  r]  rH  r;   r  get_logic_prefixget_priorityget_status_type
setdefaultprocess_any_table_fieldsr9   rA  r  CmfWorkflowcalc_workflowCmfActivityrO   r   r;  r   r<   rm   r   	CmfFolderr  CmfListCmfTaskr  CmfLogicTyper9  r  r  r  rn   r(  r)  rZ   	exceptionr*  r  r  r  )4r   r7  
number_rowall_parent_taskall_child_tasksall_epic_tasks	all_tasks
cash_boardcash_projectcash_workflow_task	file_readrX  executorr  parent_task_codechild_tasks_codeidxr  r  _rowfields_namer  r   project_fieldsr)  r1  r  executor_objtask_fieldsvalue_statusr  filter_tasktask_objtmp_parent_taskstmp_child_tasks	epic_nameepic_keytmp_data	tmp_taskslist_objparent_folderrM  rL  dataepic_objrF  r9  sub_task
tasks_codesub_task_coder4  r5  s4                                                       r   r0  zCmfImport._process_import_excelX  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]  ru   CmfPricer;   rO   r   r  r<   pricesr  r   
deal_itemsr   r   r  r   CmfDealItemsr  dealr  r  )r   rX  r  r  price_settingr  r  items           r   _process_productzCmfImport._process_product  s
    ##C):;; 	7 	47 	) 	)H& )8M+BCS+TXk+k+k (*&&&##wzWaIbAcAc040@' $ T T 	OOG7=Q[C\;];]hlhu/3 $ 5 5EJJLLL$'''.// 	/ 	/D!TW,,KKMMMO!((....  f&9v?P?]+4dDG*D|UY[b[eFf)g ! i i)]3444	? 	IIKKKr   c                    |s|r|j         sd S d }| j        D ]}|d         r|d         d         dk    r|}|sd S g }t          j                            |d                   }|s5t                              |d                   }|                                 |                    dd|j        g           |r|                    dd|j        g           n"|                    dd|j         j        g           |                     |t          j	        |          }|
                    d	d
g           |j         s|r||_         n|j         |_         |j        s||_        |j        r|                                 |S )Nr  r  zCmfDeal.pipeliner  ry  pipeline_idr  
company_idcompanypipeline)r  r]  r9   CmfPipeliner;   r<   r   rO   r  CmfDealru   r  r  )	r   rX  contactr  pipeline_settingr  r"  r  r  s	            r   _process_dealzCmfImport._process_deal:  s    	 	w 	47 	, 	,H& ,8M+BCS+TXj+j+j#+  	4%))/?
/K)LL 	))/?
/K)LLHMMOOOtX[9::: 	ENNL$
;<<<<NNL$0BCDDD  fng>>)Z0111| 	/ /&&} 	%$DM? 	IIKKKr   c                    dd l }dd l}dd l}| j        r |j                     | j        z
  dk     rd S  |j                     | _        t	                      }	 |                    |j        |j                  }|                    d           |                                d         |d<   |	                                 n# t          $ r d|d<   Y nw xY w	 |                                |d<   n# t          $ r d|d<   Y nw xY w|                                |d<   |                    |                                           |d	<   | j                            d
|            d S )Nr      )z8.8.8.8P   ipzIP unavailabler  )r(  r   r   memorydiskzSTATS )r  r   socketr^  r  AF_INET
SOCK_DGRAMconnectgetsocknamecloseOSError
getloadavgr  
disk_usager  rZ   r   )r   r  r   r  statsrz  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   
   rR  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<   ry   rZ   r   rm   r  r   r  )r   r  r  totalusedfreefree_gbrz   s           r   r  zCmfImport.is_cancelz  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().(r8  Tr,  r-  r.  r/  )r   rB  r  r  r   r   r:  r;  )methodr  r  r   params_lr6  r7  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 )/   
        Отменяем импорт
        rc  rO   N)r9   r[  r  rr  )r   rb   s     r   rc  zCmfImport.cancel  s<    
 	##HfTl;;;++-----r   c                 f    |                      g d           | j                            |           S )uk   
        Предварительный просмотр получившихся объектов
        r  r   )ru   rv   rg  r   r   rb   s      r   rg  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   rX  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sessionr?  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)rm   r   zimport.system:default)r  rv   rt   r9   r\  r;   r   s    r   _calc_workflowzCmfImport._calc_workflow	  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   )ru   r	   r5   r   r   rv   ui_namer  r   r   r   )r   ress     r   r  zCmfImport.get_download_path	  s    56777*++448K8Q8Q8S8S5^5^5^__;)/ 	E,,t{1=CDDC		4	...
r   c                 :    | j                             |            d S rW  )rv   download_datar   s    r   r  zCmfImport.download_data	  s    !!$'''''r   c                 :    | j                             |            d S rW  )rv   download_filesr   s    r   r  zCmfImport.download_files	  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 )Nr,  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   r2  r3  r   ttlr%  redis_dblock_keyr  piper   s              r   r%  zCmfImport.inc_stat	  s   (??_```**h****<g*****~""8R"88	b((** d		$'----$HHS%CH0000__S)) -IIcNNNNHHS!H,,,              b#- b b b`a``TY``RVR^``aaaaaaaabb#- b b b`a``TY``RVR^``aaaaaaaab e4444744C}}}H>&&x&<<DLLNNNf  s++ '@Q@W@[@[\dfh@i@i0i0i!0022 'd		$'-555d&7&A,&OTWXXX' ' ' ' ' ' ' ' ' ' ' ' ' ' '
fLLNNNNN'1 f f fGGd!ddddVZVbddeeeeeeeeeffLLNNNN'1 f f fGGd!ddddVZVbddeeeeeeeef! s   /F BD'F 'D++F .D+/F 3E F-FFG;F-,G;-G8-G3.G;3G88G;AM6 AL9M6 L		M6 L	M6 L' 'M3;-M..M36O8NOO!-OOOOc                 x   t           j        }i }|j                            | j        j                  D ]}|                                }|                    |          }|                    d          ^}}}|                    |          st                      ||<   |                                ||         |<   |S )Nr,  )
r  r  r  smembersrO   r   r   r;   rH  r  )r   r  r  r%  r   r3  r2  r  s           r   r+  z CmfImport.get_redis_import_statsH	  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  )ru   r  r#  r   r+  r   s    r   ri  zCmfImport.take_import_statsU	  sH    -~>???!]22$****,,,r   c                    |                      g d           | j        dk    s| j        j        dk    rdS t          j                                        st                      }|                                std}| 	                    |t          j                   || _        | j                            d          | _        |                                  |                                  dS d	S )
Nr  r*  r  r  r  import-plannedFu   Импорт прерван по неизвестной причине. Проверьте системные требования.r   rR  rS  T)ru   r  r  rm   r  r
  import_is_runningCmfImportWorker
is_runningra   r7   rp   r*  r  r  r<   ru  )r   workerr*  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[  ro  r  r  r   r  r  admin_alert)rz   s    r   
cron_checkzCmfImport.cron_checkm	  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  rA  rm   r	  r@  r)   r#  ro   r  r   u   Проект 'u   ' не найденu   Проект u.    не содержит данных дампаproject_dirr   u*   В данных дампа проекта uA    отсутствует путь до каталога дампаu@   Отсутствует каталог дампа проекта z: 'r   Nu3   Сбор статистики по проекту 'zw+r4   entitydumpedr  r  undownloadedunprocessedu,    (сдамплено/обработано): z / r  r8  u   Незагруженные r   u   Необработанные u   Выполнено за z.4fu,   . Ссылка на файл отчета: 'Tri  zrdisk/file/z2--------------------------------------------------r   )tabulatec                 >    d |                                  D             S )Nc                      g | ]\  }}|d v 	|S ))r  r  r  r  r"   r5  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   rA  r;   r  r  r   rv   r   r	   r   r7   rN   r   rC   r6   rZ   r   r  r  project_statsr   r;  r  dumpr)   r  r   r  rl  r   r   r5   r   r   r   )r  r  rZ   r1  rv   r  r  r  end_timer#  report_filer   entity_statsr  r  r  r  r  r  r   r$  r  r&  s                          r   r(  zCmfImport.project_stats~	  s\    #'' v'@+='@'@'@AS"45'.@AS"45 +**	 $! ( 
 
   	VT-?TTTUUU& 	ecGcccddd#*-377FF 	D!17;;FCCK 	 HW  H  H  H   K  '')) 	mSZmm_jmmm   >&&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)TrX  )FrW  rV  )r  N)r  N)Br   r    r!   r   r[  ui_meta_skipapi_methodsr\  r^  r|  r	   ra  classmethodrm  ro  rr  ru  rY  r  r`  r  r   rC  r   r  r  r  rb  rj  r   r]  rM   rh  r   r  re  r   r  rd  r  rf  r'  r0  r  r  r  r  r  rc  rg  r  r  r  r<   r  r  r  r  r%  r+  ri  r  cmf_deferred_jobr  r(  __classcell__)r   s   @r   r[  r[  1  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   \    
Y Y Y6       _ . . \. 7 7 \7*.# *. *. *. *.X) ) )L L L L L L\7 7 7QS QS QS QSfr r r00 00 00d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(   Ошибка работы демона: )ry   rZ   r   r[  ru  r  r  rb  )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   )r4  r5  s   ` r   catch_exceptionsr6  	  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   r-  r   r7   r	   s        r   __init__zCmfImportWorker.__init__	  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  rm   r  r  r"  r  r   u%   ***Запускаем импорт***r  import-startedr  rT  r"  r  r   r  u2   ***Импорт успешно завершен***import-completedrS  CLOSEDu6   ***Импорт завершен с ошибками: u,   . Подробности в отчете.***rR  u   Текущая версия: r'   r(   /files/u   Импорт данных 'u   ' завершен %d.%m.%Y %H:%Mz (UTC), <a href=(   >Журнал логирования</a>Trz   personr)   r\   force_notify_current_person)'rZ   r   r9   r[  r;   r   ra   r  r  r  r<   ry   r  r  r	  r
  r'  geventrF  rO   rq   rE  rm   r  r5   EVA_VERSIONr:   r   r@   r   r   	CmfNotifyplace_notifyr=  r)   r   r   r   r  )r   r  rz   r  rJ  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  rm   r?  r   u!   ***Запускаем дамп***r  r@  rA  r   r  u.   ***Дамп успешно завершен***rC  r  u2   ***Дамп завершен с ошибками: z***rR  rS  r   rD  u'   Дамп данных завершен rE  z
, <a href=rF  TrG  )"rZ   r   r  r  r	  r
  r9   r[  r;   ra   r  r  r  r<   ry   r  r  rq   rE  r  rJ   baseFilenamer   r5   r   rL  rM  r  current_personr)   r   r   r   r  )r   r  rz   r  res2rJ  rO  s          r   	dump_datazCmfImportWorker.dump_data&
  s   2333  "" 	a 	aG$:$:$<$< 	a 	ag>X>X>Z>Z 	a 	a"&&tdD)5LvW[]fNg.h.c.c.c ' e eC GG788888]`p8qqCJHHJJJLLL##%%C%%''D*00tS8Q0RRF t F 
 PQQQ \<<<RR




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


z*1-:BB6CTV_``H+	a 	a 	a 	a 	a 	a 	a 	a 	a 	a 	a 	a 	a 	a 	a 	a 	a 	a 	a 	a 	a 	a 	a 	a 	a 	a 	a 	a 	a 	a 	a 	a 	a 	a 	a 	a 	a 	a 	a 	a 	a 	a 	a 	a 	a, 	%%#N(,x|:T:Tg N N#N N N(, 	& 	. 	. 	. 	. 	.sZ   II(F<H0$I0H44I7H48I;II	II	II"%I"r%   Nc           
         | j                             d           t                                          5  t                                          5  t                                          5  t          j                            ddd|gdd|ggddgd	          }|j	        
                    d
          |_        |                                 t                       	 d}d}|j                             d           t          j                            dd|gd          D ]}}	 |j                             d|            |                    dd           t                       F#  t#                       |dz  }|j                             d| d           Y {xY wt          j                            ddd|gdd|ggg dd	          }|j        D ]y}	 |j                             d|            |                    dd           t                       F#  t#                       |dz  }|j                             d           Y wxY w|s;|j	        
                    d          |_        |j                             d           n=|j                             d|            |j	        
                    d          |_        nw# t*          $ rj}t#          |           |j                             d|            t-          |          |_        |j	        
                    d          |_        Y d}~nd}~ww xY w|                                 t0          j        j                                         n<# |                                 t0          j        j                                         w xY w	 ddd           n# 1 swxY w Y   ddd           n# 1 swxY w Y   ddd           dS # 1 swxY w Y   dS )r  u   Отмена запущенаr  rO   r  rm   r  r  T)r   r   r  zimport-cancelingrS  r   Nu#   ***** Отменяем импортr   )r   r  u   Удаляем )r  r  r"  u#   Не удалось удалить uW   , видимо обьект использовали вне данных импорта)r  r  import_objectsuy   Не удалось удалить, видимо обьект использовали вне данных импортаzimport-canceledu,   Успешно отменили импортu#   Количество ошибок: rR  u   Ошибка удаления )rZ   r   r  r  r	  r
  r9   r[  r;   r  r  r  r<   ry   rA  r   r  r  rb  rW  r   r  r   r*  r,  r-  r.  r/  )r   r  rz   rJ  rX  r   s         r   _cancel_importzCmfImportWorker._cancel_importF
  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  rm   r?  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  r@  rA  r)   u    запущенаr"  r  r   r  rB  rS  rC  rR  u    завершенаr"   ) r9   r[  r;   rU  rv   r   rt   r  r  rZ   r   r  r  r  r<   ry   r   r  r  r	  r
  rJ  rF  rO   rq   rE  rm   r  r,  r-  r.  r/  )r   r  r  rb   rz   process_configsprocess_jira_configsprocess_configr  method_kwargsrJ  s              r   _process_entityzCmfImportWorker._process_entityx
  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   getpidrP  rt  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 re  )	r   r   r  rf  r   r   rg  rU  rt  rh  s     r   r)  zCmfImportWorker.dump
  sq    8?? 	B@AAAC	,,---r   c                    | j                                         rt          d          | j                             t	          t          j                                          | j        |  | j                                          d S re  )	r   r   r  rf  r   r   rg  rX  rt  rh  s     r   rc  zCmfImportWorker.cancel
  sr    8?? 	B@AAAC	,,---T""r   c                    t           j                            g dg d          }|rH|                                 r|j                            d           |j                            d          |_        |	                                 t                       t          d          D ]Q}t                              d           t           j                            |j        d	d
g          }|j        dk    r nRn|j                            d           |j                            d          |_        |	                                 t                       |j                            d           | j                                        s| j                            d           d S | j                            d           	 t'          j        t+          | j                                                  t.          j                   n!#  | j                            d           Y nxY w| j                                         d S )Nr  r?  r   uQ   Пытаемся остановить импорт, таймаут 1 минутаr  rS  <   r"  r  r  r  r  u"   Импорт уже прерванr  u<   Импорт остановлен пользователемu    Импорт не запущенu'   Останавливаем импортuK   Не удалось завершить процесс, он запущен?)r9   r[  r;   r  rZ   r   r  r  r  r<   ry   r  rJ  rF  rO   r  r   r   r   r   killr   	read_textsignalSIGTERMrb  rt  )r   r   rz   r  s       r   rh  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 re  )	r   r   r  rf  r   r   rg  rc  rt  r  s      r   r  zCmfImportWorker.process_entity  sz    8?? 	B@AAAC	,,---d-f---r   c                     | j                                         r[t                              t	          | j                                                             rdS | j                                          d S d S )NT)r   r   r  check_process_runningr   rn  rt  r   s    r   r  zCmfImportWorker.is_running  si    8?? 	,,S1C1C1E1E-F-FGG tHOO	 	r   )r8  rV  )r   r    r!   r=  rP  rU  rX  rc  r6  rM   r)  rc  rh  r  r  r"   r   r   r  r  	  s       - - - -$. $. $.L. . .@0, 0, 0, 0,d\I \I \I|            :       r   r  ))r   decimalr   r   r   r7   r   rn   r;  r	   r  r  bs4r
   r   r  r  r  r   cmf.includer,  r   common.fieldsr   r:  r   r   ro  	functoolsr   localr   r  rL   Filterr   r$   r   r[  r6  r  r"   r   r   <module>r{     sh               ' ' ' ' ' ' ' '                            + + + + + +                  $ $ $ $ $ $ ' ' ' ' ' ' 				       Y_
 EKMM	3 3 3 3 3gn 3 3 3
L0 L0 L0 L0 L0 L0 L0 L0ft t t t t t t tn!t t t t tnj.B t t tn%  a a a a a a a a a ar   