
    i                       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 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jD                        Z# G d d      Z$ G d d      Z% G d de$e%ejL                        Z&d Z' G d d      Z(y)    )copy)Decimal)datetimetimezone)LoggerNPath)BeautifulSoup)cached_property)*fields
cmf_import
log_configwrapsc                       e Zd Zd Zy)AnonymousFilterc                     t        |dd      S )N	anonymousF)getattr)selfrecords     ./common/models/cmf_import.pyfilterzAnonymousFilter.filter#   s    v{E22    N)__name__
__module____qualname__r    r   r   r   r   "   s    3r   r   c                       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y)LoggingMixinreturnc                 8   t         j                  rt        j                  nt        j                  }t        j
                  j                  d|       }|sGt        j                  d|       }|j                          |j                  s|j                  ddd       t        j
                  j                  d|       }|sGt        j                  d|       }|j                          |j                  s|j                  ddd       t        j                  |j                  ddt         j                  t         j                  	      }|j                  |       |j!                  t        j#                  t        j$                               t        j                  |j                  ddt         j                  t         j                  	      }|j                  |       |j!                  t        j#                  t        j$                               |j'                  t)                      t        j+                         }|j                  |       |j!                  t        j,                                t        j.                  j1                  t2        |||      }|j5                          t        j7                  d
| j8                         }|j                  |       d|_        |j.                  s2|j=                  t        j.                  j?                  t2                     |S )uE    Журнал логирования процесса импорта data.log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(   sq    "(7<<  --11z$1O#11z$1ON!!--**3Uu*U$2266<PY]6^""("6"6<PY]"6"^$$&&22#//%TY/Z "//#220066
 	e$!!'"3"3J4H4H"IJ&44(770066
 	""5)&&w'8'89M9M'NO##O$56 "//1  '$$Z%?%?%AB ##11	
 	 ""WTWWI#67 g..;;IFGr   F   msgrS   c                 L     | j                   j                  ||fd|i||d| y)uI  Логируем как обычные лог для веб так и со скрытыми данными для возможности отправки в СТП

        Args:
            msg (str): сообщение
            level (int, optional): уровень логирования. Defaults to logging.INFO.
        r   )extraexc_info
stacklevelN)rZ   log)r   r\   rS   r   r_   r`   kwargss          r   ra   zLoggingMixin.logh   s;     		
 	*!	
 	
r   N
error_codeobj_typeext_href	dump_path
error_typec           
         | j                  |t        j                  d       t        j	                  ||| |||t        j                         |      }|rx|j                  |_        |j                  |_
        |j                  dg       |j                  j                  }	|	r,|	j                  |      |_        |	j!                  |      |_        |j%                          t'                y)u7  Логируем ошибки и записываем их в базу

        Args:
            msg (str): текст ошибки
            error_code (int, optional): Код ошибки для нахождения возможного решения или группировки. Defaults to 1.
           )r\   rS   r`   )textcoder   rf   rg   rd   	tracebackre   cmf_import.pluginN)ra   r7   ERRORr9   CmfImportErrorrl   
format_excr)   title
class_namerd   load_fieldsr   plugincalc_ext_hrefre   calc_dump_pathrf   r<   
cmf_commit)
r   r\   rc   objrd   re   rf   rg   import_errorrt   s
             r   	log_errorzLoggingMixin.log_error   s      	S!<,,#2<8<7@8B6>7@7K7K7M6> - / !$L$'NNL!OO012^^**F(.(<(<S(A%)/)>)>s)C&r   c                 z    d| j                  d       d} t        j                  d|  d|        t        |        y )Nu1   Ошибка при импорте данных. .ue   . Проверьте загружаемый файл и повторите попытку снова.zCmfImportError: : )stripr7   error	cmf_alert)r\   es     r   
_log_errorzLoggingMixin._log_error   sB    A#))C.AQ  Rw  x(Rs34#r   c                     t         j                  j                  d| dg      }|s't         j                  d|       }|j                          |j                  s| j
                  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   sp      --11z$X]W^1_#11z$1ON!))KK^,!!!r   c           	         t        | j                  d            }|j                  dd       t        j                  |      D cg c]  }t        j
                  j                  t        j
                  j                  ||            rEt        j                  d|      r/t        j
                  j                  d| j                         |       }}|S c c}w )u   
        Список файлов после logrotate, чтобы можно было загрузить историю
        T)parentsexist_okz%(?:data|anonymous_data)\.log(\.\d+)?$files)
r	   get_files_dirmkdiroslistdirpathisfilejoinrematch)r   r   rb   dir_pathf	file_lists         r   get_log_filenameszLoggingMixin.get_log_filenames   s     **401td3MOZZX`Ma Prww||Ha'@A"JAN WW\\'4+=+=+?C P	 P Ps   B	Cc                    dd l }t        | j                  d            }|j                  d      }t        j
                  j                  |      rt	        j                  |       |j                  |d      5 }| j                         D ]3  }|j                  dt        j                        }|j                  |       5 	 d d d        t        j
                  j                  d| j                         d      S # 1 sw Y   8xY w)Nr   Tall_logs.zipw/filesr   )zipfiler	   r   joinpathr   r   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   s    **401$$^477>>(#IIh__Xs+ 	'u!335 '	%--h8I8IJ	I&'	' ww||GT%7%7%9>JJ		' 	's   6AC55C>c                 2   dd l }t        | j                  d            }|j                  t	        j
                         j                  d       d      }| j                         }|r|j                  |d      5 }| j                         D ]H  }|j                  dt        j                        }|j                  |       t        j                  |       J 	 d d d        t        j                  j!                  d| j                         d      S y # 1 sw Y   9xY w)	Nr   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   s    **401$$(?(?(M'Nm%\]//13/ )5!%!7!7!9 )I ) 1 1(F<M<M NIKK	*IIi()) 77<<););)=~NN ) )s   8ADDc           	      8   dd l }dd l}|j                  g d      }| j                  dt        j
                         |D ][  }| j                  dj                  |j                  d   |j                  d   |j                  d	         t        j
                         ] | j                  d
t        j
                         |j                  ddg      }|j                  d      }|j                         }|D ]#  }| j                  |t        j
                         % y )Nr   )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   	processesprocessoutput
output_strlineslines	            r   
log_detailzLoggingMixin.log_detail   s    ''.I'J	'w}}=  	GHH)00e1DgllSYFZ\c\h\his\tumm  	 	-W]]C(()V)<= ]]7+
%%'  	0DHHTH/	0r   )zERR-0001NNNNr   ) )r   r    r!   r   r   rZ   r7   r8   strintra   rz   staticmethodr   r   listr   r   r   r   r"   r   r   r$   r$   '   s    = = =D \\

 
6 %#$$ $
 $ $ $ $L  

"	D 	KO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y)CrossLinkMixinc                    g }t         j                  j                  ddg dgdg      }|D ][  }|j                  s|j	                  t
        j                  j                  |j                  j                        j                         ] |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pluginsrt   s       r   _get_plugin_urlszCrossLinkMixin._get_plugin_urls   s     ""''
 ; ( 
  	NF>>KK--fnn.B.BCLLM	N r   c                     t        | j                  d      s| j                         | j                  _        | j                  j                  S )N	_api_urls)hasattr	__class__r   r   r   s    r   api_urlszCrossLinkMixin.api_urls  s5    t~~{3'+'<'<'>DNN$~~'''r   c                    |j                  d       D ]  }|j                  d      }|s-| j                  j                  t        j
                   d       Ct        j                   d| }t        j                  j                  |d      }|s0| j                  j                  t        j
                   d| d       |j                  t        j                  j                  |              y	)
u=   Заменяет макросы задач YouTrack и Kaitenc                 $    | j                  d      S )Ndata-issue-id)has_attr)tags    r   <lambda>z6CrossLinkMixin._replace_issue_macros.<locals>.<lambda>  s    S\\/-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K 	HCww/H##!))**}~ (445RzBL>>%%\D%QD##!))**deqdrrst V00@@FG!	Hr   c           	         |j                  ddi      D ]  }d}|j                  d      }|s-| j                  j                  t        j
                   d       Et        j                  j                  ddd	d
| dgdd|ggdgd      }|s0| j                  j                  t        j
                   d| d       |j                  t        j                  j                  |              y)u/   Заменяет макросы задач Jirazdata-macro-namejirar   Nzdata-jira-keyuW    Не удалось найти код задачи в атрибуте 'data-jira-key'ORimport_raw_jsonLIKE%"key":""%rk   =Tr   r   r   <    Не удалось найти задачу по коду 'r   )r   r;   rZ   r   r   r   r9   r   r   r   r   )r   r   r   rx   task_keys        r   _replace_jira_macrosz#CrossLinkMixin._replace_jira_macros0  s   ==(96'B=C 	GCCww/H##!))*  +B  C ..$$&(8*B0GHS(+
 **!% % C ##!))**fgofppqr V00@@EF3	Gr   c                     	 t         j                  j                  |      S # t        $ r;}| j                  j                  t        j                   d| d|        Y d}~y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  sd    	<<((-- 	KK%%&&STWSXX[\_[`a 		s   ! 	A%1A  A%c                     |j                   r|j                   | j                  vry|j                  r|j                  j                  d      sy|j                  s|j                   ryy)uO   Определяет, нужно ли обрабатывать данный URLFhttpT)r   r   scheme
startswith)r   
parsed_urls     r   _should_process_urlz"CrossLinkMixin._should_process_urlW  s[     :#6#6dmm#K Z%6%6%A%A&%I   Z%8%8r   c           
         |j                  d      }|j                  d      }|j                  }t        j                  j	                  |j
                        }d}d}	d}
|dk(  r|dvrt        j                   d| }t        j                  j                  |dgd	      }|s>t        j                  j                  d
ddt        j                   dgddd| dgg      }|s0| j                  j                  dt        j                   d|        y|j                  d      	r|d   j                  d      }
	n|dk(  r_|dvr[t        j                  j                  d
dd| dgdg      }|	s| j                  j                  t        j                   d|        y|j                  d      rd}t         j#                  d|      D ]A  }t        j                   d|dd  }t        j                  j                  |dgd	      }|sA n |s0| j                  j                  t        j                   d| d       y|s0| j                  j                  t        j                   d| d       y|j$                  }
n|j                  d      rt         j'                  d|      }|s0| j                  j                  t        j                   d | d       y|j)                  d!      dd }t        j*                  j                  d"ddd#| dgd$d%|ggdgd&      }|s| j                  j                  t        j                   d'| d       y|j                  d(      rt         j'                  d)|      }|sy|j)                  d      }t        j                  j-                  |j)                  d*            }|rt        j                  j/                  d+d|gg d,gg d-d&      }|D ]  }d}|j0                  rN|j0                  j2                  r8t5        |j0                  j2                  j6                  j                  d.            }|s]|j2                  rQt5        |j2                  j6                  j                  d/i       j                  dd0      j9                  d1      d2         }||k(  s|} n- n+t        j                  j                  g d3dd4d#| dgg      }|s7| j                  j                  t        j                   d5|rd6nd7 d8| d       y|j$                  r|j$                  j;                  d9d0      j9                  d:d      d2   }
n|j                  d;      r|j                  d<      r|d<   d!   }t        j                  j/                  d
dd| gd
gd&      }|D ];  }t5        |j<                        j                  t        j                   d      s9} n |r|d!   }|s0| j                  j                  t        j                   d=| d       y|j$                  r|j$                  j;                  d9d0      j9                  d:d      d2   }
n|j                  d>      r|j;                  d1d?      }t        j                  j/                  ddd@| dgdgd&      }|D ]?  }|j2                  j6                  j                  dAi       j                  dB      }||k(  s>|}A |s| j                  j                  t        j                   d=| d       y|j                  dC      ru|j                  dD      rd|dD   d!   }t        j>                  j                  d
dd| g      }|s| j                  j                  t        j                   dE| dF| d       y|j                  dG      r|j                  dH      r|dH   d!   }t        j@                  j                  d
dd| g      }|s3| j                  j                  t        j                   dI| dF| d       y|jB                  j;                  dJdHd      }	n|j                  dK      rdL|v rt         jE                  dM|      }|sy|j)                  d      }t        j                  j                  g dNdd4d#| dgg      }|s3| j                  j                  t        j                   dO| dP| d       yt        jF                  j                  ||dQdRdS      }|s3| j                  j                  t        j                   dT| dF| d       ydUdVdWdXdYdZd[d\}|j                  dHdg      d!   }|r|d]k(  r|}n|j                  |      }|s6| j                  j                  t        j                   d^| d_| d`| d       yt        j@                  j                  ||a      } | s6| j                  j                  t        j                   db| d_| dc| d       y| }n|jH                  rdd|jH                  v rt         jE                  de|      rt         j'                  df|      }|sy|j)                  d      }!t        j*                  j/                  d
dd|! gdddg|! dhggdgd&      }"|"D ]*  }t5        |j2                  di         t5        |!      k(  s(|} n |s0| j                  j                  t        j                   dj|!        yy||	|
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  rk   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    не поддерживается. Ссылка: ')r.  r)   u9    Не удалось найти фильтр задач 'u   . Ссылка: 'kaitenz%^(?:/\d+|/space/\d+/boards/card/\d+)$z(\d+)$z%"id":z,%rO   u<    Не удалось найти задачу Kaiten по id )rx   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_paramsrx   r  r9  r   ext_coder  r   	space_key	page_namedocsdoc	doc_spacepage_idrowtinyui_liker+  board_id	filter_idproject_keyr-  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??\\**:+;+;<
F"{.'H"../r+?F$$((x!% ) C ''++!6S1G1G0H+LM*F6J;-WY4Z[ ,  ##
**++depdqr ww}%]+2237g%+^*K##'' &C}C*@Ax ( C ##!))**klwkxy   *F**X|< &2232fQRj\B((,,!"8%) - 
  ##!))**deqdrrst ##!))**dekdllmn ((F  ,yy|<H##!))**bcobppqr ~~a(,H..$$&(8*B0GHS(+
 **!% % C ##!))**fgofppqr   -IILl[EAI11%++a.AI))..32
 &* /    C $Izzcjj&@&@$'

(B(B(H(H(L(LU(S$T	$)<)<$'//55 S3 S"-"U3Z,%	 !I-! ''++=*Gx	{"5MN ,  ##!))**J-6)NKK_`l_mmnp ""#,,44UB?EEc1MbQ  !9:z~~h?W *1-G%%** &Cy/: z!% + D
  "szz?--1G1G0H.KLC"
 q'C##!))**abnaoopq ""#,,44UB?EEc1MbQ  '"**38K%%**)6[R3PQ)*!% + D
  ,,2266xDHHRX%C ##!))**abnaoopq   !:;
{@[!+.q1H''++ &Cz*:; , C ##!))**UV^U__fgsfttuv   ,1I"8,Q/I%%)) &C	{*;< * C ##!))* +//8kaQ 88##Ix;D  .93HHHBHME++a.K''++:&8K=1KL , G ##!))* +%%0M,qJ "..22## 3 M !##!))* +&&-Ygl^1F  !G ;!@C!D$E#J
O %..D6:1=K+"<#-11+>"KK''%--..H V**12efresstv  $1155 -$ 6  #KK''%--. /44?=@QRYQZZklxkyyz|  !  X1D1D%DA8LIIi2Ekk!nG>>&&vWI7&&	0DE **!% ' D  s**401S\AC ##!))**fgnfop DF;;r   c                 V   |d   |d   }|d   d}|j                  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   j                  d      }|r8t        j                  |      }d| d}	fd}
t        j                  |	|
|      }t        j                  j                  |||j                  d      ||j                  dd
            S )ui   Создает новый тег ссылки на основе полученной информацииrx   r  r9  rj    T)r~   r   ?r   r  r#  z(https?://[^/]+)?(/?\bz\b)c                     rj                    d nj                   }| j                  d      }t        j                  j	                  t        t        |            |      }|S )Nz##r  full_url)r  rB  r   r   urljoinapp_base_hrefbool)r   	link_textdomainr9  rx   s      r   replacerz1CrossLinkMixin._create_link_tag.<locals>.replacer  sW    ;A388*Bvh 7sxxI"[[^F & 4 4%tF|<!!I %$r   target)rj   r  r9  rm  	view_moderH  )get_textr   r)   rk   r   r;  r@  r>  r   escapesubr9   r   r   r;   )r   r   r  	link_infor  rn  tag_textrelative_urlescaped_urlpatternrl  r9  rx   s              @@r   _create_link_tagzCrossLinkMixin._create_link_tag  s2    8$	<<4<0CM3sxx=99 I
 -7-=-=3)))2G0:0C0C3,,,M fSk	 
  ii53K=D% 66'8X>""22778$, 3 
 	
r   c                 n   |j                  d      D ]  }|j                  j                  d      r|j                  dd      j                         }|sB| j	                  |      }|sV| j                  |      sh| j                  |||      }|s~| j                  |||      }|j                  |        y)u1   Заменяет обычные HTML-ссылкиacmf_convertedr  r   N)	r   r   r;   r~   r  r  r`  rw  r   )r   r   r   r   r  rr  new_tags          r   _replace_regular_linksz%CrossLinkMixin._replace_regular_links  s    ==% 	&Cyy}}_-''&"%++-C//4J++J7//ZEI++CYGGW%)	&r   r%   Nc                 j    | j                  |       | j                  |       | j                  |       y)uU   Заменяет макросы задач и ссылки в HTML-документеN)r   r	  r|  )r   r   s     r   _replace_linkszCrossLinkMixin._replace_links  s.     	""4(!!$'##D)r   c           	      ^   |j                  ddi      D ]  }|j                  j                  d      r |j                  j                  d      }|s/| j                  j	                  t
        j                   d|        l|j                  j                  d      }t
        j                   d| }t        j                  j                  |d	
      }|s>t        j                  j                  dddt
        j                   dgddd| dgg      }|rit        j                  |      }|j                  j                  |d<   |j                  j                  |d<   t        j!                  |      |d<   d|d<   |d= h| j                  j	                  t
        j                   d|         y)ut   
        Заменяет ссылку на корневую страницу в макросе 'Page Tree'
        data-macrosz	page-treer   rz  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<  r=  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 "	Cyy}}_-$'IIMM2I$J!(##!))**abeafg 99==)=>L","8"8!9L>J**..6FY]._I"--11!6S1G1G0H+LM*F6J<.XZ4[\ 2 	 #zz*?@'0||'9'9V$-6^^-A-A\*/3zz,/G+,'-O$,-##!))* +AAMP?"	r   c           	      V   |j                  ddi      D ]  }|j                  dd      j                         dk(  r(|j                  d      }|j                  dd	      }t        j                  |      }|j                  d
      }t        j                  j                  dddt        j                   dgddd| dggdg      }|s0| j                  j                  t        j                   d| d       |j                  |d
<   t        j                  |dd      |d<   d|d<    y )Nr  wikilivesearchr   rz  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   r=  sgetr   r   rZ   r   r   rO   r  )r   r   r   macros_parametersparamsrN  r-  s          r   _replace_livesearch_space_linksz.CrossLinkMixin._replace_livesearch_space_links  sT   ==7G'H=I 	*Cww0668FB #(@ A 1 9 9(C HZZ 12F

#45I'',,vZ-C-C,DC'HI&8I;b1IJ v - G ##!))* +UU^T_ `UV (/

F$%,0JJ"% -7 -C()
 $*C =	*r   c           	      `   |j                  dddgi      D ]  }|j                  d      }|j                  d      xs |j                  d      }t        j                  j                  dd	d
t        j
                   dgddd| dgg      }|s0| j                  j                  t        j                   d| d       t        j                  j                  ||d      }|rt        |j                        |d<   | j                  j                  t        j                   d| d        y)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   r=  r   r   rZ   r   r   r<  r   rO   )r   r   r   rX  rO  r-  excerpt_pages          r   _replace_include_page_linksz*CrossLinkMixin._replace_include_page_links-  s`    ==8I>7Z'[=\ 	C''"9:K 56Z#''BY:ZI''++vZ-C-C,DC'HI&8K=1KL , G ##!))* +u vA  uB BUV
 !--11!% 2 L
 +.|+?'(##!))* +tt}s~ UV5	r   c           	          |j                  ddi      D ]  }|j                  d      dk(  rd}d}d}d}|j                  d      }|r]t        d |j                  d	      D              }|j                  d
      r+|d
   }	|	dk(  r|}nd|	v r|	j                  dd      \  }}n|}|	}|rqt        j
                  j                  dddt        j                   dgddd| dgg      }|s1| j                  j                  t        j                   d| d       |rUt        j                  j                  ||d      }|s1| j                  j                  t        j                   d| d       [|xs |}
|
r|j                  d      }d|
j                   |_        |j                  d       }t        j!                  |      }t#        |
j$                        |d!<   t        j'                  |d"d#$      |d <   d|d<    y)%u   
        Добавляет ID документа в параметр 'Родительская страница' макроса 'Отображение дочерних'
        r  zchildren-docsr   rz  r  Nzoriginal-data-macro-parametersc              3   |   K   | ]4  }t        |j                  d d            dk(  r|j                  d d       6 yw)r  r  r[   N)lenrD  ).0params     r   	<genexpr>z@CrossLinkMixin._replace_childpages_page_links.<locals>.<genexpr>`  s;      15;;sA./14 KKQ'1s   :<|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;   dictrD  r9   r=  r   r   rZ   r   r   r<  findr)   stringr  r  r   rO   r  )r   r   current_projectr   r-  documentrN  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 G	*Cww'61GHIH(+0P(Q%(,0 1!:!@!@!E1 -)
 -0084V<Ds{"1.2jja.@+	8"1#' ++//!6S1G1G0H+LM*Gx	{"5MN 0  KK''%--. /YYbXc dYZ !--11!"%) 2 
  KK''%--. /AAI
 KRS "-gK#&883J8#K ,/0@0@/A*B '#&77+B#C $45'*;>>':|$/3zz!&) 0: 0+,
 $*C OG	*r   c           
         |j                         D ]  }|s|j                         D ]  \  }}|s	t        j                  dt        j                        }|j                  |      s@t        |d      }| j                  |       dj                  |j                  j                  D cg c]  }t        |       c}      ||<     |S c c}w )u   
        Конвертирует ссылки, которые могут быть в макросе "Свойства страницы"
        z
<a .+?</a>)flagslxmlr   )valuesitemsr   compileIrA  r
   r~  r   bodychildrenr   )r   detailsdetailr!  r   rv  
value_soupxs           r   _replace_details_linksz%CrossLinkMixin._replace_details_links  s     nn& 	RF$lln 
R
U**]"$$*?~~e,*5&9
##J/ ggz7O7O&P!s1v&PQs
R		R   'Qs   'C	task_raw_datalocal_linksc                    |xs g }|j                  dg       D ]  }|d   }|d   }|j                  d      dk7  s&|j                  d      dk7  s|j                  dd	      rHt        j                  d
|d         }|sd|j                  d      }t        j
                  j                  ddd| gd      }|s||vr|j                  |       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   rA  rB  r9   r<  r   )	r   r  r  
remotelinkremotelink_objremotelink_appr   rS  rQ  s	            r   _get_remotelinkszCrossLinkMixin._get_remotelinks  s    !'R'++M2> 	/J'1N'6N ""6*.HH>>.1[@>>+u5 IIE~V[G\]E++a.((,,$fG9o>%) -  k)&&s+*.
;'/	/2 r   c                 ,   d}	 |j                   j                  xs d}t        |d      }|j                  sy | j	                  |       dj                  |j                  j                  D cg c]  }t        |       c}      |_         |j                  r|j                  d       t                t#        |      S c c}w # t        $ rI}t                | j                  t        j                    d| d| d	       d}Y d }~t#        |      S d }~ww xY w)
NFr   r  T	only_datauQ    Не удалось обработать ссылки в комментарии z. ERR-0034)rc   )rj   r   r
   htmlr~  r   r  r  r   
is_changedr<   rw   r  cmf_rollbackrz   r   r   r   )r   comment	has_errorcomment_textr   r  r  s          r   _process_comment_cross_linksz+CrossLinkMixin._process_comment_cross_links  s   		"<<--3L v6D99%77DII4F4F#GqCF#GHGL!!t, 9~ $H  	NNN%%&&wx  xA  AC  DG  CH  I%   I9~	s.   2C 4C +B<=4C <C 	D
5DDc                    d}d }d| dt         _        	 t        j                  |g d      }d|j                   dt         _        t        |j                        j                  dd      \  }}|t         _        | j                  j                  t         j                   d       |j                  j                  xs d	}t        |d
      }|j                  r| j                  |       |j                   dk(  rO| j#                  |       | j%                  |       | j'                  |       | j)                  ||j*                         d	j-                  |j.                  j0                  D cg c]  }t        |       c}      |_        |j                   dk(  rt|j2                  rh|j2                  j                  }	|j4                  j                  }
|	j7                  d      }|r)| j9                  |      }||	d<   ||
d<   |	|_        |
|_        |j                   dk(  rK|j:                  r?| j=                  |j:                  j                  |j>                  j                        |_        |j@                  r;tC        |d      r|jE                  d       n|jE                  d       tG                |jH                  D ]#  }|jJ                  dk(  r| jM                  |       % 	 tU        |      S c c}w # tN        $ rG}tQ                | jS                  t         j                   d| d|       d}Y d }~tU        |      S d }~ww xY w)NF[])
r*   rj   
text_draftr  	macros_dbmacros_db_draftr  r   zcomments.log_levelzcomments.textr   r   r  u/    Обработка ссылок объектаr   r  r<  r  r   r  T)save_importr  r[   uQ    Не удалось обработать перекрестные ссылки. r  )rc   rx   )+r   r   cmfutilget_obj_by_idrk   r   r   rD  r   rZ   debugrj   r   r
   r  r~  rr   r  r  r  r  r*   r   r  r  r  r  r;   r  r  r  r  r  r   r<   rw   comments	log_levelr  r  r  rz   r   )r   obj_idr  rx   r   _obj_textr   r  r  r  r  r  r  s                 r   _process_obj_cross_linksz'CrossLinkMixin._process_obj_cross_links  s   	 ]
E	'' ( C $%SXXJaJ _224;NK%0J"KK!3!3 44cdexx~~+H 62Dyy##D)>>]266t<88>44T:77cjjI77DII4F4F#GqCF#GH~~.3==MM//	"%"5"5";";#--	2"99'BG+2Ii(18OI.$-CM*9C'~~*s/B/B"&"7"7''--OO))#
 ~~3-HHH.HHtH,<< ;$$)11':; 9~O $H<  	NNN%%&&wx{w|}%  
 I9~	s+   EK/ *K*<E"K/ *K/ /	L?83L::L?c                     ddl m} d} |d      5  	 | j                         rn+|j                         }|dk(  rn|| j	                  |      z  }<d d d        |j                  |       y # 1 sw Y   xY w)Nr   )cmf_contextF)init_views_and_dsDONE)cmf.appr  	is_cancelr;   r  put)r   	obj_queueerror_queuer  error_countr  s         r   _cross_links_workerz"CrossLinkMixin._cross_links_worker9  sy    '51 		E>>#"V#t<<VDD 		E 	$		E 		Es   >A**A3c                    t         j                         5  t         j                         5  t         j                         5  t         j	                         5  | j                          | j                         | _        d}t        t              |   }d }|r t        j                  j                  |      }| j                  d|j                   d| d|        t        j                         }t        j                         }	g }
| j                  d| j                           t#        j$                         }t'        | j                         D ]_  }t)        j*                  | j,                  d| ||	d	      }|
j/                  |       |j1                          | j                  d
|        a | j                  d|j                   d       d}g dg dg}|r|j/                  dd|g       |j3                  |ddg|||z   g      }|D ]4  }| j5                         r n"|dz  }|j7                  |j8                         6 |
D ]  }|j7                  d        |
D ]  }|j;                           t#        j$                         |z
  }| j                  d|j                   dd d||z  dd       |	j=                         s$||	j                         z  }|	j=                         s$| j                  d|j                   d|        |cd d d        cd d d        cd d d        cd d d        S # 1 sw Y   nxY wd d d        n# 1 sw Y   nxY wd d d        n# 1 sw Y   nxY wd d d        y # 1 sw Y   y xY w)Nr   )rO   r  uc   ] Обработка ссылок на локальные задачи и документы start=z limit=uJ   Обрабатываем ссылки в несколько тредов: r  )r  r  )rm  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   r=  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  modelr-  r  r  threads
start_timeithreadcnt_filterr_  rx   elapsed_times                      r   process_cross_links_by_modelz+CrossLinkMixin.process_cross_links_by_modelJ  sb     " D	##%D	'')D	 ++-D	 ))+!224DNKL,EG ++//:/>HHE&&' (wug/ I++-KGHHabfbzbza{|}**,J4334 T"))33.qc2%.'2 v&I&RST HHq++,,^_`C13RSG#w78;;d|eem,  D
  &>>#qcff%	&
 " &f%& "   ,,.;LHHE&&'r&1CC,DVWZC[[~ "''){00 "'')HHq++,,pq|p}~ID	 D	 D	 D	 D	 D	 D	 D	 D	 D	 D	 D	 D	 D	 D	sd   M%ML;J
L&	"L&		L;
	M	M%&L/+L;2	M;M M	M%M	M%%M.c                 &   dd l }d| d|t        j                  ||nd|j                   dd}dj	                  |j                         D cg c]  }t        |       c}      }|j                  dddd| j                   d	| d
gddt        dd      t        dd            }| j                  j                  d|j                   ddj	                  |j                         D 	
cg c]  \  }	}
|	 d|
  c}
}	       d       |S c c}w c c}
}	w )Nr   r   )r  rM   r  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(r  ))r   r5   IMPORT_OBJ_CNTrO   r   r  r   PopenopenrZ   r   r   r  )r   r  rM   r-  r   r  p
params_strprockvs              r   _execute_cross_linksz#CrossLinkMixin._execute_cross_links  s+    j\+**%,_'Agjj\:K	
 YY@1A@A
"K8	 B;;E,bJ
 "<dC@$G   

 	DHH: 		&,,.A$!QaS!:ABC1F	

 %  A Bs   D&Dc                    d}|r 	 t        |t              rt        j                  |      }t        |t        j
                  t        j                  f      rt        j                         }t        j                         5  || j                  |j                        z  }ddd       t        j                         |z
  }| j                  j                  d| d|dd|        |S t        d|j                  j                    d      	 | j'                         | _        d}|X|}t        j*                  j-                  ddd|gdd|gdd|gdd|gddd| dggg dg      }|s| j%                  d| d       |S t        j                         }	g dg dg}
|r|
j/                  dd|g       d| }dD ]  }t1        t              |   }|j3                  |
      }|s+t5                | j                  j7                  d| d|j8                   d | d!| d"| j(                   
       t        j                         }d}g }t;        | j(                        D ]@  }| j=                  |||      }|j/                  |       |t>        j@                  z  }||kD  s@ n | jC                          ||k  rt        jD                  d
       tG        |      D ]r  }|jI                         }|||z  }|jK                  |       | j=                  |||      }|j/                  |       |t>        j@                  z  }| jC                          t ||k  rtG        |      D ].  }|jM                          |jN                  s ||jN                  z  }0 t        j                         |z
  }| j                  j7                  d#| d| d$|dd%        t        j                         |	z
  }| j                  j7                  d&| d$|dd|        |S # 1 sw Y   cxY w# t        $ r1}t#                | j%                  d| d	|        |d
z  }Y d}~|S d}~ww xY w# t        $ r }| j%                  d|        |cY d}~S d}~ww xY w)'u   
        Обработка ссылок на задачи и документы в тексте импортированных объектов
        r   Nr  u:   ] Обработка ссылок завершена за r  u    сек. Ошибок: u5   Обработка ссылок в объектах 'u#   ' не поддерживаетсяu?   ] Ошибка обработки ссылок объекта: r  u.   Ошибка обработки ссылок: r   r   task_code_prefixr  rk   r)   rO   r   r  %r  r  u    Не найден проект 'r   r  r*   u    проекта )r   r<  u#   Обработка ссылок в u    объектах 'z' (r)  u+    в несколько процессов: u$   Обработка ссылок в 'u    завершена за u    сек.u(   Обработка всех ссылок)(
isinstancer   r  r  r9   r   r<  r	  r
  r  r  rO   rZ   r  r  r   r   r  rz   get_max_processesmax_processesr=  r;   r   r  countrw   r   r  r  r2  r5   r*  r   sleepr   pollr   communicate
returncode)r   r-  rx   errorst1t2r  log_projectproject_identtotal_t1r  r  r  obj_cntmodel_t1rM   r   r  r/  r=  new_procmodel_t2total_t2s                          r   process_cross_linksz"CrossLinkMixin.process_cross_links  s     c3'!//4CcFNNF4F4F#GH**,B 779 H$"?"?"GGH**,r1BKK%%C5 Z[]^aZb c))/2 M $OPSP]P]PfPfOg  hK  L 	!%!7!7!9D #M''++ +S-@m4m4sM2!6Q}oQ+?@ /
 , G 6}oQG $$&-/NONNHc734,WI6K4 4	JL,Ekkk1GLKK5gY>QRWRdRdQeehishttu-J4K]K]J^` ((*H EG4--. 00UGLt$...7? OO'/ 

1 M 
*D!%J!-*,t,#'#<#<ZPW#Xx0!6!66)
* '/$ W .  "??doo-F.
 ((*X5HKK6zl!K=Pijrsviww  Ae4	l $$&16{mC\]efi\j k#H&	
 eH H  3%'fgjfklm!M	  	NN@F M		sU   A7P >O>AP ##P Q >PP 	Q&Q  Q	Q1Q,&Q1,Q1r%   NNNN)r   r    r!   r   propertyr   r   r	  r  r  r`  rw  r|  r~  r  r  r  r  r  r  r   r  r  r  r   r  r  r2  rI  r"   r   r   r   r      s    6 ( (
H(G: p<d	*
X&0*&P*B"HK*Z,d  <0M^%S %"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d8d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#d9d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d<d&       Z0d' Z1 fd(Z2 fd)Z3d* Z4de
fd+Z5d, Z6d- Z7d=d.Z8d/ Z9defd0Z:d1 Z;e e<ddd23      d4               Z=e	 	 d>d5e!d6e!fd7       Z> xZ?S )?	CmfImport)CSV_SETTING_NAMEcsv_import_settings_fieldsrZ   _last_statsr  r  r  download_threading_max_forksr8  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                 6    | j                   j                         S rK  )rU  r   clss    r   worker_herezCmfImport.worker_hereS  s    ##**,,r   c                 8    | j                   j                          y rK  )rU  touchra  s    r   create_worker_flagzCmfImport.create_worker_flagW  s    ""$r   c                 n    | j                   j                         r| j                   j                          y y rK  )rU  r   unlinkra  s    r   remove_worker_flagzCmfImport.remove_worker_flag[  s+    &&(  '') )r   c                     | j                   s8| j                  dg       | j                  d   D ci c]  }|d   |
 c}| _         | j                   S c c}w )Njson_settingsrT  r)   )_import_settingsrs   rk  )r   ss     r   rT  zCmfImport.import_settings`  sU    $$o./;?;M;MN_;`$aaQvY\$aD!$$$ %bs   Ac                 X    t         j                  | _        t         j                  | _        y rK  )r5   IMPORT_THREADSr  IMPORT_DOWNLOAD_THREADSrS  r   s    r   r  z"CmfImport._prepare_multiprocessingg  s    #)#8#8 ,2,J,J)r   Tc                     ddl }ddl}|j                         }|dz
  }|r| j                  d| dd       |j	                         j
                  }t        |dz        }|r| j                  d	| d
d       t        j                  rt        t        j                  |      }|r%| j                  dt        j                   dd       t        t        |dz        |      }|r| j                  d| dd       |st        d| d| d      |S )u.  
        Рассчитывает максимальное количество процессов
        для создания нескольких независимых процессов

        Returns:
            int: максимальное количество процессов
        r   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   rs  r   rt  r8  available_memoryavailable_memory_gbs           r   r7  zCmfImport.get_max_processesk  sW    	' $--/	!AHHFykQef   "002<<!"2i"@AHH78K7LLmn      5 5}EMHHA&BWBWAX YT U   C 3a 78-HHHA-Pcd  
 "7+>*? @|}  r   c                     ddl m} t        j                  j                  d   }|j
                  j                  |       s|j                  | d      } | S )Nr   )cmf_hashlibr4  ABCDEFGHIJKLMNOPQRSTUVWXYZ)	enc_table)cmf.utilr|  r9   r=  r   regex	fullmatchshort_str_enc)r!  r|  r4  s      r   get_correct_keyzCmfImport.get_correct_key  sN    ( ",,334FG%%//4++C;W+XC
r   c                     | j                   j                         s!| j                  j                  d      | _         t        |           y )NOPENstatus_type)statusloadworkflowget_default_statussuper_calc_statusr   r   s    r   r  zCmfImport._calc_status  s7    {{!--::v:NDKr   c                    | j                   d   ry | j                  r(| j                  j                         | j                   d<   y | j                  dk7  ry | j                   d   j	                  dt
        j                  j                         t
        j                  j                  d       | j                   d   j	                  dt
        j                  j                         t
        j                  j                  d       | j                   d   j	                  dt
        j                  j                         t
        j                  j                  d       | j                   d   j	                  dt
        j                  j                         t
        j                  j                  d       | j                   d   j	                  dt
        j                  j                         t
        j                  j                  d       | j                   d   j	                  d	t
        j                  j                         t
        j                  j                  d       y )
Nmodels_fieldsexcelu   Поля контактов)captionr   iconu   Поля задачu   Поля заметокu   Поля проектовu"   Поля списков задачu   Поля групп)rk  rt   calc_models_settingsr   r   r9   	CmfPersonimport_shop_fieldsr  r   
CmfCommentr=  CmfListCmfPersonGroupr   s    r   _calc_models_settingszCmfImport._calc_models_settings  s   o.;;26++2R2R2TD/99?+22?\>D>N>N>a>a>c<B<L<L<Q<Q4S 	T 	?+22?T>Dnn>_>_>a<BNN<O<O4Q 	R 	?+22?X>D>O>O>b>b>d<B<M<M<R<R4T 	U 	?+22?Z>D>O>O>b>b>d<B<M<M<R<R4T 	U 	?+22?c>Dnn>_>_>a<BNN<O<O4Q 	R 	?+22?T>D>S>S>f>f>h<B<Q<Q<V<V4X 	Yr   c                 t   | j                  g d       | j                  d   ry | j                  j                  |       | j                  d<   d| j                  d<   d| j                  d<   d| j                  d<   d| j                  d	<   d| j                  d
<   | j                  | _        | j	                          y )Nrk  attachmentsr   rt   rT  r   Tsend_invitesFremove_conflict_projects
add_suffix	pg_backupmerge_identic_names)rs   rk  rt   rV  r<   r   rb   s     r   rV  zCmfImport.calc_import_settings  s    KL/0040P0P\`0P0a,--1>*9>56+0<(*.;'4901!//		r   c                    | j                  g d       | j                  d   ry | j                  j                  j                  dd      | j                  d<   | j                  j                  j                  dd      | j                  d<   | j                  j                  j                  dd      | j                  d<   | j                  j                  j                  dd      | j                  d<   | j                  j                  j                  d	d      | j                  d	<   | j                  j                  | 
      | j                  d<   | j                  | _        | j                          y )Nr  rT  r  Tr  r  Fr  r  r   )rs   rk  r   r;   rt   r^  r<   r  s     r   r^  zCmfImport.tmplt_import_settings  s4   KL/0-1-?-?-E-E-I-I.Z^-_>*9=9K9K9Q9Q9U9UVprv9w56+/+=+=+C+C+G+GV[+\<(*.*<*<*B*B*F*F{TX*Y;'484F4F4L4L4P4PQfhm4n01040Q0Q]a0Q0b,-!//		r   c                     | j                  dg       | j                  d   D ]  }|d   | j                  k(  s|d   c S  g S )Nrk  rT  r)   r   )rs   rk  rP  )r   settingss     r   rQ  z$CmfImport.csv_import_settings_fields  sS    /*+**+<= 	*H4#8#88))	* 	r   c                     t         j                  j                          t         j                  j	                  d|        t         j                  j                          y)uJ   
        Запускаем в фоне импорт данных
        rM   N)r9   CmfAccessListactivate_admin_moderO  
run_workerrf  	import_id_args_kwargss      r   rM   zCmfImport.start  s>     	002##GY7++-r   c                 D    t         j                  j                  d|        y)uR   
        Останавливаем в фоне импорт данных
        r\  N)r9   rO  r  r  s      r   r\  zCmfImport.stop   s    
 	##FI6r   entity_typec                 ^   | j                  dg       d}||v r4| j                  j                  j                  dk7  rt	        d| dd       d|i}g }|j                         D ]J  \  }}t        |t        t        t        f      r"|j                  | d	t        |      j                          L |r!t	        d
dj                  |       dd       n|j                  |       t        j                   j#                  d| j$                  |       t        j                   j'                          y)u   
        Запускает отдельную обработку сущностей (фильтры, связи, ссылки и др.)

        Args:
            entity_type (str): тип сущности (filters, relations, links, etc.)
        rt   filters	relationscode_historyr   u4   Запуск отдельной обработки 'u?   ' возможен только для импорта из JiraTabortr  r}   uP   Недопустимые типы значений для параметров: r  ud   . Значения параметров должны быть строками или числамиprocess_entity)r  N)rs   rt   r   rr   r   r  r6  r   r   floatr   r   r   r   updater9   rO  r  rO   rf  )r   r  rb   jira_entitiesr  invalid_kwargsr!  r   s           r   r  zCmfImport.process_entity  s/    	($
 =(!!,,?F{m TP Q  - ,,. 	HJCec3%67%%RU0D0D/E&FG	H bcgclclm{c|b} ~u v MM&!##$4dggf#M++-r   c                 p    dd l }| j                         }|j                         r|j                  |       y y )Nr   )shutilget_download_pathr   rmtree)r   r   rb   r  download_paths        r   rY  zCmfImport.delete_dump3  s0    ..0!MM-( "r   rT  c           
         d}||j                   }|sg }i }t        | j                        D ]Q  \  }}|d   r,||   r'|d   d   j                  d      d   |j                  k7  r8|d   d   |k(  sD||   ||d   d   <   S |s|S  ||       }	t        t        |	d	            }
|D ]^  }|j                  j                  |      }t        |t        j                        st        |t        j                        rNd}|j                         D ])  }|j                  d
dd||   gd	d||   ggdg      }|s) n |rt        |	||       t        |t        j                        rt        |	|||          ||   }t        |t        j                        rDt!        j"                  |d      }t!        j$                  |t         j&                  j(                        }t        |t        j*                        rK|j-                  |d|g       a | j.                  d   r|j                  |dg      }|s|j                  d	      }|r|j                  |dgd      }|r|
|	_        |j                  |	j2                  dg      }|r8|	j2                   dt5        j6                  t8        j:                        d|	_        |	}|j=                          |S )u  
        Импортируем объект

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

        :return: Новый или найденный объект
        :rtype: Optional[models.*]
        Nmodel_fieldfield_qualnamer|   r   r  
field_namer   rk   r   r)   r  z**r   RUunionT)rk   r   include_deleted)r)   r   r  z%Y%m%d-%H%M%S)r  	enumeraterQ  rD  rr   r   r   r   r;   
issubclassCmfRelationCmfGenericRelationrelated_modelssetattr
CmfRelBaseCmfPhonephonenumbersr   format_numberPhoneNumberFormatINTERNATIONAL
CmfNumericr   rk  rk   r)   r   r   r   utcr<   )r   rT  r  r  r!  result_fieldsr  settingnew_objnew_coder  fieldrel_obj	rel_modelvalphonerk   s                     r   _process_objzCmfImport._process_obj9  s    ;$$CG#D$C$CD 	GJAw=)Q}-.>?EEcJ1MQVQaQaa}%n5<@CA.|<=	G M4(ww/0! 	4JLL$$Z0E%!3!34
5&JcJc8d!&!5!5!7 I'mmD64Q[I\:]5;T7:CV4W4Ybfag , iG	
 GZ9%!2!23GZ)<=*%C%1$**35"008V8V8d8de%!2!23NNJc23/	42 g&YYgtfY=F;;v&DdVTR' YYGLL$Y@F"),,qhll1KM0Z[FKKMr   c                 &    | j                  d      S )um   
        Ручка фронта для проверки конфликтующих проектов
        T)as_msg)get_conflict_projectsr   s    r   rX  zCmfImport.check_projects  s     )))66r   c           
         | j                  dg       | j                  j                  j                  dk(  ryg }ddd}| j                  d   d   d	   }|d
   D cg c]  }|d   s	|d   s|d    }}|D ]  }| j                  |d         }|j                  d      xs |d   }	| j                  j                  j                   d|d    }
t        j                  j                  ddd|
gddd|
 dggdg d      }|r8|j                  j                  d      xs |j                  j                  d      }|rK| j                  j                  j                  dk(  r|j                  dk(  s|	k(  r|j                  d   |k(  rt        j                  j                  ddd|	gdd|ggdg d       }|D ]  }d}t        |j                  xr7 |j                  j                   | j                  j                  j                  k7        }| j                  j                  j                  dk7  r2|j                  d!k(  r#d"|j"                   d#|j$                   d$|d%<   |}n| j                  j                  j                  dk(  rf|j                  d!k7  rW|j                  dk(  r+| j                  d&   d   d   d'k(  r|j&                  sd(|d)<   d*|	 d#|j)                          d$|d%<   |}n|j                  r|j&                  s|r|}|sR|j"                   d+|j$                   d,}|j                  dk(  r|d-z  }n|j                  d!k(  r|d.z  }|j&                  r|d/z  }n|r|d0z  }|j+                  ||f         d1}|rCd2d1j-                  d3 |D               d4d1j-                  d5 |j/                         D               d6}|r|S |D cg c]  \  }}|	 c}}S c c}w c c}}w )7u  
        Возвращает список конфликтующих проектов или текст сообщения для предупреждения

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

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

        :return: Истина в случае успешного импорта
        r   )CmfPluginImportMixinrT  F	first_rowr   r  r  r|   r  parent_taskchild_tasksr  	executorsr%  r=  priorityr  r  r  rk   r   
cmf_author	cmf_ownerzproject.basez
task.base%base)rk   )	cmf_modelprefixactivityztask.agile:softdev%softdevr  r-  r*   AND	parent_idr  r  r)   r  taskstree_parent_id)r)   r  Sprintsr  )r)   r  
   Доскаr8  kanban)r)   r*   r.  	list_type)r   r  
obj_fields
filter_obj)leftright)r)   r  Epics)r%  r  z	task.epicztask.epic:default)r*   r.  r)   
logic_typeTr  u   Строка r}   r  r$  import-errorstatus_codeN).%common.models.cmf_plugin_import_mixinr&  r  rk  	_get_filer  rQ  rD  r;   r  get_logic_prefixget_priorityget_status_type
setdefaultprocess_any_table_fieldsr9   r=  r  CmfWorkflowcalc_workflowCmfActivityrO   r   r*  r   r<   rk   r   	CmfFolderr  CmfListCmfTaskr  CmfLogicTyper(  r  r  r  rl   r  r  rZ   	exceptionr  r  r  r  )4r   r&  
number_rowall_parent_taskall_child_tasksall_epic_tasks	all_tasks
cash_boardcash_projectcash_workflow_task	file_readrT  executorr  parent_task_codechild_tasks_codeidxr  r  _rowfields_namer  r   project_fieldsr%  r-  r  executor_objtask_fieldsvalue_statusr  filter_tasktask_objtmp_parent_taskstmp_child_tasks	epic_nameepic_keytmp_data	tmp_taskslist_objparent_folderr<  r;  dataepic_objr5  r(  sub_task
tasks_codesub_task_coder#  r$  s4                                                       r   r  zCmfImport._process_import_excelX  s    	Ot'9'9:K'L
q	 O ONIJL!#(I#,Y#7 {e
C?t'9'9+'F#% #% $-d.M.M$N /LC"=1S !(!78H!I!O!OPS!TUV!WJ";;z26D")-"8"F"L"LS"QK!,QJHE!]2+0( #}4+0( ;'!+%47<H[^4$ $R 803Ck!n-%7J,<V$8$I$I#c($SE':5$8$E$Ec#h$OE'83%24H4X4XY\]`Ya4b$cE',D$*.GJ'?/B ")\2!>-88Y&**>+=+=f+EF!5!N!NtU[UfUfhv!wJGQ?FL!3!3F!;<"6"O"OPTV\VfVfhp"qa%kk)R8??<0/:</HK,*x<155lCH#'>9'-'9'9'G'GR[dpQWQcQcQgQgmsQgQt (H (vH (.'9'9'G'GR[OdQWQcQcQgQgmvQgQw (H (yH <D*<8/7L,,8K))0I&(/H%${D'**&EPTVabhViGjk2KKDRXR`R`LWYdf!"")),719	+f-. $'6':':;KR'P$$++H58HO$45 $&5&9&9+f:Mr&RO#**+;<;JOK$78
 $KK	26::62F	"+Agll.@.@-ABH-11(B?H*1HY''0HV$ (Wb 9I$$X.(1HW%/7N8, &>>.*<*<V*DE$*$4$4$8$8IY[_ahakakHlAZA\$8 %]M"'*:D-BRBR)S">"@J*6,31>/7"9J #7"O"O[_V\VdVd[e[e #P #gKHa >FJ~11&9:$==dFDYDYGOZb>ceu{e| #1"6"6"8 2$ & 0 0 4 4UEUW[]abk]l]o]oDp=T=V 4 !W $&6m>N>N%O%tT&\:<^`
!>>--Z-@%~~T)_R_37<9?9L9L9P9PVi9P9j  .  lH MMO $W 2H+3H(MMDM122$ ,;+@+@+B (' %'mm,<=$) ( ,,113/:, (( 1@0E0E0G ,, *'mm,<=)3 ,#,==#?#$005573>H0$MMO,,$   	(Bse2i>Q>QRURcRc>deg>h=ijJKK!!*-'DN--::~:VDKIIK	s,   Y\ +A#\ \ (5\ 	^;(B	^66^;c           	      :   | j                  |t        j                        }|r|syd}| j                  D ]  }|d   s	|d   d   dk(  s|} |j	                  dg       t        j
                  j                  |j                  t        |d         |j                  j                  dg      }|s?t        j                  |t        |d         |j                  | 	      }|j                          |j                  j                  d
       t        |j                  j                        D ][  }|j                   j                  | j                  k(  r'|j#                          |j                  j                  j%                  |       ] | j                  |t        j&                  t        j                  j(                  dd|j                  gdd|j                  gg      }|j	                  ddg       ||_        ||_        |j.                  r|j                          |S )u;   
        Импорт товара в сделку
        Nr  r  zCmfProduct.pricescurrencyfile_valprice)
product_idrw  currency_idr   )productrw  ru  r   T)forcedeal_idr  rx  )r!  r  rz  sales_order)r  r9   
CmfProductrQ  rs   CmfPricer;   rO   r   ru  r<   pricesr  r   
deal_itemsr   r   r  r   CmfDealItemsr  dealrz  r  )r   rT  r  rz  price_settingr  rw  items           r   _process_productzCmfImport._process_product  s    ##C):):;777 	)H&8M+BCS+TXk+k (	) 	*&##wzzWaIbAc040@0@' $ TOOG7=Q[C\;]hlhuhu/3 $ 5EJJL$'../ 	/D!!TWW,KKMOO!!((.		/
   f&9&9v?P?P?]?]+4dDGG*D|UY[b[e[eFf)g ! i)]34	??IIKr   c                    |s|r|j                   sy d }| j                  D ]  }|d   s	|d   d   dk(  s|} |sy g }t        j                  j	                  |d         }|s)t        j                  |d         }|j                          |j                  dd|j                  g       |r|j                  dd|j                  g       n(|j                  dd|j                   j                  g       | j                  |t        j                  |      }|j                  d	d
g       |j                   s|r||_         n|j                   |_         |j                  s||_        |j                  r|j                          |S )Nr  r  zCmfDeal.pipelinerv  )r)   pipeline_idr  
company_idcompanypipeline)r  rQ  r9   CmfPipeliner;   r<   r   rO   r  CmfDealrs   r  r  )	r   rT  contactr  pipeline_settingr  r  r  r  s	            r   _process_dealzCmfImport._process_deal:  sU   w77 	,H&8M+BCS+TXj+j#+ 	,  %%))/?
/K)L))/?
/K)LHMMOtX[[9:NNL$

;<NNL$0B0BCD  fnng>)Z01||&&}}$DM??IIKr   c                    dd l }dd l}dd l}| j                  r" |j                          | j                  z
  dk  ry  |j                          | _        t	               }	 |j                  |j
                  |j                        }|j                  d       |j                         d   |d<   |j                          	 |j                         |d<   |j                         |d<   |j                  | j                               |d	<   | j                  j!                  d
|        y # t        $ r d|d<   Y xw xY w# t        $ r d|d<   Y xw xY w)Nr      )z8.8.8.8P   ipzIP unavailabler  )r$  r   r   memorydiskzSTATS )r	  r   socketrR  r  AF_INET
SOCK_DGRAMconnectgetsocknamecloseOSError
getloadavgru  
disk_usager  rZ   r   )r   r	  r   r  statsrm  s         r   	get_statszCmfImport.get_stats]  s(    t/?/?!?1 D$499;		+ fnnf.?.?@AIIo&--/!,E$KGGI	'"--/E&M !//1h))$*@*@*BCf6%)*  	+*E$K	+
  	'&E&M	's%   AD! :D5 !D21D25EEc                    dd l }t        j                  j                          | j	                         }|j                  |      \  }}}|dz  }t        j                  j                  | j                  ddg      }|dk  rNd|_
        |j                  r:|j                          t                | j                  j                  d|d	d
       y|j                  j                   dk(  s|j"                  dk7  rId|_
        |j                  r5|j                          t                | j                  j%                  d       yt                | j'                          y)Nr   rr  r  cache_status_typerO   r   
   rA  u8   Импорт прерван, место на диске z.2fz	Gb < 10GbTimport-stoppingIN_PROGRESSimport-pauseduA   **** Импорт остановлен пользователемF)r  r  r  import_heartbeatr  r  r9   rO  r;   rO   r  r  r<   rw   rZ   r   rk   r  r   r  )r   r  r  totalusedfreefree_gbrx   s           r   r  zCmfImport.is_cancelz  s   ""335..0"--m<tT'"""dggxAT6U"VR<'CJ~~
!!$\]deh\iir"st::??//33H3HM3Y(CJ~~
##$ghr   r  c           
      $   ddl }d| dg}t        |t              r/|j                         D ]  \  }}|j	                  | d| d        dj                  |      }|j                  dddd	|  d
| dgddt        dd      t        dd             y)ul  
        Запускает выполнение метода импорта в отдельном процессе 

        Args:
            method (str): метод импорта
            import_id (str): ID импорта (CmfImport)
            params (dict, optional): параметры запускаемого метода. Defaults to None.
        r   Nr  z="r  r  r  r   zHfrom common.models.cmf_import import CmfImportWorker; CmfImportWorker().(r)  Tr!  r"  r#  r$  )r   r6  r  r  r   r   r+  r,  )methodr  r  r   params_lr0  r1  s          r   r  zCmfImport.run_worker  s     		{!$%fd# .11#Rs!-.(#"K%%+HAfXQ8
 "<dC@$G 	 
	
r   c                      t         j                  j                  d|d          t         j                  j                          y)/   
        Отменяем импорт
        rW  rO   N)r9   rO  r  rf  )r   rb   s     r   rW  zCmfImport.cancel  s0    
 	##HfTl;++-r   c                 `    | j                  g d       | j                  j                  |       S )uk   
        Предварительный просмотр получившихся объектов
        r  r   )rs   rt   r[  r   r   rb   s      r   r[  zCmfImport.preview  s+     	KL{{""d"33r   c                 *    t         |          g dz   S )Nr  )r  save_preload_fieldsr  s    r   r  zCmfImport.save_preload_fields  s    w*,/aaar   c                 B    | j                          t        |   di |S )Nr"   )r  r  r<   )r   rb   r   s     r   r<   zCmfImport.save  s!    ""$w|%f%%r   c                    | j                   ry | j                  r@| j                  j                  dk(  r't        j                  j                  ddg      | _         t        j                  j                  ddg      | _         y )Nr   zimport.system.jira:defaultsave_eval_code)rk   r   zimport.system:default)r  rt   rr   r9   rK  r;   r   s    r   _calc_workflowzCmfImport._calc_workflow  sh    ==;;4;;11_D"..228T^n]o2pDM**..4KUeTf.gr   c                    | j                  dg       t        t        j                        j	                  | j
                  j                  j                          d      }| j
                  j
                  j                  j                  r9|j	                  | j
                  j
                  j                  j                        }|j                  dd       |S )Nr  	_raw_dataT)r   r   )rs   r	   r5   r   r   rt   ui_namer  r   r   r   )r   ress     r   r  zCmfImport.get_download_path  s    567**+448K8K8Q8Q8S7TT]5^_;;))//,,t{{11==CCDC		4	.
r   c                 :    | j                   j                  |        y rK  )rt   download_datar   s    r   r  zCmfImport.download_data  s    !!$'r   c                 :    | j                   j                  |        y rK  )rt   download_filesr   s    r   r  zCmfImport.download_files  s    ""4(r   c                    d|v rt        d      d}| d| d| j                   }t        j                  }| j                   d| d}|j                  j                  |d      }|j                          	 |j                  j                         5 }	|	j                  | j                  j                  |       ||	j                  |||       n7|j                  |      r|	j                  |       n|	j                  |d|       |	j                          d d d        	 |j                          |dk7  r|sd| d| j                   }| d}|j                  j                  |d      }|j                          	 |j                  |      sd| j*                  j                  j-                  |i       v r}|j                  j                         5 }	|	j                  | j                  j                  |       |	j                  || j*                  |   d   |       |	j                          d d d        	 |j                          y y y # 1 sw Y   3xY w# t        j                  j                   $ r=}
t"        j%                  d	|
 d
|j&                   d|j(                          Y d }
~
zd }
~
ww xY w# 	 |j                          w # t        j                  j                   $ r<}
t"        j%                  d	|
 d
|j&                   d|j(                          Y d }
~
w d }
~
ww xY wxY w# 1 sw Y   xY w# t        j                  j                   $ r<}
t"        j%                  d	|
 d
|j&                   d|j(                          Y d }
~
y d }
~
ww xY w# 	 |j                          w # t        j                  j                   $ r<}
t"        j%                  d	|
 d
|j&                   d|j(                          Y d }
~
w d }
~
ww xY wxY w)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   increxecuterelease
exceptions	LockErrorgr  r)   r  r  r;   )r   r!  r"  r   ttlr!  redis_dblock_keyr  piper   s              r   r  zCmfImport.inc_stat  sj   (?_``AhZq	*<<ggYauE*~~""8R"8	b((* d		$''---$HHS%CH0__S)IIcNHHS!H,b ez477)4Ce}H>>&&x&<DLLNf  s+@Q@Q@W@W@[@[\dfh@i0i!002 'd		$''--5d&7&7&A,&OTWX'
fLLN ',  ##-- b-aSTYYKzRVR^R^Q_`aabb##-- b-aSTYYKzRVR^R^Q_`aab' ' ''11 fGG1!L:VZVbVbUcdeeffLLN''11 fGG1!L:VZVbVbUcdeefs   6J0 BIJ0 I <AN
 AL"*N
 3L. IJ0 J-02J((J-0L2KLL 2LLLL"L+'N
 .N2NN
O9NO9O6:2O1,O91O66O9c                 d   t         j                  }i }|j                  j                  | j                  j
                        D ]k  }|j                         }|j                  |      }|j                  d      ^}}}|j                  |      st               ||<   |j                         ||   |<   m |S )Nr(  )
r  r  r  smembersrO   r   r   r;   rD  r  )r   r  r  r!  r   r"  r!  r  s           r   r  z CmfImport.get_redis_import_stats		  s    <<>>**477==9 	2C**,CLL%E"yy~B1::h'#'6x #(<<>F8R 	2 r   c                     | j                  ddg       | j                  dk7  r| j                  j                  S | j	                         S )Nr  r  r  )rs   r  r  r   r  r   s    r   r]  zCmfImport.take_import_stats	  sE    -~>?!!]2$$*****,,r   c                    | j                  g d       | j                  dk7  s| j                  j                  dk(  ryt        j
                  j                         st               }|j                         sld}| j                  |t        j                         || _        | j                  j                  d      | _        | j                          | j!                          yy	)
Nr  r  r  r  r  import-plannedFu   Импорт прерван по неизвестной причине. Проверьте системные требования.r   rA  rB  T)rs   r  r  rk   r  r  import_is_runningCmfImportWorker
is_runningra   r7   rn   r  r  r  r<   ri  )r   workerr  s      r   r  zCmfImport.is_running	  s    QR!!]2dkk6F6FJZ6Z));;=$&F$$& b	'--8!*"mm>>>>Z		'')r   z	@minutely)	only_once
system_jobschedulec                     t         j                  j                         sy t        j	                  d       t         j                  j                  g ddddgggg d      D ])  } | j                         rt        j                  d|        + y )	Nz&cmf_deferred_job: CmfImport.cron_checkr  r  r  zstatus.codezNOT INr  r  r   uH   Импорт прерван по неизвестным причинам)	r9   rO  rc  r  r  r   r  r  admin_alert)rx   s    r   
cron_checkzCmfImport.cron_check.	  s     ++-	89##((:+;*<= L ) 
 		uC >>###$npst		ur   project_identifierreport_file_namec                 V   t         j                  j                  dddd|  dgdd| gdd| gdd| ggg d	gd
dg      }|st        d|  d      |j                  st        d| d      |j
                  j                  }|j                  j                  j                  d      }|s%|j                  j                  j                  d      }|st        d| d      t        |      j                         st        d| d| d      |8t        j                  t              }|j                  t        j                         ||_        |j!                  d| d       t#        j$                         }|j'                  |      }t#        j$                         }||z
  }	t        |      j)                  |      }
t+        |
d      5 }t,        j/                  ||       ddd       |j0                  j3                  d      r|D ]  }|d   }|d   }|d   }|d   }|j                  d       }|d!   }|j!                  | d"| d#| d$| d%       |r%|j5                  d&|j7                          d'|        |st|j5                  d(|j7                          d'|         |j!                  d)|	d*d+t9        d,-       t;        |
      j=                  t>        j@                  d.       d       |j!                  d/       yd0d1l!m!} d2 }g }|D ]  }|jE                   ||              g d3}|j!                  d4 |||d56      z          |j!                  d)|	d*       |j!                  d7t9        d,-       t;        |
      j=                  t>        j@                  d.       d       y# 1 sw Y   xY w)8u  
        Собирает статистику количества сдампленных и обработанных объектов
        по проекту

        Args:
            project_identifier (str): ext_id, код, префикс кода задач или название проекта
            report_file_name (str, optional): имя файла отчета. Defaults to "report.json".
            logger (Logger, optional): вывод данных отчета.
        r   r   r  r5  rk   r  r4  r)   r  rm   r  r   u   Проект 'u   ' не найденu   Проект u.    не содержит данных дампаproject_dirr   u*   В данных дампа проекта uA    отсутствует путь до каталога дампаu@   Отсутствует каталог дампа проекта z: 'r   Nu3   Сбор статистики по проекту 'zw+r4   entitydumpedr  r  undownloadedunprocessedu,    (сдамплено/обработано): z / r  r)  u   Незагруженные r}   u   Необработанные u   Выполнено за z.4fu,   . Ссылка на файл отчета: 'Tre  zrdisk/file/z2--------------------------------------------------r   )tabulatec                 \    | j                         D cg c]  \  }}|dv r| c}}S c c}}w )N)r  r  r  r  )r  )
stats_datar0  r1  s      r   	data_listz*CmfImport.project_stats.<locals>.data_list	  s8    ","2"2"4!QGG   s   ()r   u   Сдампленоu   Обработаноu   Результатr  grid)headerstablefmtu*   Ссылка на файл отчета: ')#r9   r=  r;   r  r  r   rt   r   r	   r   r7   rN   r   rC   r6   rZ   r   r	  r
  project_statsr   r,  r  dumpr)   r  r   r  rh  r   r   r5   r   r  r   )r  r  rZ   r-  rt   r  r  r  end_timer  report_filer   entity_statsr  r  r  r  r  r  r  r  ro  r  s                          r   r  zCmfImport.project_stats?	  s    ##'' v+=*>a'@AS"45'.@AS"45 +	 $! ( 
  n-?,@@STUU&&mG94bcdd##**--3377F!1177;;FCK<WI  FG  H  K '')RSZR[[^_j^kklm  >&&x0FOOGMM*I'RSTU&&(
$$W-$$&*, ;'001AB+t$ 	 IIeQ	  ;;!!), % d%h/%h/(5	%h/+//?*=9vh&RSYRZZ]^g]hhjkqjrrstuNN%@@PPRS_R`#abNN%B6<<>BRRTU`Ta#bcd KK*<*< ===JTX=Y<Z{#++F,=,=}MNaQ
 KK!) D % 5Il345^GKKxgOOPKK2<2DEFKK<]TX=Y<Z{#++F,=,=}MNaQK	  	 s   NN()TrL  )FrK  rJ  )r  N)zreport.jsonN)@r   r    r!   r   rO  ui_meta_skipapi_methodsrP  rR  rl  r	   rU  classmethodri  rc  rf  ri  rM  r  rT  r  r   r7  r   r  r  r  rV  r^  r   rQ  rM   r\  r   r  rY  r   r  rX  r  rZ  r  r  r  r  r  r  r  rW  r[  r  r<   r  r  r  r  r  r  r]  r  cmf_deferred_jobr  r  __classcell__)r   s   @r   rO  rO  1  s]   ''44 8 L &&22 6 K K9:-D - - % % * * % % %K7S 7r  
Y6   . . 7 7*.# *.X)L L\7QSfr00dt BB!F+:2 
d 
 
: . .4b&h4 ()*fX-4 -" Lu M u  !.fff fr   rO  c                 .     t                fd       }|S )Nc                    	  | g|i |}t                | j                  j                  d       t        j	                          |S # t
        $ r2}t                | j                  j                  d|        Y d }~y d }~ww xY w)Nu*   Импорт завершил работуu(   Ошибка работы демона: )rw   rZ   r   rO  ri  r  r  rQ  )r   r   rb   r  r  fns        r   wrappedz!catch_exceptions.<locals>.wrapped	  sz    	TT+D+F+CLKKIJ((*J 	TNKK!!$LSE"RSS	Ts   AA
 
	B(B  Br   )r  r  s   ` r   catch_exceptionsr  	  s"    
2Y	T 	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y)r  c                     ddl m} dd l}ddlm} |j                  |      | _         |j                  | j                   |d| d      |j                          |d| d      | _	        y )	Nr   r   r   z/var/logz.logr   z	/var/run/z.pid)
cmf.modules.logsr   r7   pathlibr	   rN   rZ   init_loggerr8   r   )r   r  r   r7   r	   s        r   __init__zCmfImportWorker.__init__	  s^    / '',
t{{DuD\,JRYR^R^_	#d+,r   c                 X   | j                   j                  d       t        j                  j	                  ddd|gdd|ggg d      }|j                          |j                  d       |j                  j                  d	d
      |_	        |j                          t                t        j                         5  t        j                         5  t        j                         5  |j!                         }t"        j%                  d       d d d        d d d        d d d        t        j                  j	                  |j&                  g d      }t        j(                  j+                  dd|g      }|j                  j,                  d
k(  r|sM|j                   j                  d       |j                  j                  d      |_	        |j                          ni|j                  j.                  dk7  rP|j                   j                  d| d       |j                  j                  d      |_	        |j                          t        j0                  j	                  d|      }t3        |j4                        j7                  t8        j:                  d      }t        j<                  j?                  ||j@                  |jB                  d|j,                   dtE        jF                  tH        jJ                        dd| dd        y # 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   xY w)!Nu   Импорт запущенr   rO   r  rk   r  r  r  r  r   u%   ***Запускаем импорт***r  import-startedr  rC  r  r  r   r  u2   ***Импорт успешно завершен***import-completedrB  CLOSEDu6   ***Импорт завершен с ошибками: u,   . Подробности в отчете.***rA  r'   r(   /files/u   Импорт данных 'u   ' завершен %d.%m.%Y %H:%Mz (UTC), <a href=(   >Журнал логирования</a>Trx   personr)   r\   force_notify_current_person)&rZ   r   r9   rO  r;   r   ra   r  r  r  r<   rw   r  r  r   r  r  geventr:  rO   ro   r9  rk   r  r:   r   r@   r   r5   r   	CmfNotifyplace_notifyr,  r)   r   r   r   r  )r   r  rx   r  r>  log_filelog_paths          r   runzCmfImportWorker.run	  s   67""4$i1H6SWYbJc*d.c # e78\\44\l4m

  " 	G$:$:$< 	g>X>X>Z 	$$&CLLO	 	 	 ""cff+` # b&&,,\44M,N::??..

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

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

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

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

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

/#(?@

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

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

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

	Y 
!!))+W+	, +	, +	, +	, +	, +	,s   ON5A)N(AK:;J>K:;K B K: 8N(9N5O0KK:,K74K::	M(	AM#	M+#M(	(M++:N%	%N((N2-N55N?	:OOc                    t         j                  j                  ddd|gdd|ggg d      }dd|j                  d	i}|j                  j
                  j                  d
k(  rhd|j                  j                  |dddd|j                  j                  |dddd|j                  j                  |dddd}|j                  |       |j                  |      }|s |j                  j                  d| d       y |d   }|j                  di       }	|	j                  |       |j                  j                  dd      |_        |j                          t                | j                  j!                  |d    d       t"        j%                         5  t"        j'                         5  t"        j)                         5   |d&i |	 t*        j-                  d       d d d        d d d        d d d        t         j                  j                  |j.                  g d      }t         j0                  j3                  dd|g       }
|j                  j4                  dk(  r~|
s2|j                  j                  d!"      |_        |j                          nJ|j                  j6                  d#k7  r1|j                  j                  d$"      |_        |j                          t8        j:                  j<                  j?                          | j                  j!                  |d    d%       y # 1 sw Y   KxY w# 1 sw Y   PxY w# 1 sw Y   UxY w)'Nr   rO   r  rk   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  r  r)   u    запущенаr  r  r   r  r  rB  r  rA  u    завершенаr"   ) r9   rO  r;   rI  rt   r   rr   r  r  rZ   r   r  r  r  r<   rw   r   r  r  r   r  r  r:  rO   ro   r9  rk   r  r  r  r  r  )r   r  r  rb   rx   process_configsprocess_jira_configsprocess_configr  method_kwargsr>  s              r   _process_entityzCmfImportWorker._process_entity8
  s   ""tY'y)
 # 
 911
 ::&&/9 <!jj77&)*< R!jj77&)*> V!jj77&)*A!#$ 4 ""#78(,,[9JJbcnbo  pE  F  G)&**8R8V$\\44%( 5 

 	
N6233DEF  " 	G$:$:$< 	g>X>X>Z 	#]#LLO	 	 	 ""vv # 
 &&,,\44M,N::??.. \\<<I[<\

''83 \\<<<X

!!#N6233FGH/	 	 	 	 	 	s<   M *L3?L&L3%M &L0+L33L=	8M  M
c                    | j                   j                         rt        d      | j                   j                  t	        t        j                                       | j                  |  | j                   j                          y Nu"   Импорт уже запущен)	r   r   r  
write_textr   r   getpidr  rh  r   r   s     r   rM   zCmfImportWorker.start
  sT    88??@AAC		,-$r   c                    | j                   j                         rt        d      | j                   j                  t	        t        j                                       | j                  |  | j                   j                          y r4  )	r   r   r  r5  r   r   r6  r$  rh  r7  s     r   r  zCmfImportWorker.dump
  sU    88??@AAC		,-r   c                    | j                   j                         rt        d      | j                   j                  t	        t        j                                       | j                  |  | j                   j                          y r4  )	r   r   r  r5  r   r   r6  r'  rh  r7  s     r   rW  zCmfImportWorker.cancel
  sW    88??@AAC		,-T"r   c                 p   t         j                  j                  g dg d      }|r;| j                         r|j                  j                  d       |j                  j                  d      |_        |j                          t                t        d      D ]U  }t        j                  d       t         j                  j                  |j                  d	d
g      }|j                  dk7  sU n n|j                  j                  d       |j                  j                  d      |_        |j                          t                |j                  j!                  d       | j"                  j%                         s| j                  j!                  d       y | j                  j!                  d       	 t'        j(                  t+        | j"                  j-                               t.        j0                         | j"                  j5                          y #  | j                  j3                  d       Y :xY w)Nr  r  r   uQ   Пытаемся остановить импорт, таймаут 1 минутаr  rB  <   r  r  r  r  r  u"   Импорт уже прерванr  u<   Импорт остановлен пользователемu    Импорт не запущенu'   Останавливаем импортuK   Не удалось завершить процесс, он запущен?)r9   rO  r;   r  rZ   r   r  r  r  r<   rw   r  r  r:  rO   r  r   r   r   r   killr   	read_textsignalSIGTERMrQ  rh  )r   r   rx   r  s       r   r\  zCmfImportWorker.stop
  s   ""*T  ^S"  T 

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

""#GH88_8UCJHHJLJJOOZ[xx KK?@BC	qGGC**,-v~~> 		qKK!!"ops   6AH H5c                    | j                   j                         rt        d      | j                   j                  t	        t        j                                       | j                  |i | | j                   j                          y r4  )	r   r   r  r5  r   r   r6  r2  rh  r  s      r   r  zCmfImportWorker.process_entity
  s\    88??@AAC		,-d-f-r   c                     | j                   j                         rRt        j                  t	        | j                   j                                     ry| j                   j                          y y )NT)r   r   r  check_process_runningr   r=  rh  r   s    r   r  zCmfImportWorker.is_running
  sF    88??,,S1C1C1E-FGHHOO r   )zeva-import-workerrJ  )r   r    r!   r  r  r$  r'  r2  r  rM   r  rW  r\  r  r  r"   r   r   r  r  	  s    -#.J.@0,d\I|        :  r   r  ))r   decimalr   r   r   r7   r   rl   r  r	   r  r  bs4r
   r   r	  r  r  r   cmf.includer  r   common.fieldsr   r
  r   r   r>  	functoolsr   localr   r  rL   Filterr   r$   r   rO  r  r  r"   r   r   <module>rJ     s      '       +       $ ' 	  Y__
 EKKM	3gnn 3
L0 L0ft tn!unj.B.B up#` `r   