
    oj;                       d dl mZ d dl d dlmZmZ d dlZd dlZd dlZd dl	Z	d dl
Z
d dlZd dlZd dlZd dlmZ d dlZd dlZd dlZd dlmZmZmZmZmZmZmZ d dlmZ d dlmZ 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(m)Z) d dl*m+Z+ d dl,m-Z- d dl.m/Z/ d dl0m1Z1  ejd                         Z3eee4jj                     ee4jl                     ee4jn                     f   Z8 G d de9      Z:ejv                   G d d             Z<d Z= G d de/      Z>y)    )cmf_context)*)cmf_hashlibcmfutilN)Path)DictOptionalListCallableUnionTypeIterator)BeautifulSoup)contextmanager)tz)permutations)dedentindent)	normalize)	BaseModel)CmfPluginImportMixin)JiraApi)JiraBaseImport)JQLNormalizerc                   (     e Zd Zdedef fdZ xZS )	DumpErrorcodemessagec                 Z    || _         || _        || _        t        |   d| d|        y )N[] )r   msgdetailssuper__init__)selfr   r   kwargs	__class__s       ./modules/jira/api_import.pyr%   zDumpError.__init__%   s2    	1TF"WI./    )__name__
__module____qualname__strr%   __classcell__r(   s   @r)   r   r   $   s    0S 03 0 0r*   r   c                   <    e Zd ZU dZeed<   eed<   eed<   d Zd Zy)EpicDatauD    Данные используемые при создании epic namekeyproject_keyc                 ,    t        | j                        S N)hashr4   r&   s    r)   __hash__zEpicData.__hash__3   s    DHH~r*   c                 4    | j                   |j                   k(  S r7   )r4   )r&   others     r)   __eq__zEpicData.__eq__6   s    xx599$$r*   N)r+   r,   r-   __doc__r.   __annotations__r:   r=    r*   r)   r2   r2   ,   s    N
I	H%r*   r2   c                       fd}|S )Nc                       fd}|S )Nc                    	 t        t        d      rd dt        j                   d }nd d }| j                  j	                  |       | j                  j                         ry | g|i |}t                |S # t        $ r_ | xj                  dz  c_        d }t        t        d      rt        j                   d| }| j                  j                  |d       Y yw xY w)	Ntask_msgz
========== r      u   Ошибка T)rollback)
hasattr
thread_ctxrD   
cmf_importlog	is_cancel
cmf_commit	Exception
has_errors	log_error)objargsr'   log_msgres	error_msgfuncr3   s         r)   wrapperz3catch_exception.<locals>.decorator.<locals>.wrapper<   s    :z2!)
!J,?,?+@$HG!)
!D62G""7+>>++-3000
 !#+D62	:z2#-#6#6"7q DI((T(Bs   A%B )B A%C)(C)r@   )rV   rW   r3   s   ` r)   	decoratorz"catch_exception.<locals>.decorator;   s    	( r*   r@   )r3   rX   s   ` r)   catch_exceptionrY   :   s    . r*   c                   	    e Zd ZU dZeed<   eeef   ed<   dZ	de
ddf fdZd	 Zd
 Zedeeef   fd       Zd Zd Zd Zd Zedededeee      fd       Zd Zdeeeef      fdZed        Zed        Zd Zedd       Zdee   fdZdee   fdZ dee   defdZ!	 	 ddZ" e#d      d        Z$ e#d       d!        Z% e#d"      d#edefd$       Z&d% Z' e#d&      d#ed'e(fd(       Z)dd)Z* e#d*      d+        Z+ e#d,      d-        Z, e#d.      d/        Z-de.j^                  fd0Z0d1 Z1d2 Z2d3 Z3d4 Z4d5 Z5d6 Z6d7 Z7d8 Z8d9 Z9d: Z:d; Z;d< Z<d= Z=d> Z> e#d?      d@        Z?dA Z@ e#dB      dC        ZA e#dD      dE        ZB e#dF      dG        ZC e#dH      ddIeDfdJ       ZEdK ZFdL ZG e#dM      dN        ZH e#dO      dP        ZIdQ ZJdRedSefdTZKdU ZL	 	 ddVZMdW ZNdX ZO e#dY      dZ        ZPd[ ZQ e#d\      d]        ZRd^ ZS e#d_      d`        ZT e#da      db        ZUdc ZVdddZWdeeXfdfZYdeeXfdgZZ e#dh      diefdj       Z[dk Z\dl Z] e#dm      diefdn       Z^do Z_ e#dp      dq        Z`dr Zads Zbdt Zcdu Zd e#dv      dw        Ze e#dx      dy        Zfdz Zgd{ Zh e#d|      dd}       Zi e#d~      d        Zj e#d      ddIeDfd       Zk e#d      dSefd       Zl e#d      d        Zm e#d      d        Zn e#d      d        Zod Zp e#d      d        Zq e#d      d        Zr e#d      d        Zsd ZtddZudefdZv e#d      defd       ZwdefdZxd Zyd Zzd Z{d Z|d Z}d Z~d Zd Zd Zd Zd ZddZd Zd Zd Zd Zd Zd ZdiefdZdiefdZdiefdZdiefdZdiefdZd Zd Zd Zd Zd Zd Zd Zd ZdedefdZd Zd Zd Zd Zd Zd Zd Zd ZdÄ ZdĄ Zdń ZedƄ        ZdǄ ZdȄ ZddɄZdʄ Ze	 	 	 	 ddededededef
dτ       ZdЄ Zdф Zd҄ Zdӄ ZdԄ ZdՄ Zdք Zdׄ Zd؄ Zdل Zdڄ Zdۄ Zd܄ Zdd݄Zdބ Zd߄ Zd Zd Zd Zd Zd Zd Zed        Zd Zd Zd Zd Zd Zd Zd Zd Zd ZdefdZd Zd Zd Z e#d      d        Zd Z e#d      d        Zd Zd Zd Z e#d      d	dedIeDfd       Z֐d  Z׈ xZS (
  JiraAPIImportu;   Класс загрузки объектов через APIrO   _JiraAPIImport__jira_fields).meta.dirty.deleted	.archived.movedjirareturnNc                    t        |   |i | || _        d| _        | j                  j                  rd| _        t
        j                  j                  d      | _        d | _	        | j                         | _        i | _        i | _        i | _        g | _        g | _        d| _        t$        j'                  d      }| j(                  j*                  j,                  |_        |j/                  | j(                  j*                  j0                         | j3                          | j5                          d | _        d| _        d | _        dd	d
d| _        | j?                          | jA                          y )Nr4   	accountIdsoftdevr   r   zatlassian.rest_clientF
logic_typepriorityresponsible)	issuetyperi   assignee)!r$   r%   rb   user_keycloudmodelsCmfActivitygetdefault_activitycloud_id_get_jira_global_settingsjira_global_settingsepicsissue_relationssubtasksboardsselected_projectsrO   logging	getLoggerrJ   loggerhandlerssetLevellevel_prepare_multiprocessing_set_fallback_personr\   update_fieldskey_pair_board_card_colors_mapping_init_projects_dir	configure)r&   rb   rR   r'   r}   r(   s        r)   r%   zJiraAPIImport.__init__a   s5   $)&)!	99??'DM & 2 2 6 6I 6 F$($B$B$D!
!!#""#:;//0099..445%%'!!#!")- &"%+
' 	!r*   c                     | j                   j                         j                  d      | _        | j                  j	                  d       y )NprojectsTexist_ok)rJ   get_download_pathjoinpathprojects_dirmkdirr9   s    r)   r   z JiraAPIImport._init_projects_dir   s9     OO==?HHT.r*   c                    t        t        dd      | j                  j                  j                  j                  dd      | j                  j                  j                  j                  dd      | j                  j                  j                  j                  dd      t        t        dd      | j                  j                  j                  j                  dd      | j                  j                  j                  j                  d	d      t        t        d
d      | j                  j                  j                  j                  dd      t        t        dd      d
| _        y )NIMPORT_JIRA_BIGGANTTFimport_custom_fieldsimport_filtersT
load_usersIMPORT_JIRA_CODE_HISTORYprocess_linksprocess_task_linksIMPORT_REFRESH_DUMPsend_invitesIMPORT_SYNC_MISSING_TASKS)
biggantt_pluginr   r   r   process_code_historyr   process_relationsrefresh_dumpr   sync_missing_tasks)getattrconfigrJ   json_settingsvaluerq   r9   s    r)   r   zJiraAPIImport.configure   s     'v/EuM$(OO$A$A$G$G$K$KLbdi$j"oo;;AAEEFVX\]//77==AA,PTU$+F4NPU$V!__::@@DD_VZ[!%!>!>!D!D!H!HI]_c!d#F,A5I OO99??CCNTXY")&2Mu"U
r*   c                 D   | j                   r| j                   S | j                  j                         j                  d      }|j	                         rF| j
                  s:t        |      5 }t        j                  |      | _         d d d        | j                   S | j                  j                         | _         t        |d      5 }t        j                  | j                   |       d d d        d| _        | j                   S # 1 sw Y   | j                   S xY w# 1 sw Y   3xY w)Nfields.jsonw+F)r\   rJ   r   r   existsr   openjsonloadrb   
get_fieldsdump)r&   	file_pathfs      r)   jira_fieldszJiraAPIImport.jira_fields   s    %%%OO557@@O	d&8&8i 2A%)YYq\"2 !!! "&!5!5!7Di& 1!		$,,a01!&D!!!2 !!!	1 1s   )C?!D?DDc                    dd l }|| _        | j                  j                         j	                  d      }| j                  j                         j	                  dt
        j                                }t        |d      5 }t        j                  | j                  |       d d d         |j                  ||       y # 1 sw Y   xY w)Nr   r   zfields.json.r   )shutilr\   rJ   r   r   osgetpidr   r   r   move)r&   fieldsr   r   file_path_tmpr   s         r)   update_jira_fieldsz JiraAPIImport.update_jira_fields   s    #OO557@@O	99;DD|TVT]T]T_S`Eab-& 	-!IId((!,	-M9-	- 	-s   ?!B<<Cc                    | j                   j                  j                  j                  d      }t	        |      | _        | j
                  r&t        j                  j                  |      | _        yt        j                  | _        y)u   
        Устанавливает резервного пользователя,
        если пользователь не будет найден в методе _get_person()
        default_user_id)idN)rJ   r   r   rq   bool_is_default_userro   	CmfPerson_fallback_persongsystem_user)r&   r   s     r)   r   z"JiraAPIImport._set_fallback_person   sc    
 //77==AABST $_ 5  $*$4$4$8$8O$8$LD!$%MMD!r*   c                 Z    | j                   j                         D ]  }|d   |k(  s|c S  y )Nr3   )r   values)r&   r3   fields      r)   _get_field_by_namez JiraAPIImport._get_field_by_name   s1    %%,,. 	EV}$	r*   c                 j    t        t        fd| j                  j                               d       }|S )Nc                 L    | j                  di       j                  d      k(  S )Nschemacustomrq   )r   
field_types    r)   <lambda>z2JiraAPIImport._get_field_by_type.<locals>.<lambda>   s"    !%%"-11(;zI r*   )nextfilterr   r   )r&   r   r   s    ` r)   _get_field_by_typez JiraAPIImport._get_field_by_type   s6    I  '') 
 r*   model
field_namec                 @    |sy | j                  |g      }|r|d   S d S )N)fields_namer   )import_shop_fields)r   r   rT   s      r)   _get_field_namezJiraAPIImport._get_field_name   s.    &&J<&@s1v&$&r*   c                     dd l }dd l}|| _         || _        t        j                  | _        t        j
                  | _        | j                  j                         | _	        y )Nr   )
	threadingqueuer   IMPORT_THREADSthreading_max_forksIMPORT_DOWNLOAD_THREADSdownload_threading_max_forksrJ   get_max_processesmax_processes)r&   r   r   s      r)   r   z&JiraAPIImport._prepare_multiprocessing   sD    "
#)#8#8 ,2,J,J)!__>>@r*   c                     g }ddddddddd	d
ddd}dddd}| j                   j                         D ]A  \  }}d| |j                  |d       }|j                  |j                  |d      ||d       C |S )uO    Сопоставление настроек для модели models.CmfTaskr3   text	cmf_ownerrj   ri   status
alarm_datedeadlinecmf_modified_atcmf_created_atstatus_closed_at
resolution)summarydescriptionreporterrl   ri   r   customfield_10015duedateupdatedcreatedresolutiondater   z.namez.watchCountz.votes)ri   watchesvoteszfields. N)model_field	json_path	ext_field)r   itemsrq   append)r&   issue_settingsdefault_local_attrs_mappingadditional_json_pathcustom_field_keycustom_fieldr   s          r)   _get_issue_import_settingsz(JiraAPIImport._get_issue_import_settings   s    !#%"!-!('0&'
#$  $ 

 /3.>.>.D.D.F 	*l!"2!34H4L4LM]_a4b3cdI!!:>>?OQUV&)# 	 r*   c                  "    dddddddddg} | S )Nr3   displayNamer   r   emailemailAddressdoes_not_workactiver@   )user_settingss    r)   _get_user_import_settingsz'JiraAPIImport._get_user_import_settings  s+     #?#.A+(C

 r*   c                  "    dddddddddg} | S )Nr   r   r   
cmf_authorauthorr   renderedBodyr@   )comment_settingss    r)   _get_comment_import_settingsz*JiraAPIImport._get_comment_import_settings
  s,     -9E(x@"@	
  r*   c                     dddddddd}||v r||   S |j                  d	      }t        |      d
k(  ry| j                  j                  |d
   i       j                  dd      S )N   ИмяEmailu   Активныйu   Создано
   Автор
   Текстu   Ключ)r   r  r  r   r	  bodyr4   .rF   r   r3   )splitlenr   rq   )r&   jsonpathmappings      r)    _get_setting_title_from_jsonpathz.JiraAPIImport._get_setting_title_from_jsonpath  sz    ##('" 
 w8$$>>#&x=A##HQK488DDr*   c                    |sy |j                  d      D ])  }t        | t              s y | j                  |      } | r) y  |r't        | t              rg d}|D ]  }|| v s| |   c S  y|rt        | t              rg }| D ]p  }d|v r|j                  |d   d          d|v r|j                  |d   d          ;d|v r|j                  |d          T|sW|j                  t        |             r dj                  |      S | S )Nr  )r3   r   r4   r   inwardIssuer4   outwardIssue,)r  
isinstancedictrq   listr   r.   join)rQ   r   to_strr   
str_fields	str_fieldresultrelated_objs           r)   _get_file_valzJiraAPIImport._get_file_val%  s   
 #//#. 	Jc4(''*%C	 jd+7J' *	#y>)* jd+F" 4 K/MM+m"<U"CD#{2MM+n"=e"DEk)MM+e"45 MM#k"234 88F##
r*   c                    	 g 	dt         t        t        t           f   dt        g t        t           f   dt
        dt        f	 fd} j                  j                  dg       d}d} j                         D ]   } j                  |d         D ]  } n |s  n  j                  d	      D ]  } n |s0 j                  j                  d
      D cg c]  }| }}|r|d   }|sE j                  j                   j                  j                  d
      D cg c]  }| }}|r|d   }|st        d      d _         || j"                  t$        j&                         |st        d       || j(                  t$        j*                         ddddddg} || j,                  t$        j.                         	j1                  dg d       	S c c}w c c}w )u-    Инициализация настроек objssettings_funcr   rc   c                    | D ]  } |       }|D ]X  }j                  ||d         |d<   j                  ||d         |d<   j                  |d         |d<   |j                  |d<   Z j	                  |j
                  |d       |c S  y )Nr   file_valr   titleicon)r3   r   )r&  r   r  r-  r   verbose_name)r(  r)  r   rQ   obj_settingssettingr$  r&   s         r)   _get_settingsz:JiraAPIImport.tmplt_import_settings.<locals>._get_settingsM  s     ,+ 1G*.*<*<S'+BV*WGJ'-1-A-A%Q^I_-`GM*'+'L'LWU`Ma'bGG$&+jjGFO	1
 u'9'9\RS
r*   zplugin.plugin.*Nr   usersrF   limitr   )username	limit_enduS   Не найдено ни одной задачи, импорт невозможенTua   Не найдено ни одного пользователя, импорт невозможенz2022-05-22T15:22:22.593+0300r  u!   Электронная почта)r   r  r  )r   r	  r  selectedObjects)r3   r   )r   r
   r   r   r   	TypeModelrJ   load_fields_get_projectsget_project_tasks_simple_getrb   
get_issues	get_usersr5  rN   r   r   ro   CmfTaskr  r   r  
CmfCommentr   )
r&   r1  taskuserprojectrQ   tasksr2  comment_exampler$  s
   `        @r)   tmplt_import_settingsz#JiraAPIImport.tmplt_import_settingsI  s   :<
	dHTN&: ; 
	)1"d4j.)A
	JS
	X\
	 	##%6$78))+ 	G..wt}= 		
 $$W- 	D	$(II$8$8q$8$ABSSBEBQx$(II$7$7ASAS_`$7$abSSbEbQxqrr "dD;;V^^L  A  AdD::F<L<LM'E6>4W'Y$02 3
 	ot'H'H&J[J[\ 	02>?= C cs   	G	Gc                    | j                  | j                  j                  d         }ddg g gdg}| j                  j	                  d      D ]  }t        |t        j                  j                     d         D ]o  \  }}|d   s| j                  ||d	         }| j                  |d   d
   |      }|d   d   j                  |d   d          |d   d   d   j                  |       q  |S )Nimport_settingsu   Задачиzcalendar-today)r,  r-  titlesrows   r3  r   r   r   r   r   rI  captionrJ  )_normalize_settingsrJ   r   rb   r=  	enumeratero   r?  r.  r&  _normalize_jira_valuer   )r&   settingsr$  issuenumr0  r   s          r)   previewzJiraAPIImport.preview  s
   ++DOO,I,IJ[,\]*4DPR]_\`abYY)))2 	3E )(6>>3N3N*OPX*Y Z 3W}-**5'+2FG227=3I,3WY^_q	(#**7=+A)+LMq	&!!$++E23	3 r*   rP  c                     i }|D ]R  }|d   s	| j                  ||d   d      }| j                  |d   d   ||j                  d            }|||d   d   <   T |S )uC    Преобразование настроек для модели r   r   F)r!  r   r   )r&  rO  rq   )r&   rQ   rP  normalized_objr0  r   s         r)   _normalize_objzJiraAPIImport._normalize_obj  s     	IG=)&&sGK,@&OE..w}/El/SUZ\c\g\ghs\tuECHN7=1,?@	I r*   c                 8   dd|j                   gg}|j                  d      r|j                  g d       n|j                  dd|g       t        j                  j                  |      }| j
                  j                  j                  j                   d|d    }t        j                  | j
                  t        j                  |d	   ||||j                  d
      |j                  d      |ddd|g      \  }}	|	r|d	   |_        |j                  d       |S )Ntree_parent_id==completeDate)sys_typerY  archiver[  r   ::r   r3   	startDateendDate)r3   parenttree_parent	list_typeplan_start_dateplan_end_dateext_idrf  
filter_objTsave_import)r   rq   r   ro   	CmfFolderrJ   pluginsource_hashr   process_any_table_fieldsCmfListr3   save)
r&   ra  sprintparent_sys_typerc  _filterrb  rf  list_objnews
             r)   _process_listzJiraAPIImport._process_list  s   $dFII67::n%NN89NNJo>?&&**'*:OO**11==>bO,EEdooW]WeWeOUV\~QWVaT]Z`ZdZdepZqX^XbXbclXmQWGI W_`dflUm	o# "6NHMMMdM+r*   u8   Обработка наблюдателей задачиc                 f   d|d    d|d   d    d}g }| j                  |      D ]H  }	 | j                  j                  r|d   n|d   }| j                  ||d	      }|j	                  |       J ||_        y# t
        $ r.}| j                  j                  d
| d| d|       Y d}~d}~ww xY w)u;   Добавляем наблюдателей в задачуu$   Наблюдатели задачи r4   : "r   r   "re   T)rQ   raise_on_erroruC   Не удалось найти наблюдателя задачи . zERR-0135rQ   N)	_get_issue_watchersrb   rn   _get_personr   rN   rJ   rP   
spectators)	r&   	issue_objrQ  rQ   r  watcheruser_idpersonexcs	            r)   _process_watcherszJiraAPIImport._process_watchers  s     5U5\N$uXW`GaFbbde
//6 
	G	26))//'+.wu~))'s4)P!!&)	
	  *	  ))YZaYbbdehdij! *  s   AA99	B0$B++B0u#   Обработка вложенийc                     d}d|d    d|d   d    di g }|d   d   D ]S  }t        |d	         }||<   |j                   j                  j                  j                  j                   d
|        U |rBt
        j                  j                  ddgdd|gg dg      }|D ]  }|j                            fd}	 j                  |      D ]0  }
| |	|
d   |
d         z  } j                  j                  dd       2 |S )Nr   u   Вложения задачи r4   : 'r   r   '
attachmentr   r^  ra  =rf  NOT INrJ   !=Nr]  c                    d}g d}d }	 j                  |       }|r|d   nd}|r|d   n| }|rPj                  j                  j                  j                   d| }t        j
                  j                  ||      }|s.dd	|gd
d	gg dg}	t        j
                  j                  |	|      }|st        j                  j                  |      \  }
}d}t        j
                  j                  |dg      r2|
 d| | }|dz  }t        j
                  j                  |dg      r2t        j                  |j                  d      }|j                  d       |j                  r|r|_        nd|_        j                  |_        |r[|j                  d      r9j!                  |d   j"                           |_        |j$                  |_        |d   |_        ||_        t-        |d      5 }|j/                  |j1                         dd       d d d        d|_        |j                  d       |r|d   }|j2                  |k(  sJ t5                |S # 1 sw Y   FxY w# t6        $ rE t5                j                  j9                  d d d|j2                   d d	d        d}Y |S t:        $ r, j                  j9                  d! d d"d#d$       d}Y |S w xY w# |c cY S xY w)%Nr   )import_originalurlurl_preview_imgurl_previewr   r   filenamer^  rf  r   r3   r  ra  rf  r  Nr   r   rF   --r3   ra  r   -Tr3   ra  rJ   r  ri  r	  r|  r   rbF)smart_backup
mark_dirtysizeu   Размер файла '' (u@   ) не соответствует размеру из меты: z	 bytes / z bytesERR-0034u;   Не удалось обработать вложение ')zERR-0035rQ   rG   )rq   rJ   rl  rm  ro   CmfAttachmentr   pathsplitextsgetrp  r  rf  embeddedra  rC  r~  rm   r  r   r   import_raw_jsonr   upload_filereadst_sizerM   AssertionErrorrP   rN   )	file_namer   errorattachment_fieldsr  attachment_metaattachment_idattachment_nameattachment_ext_idattachment_filter	base_nameextcounterr   attachment_sizeattachment_metas	issue_msgr  r&   s                  r)   _process_attachmentz?JiraAPIImport._process_attachments.<locals>._process_attachment  s    E! J["2"6"6y"A9H 5bAP/*"=V_ +/??+A+A+H+H+T+T*UUWXeWf(g%!'!5!5!9!900 ": "J
 "o6!3	2-)%
 "(!5!5!9!900 ": "J " &(WW%5%5o%FNIsG ..33,( $v 4 
 .7Kq	#*G1 !..33,( $v 4  "(!5!5,(#'??(,	 "6 "J OOO5--
 %,=
).2
+)2)9)9J&&*..x8484D4D / 9$-- H$- 5E 5J1 4>3H3HJ04CI4N
15D
2i. !"..FFH)-', /  26J.OOO5&*9&*A)11_DDD& =  " ))//@M? S55?5G5G4H	RaQbbhj!	 *     ))QRaQbbefsettuv!!	 *   sQ   DI+ +CI+ 7#IAI+ I($I+ +A
K,5K/ 80K,(K/ +K,,K/ /K6r  r   	processed)r.   r   rJ   rl  rm  ro   r  r  delete_get_issue_attachmentsinc_stat)r&   r  
jira_issueerrorsattachment_ext_idsatt_dataatt_idattachments_to_deleter  r  attachment_datar  r  s   ``         @@r)   _process_attachmentsz"JiraAPIImport._process_attachments  sb   4Z5F4Gs:V^K_`iKjJkklm	"8,\: 	`H$(F'/V$%%)?)?)F)F)R)R(SSUV\U]&^_	`
 $*$8$8$=$=sI.x);<. %> %! 4 $
!!#$h	T  $:::F 	@O),, F OO$$\;?	@ r*   uB   Обработка упоминаний пользователей	text_soupc                    ddl m}m} |j                  dv rd}nd}|j	                  ddi      D ]  }	 |j
                  j                  d	      r| j                  |j
                  d	         }n|j
                  j                  d
      r| j                  |j
                  d
         }n ||j
                  d         } ||j                        }	|	j                  d      rD| j                  |	d   d   j                               }
| j                  |
| j                           }nt        d      t        |j                  t        |j                         t        |j"                        t        |j$                        t        |j&                              d      }|j)                  |j*                          y# t        $ rD}| xj,                  dz  c_        | j.                  j1                  d| d| d|       Y d}~d}~ww xY w)u]   
        Упоминания пользователей
        confluence-userlink
        r   )urlparseparse_qsr@  a  
                <a
                    class="external"
                    href="{person_href}"
                    rel="noopener"
                    target="_blank"
                    data-macros="mentions"
                    data-mention-type="person"
                    data-object-id="{person_id}"
                    data-title="{person_login}"
                    cmf_converted="true"
                >
                    @{person_name}
                </a>
            u	  
                <span class="macros-panel mentions-macros" contenteditable="false" data-id>
                    <span class="extension-container" data-layout="default" data-id>
                        <span class="extension-title" data-id>
                            @Упоминания <span class="excerpt-title" data-id>| {person_login}</span>
                        </span>
                        <span class="macros-actions" data-id>
                            <span class="macros-delete" data-id>
                                <svg viewbox="0 0 18 18" class="ng-star-inserted" style="width: 14px; height: 14px; color: #222222;">
                                    <path fill="#222" d="M16.5 3H12.75V1.5C12.75 1.10218 12.592 0.720644 12.3107 0.43934C12.0294 0.158035 11.6478 0 11.25 0L6.75 0C6.35218 0 5.97064 0.158035 5.68934 0.43934C5.40804 0.720644 5.25 1.10218 5.25 1.5V3H1.5V4.5H3V15.75C3 16.3467 3.23705 16.919 3.65901 17.341C4.08097 17.7629 4.65326 18 5.25 18H12.75C13.3467 18 13.919 17.7629 14.341 17.341C14.7629 16.919 15 16.3467 15 15.75V4.5H16.5V3ZM6.75 1.5H11.25V3H6.75V1.5ZM13.5 15.75C13.5 15.9489 13.421 16.1397 13.2803 16.2803C13.1397 16.421 12.9489 16.5 12.75 16.5H5.25C5.05109 16.5 4.86032 16.421 4.71967 16.2803C4.57902 16.1397 4.5 15.9489 4.5 15.75V4.5H13.5V15.75Z" stroke="none" stroke-width="1" class="ng-star-inserted"></path>
                                    <path fill="#222" d="M8.25 7.5H6.75V13.5H8.25V7.5Z" stroke="none" stroke-width="1" class="ng-star-inserted"></path>
                                    <path fill="#222" d="M11.25 7.5H9.75V13.5H11.25V7.5Z" stroke="none" stroke-width="1" class="ng-star-inserted"></path>
                                </svg>
                            </span>
                        </span>
                    </span>
                    <span class="ak-renderer-wrapper" data-id>
                        <a class="external" data-macros="mentions" data-mention-type="person" data-object-id="{person_id}" data-title="{person_login}" rel="noopener" data-id cmf_converted="true">
                            <span class="lds-ring" data-id>
                                <span data-id></span>
                                <span data-id></span>
                                <span data-id></span>
                                <span data-id></span>
                            </span>
                        </a>
                    </span>
                </span>
            class
user-hoverattrsdata-account-iddata-usernamehrefr3   u[   Не найдены атрибуты для определения пользователя)	person_idperson_loginperson_hrefperson_namezhtml.parserrF   uR   Ошибка конвертации упоминания пользователя : zERR-0036r|  N)urllib.parser  r  
class_namefind_allr  rq   r~  query_get_user_info_from_dumplowerrm   rN   r   formatr.   r   loginr  r3   replace_with
currentTagrO   rJ   rP   )r&   r  rQ   r  r  TMPLtagr  
parsed_urlr  	user_infonew_tages                r)   _process_mentionszJiraAPIImport._process_mentionsY  s    	4>>_,D D: %%Wl,C%D 	C99==!23!--cii8I.JKFYY]]?3!--cii.HIF!)#))F*;!<J$Z%5%56Eyy($($A$A%-PQBRBXBXBZ$[	!%!1!1)DMM2J!K'  )F  G  G'KK"%fii.%(%6$'$4$'$4	    "   !3!341	2  1$))hilhmmopqors *  s   FF::	H9HHc                    t         j                  j                  }|j                  | j                  j
                   d|       }|t        j                  |      S | j                  d      D ]  }|j                  | j                        |k(  r|c S |j                  dd      j                         |j                         k(  r|c S |j                  dd      j                         |j                         k(  r|c S |j                  dd      j                         |j                         k(  r|c S |j                  dd      j                         |j                         k(  s|c S  t        d|       )	N:user:r2  r3   r   r5  r  r   uQ   Не нашли информацию по пользователю в дампе )APPREDIS_DBredisrq   rJ   r   pickleloadsr<  rm   r  rN   )r&   r  redis_dbr  s       r)   r  z&JiraAPIImport._get_user_info_from_dump  s6   <<%%LLDOO$6$6#7vgY!GH	 <<	**))'2 
	!I}}T]]+w6  }}VR(..0GMMOC  }}Z,224G  }}^R0668GMMOK  }}]B/5577==?J  
	! klsktuvvr*   u#   Конвертация ссылокra  c                    |j                   dv r|j                  }|j                  d       D ]>  }|j                  j	                  d      r)| j
                  j                  j                  d|        H|j                  d      rG|j                  d   j                  d      r)| j
                  j                  j                  d|        | j
                  j                  j                  d|        |j                  d      r|j                  d   }n|j                  d	   }t        j                  j                  |      j                  d
      d   j                  d      d   }dd|gdd|gg}t        j                  dt        j                  j                  |      j                  d      d         }|ra|d   |d   d   }	t!        t#        fd|	      d       }
|
r9|
d   }| j
                  j$                  j$                  j&                   d }dd|g}t(        j*                  j-                  |dg      }|rO|j                  d	      r|j                  d	   |j                  d<   |j.                  |j                  d	<   d|j                  d<   t1        j2                  |j                  d	         }|rM|d   rH|d   j                  d      r4d|_        d|j                  d<   d|j                  d <   d|j                  d!<   |j                  d      rD|j                  d   |j                  d"<   |j.                  |j                  d<   d|j                  d<   | j
                  j                  j                  d#|j.                          ad$|j                  j	                  dd%      v s|j                  d   j                  d
      d   j                  d      d   }| j7                  |      }|s|j                  d   |j                  d"<   |j8                  |j                  d<   d|j                  d<   | j
                  j                  j                  d#|j8                          A y )&Nr  c                 J    | j                  d      xs | j                  d      S Nr  srchas_attrr  s    r)   r   z.JiraAPIImport._process_links.<locals>.<lambda>      #,,v2F2]#,,W\J] r*   cmf_convertedu   Уже обработали r  #u   Это якорь u&   Обрабатываем ссылку r  /?r   r3   r  ra  (/attachment(?:/content)?/(\d+)(?:/)?(.*)rF   r   r  c                 ,    | j                  d      k(  S Nr   r   )item	attach_ids    r)   r   z.JiraAPIImport._process_links.<locals>.<lambda>  s    $((4.I2M r*   r  r^  rf  r  r  src_origTvideocontrolsz100%widthheight	href_origu   Заменили на z/people/r   )r  ra  r  r  rq   rJ   r}   infor  
startswithurllibparseunquoter  researchr   r   rl  rm  ro   r  r  r  	mimetypes
guess_typer3   r~  r  )r&   r  ra  r  r  r  r  r  	url_matchattachmentsattachr  
attach_obj	mime_type
account_idr  r  s                   @r)   _process_linkszJiraAPIImport._process_links  s   /]]F%%&]^ 7	XCyy}}_-&&++.J3%,PQ||F#		&(9(D(DS(I&&++.@,FGOO""''*PQTPU(VW||F#ii'ii&,,S177<R@FFsKANIi(3'!
 		"Mv||OcOcdgOhOnOnorOstuOvwI%aL	(2<@f%M{[]ab &z 2I+/??+A+A+H+H+T+T*UUWXaWb(c%)138I(J%--22:KUZT[2\J<<&,/IIe,<CIIj)'1~~CIIe$15CIIo. ) 4 4SYYu5E FI Yq\il6M6Mg6V#*0:		*--3		'*.4		(+<<'-0YYv->CIIk*(2CIIf%15CIIo.&&++.DZ^^DT,UVSYY]]6266 YYv.44S9"=CCCHK
))*5-0YYv->CIIk*(.CIIf%15CIIo.OO**//2H0VWo7	Xr*   c           
         |rd| dnd}|s|r(| j                   j                  j                  d|        | j                  j                  r3|d   dk7  r+| j                   j                  j                  d|d           | j                  || j                  t        j                  j                     d         }| j                  j                  s|d	   }t        j                  d
|d         }|D 	cg c]#  }	|	j                         s|	j                         % }}	t        |      dkD  r|D 	cg c]  }	||	j                  d      d   v s|	 }
}	|D 	cg c]  }	|	j                  d      d   |v s|	 }}	|
r	|
d   |d<   n|r	|d   |d<   n|d   |d<   |j                  |d          |d   |d<   d| j                   j                   j                   j"                   d|| j$                      d}|d	   j                  dd      }d}|D ]  }t        |      |kD  st        |      } t'        t        j                  j(                  j*                  t        j                  j,                  j*                  t        j                  j.                  j*                        }||k  rlt        |      dk(  r|d   |d<   d|d<   d|d<   nt        |      dk(  r|d   |d<   |d   |d<   d|d<   ndt        |      dk\  rV|d   |d<   |d   |d<   |d   |d<   n=| xj0                  dz  c_        | j                   j3                  d|d	    d| ddd       ddg}t        j                  j5                  dd d!| d!g|"      }|r@|j6                  j8                  j;                  d| j                   j                   j                   j"                   d      dkD  r|r| j                   j                  j                  d#| d$|j6                          t        j<                  d| j                   j                   j                   j"                   d%d|j6                  j8                        |_        |j?                  d&'       d }nD| xj0                  dz  c_        | j                   j3                  d(| d)|j6                   d*d+d,-       |sd.dd/d0| j                   j                   j                   j"                   d1gg d2g}t        j                  j5                  d3d4|d   g|g|"      }|s8t        j                  jA                  dd4|d   g|g|"      }t        |      dkD  rJ| j                   j3                  d5|d    d6t        |       d| d7d       | xj0                  dz  c_        g }|s| j                   j                  j                  d8|d    d|        d	d4|d	   g|g}t        j                  jA                  ||"      }|sd.g}tC        |t        |            D ]|  }t        |      dk(  r	dd4|d   g}t        |      dk(  r |jE                  dd4|d   gdd4|d   gg       Ht        |      dk(  sW|jE                  dd4|d   gdd4|d   gdd4|d   gg       ~ ||g}t        j                  jA                  ||"      }t        |      dkD  rN| xj0                  dz  c_        | j                   j3                  d9|d	    d:|d    d;t        |       d| d7d       |r|d   }n9| j                   jG                  d<|d	    d:|d    d=| tH        jJ                         d>}|s|rd&}d}|d   }t        j                  j5                  d3d4|jM                         g|"      r| j                   jG                  d?| d@tH        jN                         |d   j                  d      \  }}| dA| d| }|dz  }t        j                  j5                  d3d4|jM                         g|"      rt        j                  ||| j                   d&B      }nd |fS |r
t        j                  d
tQ        |jR                              }|D 	cg c]#  }	|	j                         s|	j                         % }}	t        |      dkD  r|d   |d3<   |jT                  r|D ]  }tW        ||||           |j6                  r$||j6                  vr|j6                   | |_        n||_        t        jX                  j[                         }t        jX                  j]                         }|j^                  jE                  |       |j^                  jE                  |       d&|_0        |j5                  dC      xs i }|j5                  dD      xs g } | s)| j                   j                  j                  dE| dF       | D ]Q  }!| j                  j                  r
d|!dG    d}n	d|!d	    d}d| j                   j                   j                   j"                   | }t        jX                  j5                  dd d!| d!gdg"      }"|"s(t        jX                  j5                  d	dH|!d	   gdg"      }"|"s't        jY                  || j                   d&|!d	   |!I      }"|"jT                  r
|!d	   |"_1        |"j6                  s||"_        n#||"j6                  vr|"j6                   | |"_        |"j?                  d&'       |j^                  jE                  |"       T |jd                  r|j?                  d&'       ||fS c c}	w c c}	w c c}	w c c}	w )JN(r  r   u0   Импортируем пользователя accountType	atlassianu   Неизвестный тип r   r3   z[,;\s]+r  rF   @r   email_2r^  rE      	last_name
first_namesecond_name   u?   Часть полного имени пользователя "u   " длиннее u_    символов. Фамилия, Имя и Отчество не были заполнены.zERR-0110r   obj_typer   rg_member_ofrf  LIKE%r  u    ext_id пользователя N    содержит несколько ID из одного источника: z::.+?::Tri  uP   Возможно найден некорректный пользователь ud   ,так как ext_id содержит несколько ID из одного источника: 'uq   '.Необходимо повторно импортировать локальных пользователей.zERR-0004rB  )
error_coder&  ORzNOT LIKE%::::%rf  rY  Nr  ILIKEu+   Пользователей с почтой z > zERR-0037uH   Не удалось найти пользователя с почтой u+   Пользователей с именем  (z) > uM   Не нашли пользователя среди существующих ) FuQ   Обнаружена учетная запись с дублирующим email u   , добавляем цифру+)rf  r  rJ   r  groupsr   u   Пользователь u0    не входит ни в одну группуgroupIdrY  )rf  rJ   r  r3   r  )3rJ   r}   r
  rb   rn   warningrV  rP  ro   r   r.  r  r  stripr  removerl  rm  rm   minr"  
max_lengthr!  r#  rO   rP   rq   rf  r   countsubrp  r  r   r   rK   r{   INFOr  WARNINGr.   r  r  setattrCmfPersonGroup
jira_group
user_groupr'  
user_localr3   
is_changed)#r&   rB  createupdaterQ   obj_msg	user_dict
user_loginemailsr  emails_by_loginemails_by_namerf  	full_namecurrent_length_namer3   max_length_namer   r  not_source_hash_filterpersonsrs  
name_combo
is_creatednr  prefix_emaildomainr4   rA  rB  user_groupsgroup_items
group_infogroups#                                      r)   _process_personzJiraAPIImport._process_person  s~    #AcU!*VOO""''*Z[_Z`(ab99??tM2kAOO""**-KDQ^L_K`+ab''dmmF<L<L<Y<Y.Z[c.de	yy fJXXj)G*<=F17I5;;=ekkmIFI6{Q6<"bU
ekkZ]N^_`Na@a5"b"b5;!aEu{{3?OPQ?RV`?`%!a!a")8);Ig&#)7):Ig&)/Ig&i01'-ay	)$ doo,,33??@4CVBWWYZf%++C3	   	0D4y..&)$i#	0 ''22&&11((33

 /19~")21	+&*,	,'+-	-(Y1$)21	+&*3A,	,'+-	-(Y1$)21	+&*3A,	,'+4Q<	-(
 OOq OOO%%QR[\bRcQddu  wF  vG G_ `$	 &  ^$!!%%f&m4 & 
 fmm))//"T__5K5K5R5R5^5^4__a0bcfgg &&..6vh ?SSYS`S`Rac !#$//0077CCDGLMM''!
 -1$))fgmfn oz {A  {H  {H  zI IFG  *# *   :T__-C-C-J-J-V-V,WWZ'[\&&"
 %%))gy'9:*  * F  **// '9W+=>. " 0  w<!#OO--0[\efm\n[oorsvw~s  sA  AB  CJ  BK  /L.8; . POOq(O GOO**22bclmtcubvvwx  xA  B  )F*;<.G %..33763RG"#'&*6y#i.*Q #J"9~2+6A*O!$Y1!4 '%17JqM$J%0':a=$I0" !# "%Y1!4 '%0':a=$I%17JqM$J%2GZ]$K0" !## $2# #)"2"2"7"7wv"7"Vw<!#OOq(OOO--EiPVFWEXXZ[del[mZnnrsvw~s  sA  AB  CJ  BK  L"!, . 
 $QZFOO''ghqrxhygzz|  ~G  HO  ~P  }Q  QS  T[  S\  ] 
!
(&&**77EKKM2R[a*bOO''*{  }B  |C  Cb  )c  el  et  et  u+4W+=+C+CC+H(L&+nAaS&:EFA	 &&**77EKKM2R[a*b
  ))27DOO<@ * B Z'' XXj#fll*;<F17I5;;=ekkmIFI6{Q%.w%7	'" %%$ 9CFC389 }}.'-}}ofX$>FM &..99;J..99;J&&z2&&z2 $F((8,2K%//'28bK&&..1J6(  SC  0D  E) 2
99??!*Y"7!8;F!*V"4!5R8Fdoo44;;GGHQ--11(FaPVxWXM9Zdgch1i"1155fdJW]L^=_ilhm5nE"11?C`d9CF9K]g 2 iE ((!+F!3EJ||#)EL5<</&+ll^F8#<EL

t
,##**51+2,   -z!!K J"b!ad Js0   2mm.m
mm0m3m#	m#u   Обработка группc                 \   | j                  d      D ]X  }	 | j                  j                         r y d| j                  j                  j                  j                   d|d    d}t
        j                  j                  ddd| dgdg      }|s(t
        j                  j                  dd	|d   gdg      }|s't
        j                  |d   || j                  d
|      }|j                  r
|d   |_	        |j                  s||_
        n#||j                  vr|j                   | |_
        |j                  d
       t                | j                  xj                  dz  c_        [ y #  | xj                  dz  c_        | j                  j                  d| ddd
       Y xY w)Nr4  r^  r3   rf  r(  r)  r   r  r0  T)r3   rf  rJ   r  r  ri  rF   u4   Не удалось загрузить группу ERR-0038r@  r&  rG   )r<  rJ   rL   rl  rm  ro   r@  rq   r  r3   rf  rp  rM   imported_object_countrO   rP   )r&   
group_datarf  rZ  s       r)   _process_groupszJiraAPIImport._process_groups  s   **84 #	J"??,,.doo44;;GGH:V\K]J^^`a--11(FaPVxWXM9Zdgch1i"1155fgzZ`Oa=blokp5qE"11'/%#'??(,(2 2 E ((!+F!3EJ||#)EL5<</&+ll^F8#<EL

t
,55:57#	81$))J:,W-!	 * s   E/D8E//9F+u-   Обработка пользователейc                 T   | j                   j                  d      s,| j                  j                  dt        j
                         y t               }| j                  d      D ]  }	 | j                  j                         r y | j                  |      \  }}t                | j                  xj                  dz  c_        |j                  rN|j                  sB|j                  j                  d      s'|r%|j                  |j                  j                           |rL| j                   j                  d      r0t'        t(        j*                  j,                  t/        |      g       y y y #  | xj"                  dz  c_        | j                  j%                  d| dd	d
       Y DxY w)Nr   uA   Не грузим пользователей из-за опцийr   r2  rF   z.evateam.ruu@   Не удалось загрузить пользователя r]  r   Tr^  r   )rR   )r   rq   rJ   rK   r{   r>  setr<  rL   r[  rM   r_  r  r  endswithaddr   rO   rP   schedule_deferred_jobro   r   register_personsr  )r&   new_user_emailsrB  r  rS  s        r)   _process_userszJiraAPIImport._process_users   sV   {{|,OO ckrkzkz{%$$W- 	D??,,.%)%9%9$%?"
55:5 <<(<(<V\\EZEZ[hEi&#''(:(:;	* t{{~>!&"2"2"C"C4P_K`Jab  ??1$))VW[V\](!	 * s   'E+BE++9F'u#   Обработка статусовc                    | j                  d      D ]^  }| j                  j                         r y| j                  j                  r|d   }n|d   d   }| j                  j
                  j
                  j                   d|d    }|j                  d      xs |d   }t        j                  j                  |      }|s)dd	|gg d
g}t        j                  j                  |      }|s!t        j                  || j                        }||_
        t        j                  |      |_        ||_        |j                  d       t!                | j                  xj"                  dz  c_        a y)uc   
        Грузим статусы из Jira и сопостовляем с нашими
        statusesNstatusCategoryr3   r^  r   untranslatedNamerf  rY  r/  r]  )r3   rJ   Tri  rF   )r<  rJ   rL   rb   rn   rl  rm  rq   ro   CmfStatusCoderf  r   get_status_typestatus_typer3   rp  rM   r_  )r&   r   rr  rf  status_namecmf_status_coders  s          r)   _process_statuseszJiraAPIImport._process_statuses?  sS    &&z2 	7F((*yy$%56$%56v>..55AAB"VD\NSF **%78JF6NK$2266f6EO""D+68NO"("6"6":":'":"J""("6"6$# #7 # &,O"*>*N*N{*[O'#.O   T 2LOO11Q61/	7r*   c           	      
   i }d }d }|d   }| j                  |      D ci c]  }|d   |
 }}t        j                  j                  d      }| j	                  |      }	|	D ]R  }
| j
                  j                  j                  j                   d|
d    }t        j                  j                  dd|g      }|s#t        j                  ||| j
                  d	      }|j                  rB|d
    d|
d    |_	        |
j                  dd      |_
        |
|_        |j                  d       |
d   d   d   }|D ]d  }|j                  |      }|s
|d   dk(  r|}|s
|d   dk(  r|}d| j
                  j                  j                  j                   d| d| d}|||<   f |
d   D ]  }| j                  ||        t        j                  j                  dd|gg dgdg      D ]J  }t        j                  j                  dd|j                   gdd|gg dg      s9|j#                  d       L |j%                          | j
                  j                  j                  j                   d|j&                   }|
d   D ]/  }| d|d    }|d   j)                         }t        j*                  j                  ||       }|s"t        j+                  ||| j
                  !      }|d   |_	        |d   |_
        |d"   D cg c]  }|j                  d#      r
| d|d#     }}t        j                  j                  dd$|g      |_        | d|d%    }t        j                  j                  |&      }|d'k(  r|rd|_        |j                  d(       ||_        |j                  d       2 U |d)   }| j
                  j                  j                  j                   d*|d    }t        j2                  j                  |&      }|sBt        j2                  j                  d+      }t        j3                  ||| j
                  ,      }|d   |_	        ||_        ||_        |j                  d       t        j8                  j                  |-      D ]  }|j#                  d.        |j;                         D ]  \  }}| j
                  j=                         r |S t        j>                  j                  dd/d0| d0g      } || || j
                  d1d2}!t        j8                  d3i |!}|j                  d        |S c c}w c c}w )4Nr   default.system:defaultrg   r^  rf  r  r]  Ttemplaterf  rJ   r  r4   r  r3   r   r   ri  associatedWithr   
issueTypeshierarchyLevelr  :rl  workflowrY  r/  rr  r  rf  r  Nforcetransitionstype)r~  rf  )r~  rf  rJ   linksfromStatusReferenceINtoStatusReferencero  global	only_datajira_workflow_scheme
::SIMPLE::softdev:default)ry  rf  rJ   )	scheme_wfTEXKOM_db_deleter(  r)  r?  )r  rh   target_workflowrJ   cmf_model_namer@   ) _get_issue_types_for_projectro   CmfWorkflowrq   !_get_simplified_project_workflowsrJ   rl  rm  r  r3   r   r  rp  _create_workflow_status	CmfStatusr  rr  r  create_create_transr   r  CmfTransstatus_fromallow_empty_transition	status_toCmfSchemeWfdefault_task_workflowdefault_subtask_workflowCmfSchemeWfRuler   rL   CmfLogicType)"r&   jira_project_info	issue_mapdefault_workflow_for_taskdefault_workflow_for_subtask
project_id
issue_typeissue_typeswf_templateworkflows_dataworkflow_dataworkflow_ext_idr~  issue_type_idsissue_type_idissue_type_ext_idr   workflow_hash_idworkflow_transitiontransition_ext_idtransition_type
transitionsstatus_from_ext_id_liststatus_to_ext_idr  workflow_scheme_datascheme_wf_ext_idr  template_wfrulelogic_type_ext_idrh   	rule_dicts"                                     r)   #_create_schemewf_for_simple_projectz1JiraAPIImport._create_schemewf_for_simple_project^  s"   	$(!'+$&t,
 #??
K
 tZ'
 

 ((,,2J,K??
K+ \	2M!%!7!7!>!>!J!J K2m\`NaMbcO))--h_5U-VH!--(*#$(	 .  ''#4U#;"<B}V?T>U V - 1 1- D+8($/ ++;<Q?MN!/ 8(__];
 2"#34908- 5"#34:3;0&()?)?)F)F)R)R(SSUV`Uaabcpbqqs$t!/7	+,!8& (
3 ?,,Xv>? !**//x0* & 0  * ''++&f.@.@A#T84. ,  D)*$ ((*"&//"8"8"?"?"K"K!LBx{{m\'4]'C 2#'7&8;Nt;T:U$V!"5f"="C"C"E#__00%, 1 
 "!'!)0#'?? "1 "J
 #6f"=
"5m"D
 19+uu23 ((1-B+C*DE+' +
 *0)9)9)>)>$d,CD *? *
& '7%7r:MNa:b9c#d ",,008H0I	"h.97;I4NNTN2'0
$D1=2}\	2~  11GH"oo44;;GGH
SghlSmRno&&**2B*C	 ,,006G0HK**$'?? + I
 .f5	*C	'-I	*4( **//)/D 	/DKKK.	/ ,5??+< 	('x((*   ,,00 &A.?-@*BC 1 J '(#+"oo"+I ))6I6DII$I'	(  S
j+s   U
"Uc                    | j                   j                  j                  j                   d|j                   d|d    }| j                   j                  j                  j                   d|d    }t        j
                  j                  |      }t        j                  |d         }|j                  d      xs |d   }|s"t        j                  ||| j                         }||_	        |j                  d	       t        j                  j                  d
d|g      }|s+t        j                  j                  dd|gdd|gg dg      }|s.t        j                  j                  dd|d   gdd|gg dg      }|s"t        j                  || j                   |      }||_        |d   |_        |d   |_        d|_        ||_        ddddd}	|	j                  |d      |_        |j                  d	       |S )Nr^  r   ro  rm  rn  r3   )rf  r3   rJ   Tri  rf  rY  r]  r~  status_coder/  )r~  rJ   r  r   F#a0a0a0z#3f82d8z#e36b51z#23a055)OPENIN_PROGRESS	IN_REVIEWCLOSED)rJ   rl  rm  r   ro   rp  rq   r   rq  rr  rp  r  rf  r3   r   r  r  color)
r&   r~  jira_status_datastatus_ext_idrf  r  rr  rs  r   status_type_colors
             r)   r  z%JiraAPIImport._create_workflow_status  s!   
  ??1188DDER}TVWghlWmVno
 OO**11==>bAQRVAW@XY**..f.=*::;KL\;]^&**+=>ZBRSYBZ .. ?? / K
 #.T*!!%%hm-L%M%%))T8,k2&2) F %%))/78T8,&2) F
 %%xDOOal%mF%&v.&}5(-%($"	
 ),,[)D%r*   c                     d2 fd	}d2 fd	}d3d}d }d }d|dd	|dd
|dd|dd|dd}	d|j                    d}
g }t        |      D ]  \  }}|d   }|	j                  |      }|r	 t         |d   d4i |      }|j                   d| }t
        j                  j                  |ddg      }|s(t
        j                  dd|d|| j                  d|	      }|j                  r0 j                  j                  j                  d| d|
 d| d       n|j                  s0 j                  j                  j                  d| d|
 d| d       njd|j                  _        |j                          t                 j                  j                  j!                  d| d|
 d|j"                   d |d!    d	       |j%                  t'        |j"                                j                  j                  j!                  d"|d!    d#|         j                  j                  j!                  d"|d!    d$|         j                  j                  j-                  d"| d*       " t
        j                  j/                  d+d,|gd-d.|gg d/gd0      }|D ]  }|j1                  d1        t                y# t(        $ r8} j                  j+                  d| d|
 d%|d!    d&| d'd()       Y d}~d}~ww xY w)5uv   
        Обработка условий перехода
        Конвертация в bzPython код
        Nc                     dj                   j                  j                  j                   d|  d}t        j                  j                  dddd| dgdd| gg      }|st        d|  d	      d
|j                   d|j                   d}|S )Nr^  r,  rf  r0  r)  r3   r]  u   Группа '   ' не найденаu8               # Пользователь в Группе 'zU'
            try:
                return g.current_user.in_person_group(group_code='@')
            except:
                return False
            )	rJ   rl  rm  ro   r@  rq   rN   r3   r   )rZ  r'   group_ext_idperson_group	eval_coder&   s        r)   user_in_group_conditionzMJiraAPIImport._process_transition_conditions.<locals>.user_in_group_condition+  s     6 6 = = I IJ"UGSUVL!0044w!L>(;<We, 5 L  .7L MNN99E9J9J8K LCCOCTCTBU VI r*   c                    j                   j                  j                  j                   d|  }t        j                  j                  |      }|st        d|  d      d|j                   d|j                   d}|S )Nr^  ro  u
   Роль 'r  uG               # Пользователь в проектной роли 'zb'
            try:
                return g.current_user.in_project_role(self.project, role_code='r  )	rJ   rl  rm  ro   CmfProjectRolerq   rN   r3   r   )jira_projectrole_idr'   role_ext_idroler  r&   s        r)   in_project_role_conditionzOJiraAPIImport._process_transition_conditions.<locals>.in_project_role_condition@  s    !__33::FFGrJ]I^_K((,,K,@D*-@,AAV WXXHHL		{ SPPTPYPY{ [I r*   c                 "    ddl m}  |       }i } rt        t         fd|d         i       }nrt        t        fd|d         i       }|j	                  d      }|j	                  d      }|st        d xs  d	      d
| d| d}|S )u   
            Условие прав
            Args:
                permission_key (str): ключ права
                permission (str): название или ключ права
            r   get_datac                 ,    | j                  d      k(  S )N	jira_coder   )permpermission_keys    r)   r   z\JiraAPIImport._process_transition_conditions.<locals>.permission_condition.<locals>.<lambda>^  s    TXXk%:n%L r*   project_perm_permissionc                     | j                  dd      j                         j                         k(  xs | j                  d      k(  S )N	jira_namer   r  )rq   r  )r  
permissions    r)   r   z\JiraAPIImport._process_transition_conditions.<locals>.permission_condition.<locals>.<lambda>g  sD     HH["5;;=AQAQASS C#xx4
B r*   r3   r   u   Право 'u   ' не найденоu.               # Только с правами 'zR'
            try:
                return self.project.check_project_role_access('zJ', obj=self)
            except:
                return False
            )cmf.system_datar  r   r   rq   rN   )	r  r  r'   r  system_datapermission_datapermission_namepermission_coder  s	   ``       r)   permission_conditionzJJiraAPIImport._process_transition_conditions.<locals>.permission_conditionO  s     1"*K O"&L#$=> # "& $$=> 	# .11&9O-11&9O",~/K.LLa bcc//>.? @@@O?P QI r*   c                  
    d}|S )Nut               # Только Исполнитель
            return self.responsible == g.current_user
            r@   r'   r  s     r)   allow_only_assigneezIJiraAPIImport._process_transition_conditions.<locals>.allow_only_assignee~      I r*   c                  
    d}|S )Nur               # Только Постановщик
            return self.cmf_owner == g.current_user
            r@   r  s     r)   allow_only_reporterzIJiraAPIImport._process_transition_conditions.<locals>.allow_only_reporter  r  r*   u(   Пользователь в Группе)r  r  u3   Пользователь в Роли Проектаu   Условие Правu2   Условие Только Исполнителяu(   Условие Только Автора)z:com.atlassian.jira.workflow.condition.UserInGroupConditionz<com.atlassian.jira.workflow.condition.InProjectRoleConditionz9com.atlassian.jira.workflow.condition.PermissionConditionz7com.atlassian.jira.workflow.condition.AllowOnlyAssigneez7com.atlassian.jira.workflow.condition.AllowOnlyReporter   переход 'r  r  r  r^  Tcmf_deletedrf  include_deletedr   r?  z6 eval)	r  rh   r  eval_unsafer~  r  rJ   r  rf     Бизнес-процесс , u7   . Пользователь удалил условие K   . Изменения из импорта не будут примененыu9   . Пользователь изменил условие Fu$   . Добавлено условие r  r  u   Условие '' Jira: ' bzPython: u5   . Не удалось создать условие ''. zERR-0127CmfTransFilterr%  #   ' не поддерживаетсяr  r  r   r  r  r   r  r  r7   NNr@   )r3   rN  rq   r   rf  ro   r  rJ   r  r}   r6  r  r  rD  rp  rM   r
  r   r   r.   rN   rP   debugr  r  )r&   r~  r  
conditionsr  r  r  r  r  condition_maptransition_namefilter_codesrR  condition_datacondition_name	conditionr  filter_ext_idtrans_filterr  trans_filterss   `                    r)   _process_transition_conditionsz,JiraAPIImport._process_transition_conditions&  s   
	*	-	^		 H4K
 S6M
 71J
 R0H
 H0H#
. -Z__,=Q?#,Z#8 E	C+L9N%)).9I= &'=y'='O'O PI'1'8'8&9C5$AM#)#8#8#<#<,(,)  $= $L ('-'<'<+4'/&/(,%-'1'+,0#0 (= 
( $//..66:8*BFW XTT`Sa bhi
 *99..66:8*BFW XVVbUc dhi ?D00;$))+"..33:8*BFW XAAMARAR@SSVW`alWmVnnoq !''L,=,=(>?OO**//*9[+A*B(>JZ[ OO**//*9[+A*B,ykZ &&,,&~&66YZGE	P --22sJ/<0*
 ! 3 
 * 	7L6	7 	1 ! OO--6xj?BS TNNWXcNdMeehilhmo"!1	 .  s   -GJ??	L -K;;L c                 ~    dE fd	}d }dF fd	}d|dd|dd|dd	}|d
k(  r9d}t         j                  j                  j                         }	|j                   d}
t         j                  j                  |
ddg      }|sPt         j                  d|j                   dd|j                   d|j                   dddd j                  d|
	      }|j                  r3 j                  j                  j                  d| d| d|	 d| d	       y|j                  s3 j                  j                  j                  d| d| d|	 d| d	       yt               }g }nTt        |t         j                        r:d|j                   d}t         j                   j                  j                         }	g }t#        |d       D ]w  \  }}|d!   }|j                  |      }|r/	  |d"   dGi |\  }}t%        |      }|d
k(  r$j'                  |       j)                  |       nt        |t         j                        rs|j                   d#| }t         j                   j                  |ddg      }|s't         j!                  dd$d|| j                  d|%      }|j                  r3 j                  j                  j                  d| d d	 d| d	       n|j                  s3 j                  j                  j                  d| d d	 d| d	       ntd&|j*                  _        ||_        |j1                          t3                 j                  j                  j5                  d| d d'	 d|j                   d(|d)    d       j)                  t7        |j                                j                  j                  j5                  d*|d)    d+|         j                  j                  j5                  d*|d)    d,|        O j                  j                  j=                  d0| d1       z |d
k(  rRsej>                  sX|jA                  d2       t3                 j                  j                  j                  d| d d3	 d4|j                   d5	       yt7        j                        jC                  dd6      }d7|j                   d8}d9djE                         d:| d;}|d<z   tG        d<jE                  |      d=      z   d<z   tG        |d=      z   |_        d&|j*                  _        |j1                           j                  j                  j5                  d| d d>	 d4|j                   d	       t3                yt        |t         j                        rEt         j                   jI                  d?d@|gdAdBgg dCgdD      }|D ]  }|jA                  d2        t3                y# t8        $ r6} j                  j;                  d| d d-|d)    d.| d/       Y d}~wd}~ww xY w)Hu  
        Обработка пост-функций (действий) перехода
        Конвертация в bzPython код

        Действия для начального перехода создаются при помощи
        триггера автоматизации crud (CmfAutomationCrudTrigger),
        так как на текущий момент в бизнес-процессах нет возможности
        настраивать начальный переход.
        Nc                 0   ddddddddddd	dd
ddd}|j                  |       }|st        d|  d      |d   }|d   } d| }d}| dk(  rn|r|dk(  r	|dz  }d}n'j                  |      }j                  |dd      \  }	}
|	st        d| d|       |d|	j                   z  }d|	j
                   d}n| dk(  r'|s|dz  }d}nj                  |      \  }}|d| z  }n| d	k(  r|r|dk(  r|dz  }d}nj                  j                  j                  j                   d| }t        j                  j                  |      }|st        d| d      |d|j                   z  }d|j
                   d}nd| d}d | d!|  d"| d#}||fS )$uZ   
            Пост-функция "Обновить Поле Задачи"
               Исполнительrj   )r,  r3   u   Описаниеr      Приоритетri      Решениеr   u   Темаr3   )rl   r   ri   r   r   
   Поле 'r  r,  u   # Поле Nz-1u    будет очищеноFrE  rF     Пользователь '   ' не найден: u    в r  u    в Обычныйr   r^  ro  u   Резолюция 'r  z            z
            self.z = z
            )rq   rN   r  r[  r3   r   _get_cached_priorityrJ   rl  rm  ro   CmfResolution)r   field_valuer'   	field_map
field_datafield_titlecode_commentr   	user_datar  _priority_nameresolution_ext_idr   r  r&   s                  r)   update_issue_fieldzLJiraAPIImport._process_transition_post_functions.<locals>.update_issue_field  s@   
 '?V);VL&:JO(8,O%/@I #z2J*ZL8[ \]]$W-K#F+J(6LE]*"kT&9 $@@L E $ = =k JI $ 4 4YuUZ 4 [IFA!'*D[MQfgpfq(rss d6;;-$88L}A.Ez)" $88LE+/+D+D[+Q(E= d=/$::L|+"kT&9 $@@L E+/??+A+A+H+H+T+T*UUWXcWd(e%!'!5!5!9!9AR!9!SJ%'*>{mK`(abb d:??*;$<<L
02EK=*N S (I k))r*   c                      d}d}||fS )Nr  uh               # Назначить автора
            self.responsible = self.cmf_owner
            r@   )r'   r  r  s      r)   assign_to_reporterzLJiraAPIImport._process_transition_post_functions.<locals>.assign_to_reporterB  s    2KI k))r*   c                     j                  |       }j                  |dd      \  }}|st        d|  d|       d}d|j                   d|j                   d}||fS )	NFr  r  r  u   НаблюдателиuR               # Добавить в наблюдатели пользователя z1
            person = models.CmfPerson.get(code='z:')
            self.spectators.append(person)
            )r  r[  rN   r3   r   )r5  r'   r  r  r  r  r  r&   s          r)   add_to_watcherszIJiraAPIImport._process_transition_post_functions.<locals>.add_to_watchersJ  s    55h?I,,YuU,SIFA"<XJF[\e[f ghh2KSSYS^S^R_ `117 >I
 k))r*   u&   Обновить Поле Задачи)r3   r  u   Назначить автораuC   Добавить в наблюдатели пользователя)zCcom.atlassian.jira.workflow.function.issue.UpdateIssueFieldFunctionzCcom.atlassian.jira.workflow.function.issue.AssignToReporterFunctionzGcom.aeroflot.jira.agreement.workflow.function.AddToWatchersPostFunctioninitialu!   начальный переходz	::initialTr  r  uA   Начальный переход бизнес-процесса 'r  uX   Действия начального перехода в бизнес-процессе r  r?  rE  
after_save)	r3   r   r  crud_action	eval_typer  rJ   r  rf  r  r  u(   . Пользователь удалил rE   r  u*   . Пользователь изменил r  rF   )startr  r  r^  eval)r  rh   r  r~  r  rJ   r  rf  Fu   . Добавлено r  r3   u   Действие 'r  r  u7   . Не удалось создать действие 'r  zERR-0126u   Пост-функция 'r  r  u   . Удален  'uY   ', так как начальный переход не содержит действийz\'zif self.workflow.code == 'z':u3   cmf_alert(f'В задаче "{self.code}" поля uC    заполнены автоматически триггером "z"')
z    u   . Добавлен r  r  r   r  r  r  r  r7   r@   )%ro   CmfAutomationCrudTriggerr.  r  rf  rq   r3   r   rJ   r  r}   r6  r  rd  r  r  CmfTransActionrN  r   rf  r   r  rD  r  rp  rM   r
  r.   rN   rP   r  is_newr  replacer   r   r  )r&   r~  r  post_functionsr  r   r"  post_function_mapr  action_verbose_nametrigger_ext_idtriggerfield_titlesaction_eval_codesaction_codesrR  post_function_datapost_function_nameactionr  r  action_ext_idtrans_actionr  trigger_nametrigger_condition_codetrigger_alert_codetrans_actionss   `                           r)   "_process_transition_post_functionsz0JiraAPIImport._process_transition_post_functions  s<   :	*x	*	*" A/T
 :/T
 ^,X
 "AO"("A"A"N"N"T"T"V (0	:N5599% $! : G  99\]e]j]j\kklm99Ar(--Z $- (* $#$() :  ""&&..28*B>O P==P<QQRSZR[ \`a
 ,,&&..28*B>O P??R>SSTU\T] ^`a
 5L "
FOO4 00ACO"("7"7"D"D"J"J"LL'0q'I J	#C#!3L!A&**+=>FB-@VK-@-VCU-V*I{ &y 1I!Y.$((5)00;#J@+5+<+<*=Ru(E'-'<'<'@'@#0,0 -$ (A (  ,+1+@+@/8+1,0)1+5+/??04'4 ,A 	,L (33 OO22::">xj?J[ \II\H]]^_k^l ml!m
 ".!=!= OO22::">xj?J[ \KK^J__`am`n ol!m CHL44?5>L2(--/&L OO2277">xj?J[ \66I5J!#/#4#4"5S8H!K
 %++C0A0A,BCOO**//,VF^,<HEWDXY OO**//,VF^,<LT &&,,/0B/CCfgQJ	X "$~~NNDN9LOO**226xj?BS T((;'<Bw||n Mqr
 w||,44S%@L'A(--PR%S"I$))T`JaIb cVVbUccgi 
 '#45w?@  +W5	6  .3G*LLNOO""''.xj?:K L$$7#87<<.K" 	 
FOO4"1166!3
3X|4.
 !% 7 M !. ;##T#:; 	y ! OO--6xj?BS TPPVW]P^O__bcfbgi" s   !H,W==	X<+X77X<c           
        	 | j                   j                  j                  j                   d|j                   }| d|d    }t        j
                  j                  ||ddg      }|s#t        j                  ||| j                   d      }|j                  sB| j                   j                  j                  d|j                   d	|j                   d
       |S |d   |_
        |d   |_        |d   D cg c]  }||   	 c}|_        ||d      |_        |j                  d      rK|d   	t        t        	fd| j!                  d            d      }	 | j#                  |      |_        d|_        |j+                  d       |S c c}w #  | j                   j)                  d	 d|j                   d|j                   ddd|       Y ZxY w)uS   
        Обработка перехода бизнес-процесса
        r^  r   r~  rf  )rf  r~  r   Tr~  rf  rJ   r     Переход '$   ' в бизнес-процессе ';   ' был изменен и не будет обновленr3   r   fromtofieldscreenc                 P    t        | j                  d            t              k(  S r  r.   rq   screen	screen_ids    r)   r   z3JiraAPIImport._process_transition.<locals>.<lambda>?  s    s6::d+;'<I'N r*   screensN7   Не удалось установить экран ID     для перехода '!   ' бизнес-процесса 'r  ERR-0122	CmfUiFormr&  rQ   ri  )rJ   rl  rm  r   ro   r  rq   r  r}   r6  r3   r   r  r  r   r   r<  _process_transition_screencmf_ui_formtrans_form_showrP   rp  )
r&   r~  transition_datastep_status_mapr  r  r  	step_fromscreen_datarM  s
            @r)   _process_transitionz!JiraAPIImport._process_transition  s    #oo44;;GGH8;;-X/0?43H2IJ__(($ ) 

 !(?? $	 ) J ))OO""**":??"33WX`XeXeWf gL MD ; .f5JO-m<JO "1!8&  	*&J" $3?43H#IJ ""=1+M:	"N((3 
-1-L-L[-YJ*15J. OOO-7&"OO--QR[Q\ ]44>OO3DDefnfsfsettuw"!,$ . s   7FF ?Gc                 &   | j                   j                  j                  dt        |       d       |j	                         D ]L  }|d   dk(  rd}n)| j                  |||      }| j                  |||d          | j                  |||d          N y )Nu   Обработка u    переходовr  r#  r  r/  )rJ   r}   r
  r  r   r\  r	  r@  )r&   r~  r  rY  rX  r  s         r)   _process_workflow_transitionsz+JiraAPIImport._process_workflow_transitionsS  s    ##&9#k:J9KK^$_`*113 	Ov&)3&
!55##
 33#L1 33 01!	r*   c                    t        j                  d| dd      }| j                  j                  d|      }|j	                         st        d|       	 |j                  d      5 }|j                         }d d d        t        d      }|r|j                         st        d	      |S # 1 sw Y   4xY w# t        $ r}t        d
| d|       d }~ww xY w)N	workflow_.xmlTreplace_spaces	workflowsu    XML файл не найден: rxmluS   XML файл пуст или содержит некорректные данныеu"   Ошибка парсинга XML r  )r   safe_filenameproject_dirr   r   FileNotFoundErrorr   r  r   find
ValueErrorrN   )r&   workflow_nameworkflow_filenameworkflow_filer   rf  xml_soupr  s           r)   _get_workflow_xmlzJiraAPIImport._get_workflow_xmlk  s    #11d+
 ((11+?PQ##%#&F}o$VWW
	Y##C( Affh %S%0H8==? !vwwO   	Y@rRUQVWXX	Ys0   B8 (B,92B8 ,B51B8 8	CCCc                     t         j                  j                  dd|gg dgdg      }|D ]L  }t         j                  j                  dd|j                  gdd|gg dg      }|s;|j                  d	       N y
)u   
        Удаляет базовые статусы бизнес-процесса,
        если есть импортированные с таким же типом
        r~  r  r  rr  r  r  r]  Tr  N)ro   r  r  rq   rr  r  )r&   r~  base_statusesbase_statussimilar_type_statuss        r)   #_deduplicate_workflow_base_statusesz1JiraAPIImport._deduplicate_workflow_base_statuses  s    
 ((--S(+% "? . 
 ) 		/K"("2"2"6"6"C)@)@Ah/* #7 # #""".		/r*   c                    d fdfdfd}t        |j                        }t               }i }i }| j                  |      }|j	                  d      }	t        |	d      D ]  \  }
}d}d}|d   }|j	                  d	| d
      |j	                  d| d
      |j	                  d| d
      |j	                  d      d}|j                         D ]E  \  }}|D ];  }|dk(  r|}n|j                  d      } ||||      ||d   <   |dk(  rd}4|dk(  s:d}= G |j	                  d      D ](  }|j                  |d   g       }|j                  |       * |j                  ddi      j                  d      }|j                  |      }|s$| j                  j                  d| dd|       N| j                  ||      }||_        |rdn|
dz  |_        |j%                  d       |||<    |j                         D ]B  \  }}|j                  |      }|s%| j                  j                  d | d!| d"|       >||d#<   D |st'        d$      | j)                  |       | j+                  |||       |j-                          y )%Nc                     t        j                  dd|       } t        j                  dd|       } t        j                  dd|       } | j                         S )ul   
            Преобразует строку в snake_case из любого формата
            z[\.\-\s]r  z([a-z0-9])([A-Z])z\1_\2z([A-Z])([A-Z][a-z]))r  r<  r  )arg_names    r)   to_snake_casez<JiraAPIImport._process_workflow_setup.<locals>.to_snake_case  sI     vvk39Hvv2HhGHvv4hIH>>##r*   c                     g }| j                  d      D ]I  }i }|j                  d      D ]   } |d         }|j                         ||<   " |j                  |       K |S )Nz$restrict-to > conditions > conditionargr3   selectr  get_textr   )r9  r  r  r  r{  rx  ry  s         r)   _get_action_conditionszEJiraAPIImport._process_workflow_setup.<locals>._get_action_conditions  sz    J#]]6 2	 "$$--e4 >C,S[9H/2||~N8,> !!.12 r*   c                     g }| j                  d      D ]I  }i }|j                  d      D ]   } |d         }|j                         ||<   " |j                  |       K |S )Nz:results > unconditional-result > post-functions > functionr{  r3   r|  )r9  r/  functionfunction_datar{  rx  ry  s         r)   _get_action_post_functionszIJiraAPIImport._process_workflow_setup.<locals>._get_action_post_functions  sz    N"MML 5 !##,,U3 =C,S[9H.1llnM(+= %%m45 "!r*   c                 ,   |dk(  r| g}|j                  d      d   d   }ng }| }|j                  ddi      }|j                  ddi      }|d	   ||d   |r|j                  d
      nd|||r|j                  d
      nd |       	|      d	}|S )u  
            Формирует данные перехода для дальнейшей обработки

            Args:
                step_id (str): ID статуса
                action (Tag): объект Tag (bs4.element.Tag) из xml
                action_type (str): тип перехода

            Returns:
                dict: данные перехода
            ordinaryzresults > unconditional-resultr   stepr3   zjira.descriptionr  zjira.fieldscreen.idr   Tr7  r   N)	r   r  r3   r   rF  rG  rH  r  r/  )r}  rj  r~  )
step_idr9  action_type
from_stepsto_stepr   rM  rX  r  r  s
           r)   _get_transitionz>JiraAPIImport._process_workflow_setup.<locals>._get_transition  s     j(%Y
 --(HI!LVT
! ++V5G,H+IK63H*IJITl#vCN{33$3?TV"AJy111=PT4V<"<V"D
O #"r*   zsteps > steprF   Fr   z4initial-actions > action unconditional-result[step="z"]z3global-actions > action unconditional-result[step="z3common-actions > action unconditional-result[step="zactions > action)r#  r  commonr  r  r9  r#  Tr  zactions > common-actionr3   zjira.status.idr  r  u    Не найден статус 'r  zERR-0145r|  r     r  u7   В XML разметке бизнес-процесса 'u%   ' не найден common-action ID zERR-0121rF  u@   В XML отсутствуют статусы и переходы)r.   r3   r  rp  r}  rN  r   find_parent
setdefaultr   rj  r~  rq   rJ   rP   r  r  ordernorp  rN   ru  r^  r  )r&   r~  statuses_mapr  rl  rY  r  common_transitionsworkflow_xmlstepsorderr  
is_initial	is_globalr  action_typesr  step_actionsstep_actionr9  r  jira_status_idstatus_datar   	action_idrX  r  r  ry  s                             @@@r)   _process_workflow_setupz%JiraAPIImport._process_workflow_setup  s   	$		" 	#D HMM*&--m<##N3$UA. ?	.KE4JI4jG (..J7)SUV '--I'RTU '--I'RTU !KK(:;L  .:-?-?-A ))\#/ )K"j0!,!,!8!8!B0?#1Kt- #i/%)
$0$(	#))* ++&?@ +/::6$<L
!!'*+ "YYf6F-GYHQQX\Q]N&**>:K))6~6FaH  * 
 11(KHF,5F)",Q%$,FNKK$K''-OG$?	.D &8%=%=%? 
	1!Iz)ooi8O"))Mm_ ]::CF 	 *  &0OF#
	1 ^__00:**8[/R 	$$&r*   c                    |d   }t        j                  |      }| j                  j                  j                  j                   d| }t
        j                  j                  dd|gdg      }|s#t
        j                  |||| j                        }|j                  dd      |_        |j                  d	
       	 | j                  ||       |S # t        $ r.}| j                  j                  d| d| d|       Y d }~y d }~ww xY w)Nr3   r  rf  r  r  )r3   ry  rf  rJ   r   r   Tri  uk   Не удалось обработать статусы и переходы бизнес-процесса '': ERR-0067r|  )r   short_str_encrJ   rl  rm  ro   r  rq   r   rp  r  rN   rP   )	r&   r  workflow_templater  rl  workflow_name_hashr  r~  r  s	            r)   _process_workflowzJiraAPIImport._process_workflow>  s:   %f-(66}E!__33::FFGzRdQef%%))c?3: * 
 ))"*&??	 * H &))-<$'	((<@   	OO%%}  L  ~M  MP  QT  PU  V & 
 	s   >C 	D	$DD	c                    i }| j                  d      D ]  }|d   d   |d<   |||d   <    | j                  |      D ]&  }|d   D ]  }|d   }||vs|d   d   |d<   |||<    ( g }d }t        j                  j	                  d      }	|D ]6  }
| j                  |
|	|      }||
d   r|}!|j                  ||
d	   f       8 ||fS )
Nrl  rm  r4   r   r  rw  rg   defaultr{  )r<  _get_statuses_for_projectro   r  rq   r  r   )r&   r  r  r  r  r  	status_idrd  default_workflowr  r  r~  s               r)   _process_wf_scheme_workflowsz*JiraAPIImport._process_wf_scheme_workflows]  s8   ++J7 	:K,78H,I%,PK().9LT*+	: 88J8O 	:J)*5 :'-	L04?@P4QRW4XK 01.9L+	:	: 	"..228P2Q+ 	JM--m=NP\]HY'#+   (M,,G!HI	J ***r*   c                 v   d d i d}|D ]  }|d   }|d   }| j                   j                  j                  j                   d| }t        j                  j                  ddd| dg	      }|r$||d
   |<   |d   r||d<   |d   s}|d   r||d<   | j                   j                  d| d| ddd        |S )N)default_taskdefault_subtaskallowedr3   r   r^  rf  r(  r-  r.  r]  r  defaultIssueTyper  subTaskr  u/   Не найден логический тип 'r  r  r  r  r%  )rJ   rl  rm  ro   r  rq   rP   )r&   r  
task_typesr  issue_type_namer  r  rh   s           r)   _get_wf_scheme_task_typesz'JiraAPIImport._get_wf_scheme_task_types}  s    #

 & 	J(0O&t,M#'??#9#9#@#@#L#L"MRP] _,,00 &C0A/B#*FG 1 J 7A
9%m4011;J~.i(<M1N4>J01))EoEVVYZgYhhij+ * 	( r*   c           	         t         j                  j                  dd|gdd|gg      }|r[|j                  sO| j                  j
                  j                  d|j                   d|j                   d|j                   d       |S |st         j                  j                  dd|gdd|gg d	g d
gd      }|rO| j                  j
                  j                  d|j                   d|j                   d|j                   d       |S t         j                  d||| j                        }||_	        |j                  d       |S )Nrh   r  r  r]  -   В схеме бизнес-процесса '   ' правило u    для типа задачи 'j   ' было изменено или добавлено вручную и не будет обновленоr  r  Tr  Tr  V   ' было удалено вручную и не будет восстановленоr?  r  rh   r  rJ   ri  )ro   r  rq   r  rJ   r}   r6  r3   r   r  rp  )r&   	wf_schemer~  	task_typer  s        r)   _process_wf_scheme_rulez%JiraAPIImport._process_wf_scheme_rule  su   %%))sI.c9- * 
 ,,OO""**?	?O P""&)),KINNK[ \{|
 K))--!3	2 #y1..	 !% . D &&..CINNCS T&&*ii[0OPYP^P^O_ `kl
 ))($#??	 * D  (		d	#r*   c                 8   g }|D ]N  \  }}|D ]D  }|j                  |      }|s| j                  |||      }	|j                  |	j                         F P t        j
                  j                  dd|gdd|gg dgd      }
|
D ]  }	|	j                  d        y )	Nr   r  r  r  r  Tr  r  )rq   r  r   r   ro   r  r  r  )r&   r  rd  r  current_rulesr~  r  r  r  r  rules_for_deletions              r)   _process_wf_scheme_rulesz&JiraAPIImport._process_wf_scheme_rules  s    (1 	0$Hn!/ 0&NN=9	 33IxS$$TYY/0	0 $3388=1c9-*
 ! 9 
 ' 	/DKKK.	/r*   c                 d   |d   }|d   }|d   }| j                  |d   |      \  }}| j                  |d         }|d   }|d   }	| j                  j                  j                  j                   d|	 d| }
t
        j                  j                  dd	| j                  j                  j                  j                   d
| gg dg      }|sBt
        j                  j                  d      }t
        j                  || j                  d      }|j                  r| d| d|_	        |j                  dd      |_
        |r||_        ||_        ||_        n%| j                  j                  j                  d       |d   r
|d   |_        |d   r
|d   |_        t%        |d   j'                               |_        |
|_        ||_        |j/                  d       n3| j                  j                  j                  d|j                   d       | j1                  |||d          t3                |S )u  
        NOTE: В Jira у разных проектов может быть одинаковая схема бизнес-процесса,
        но при этом использоваться различные схемы типов задач.
        В результате для каждого проекта применяется собственное сопоставление
        типов запросов с бизнес-процессом, а также формируются индивидуальные списки типов запросов.
        В Eva для проектов не предусмотрены отдельные схемы типов задач:
        все допустимые логические типы настраиваются непосредственно в схеме бизнес-процесса.
        Поэтому для каждого проекта создаётся индивидуальная схема бизнес-процесса.
        r   r4   r  mappingsr{  r3   r^  rf  r(  z::%::r  r]  r  rg   T)ry  rJ   r  u    (Проект r  r   r   uE   Не указан бизнес-процесс по умолчаниюr  r  r  ri  *   Схема бизнес-процесса '[   ' была изменена после импорта и не будет обновлена)r  r  rJ   rl  rm  ro   r  rq   r  r3   r   r  r  default_epic_workflowr}   r6  default_task_logic_typedefault_subtask_logic_typer  r   strict_task_logic_typerf  r  rp  r  rM   )r&   project_infor  r5   wf_scheme_datard  r  r  wf_scheme_namewf_scheme_idwf_scheme_ext_idr  wf_scheme_templates                r)   _process_wf_schemez JiraAPIImport._process_wf_scheme  sX    "$'
"5)%&<= '+&G&G:&'
#	# 33N<4PQ

 (/%d+"oo44;;GGH<.XZ[eZfg&&**6doo&<&<&C&C&O&O%PPUV`Ua#bc* + 
	 !'!3!3!7!7=N!7!O**+?? $ + I $$ ./{m1MIN+//rBIN2B	/5E	22B	/&&../vw.)4>~4N	1+,7ABS7T	4/3Jy4I4P4P4R/SI,/I(6I%NNtN,OO""**<Y^^<L M8 9 	%%iJy<QRr*   u;   Обработка схемы бизнес-процессаc                 :   | j                   j                  rs|d   }|r| j                  |      }|S | j                  j                  j                  j
                   d|d   d    }t        j                  j                  |dg      }|S | j                  |      }|S )N
simplifiedr^  r  r   default_release_workflowr  )
rb   rn   r  rJ   rl  rm  ro   r  rq   r  )r&   r  project_simplifiedr  r  s        r)   _get_workflow_schemez"JiraAPIImport._get_workflow_scheme.	  s    99??!-l!;!
 !DD\R	  '+oo&<&<&C&C&O&O%PPRS_`vSwx|S}R~# "..22+67 3 	  //=Ir*   c                    d}t        d      5  	 | j                  j                         rn|j                         }|dk(  rnvt	        |      j                  d      }t        |d      5 }t        j                  |      }d d d        d   }	|d   }
d	|
 d
|	 dt        _
        || j                  ||      z  }d d d        |j                  |       y # 1 sw Y   UxY w# 1 sw Y   'xY w)Nr   Finit_views_and_dsDONE	info.jsonre  r   r4   u   [Задача r1  )])r   rJ   rL   rq   r   r   r   r   r   rI   rD   _process_issueput)r&   issue_queueissue_queue_errorsrC  r  
issue_path	info_filer   
issue_dataissue_id	issue_keys              r)   _process_issue_threadz#JiraAPIImport._process_issue_threadD	  s    51 	C??,,.(__.
' ,55kB	)S) .Q!%1J. &d+&u-	(6ykH:R&P
#$--j'BB 	C" 	v&. .	C 	Cs$   AC(C>:CC	CC'u   Обработка теговc           	         ddl m} t               }| j                  |d         \  }}| j	                  |d   |      D ]J  }| j
                  j                         r y |d   j                  d      s4|j                  |d   d         }L |D ]  }|j                  dd      j                  d	d
      } ||dd      }	 dddd| dgdd|gddd| dgg}	t        j                  j                  |	      }
|
s(t        j                  |      }
|
j                  d       t                 y # t        $ r/}| j
                  j                  d| d| ddd       Y d }~d }~ww xY w)Nr   translitr   r3  r   labelsrE   r  r  r   ruTlanguage_codereversedr,  aliasr0  ry  "%r3   r]  r3   ri  u*   Не удалось создать тег r  zERR-0134CmfTagr+  r&  rG   )transliterater  rd  _count_project_tasksr;  rJ   rL   rq   unionr.  ro   r  rp  rM   rN   rP   )r&   r  r  tagstotal_tasksr  rQ  tag_name
name_aliasrs  tag_objr  s               r)   _process_tagszJiraAPIImport._process_tagsY	  s   *u22<3EFQ++L,>k+R 	=E((*X""8,zz%/(";<		=  	H''S199#rBH!($NJ#W(2.>?"GX6#W*R.@AC !--++7+;$mmm:GLLTL2	  ))@
"QCP)%!	 *  s   >A+D,,	E$5%EE$u)   Обработка приоритетовc           	         | j                   j                  j                  j                   d|d    }t        j                  j                  dd| dg      }i }d }| j                  d      D ]8  }|d   |d	   vr|j                  d
      }|d   D ]  }|d   }|d   }	|||	<     n |D ]  }
t        j                  j                  d|
ddg      }|s%t        j                  ddd|
| j                   d      }|j                  s*| j                   j                  j                  d| d       ||_        d|xs di|_        |j                  s|j                  d        y )Nr^  r   rf  r0  r)  r]  priority_schemesr4   projectKeysdefaultOptionId
prioritiesr3   ri   choicesr  r  r  T)rL  r3   orig_captionra  rJ   r  u"   Конфигурация поля ue    была изменена. Изменения из импорта не будут примененыr   _NONE_ri  )rJ   rl  rm  ro   CmfCustFieldConfr  r<  rq   CmfCustFieldConfFieldr  r}   r6  r  r  rD  rp  )r&   r  cust_field_conf_ext_idcust_field_confsr  
default_idpriority_schemeri   r  priority_idcust_field_confcust_field_conf_fields               r)   _process_prioritiesz!JiraAPIImport._process_prioritiesy	  s   $(OO$:$:$A$A$M$M#NbQ]^bQcPd!e!2277'VlUmmnSo?p7q
  $//0BC 	OE"/-*HH(,,->?J+L9 5 ( 0&tn'4$5 	  0 	=O$*$@$@$D$D& %E %! )(.(D(D0#!5*#$( )E )% )88&&..89N8O P` a ,3!)-4j6LH,M!)$//%**t*<7	=r*   u5   Обработка решений(резолюций)c           
         | j                  d      D ]5  }| j                  j                         r y |d   }|j                  d      xs |d   }| j                  j                  j                  j
                   d| }t        j                  j                  |      }|s#t        j                  || j                  |d      }|j                  r+||_	        |d	   |_
        ||_        |j                  d
       n/| j                  j                  j                  d| d| d| d       | j                  xj                  dz  c_        8 y )Nresolutionsr   rn  r3   r^  ro  T)rf  rJ   r  r  r   ri  u   Резолюция 
 (Jira ID r  ug   ') была изменена. Изменения из импорта не будут примененыrF   )r<  rJ   rL   rq   rl  rm  ro   r  r  r3   r   r  rp  r}   r6  r_  )r&   r   resolution_idresolution_namer  resolution_objs         r)   _process_resolutionsz"JiraAPIImport._process_resolutions	  sK   **=9 	7J((*&t,M(nn-?@VJvDVO#'??#9#9#@#@#L#L"MRP] _#1155=N5ON!!'!5!5,#$.$(	 "6 " --&5#&0&?#1;.###5&&..).)9 :  -c/1B C`a OO11Q619	7r*   u   Импорт фильтров
is_processc                 4    |s& j                   j                  j                  d       y  fd}t        j                         }d} j                  d      D ]  } j                   j                         r y |d   }|d   } j                   j                  j                  j                   d| }t        j                  j                  |g d	      }	|	s"t        j                   j                   |d
      }	|	j                  r	 ||	_        |j                  d      |	_        |j                  di       j                   j                        r( j!                  |d    j                     |	      |	_        d}
d}t%               }t%               }|d   D ]n  } |||	      }|s|dk(  rd}
d} j&                  j(                  r|j+                  |       A|d   r|j+                  |       X|d   s^|j+                  |       p |j                  dg       D ]  } |||	      }|s|j+                  |       ! t-        |      |	_        t-        |      |	_        t3        d ||z  D              }|rd}
d}|
|	_        ||	_        ||	_        |	j;                  d
       t=                n/ j                   j                  j                  d!|	 d"| d#| d$       |dz  } t        j                         |z
  }||z  } j                   j                  jE                  d%|d&d'| d(|d)d*tG        |d+z         d,	        jI                          y # t>        $ rG} xj@                  dz  c_          j                   jC                  d| d| d| ddd
        Y d }~d }~ww xY w)-NuN   Импорт фильтров и конвертация JQL отключеныc                    d}	 | d   }|dk(  rx| d   d   }dj                   j                  j                  j                   d| d}t        j                  j                  dddd	| d	gdd|gg
      }|set        d| d      |dk(  r| d   d   }| d   d   }| d   d   }j                   j                  j                  j                   d| }	t        j                  j                  ddd|	 dg
      }|sj                   j                  j                  d| d| d       	 |S |dk(  r| j                  di       j                  j                        r{| d   j                     }
| d   j                  d      }| d   j                  d      }	 j                  |
      }j                  |dd      \  }}|st        d|xs | d|
 d      |dk(  rd}|S # t        $ r}t        | d      d}~ww xY w# t        $ rN}xj                  dz  c_        j                   j                  d |j                   d!| d"|#       Y d}~|S d}~ww xY w)$u  
            Получает объект (группу, проект, пользователь), которому
            необходимо предоставить доступ к фильтру

            Args:
                share_permission (dict): данные объекта прав
                task_filter (obj): объект фильтра

            Returns:
                _type_: _description_
            Nr  rZ  r3   r^  r,  rf  r0  r)  r]  u"   Не найдена группа 'r  rC  r   r4   r(  r-  r.  u~   Не удалось добавить разрешение на доступ к фильтру. Не найден проект r  u=   '. Возможно он еще не импортированrB  r   H   . Возможно пользователь был удален в Jira.Fr  u,   Не найден пользователь 'r  r  loggedinrF   u_   Не удалось добавить разрешение на доступ к фильтру 'r  zERR-0129r+  rQ   )rJ   rl  rm  ro   r@  rq   rN   
CmfProjectr}   r6  rm   r  r[  rO   rP   r3   )share_permissiontask_filtershareeshare_permission_type
group_namer  r  r5   project_nameproject_ext_idrm   	user_nameuser_display_namer  r  r  r&   s                   r)   _get_shareez3JiraAPIImport._process_filters.<locals>._get_sharee	  s    F?(8(@%(G3!1'!:6!BJ%'(>(>(E(E(Q(Q'RRTU_T``b#cL#2266 %w!L>0CD#Wj9  7 F "'@AN  +i7!1)!<T!BJ"29"=e"DK#3I#>v#FL(,(>(>(E(E(Q(Q'RRTU_T`%aN#..22 (&C7Gs2KL 3 F "..66>>I]#l^ \YZP ME *V3(,,VR8<<T]]K/7FH 0 8 < <V DI(8(@(D(D](S%$($A$A($K	
 !% 4 4!$$ !5 !IFA
 "'  ) >->?s8*AO  +j8'F M5 % '"e#kl "  1$))**5*:*:);3seE)#	 *   MsD   D#G> +A*G> G '6G> 	G;(G66G;;G> >	IAIIr   filtersr   r3   r^  r3   r  r  r  TrJ   rf  r  r   ownerr|  privatesharePermissionsr  readonlyr  editvieweditPermissionsc              3   P   K   | ]  }t        |t        j                           y wr7   )r  ro   r  ).0rQ   s     r)   	<genexpr>z1JiraAPIImport._process_filters.<locals>.<genexpr>h
  s%      & #3(9(9:&s   $&fullri  rF   u0   Ошибка обработки фильтра 'z' (ID: z). zERR-0130CmfBqlFilterr     Фильтр r  r  uc   ') был изменен. Изменения из импорта не будут примененыu4   Импорт фильтров выполнен за .3fu
    сек.: r1  .2fu   /с | ~<   u   /мин))%rJ   r}   r6  time	monotonicr<  rL   rl  rm  ro   r7  rq   r  r3   r   rm   r~  r   rd  rb   rn   rf  r  r  	executorsanyperm_policy
view_scoper  rp  rM   rN   rO   rP   r
  int_process_jql_in_filters)r&   r  r(  t1filter_countfilter_data	filter_idfilter_namer  r   r@  rA  r  r>  r  r!  edit_permissionhas_projectr  t2
proc_speeds   `                    r)   _process_filterszJiraAPIImport._process_filters	  s   OO""**+{|O	b ^^++I6 ^	K((*#D)I%f-K#55<<HHII;WM --11$ 2 K $11#($( 2 
 **B'2K$'2}'EK$"w377F040@0@'0? + 1A 1- #,K!*J!$J #I
 -88J,K 7(!,-={!K%$!Z/*4K)1J$99??&NN62/7 )f 5!1&!9 *v 67" ,7??;Lb+Q 2!,_k!J!%MM&12
 .2*-=K*,0OK)"% &#-	#9& #K #&,%-
.9K+-7K*2=K/$$$6L &&..#K=
9+S V` a AL}^	@ ^^"!B&
##B2c(*nBz#.gc*r/6J5K8U	
 	$$&/ ! OOq(OOO--J;-W^_h^iilmplqr#-!/!%	 .  s&   C*M/3M#A?M	N=NNc                    |d   }|d   }| j                   j                  d| d| dd       | j                   j                  j                  j                   d| }t        j
                  j                  |d	d
g      }|s*t        j
                  j                  dd|gg dgd	d
g      }|sDt        j                  ||| j                   d      }| j                   j                  d| dd       |j                   rt        j
                  j                  j                  }|j                  r||_
        |j                  dd      }t        |      |kD  r3| j                   j                  d| d| dt        j                  d       |d| |_        ||_        |j                  d       |S | j                   j                  d| dt        j                  d       |S |j                   s||_        |j                  d       |S )u   
        Обрабатывает проектную роль

        Args:
            role_data (dict): сырые данные проектной роли

        Returns:
            CmfProjectRole: проектная роль
        r3   r   u0   Обработка проектной роли 'r  r  T	anonymousr^  rf  rJ   r  r0  r  r  r3   rf  rJ   r  u7   Создана новая проектная роль 'r  r   r   u   Описание роли 'u   ' обрезано  до u"    символов (TEM-1625050885)r   rP  Nri  u   Проектная роль u_    была изменена. Новые данные из импорта не применены)rJ   rK   rl  rm  ro   r  rq   r   r:  r  r3   r  r{   r>  r  rp  rf  )r&   	role_data	role_namerole_idr  project_rolemax_text_lengthrole_descriptions           r)   _process_project_rolez#JiraAPIImport._process_project_role
  sO    f%	D/>ykWIUVW 	 	
 //66BBC2gYO,,00l+ 1 
 !0044Wi0) !,/ 5 L !00"?? $	 1 L OOI)TUV   
 "" %3388CCO++$-!#,==#C '(?:OO''5i[ A!!0 11SU%oo"&	 (  %55Eo$F!/8,!!d!3  ##2<. AZ [!//"	 $  	 $$"-L$/r*   c                 ,   t         j                  j                  ||dg      }|r_|s]|j                  r|j	                  d       t                y	| j                  j                  d| d| dt        j                  d       y	|sy	| j                  j                  d
| d|        g }|D ]
  }|d   }|d   }| j                  j                  d| d| d|        |dk(  rI| j                  j                  r|d   d   n|d   }		 | j                  |	d      }
|j                  |
       |dk(  rL| j                  j                  r|d   d   }|d   d   }n|d   x}}d| j                  j"                  j"                  j$                   d| d}t         j&                  j                  d d!d"| d"gd g#      }|s%t         j&                  j                  dd$|gd g#      }|r\|j(                  s||_        n#||j(                  vr|j(                   | |_        |j+                  d%       |j                  |       | j                  j                  d&| d| d| d'd|       | xj                   dz  c_        | j                  j                  d(| d)| d*|       | xj                   dz  c_         |sy	|s#t         j                  ||| j                  d+      }||_        |j+                  d%       t                | j                  j                  d,| d| d-t/        |j,                         d.       y	# t        $ rJ}| j                  j                  d| d|	 d| d| d|       | xj                   dz  c_        Y d	}~d	}~ww xY w)/u   
        Добавляет участников в к роли в проекте

        Args:
            actors (list): список участников
            project_role (CmfProjectRole): проектная роль
            project_obj (CmfProject): проект
        members)rV  ra  r   Tr  u+   Состав участников роли u    в проекте u[    был изменен. Новые данные из импорта не примененыrR  Nu6   Добавление участников к роли     проекта r   r  u)   Добавление участника 'z	' (type: u   ) к роли atlassian-user-role-actorr  re   r3   rz  u?   Не удалось добавить пользователя 'r  r{  zERR-0039r|  rF   zatlassian-group-role-actor
actorGroupr5  r^  rf  r(  r)  r  r0  ri  u3   Не удалось добавить группу 'u"   . Группа не найденаu<   Неподдерживаемый тип участника 'r  zERR-0040)rV  ra  rJ   r  u   К роли u*    добавлено участников: rO  )ro   CmfProjectRoleAssignrq   r  r  rM   rJ   rK   r{   r>  rb   rn   r~  r   rN   rP   rO   rl  rm  r@  rf  rp  r[  r  )r&   actorsrV  project_objrole_assignr[  actoractor_display_name
actor_typer  rB  r  group_idr#  r  rZ  s                   r)   _process_project_role_assignz*JiraAPIImport._process_project_role_assign
  s*    1155%; 6 

 v**""D"9  ##A, P))4 6Z[ "//" $   D\NRbcnbop	
  <	%E!&}!5vJOO;<N;O P$^L>C
 88=AYY__%,[9RWX^R_
)++GD+IDNN4( ;;99??$\29=H!&|!4V!<J,1&M9Hz!#DOO$:$:$A$A$M$M#NbQYPZZ\]--11$f,q.AB$: 2  "1155 &< (z 6 E  <<'3%U\\9*/,,~'FJJ4J0NN5)OO--./s8*N<. Y;< #' .  OOq(O))RS]R^^abgahi# * 
 1$y<	%~  55)"?? $	 6 K &T*<.(8 F88;K<O<O8P7QS 	 	
 ! )OO--./s7)>,WYZ]Y^`"'	 .  OOq(OO)s   $M  	N	?NNu0   Обработка проектных ролейc                 ,   | j                  |      }|D ]C  }	 | j                  |      }t                |j                  dg       }| j	                  |||       E y # t
        $ r/}| j                  j                  d| d| ddd       Y d }~zd }~ww xY w)Nra  u=   Ошибка обработки проектной роли: r{  zERR-0143r  Tr^  )_get_project_rolesrY  rM   rq   rh  rN   rJ   rP   )r&   r  rb  rolesrS  rV  ra  r  s           r)   _process_project_rolesz$JiraAPIImport._process_project_rolesM  s    ''
3 	I#99)D"x411&,T	  ))STWSXXZ[dZef-!	 *  s   A A	B$%BB   Ссылки проектаc           
         | j                   j                  |d      }|j                         syt        |d      5 }t        j                  |      }ddd       g }D ]&  }|d   }|d   }	d| d|	 d}
|j                  |
       ( |r| j                  j                  j                  j                   d	| d
}t        j                  j                  |      }|set        j                  j                  |j                  d      }|d   }|j                   }t        j                  d|||| j                  d|dz         }dj#                  |ddd         |_        |j'                  d       yy# 1 sw Y    xY w)u  
        Ссылки проекта

        Создает документ "Ссылки проекта" в структуре проекта.
        В документе перечисляются ссылки из раздела "Ссылки проекта"(Project Shortcuts) в Jira

        Args:
            project_id (str): ID проекта
            project_obj (CmfProject): объект проекта
        shortcuts.jsonNre  r  r3   z<p><a href="z5" class="plugin_link" target="_blank" rel="noopener">z</a></p>r^  z::shourtcutsro  r   )rX  r   r  rm  Ti'  )r3   ra  rb  rf  rJ   r  r  r   ri  )r   r   r   r   r   r   r   rJ   rl  rm  ro   CmfDocumentrq   CmfMenuTreeget_treer   r  r   r   rp  )r&   r  rb  shourtcuts_filer   shourtcuts_data
shourtcutsshourtcut_datashourtcut_urlshourtcut_nameshourtcut_textshourtcuts_ext_idshourtcuts_doc	menu_treelast_menu_itemlast_ordernos                   r)   _process_project_shourtcutsz)JiraAPIImport._process_project_shourtcuts_  s    ++44ZAQR%%'/3' 	+1"iilO	+ 
- 	.N*51M+F3N+M?:op~o  @H  INn-		. #'??#9#9#@#@#L#L"MRPZ|[g h#//33;L3MN!"..77{~~]^7_	!*2-55!'!3!36& +,#$((50 "4 " #%''*TrT*:";ND1# 	+ 	+s   E..E8c           
         | j                   j                  |      }|j                  d      }|j                  d      }|j                         sy |j                  d      5 }t        j                  |      }d d d        j                         D ]  \  }}|d   }	|d   }
d|
 d| d}|j                  |      }|d	   }|d
k(  rv| j                  j                  j                  | d       t        j                  j                  |	      }|r|j                          t                |j                  d      }n|dk(  r| j                  j                  j                  | d       t        j                  j                  |	      }|r#d|_        |j#                  d       t                |j                  d      }n`|dk(  rY|d   }d|d    d|d    d}| j                  j                  j                  | d| d|d    d|        |j                  d      }n|j                         s|j%                  |        y # 1 sw Y   xY w)NrD  missing_tasks.jsonre  rf  r4   r    r1  r  statedeletedu$    Задача удалена в Jiraro  r_   archivedu    Задача в архивеTr  r`   movedrC  r  r3   r  r  u;    Задача перемещена в Jira в проект u    с новым кодом new_keyuF   . Необходимо повторить импорт проекта ra   )r   r   r   r   r   r   r   rJ   r}   r6  ro   r?  rq   r  rM   with_suffixcmf_archivedrp  r.  )r&   r  rh  	tasks_dirmissing_tasks_filer   missing_taskstask_id	task_datatask_ext_idtask_keylog_tasktask_dir
task_staterA  new_task_dirrC  log_projects                     r)   _process_missing_tasksz$JiraAPIImport._process_missing_tasks  sL   ''00<((1	(112FG!((*$$S) 	)Q IIaLM	) #0"5"5"7 #	/GY#H-K 'H8*Bwir2H ))'2H"7+JY&&&..(;_/`a~~)))=KKML'33J?z)&&..(;X/YZ~~)))=(,D%III-L'33K@w&#I. !'&/!2#gen5EQG&&..j ["m#=i	>R=S T[[fZgi
  (33H=   .G#	/	) 	)s    IIproject_structr  c                 ,   t         j                  j                  dd|d   gddg      }|r|j                  j                  |d   k7  s|j
                  r[|d   |j
                  vrJ|d    d|d    d|d<   | j                  j                  j                  d|j                   d	|d           n&|j
                  s|d   |_        |j                          t         j                  j                  dd
d|d    dg|j                               }|s)t         j                  | j                  |d   |d   d      }|j                  }|j                  r|D ]  }|dk(  r	t        ||||           |j                  d      rd|_        |j                          d|_        d|_        d|_        d|_        d|_        d|_        d|_        d|_        d|_        |j2                  dk(  rd|_        d|_        d|_        n$|j2                  dk(  rd|_        d|_        d|_        |j                  d       n)| j                  j                  j                  d| d       |r7t         j:                  j=                  |      D ]  }|j?                  d        | jA                  |d   |       i }| jC                  |      |d<   | jE                  |      |d<   | jG                  |      |d<   | jI                  |      |d<   | jK                  |       | jM                          | jO                  |      |d<   |j                  r7|jQ                         D ]  \  }}	t        |||	        |j                  d       | jS                          | jU                  |       | jS                          | jW                  ||       | jY                  ||       | j[                  |d   |       t         j\                  j                  |dd       }
|
s+t         j]                  d!|dd"      }
|
j                  d       t_                | j`                  j                  d#      r| jc                  |d          | je                  |       | j                  jg                         ry t_                | ji                  ||       | jS                          | jk                  ||       t         j\                  jm                  d$d%|gg d&g'      }|r#d|_7        |j                  d(       t_                | j                  jp                  js                  |       | j                  jp                  ju                  |       | j                  xjv                  d)z  c_;        | jS                          |S )*Nr3   rY  rh   rf  r  r1  r  u   Проект с именем u8    уже существует! Переименуем в r(  r)  T)rJ   rf  r3   r  	isPrivater-  Fproject.baseproject.servicedeskri  u"   Настройки проекта u    были изменены пользователем. Изменения из импорта не будут примененыra  r  r   ui_form_schemeproject_perm_schemesecurity_level_schemecust_field_conf_schemer  )r  epic)rb  r[  include_systemEpics)r3   rb  r[  systemr   rb  r  )has_children_archivedr  Tr]  r  rF   )<ro   r  rq   rh   r   rf  rJ   r}   r6  r3   rp  keysr-  r  r?  r@  task_allow_multiple_sprintssl_only_owner_approvesl_deny_no_approvesl_task_only_owner_close
show_lists	show_blog
show_pfeed	show_disk	show_chatlogic_prefixshow_sprintshow_releaseshow_componentsr?  r  r  rl  _process_screen_scheme_process_permissions_process_security_levels_process_field_conf_schemer  _cache_prioritiesr  r   _calc_progressr  _process_versions_process_componentsr  rk  rM   r   r  _process_tasksrL   _process_boards_process_sprintsr;  r  rl  _hack_replace_creation_date_hack_create_fake_taskr_  )r&   r  r  rb  r-  r4   rA  schemesschemer   epics_folderfolder_has_children_archiveds               r)   _process_projectzJiraAPIImport._process_project  s   ''++FD.QWBX3Y4@(3K , M%%((N<,HH ''N8,DKL^L^,^,:6,B+C2nU]F^E__`)av&&&..1N{O_O_N` aLLZ[aLbKc0e f ''%3H%="  " ''++Hf.YaJbIccdFe3f3A3F3F3H , J ++t~^fOg1?1GY] , _K##&&% ?(?S.*=>? ,*3' 7;K3 16K--2K*38K0 &+K"$)K!%*K"$)K!$)K!''>9*/'+/(.2+))-BB*/'+0(.3+.OO""**4[M B\ ]
 ++;+? 3T23 	##L$6D$($?$?$M !)-)B)B<)P%&+/+H+H+V'(,0,K,KL,Y() 	  .   $88F&&!( 4VU34.5|[9  {;((d);[I ''++# , 

 !++'	 , L $/;;??/0''T(:;L)??$$& 	\;7lK8 (.'7'7'='=[14 (> (
$ (04K-t,L 	::;G 	55kB--2-r*   c                    dd l }|j                  dddd| j                  j                  j                   d| j                  j                   d| d| d	| d
gddt        dd      t        dd            }| j                  j                  d|j                   d| d| d       | j                  j                          |S )Nr   z/usr/bin/python3z	manage.pyshellz&plugin = models.CmfPluginJira.get(id='z(');retcode = plugin.process_issue_fork('z', 'z', r  z);Tz"/var/log/eva-import-subprocess.loga+z&/var/log/eva-import-subprocess.err.log)	close_fdsstart_new_sessionstdoutstderrz[PID u(   ] Запуск процесса (offset=z, limit=r  )	
subprocessPopenrJ   rl  r   r   rK   pid
log_detail)r&   r  offsetr4  r  procs         r)   _execute_taskzJiraAPIImport._execute_taska  s    "K89O9O9R9R8S T**+4
|3vhb "<dC@$G   
 	eDHH:-UV\U]]efkellmno""$r*   c                 n   ||k  rd|fgS t        j                  ||z        }t        dt        j                  ||z              }t	        |t        ||            }t        ||      }||z  }	||z  }
g }d}t        |      D ]2  }|	}||
k  r|dz  }t	        ||      }|j                  ||f       ||z  }4 |S )u  
        Рассчитывает распределение задач между процессами

        Args:
            total_tasks (int): количество задач
            max_processes (int): максимальное количество одновременных процессов
            threads_per_process (int, optional): количество потоков в процессе. Defaults to 25.
            max_tasks_per_process (int, optional): максимальное количество задач
                                                   обрабатываемых в процессе. Defaults to 1000.

        Returns:
            list[tuple]: список кортежей (offset, limit)
        r   rF   )mathceilmaxfloorr9  ranger   )r&   r  r   threads_per_processmax_tasks_per_processmin_processes_by_limitprocesses_by_threadsmin_processes_to_useprocesses_to_use
base_tasks	remainderdistributionr  ir4  s                  r)   _calc_task_distributionz%JiraAPIImport._calc_task_distributionu  s    * --$%% "&;9N+N!O  #1djj?R1R&ST  #=#6LNb2cd35KL !$44
"22	'( 	AE9}
45E0eOF	 r*   c                    d}d}| j                   j                  t        |      d      }|j                         r|j	                         D ]  }|j                         s|j                  j                  | j                        r:|j                  d      j                         r/dD ]%  }|j                  |      }|j                  d       ' |dz  }|j                  d      j                         s|dz  } ||fS )	u  
        Получает количество успешно и неуспешно обработанных задач.
        Неуспешно - были ошибки при обрабоке саймой задачи или
        связанных объектов(комментарии, чек-листы, журнал работ и т.д.).

        Для успешно обработанных задач удаляет файл-флаги.
        r   rD  .success).processingr  T
missing_okrF   r  )
r   r   r.   r   iterdiris_dirr3   re  excluded_task_dir_endingsunlink)r&   r  success_countfailed_countr  r  file_flag_name	flag_files           r)   _get_processed_countz"JiraAPIImport._get_processed_count  s     %%..s:H	%--/ &(==))$*H*HI$$Z0779*E :$,$5$5n$E	!((D(9: "Q&M $$]3::< A%L& l**r*   c                 z	   |d   }d|d    d| d|d    d}t         j                  }|r%| j                  j                  j	                  d       | j                  |      \  }}|r|r&|s$| j                  j                  | d	| d
d       y |r|n|}| j                  j                         }| j                  j                  j                  | d| d| d| d       | j                  ||| j                  t         j                        }	t         j                  }
|	D ci c]  }|d }}|	j                         }i }t        j                         }|s|rt!        |      |k  r|r|j#                  d      }||   dz   }| j                  j                  j                  d| d| d|
        |\  }}	 | j%                  |||      }||f||<   |||<   t        j.                  d       t!        |      |k  r|rg }|j1                         D ]  \  }\  }}|j3                         }||j)                  |       |dk(  r/| j                  j                  d| d|j,                   d|        a||
k  rC| j                  j                  j	                  d| d|dz    d|        |j)                  |       | j                  j+                  d| d|j,                   d| d | d        |D ]  }||=  |s|rt        j.                  d!       |r|rt        j                         }||z
  }t5        |d"      \  }}t5        |d#      \  }}| j7                  |      \  }}| j                  j                  j                  | d$t9        |      d%d&t9        |      d%d&|d'       | j                  j                  j                  d(| d| d|        | j                  j                  j                  d)||z  d*d+       | j                  j                  j                  d,|        y c c}w # t&        $ r}||
k  rC| j                  j                  j	                  d| d|dz    d|        |j)                  |       n3| j                  j+                  d| dj,                   d| d| d       Y d }~d }~ww xY w)-Nr   u   Проект 'r3   r  r  r4   r  u   Будет выполнена обработка только новых или обновленных задач. Для обработки всех задач измените значение параметра 'IMPORT_ONLY_NEW_OR_UPDATED'uU   . Нет новых/обновленных задач для обработки из     задачTrO  u   . Обработка u    из u(    задач с ограничением u,    одновременных процессаr   rF   r    u   ] Попытка: r  u3   ] Повторный запуск, попытка: u4   . Ошибка предыдущей попытки: z] [PID uC   ] Процесс завершился с ошибкой после u    попыток. Ошибка: r  )r+  g      ?uF   ] Процесс завершился успешно. Попытка: u?   . Код возврата предыдущей попытки: u*    попыток. Код возврата: rK    r;  u8   . Обработка задач завершена за 02dr}  z06.3fuE   Обработано задач (успешно/неуспешно): u%   Скорость обработки: r9  u    задач/секu)   Всего задач в проекте: )r   IMPORT_ONLY_NEW_OR_UPDATEDrJ   r}   r6  r  rK   r   r
  r  r   IMPORT_OBJ_CNTIMPORT_PROCESS_RETRYcopyr<  perf_counterr  popr  rN   r   rP   r  sleepr   polldivmodr  rB  )r&   r  r  project_msgonly_new_or_updatedr  unprocessed_tasks
task_countr   r  max_retries
task_chunktask_chunk_attemptspending_task_chunksactive_processesr'  attemptr  r4  processr  processes_to_removereturn_codeenddiffhoursr  minutessecondssuccess_tasksfailed_taskss                                  r)   r  zJiraAPIImport._process_tasks  s   !$'
&|F';&<C
|2l[`NaMbbcd$??OO""**R
 *.)B)B:)N&&#,=OO-t  vA  uB  BM  N    *=&;
99;##m0F;- P++8/9eg	

 33$$!!	
 11 @LLz1}LL +//1!!#!%5&'-7<O044Q7
-j9A=&&++a
|;MgYVWXcWd,ef !+"00VUKG1;W0E$W-6='
3 

35 &'-7<O: #%2B2H2H2J ..*g%lln*'..w7"a'++
|77;;- @//6i9
 #[0 OO22::"#J</bcjmncnbo p``k_l!n 066zB OO55"#J<ww{{m D..5Y 7<<G=!J ,6	 6 #2 / .$W-.  #6

1 "%5B !U{!$-y!)R0&*&?&?
&K#|##mS5z#aGS175/C	
 	##STaSbbcdpcqqw  yC  xD  E	
 	##&KZZ^M^`cKddv$wx##&OP[}$]^q M. ! ,..66
|+^_fij_j^k lQQTPUW ,22:>11
|77;;- @**1 3--0E3 (2	 2 s   
P&2P+ +	R:4A;R55R:u#   Обработка проектовc           
      J   t         j                  j                  d      j                  j                  }| j                         D ]  }	 |d   | j                  D cg c]  }|d   	 c}vr(| j                  j                         r y |j                  di       }|r| j                  || j                           }nddd}|d   d	k(  r!t         j                  j                  d
      }nd|d   dk(  r!t         j                  j                  d      }n;|d   dk(  r!t         j                  j                  d      }nt        d|d    d      d| j                  j                  j                  j                   d|d    d|d<   |d   |j                  j                  |d   ||j                  d      xs |d   ||d   |d}| j                  ||        y c c}w # t        $ r; | xj                   dz  c_        | j                  j#                  d| ddd       Y w xY w)Nrf   rg   r   leadzdefault_import_jira@evateam.comdefault_import_jira)r  r3   projectTypeKeybusinesszproject.base:defaultsoftwarezproject.agile:defaultservice_deskzproject.servicedesk:defaultu$   ERROR! Проекты с типом u3    временно не поддерживаютсяr^  rf  r3   r   normalized_keyr4   )r3   rh   r   activitytask_code_prefixr   rf  r  rF   u<   Не удалось импортировать проект zERR-0041r  Tr^  )ro   rp   rq   r   r   r:  rz   rJ   rL   r~  rm   r  rN   rl  rm  r  rO   rP   )r&   r  r  rQ   project_leadr   rh   r  s           r)   _process_projectszJiraAPIImport._process_projectsM  sE   %%))y)9<<BB ..0 -	L,%4CYCY-ZCc$i-ZZ??,,.+//; $ 0 0dmm1L MI*K)>!@I 01Z?!'!4!4!8!8>T!8!UJ!"23zA!'!4!4!8!8>U!8!VJ!"23~E!'!4!4!8!8>[!8!\J#>|L\?]>^  _R  ST T+-doo.D.D.K.K.W.W-XXZ[ghl[mZnnp)qX&(0",--"5"5(7 ((4(8(89I(J(al[`Na!**84'3	" %%nlCK-	-ZH  1$))RS_R`a)!	 * s2   
GG(G-G	EGGA H"!H"c                 z   |d   }|d   }|d   }d}d}d}	d}
|dk(  rod| j                   j                  j                  j                   d| d}t        j                  j                  ddd	| d	g
      }|st        d| d| d      |}n-|dk(  r|dk(  ry| j                  |d      }n|dk(  r	|}	| d| }
| j                   j                  j                  j                   d| }t        j                  j                  |g d      }|s#t        j                  ||| j                   d      }|j                  rC|d   |_
        ||_        ||_        |	|_        |
|_        |j                  d       t'                y| j                   j!                  d| d| dt"        j$                  d       t'                y)uG  
        Присваивает цвет карточке

        Args:
            card_color_data (dict): сырые данные настройки цвета карточки
            card_color_scheme (str): стратегия присвоения цвета
            board_obj (CmfKanbanBoard): доска
        r   displayValuer   Nrh   r^  rf  r(  r)  r]  u'   Не найден тип задачи 'r  r  rj   
unassignedTr^  ri   r  )r  rh   rj   ri   r3   r  ra  rf  rJ   r  r  ri  u&   Цвет карточки задач 'u\   ) был изменен. Новые данные из импорта не примененыrR  )rJ   rl  rm  ro   r  rq   rN   r~  CmfKanbanBoardCardColorRuler  r  rh   rj   ri   r3   rp  rK   r{   r>  rM   )r&   card_color_datacard_color_scheme	board_objr   display_valuecard_color_idlogic_type_ruleresponsible_rulepriority_rule	name_ruler  rh   card_color_rule_ext_idcard_color_rules                  r)   _process_board_card_color_rulez,JiraAPIImport._process_board_card_color_rule  s     ('7'-	,"$T__%;%;%B%B%N%N$OrRWQXXZ [,,00 &A.?-@*BC 1 J "I-X[\a[bbc dee(O-/$#//d/K*,!M 'M?3I$(OO$:$:$A$A$M$M#NbQ^P_!` <<@@) A 	
 $@@ -?? $	 A O **$3G$<O!)8O&*:O''4O$#,O   T 2 	 OO8s?J[ \V Woo	    	r*   u;   Обработка цветов карточек доскиc           	      Z   |j                  d      xs i }|j                         D ]H  \  }}| j                  j                  |      }|s$|d   }|D ]  }|d   }		 | j                  |||        J y # t        $ r/}
| j
                  j                  d|	 d|
 ddd	       Y d }
~
Td }
~
ww xY w)
N
strategies
cardColorsr   uI   Не удалось присвоить цвет карточки для 'r  zERR-0137r#  Tr^  )rq   r   r   r/  rN   rJ   rP   )r&   card_color_configr&  card_colors_strategiesstrategy_typecard_colors_datar%  card_colorsr$  r'  r  s              r)    _process_board_card_color_schemez.JiraAPIImport._process_board_card_color_scheme  s    !2!6!6|!D!J/E/K/K/M 	+M+ $ ? ? C CM R$*<8K#.  / ?77')!	 ! OO--cdqcrruvyuz{"!>!%	 .  s   A22	B*;%B%%B*c                    i ddddddddd	d
dddddddddddddddddddddddddd d!d!d!d"d#d$d%d&d'd(d)}g }|j                  d*g       }|D ]  }	 |d+   d,k7  r|d-   }|d.   }|j                  |      }	|	s|j                  d/      r| j                  j                  |      }
|
j                  d0i       j                  d1      }|j                  |      }	|	s|
d-   }|j                  |      }	|	s^| j                  j                  j                  j
                   d2| }t        j                  j                  |d3d-g4      }|j                  }	|	s.| j                  j                  j                  d5| d6| d7       1|	j                  d8      r-t        t        j                  |	j                  d9      d:         }nt        t        j                  |	      }|j!                  |j"                  |	d;        |S # t$        $ r/}| j                  j'                  d<| d=| d>|?       Y d }~d }~ww xY w)@Nr   r   r   r   versionsaffected_versionsrl   rj   fixVersionsfix_versions
componentsr  r  r   r  r   r   r   r   ri   rC  ra  r   r   r   creatorr  r   r   r   rh   perm_security_levelr  listsagile_story_pointsop_gantt_task.actual_workop_gantt_task.sched_workzop_gantt_task.actual_completezop_gantt_task.sched_start_datezop_gantt_task.sched_finish_date)rk   securityra  z)com.atlassian.jpo:jpo-custom-field-parent'com.pyxis.greenhopper.jira:gh-epic-linkz$com.pyxis.greenhopper.jira:gh-sprintStory Points	timespenttimeoriginalestimateprogress1com.atlassian.jpo:jpo-custom-field-baseline-start/com.atlassian.jpo:jpo-custom-field-baseline-endcurrentFieldsmodeworkModer3   fieldIdcustomfield_r   r   r^  r  r  u5   Не удалось сопоставить поле 'r  r  zop_gantt_task.r  rF   )rL  	classNameua   Не удалось добавить поле в раскладке карточек доски: r{  zERR-0139r|  )rq   r  r   rJ   rl  rm  ro   CmfCustFieldr  r3   r}   r6  r   CmfGanttTaskr  r?  r   rL  rN   rP   )r&   card_layout_configr&  r  card_task_fieldscurrent_fieldscurrent_fieldcurrent_field_namecurrent_field_idr   r   custom_field_schemacustom_field_namecust_field_ext_id
cust_field
task_fieldr  s                    r)   _get_card_task_fieldsz#JiraAPIImport._get_card_task_fields  s7   

0
 +
 	

 >
 ,
 f
 |
 (
 6
 

 x
 ,
 '
 |
  z!
" h#
$ &-9?7=4;04$>7Aa?`;
	@ +//D+ +	M* (J6%26%:"#0#; &]]+;<
!&6&A&A.&Q#'#3#3#7#78H#IL*6*:*:8R*H*L*LX*V'!*/B!CJ%,8,@)%.]]3D%E
%/3/E/E/L/L/X/X.YY[\l[m,n)%+%8%8%=%=#4$(&> &> &
 &0__
!OO**22OPbOccfgwfxxyz (()9:!()<)<j>N>Ns>STU>V!WJ!(!DJ '')11!+) E+	Z    ))w  yF  xG  GI  JM  IN  O! *  s&    H)D!HA6H	H?$H::H?u   Обработка досокc                    ddd}dddddd	d
}ddddd}t         j                  j                  d|dg      }|s$t         j                  d||d| j                        }|j                  sd|_        |j                          |d   }| j                  |      D 	]s  }	 | j                  j                         r y|d   }	|d   }
| j                  j                  j                  d|	 d|
        |d   d   }|d   }|d   }d}|d   d   }|r|d   }|d   }| j                  j                  j                  j                   d| }t         j                  j                  |g d !      }|s"t         j                  | j                  |d"      }|j                  rJ||_        d#|_        d$|_        |j"                  j%                  |       ||_        |j                  d%       n/| j                  j                  j)                  d&| d'| d| d(       g }|d)   }|d*   ddd+   D ]  }|d   }|d   }| j                  j                  j                  j                   d| d| }t         j                  j                  |g d,!      }|s"t         j                  | j                  |d"      }|j                  r(||_        d-|_        ||_        |j                  d%       n/| j                  j                  j)                  d.| d'| d| d/       |j%                  |        g }|d0   d1   ddd+   D ]  }|d   }|d   }| j                  j                  j                  j                   d| d| }t         j                  j                  |g d,!      }|s"t         j                  | j                  |d"      }|j                  r+|d   |_        d-|_        ||_        |j                  d%       n/| j                  j                  j)                  d2| d'| d| d(       |j%                  |        | j                  j                  j                  j                   d|	 |d3<   t         j*                  j                  d3d4|d3   gd5d4|ggg d67      } | s%t         j+                  |d3   | j                  d8      } | j                  r|d   | _        || _        || _        |j                  |d9         | _        || _        || _        || _        |j                  |d:   d	      | _        |j                  |d;   d      | _        | j<                  j                  |d<   d=      | _        | jA                  ||       | _!        d| _"        |d   | _        | j                  d%       tG                n/| j                  j                  j)                  d>|  d'|	 d|
 d/       | jI                  ||        tK        tM        d? |d@   dA         d      }!tK        tM        dB |d@   dA   ddd+         d      }"|"rdC|"dD<   |!rdE|!dD<   d}#t         jN                  jQ                  | g dFG      }$|$D ]x  }%|%j&                  jR                  xs i }&|&j                  dH      }'|%j                  r|'s=|'|%jT                  k7  sM| j                  j                  j)                  dI|  dJ       dK}# n g }(dL}'|d@   dA   D ]  })	 |)d   }*|)d   }+| j                  j                  j                  j                   d|* },t         jN                  j                  d3d4|,gd5d4| ggdMdNgdO      }%|%s5t         jO                  | |,| j                  dP      }%|%j                  d%       |(j%                  |%jV                         |%jX                  r0| j                  j                  j)                  dQ|% d'|* d|+ dR       |%j&                  jR                  xs i }&|%j                  r|+|%_        |)dS   |%_-        |)dT   |%_.        g }-|)dU   D ]  }.| j                  j                  j                  j                   d|.d    }/t         j^                  j                  |/V      }0|0s+| j                  ja                  dW|% d'|* d|+ dX|. dY| Z       |-j%                  |0        |-|%_1        |)d[   rd\|%_2        n$|)dU   sd]|%_2        n|)j                  dDd^      |%_2        |&jg                  |)       n/| j                  j                  j)                  dQ|% d'|* d|+ d/       |#r|'|%_*        |%jT                  |&dH<   |&|%_        |%j                  d%       tG                |'dLz  }' t         jN                  jQ                  dbdc|(gd5d4| gg ddgde      }2|2D ]  })|)jk                  df        |2r(| j                  j                  j)                  dg|2        tG                | j                  xjl                  dhz  c_6        	v y# th        $ r3}1| j                  ja                  d_* d+ d|1 d`| da       Y d}1~1ed}1~1ww xY w#  | j                  ja                  di| dj|da       Y 	xY w)ku  
        https://bcrm.carbonsoft.ru/desk/favorites/Document/DOC-007367#spec-006348-b
        https://developer.atlassian.com/cloud/jira/software/rest/api-group-board/#api-rest-agile-1-0-board-boardid-quickfilter-get

        Только для Jira Server.
        Если с доской связано несколько проектов,
        то в каждом проекте создаются одинаковые доски с единым основным фильтром 
        zboard.scrum:defaultzboard.kanban:default)scrumkanbanz	1 queriesz2 userstoryz
3 assigneez4 epicz	5 projectz7 none)r   parentChildrl   r  rC  nonez1 -1wz2 -2wz3 -4wz6 none)z-1wz-2wz-4wNONEu
   Доскиtree_node_is_branchr  N)r3   ra  rb  r[  rJ   Tr   r3   u!   Обработка доски ID r  r
  r   cardColorConfigcardLayoutConfigr   r^  )r3   r  r  r  r  r+  r6  r  ri  u   Основной фильтр z (ID u;   ) был изменен и не будет обновленswimlanesConfig	swimlanesr  r*  r  u   Дорожка uA   ) была изменена и не будет обновленаquickFilterConfigquickFiltersu   Быстрый фильтр rf  r  ra  )	ra  rb  kanban_bql_filterswimlane_bql_filtersquick_bql_filters
limit_dayskanban_board_columnsrV  r  r  rf  rJ   r  r  swimlaneStrategyoldDoneIssuesCutoffcardColorStrategyre     Доска c                     | d   xr | d    S NmappedStatusesisKanPlanColumnr@   columns    r)   r   z/JiraAPIImport._process_boards.<locals>.<lambda>      v.>'?'aO`HaDa r*   rapidListConfigmappedColumnsc                     | d   xr | d    S ry  r@   r|  s    r)   r   z/JiraAPIImport._process_boards.<locals>.<lambda>$  r~  r*   z#00875ar  z#42526e)rJ   r  r  ra  r   r  u.   Порядок колонок на доске up    был изменен и не будет обновлен. Упорядочите колонки вручнуюFr  r  r  )r   r   r  r"  u   Колонка uG   ) была удалена и не будет восстановленаr9  r  rz  ro  u   Для колонки u!   ) не найден статус zERR-0124r|  r{  r  z#6b778cz#0052ccu5   Не удалось создать колонку ID zERR-0042r  r   r  r  r  r  uC   Удалены колонки, отсутствующие в Jira: rF   u:   Не удалось импортировать доску zERR-0043)7ro   rk  rq   rJ   rg  rp  _get_project_boardsrL   r}   r
  rl  rm  r7  r  r3   r@  rA  r  r   r  r6  CmfKanbanBoardra  rb  rh   rn  rp  ro  swimlane_typerq  r   r%  r`  rV  "kanban_board_quick_filters_visiblerM   r8  r   r   CmfKanbanBoardColumnr  r   r  r   r  min_sizemax_sizerp  rP   mapped_status_codesr  rF  rN   r  r_  )3r&   r  rb  
board_typeswimlane_type_mappinglimit_days_mappingboard_folderr  boardboard_id
board_nameboard_configr3  rU  rn  board_filterboard_filter_idboard_filter_namekanban_filter_ext_idro  swimlanes_configswimlaneswimlane_idswimlane_nameswimlane_ext_idswimlane_filterrp  quickfilterquickfilter_idquickfilter_namequick_filter_ext_idquick_filterr&  first_column_with_statuseslast_column_with_statusesupdate_column_orderboard_columnsboard_columncolumn_datacolumn_ordernocurrent_columnsr}  	column_idcolumn_namecolumn_ext_idr  r   r  status_globalr  columns_for_deletions3                                                      r)   r  zJiraAPIImport._process_boards1  s    +,

 "($"!
 	
 ''++)* , 

 !++!"'?? , L ///3L,!$'
--j9 Z	EY??,,. ;"6]
&&++7zJ<P  %V}X6$01B$C!%12D%E" %)!$V}X6&24&8O(4V(<%.2oo.D.D.K.K.W.W-XXZ[jZk+l((.(;(;(?(?3  )@ )% -,2,?,?'+#7,0 -@ -)
 )881B).8>)57?)4)44;;KH<H)9)..4.@..66<=N<O P##2"326G5H IXY (*$#/0A#B  0 =dd C AH"*4.K$,V$4M)-)?)?)F)F)R)R(SSUVaUbbdeodp&qO&,&9&9&=&=.  '> 'O +*0*=*='+#2,0 +> +
 '66/<,5?2:B7',,,>..66-o->eK=PRS`Ra b^ _ )//@9A> %'!#/0C#D^#TUYWYUY#Z ;K%0%6N'26':$-1__-C-C-J-J-V-V,WWYZhYiiklvkw*x'#)#6#6#:#:2  $; $L ('-':':'+#6,0 (; (
 $33,7,?)2</7B4$))d);..66:<. I##1"2"5E4F GXY
 &,,\:;;> &*__%;%;%B%B%N%N$OrRZQ["\h"1155!3h8!34
 6 	" ! & 5 5$X#'??(, !6 !I
 ,,%*6]IN'2I$,8I)+5>>%-+HI(2CI/2CI/5II2.C.G.G();< /I+ ,>+A+A$%:; ,I( 372Q2Q2U2U)*=>3I/ 261K1K*!2I. DHI@05fI-NNtN4LOO**22%i[hZr* NZ [ 556GS .2a$%67H .* -1a$%67H2N -) -9B-g6-:C.w7
 '+# & ; ; @ @$ !A ! %2 L".">">"D"D"JK%0__Y%?N(33)n@T@T.T..66LYK XS T
 /4+ #%!%*+<=oN ZFY$*4L	&,Vn+/??+A+A+H+H+T+T*UUWXaWb(c'-'B'B'F'F!)3 >!)3	 :$
 !2 -$ -1 (G 
(  ,+1+F+F'0'4+/??04	 ,G ,L )--$-?'..|/@/@A'33 OO22::"1,uYKrR]Q^ _h !i %&2&B&B&H&H&NB'770;L-4:5ML14:5ML124/*01A*B J37??3I3I3P3P3\3\2]]_`fgk`l_m0n060D0D0H0HP]0H0^'4$(OO$=$=*@eT]S^^`al`m nJJP)S(2,5	 %> %& %- 3 : := IJ @SL<  &&785> 2%+,<%=5> 2 6<ZZ5S 2'..v6 OO22::"1,uYKrR]Q^ _b !c
 /3AL0 6B5I5IK	27B4$))d);"&$.gZz (.'B'B'G'G?;!3	22
 %) (H ($ 3 9FMM4M89'OO**22]^r]st 55:5g
Z	t	 % 11ST]S^^`al`mmopsotu& )%)	 2  4))PQVPWX#!	 * sX   i9Wii(>i'C2hiFh1Bi	i(iiii$i6u#   Обработка спринтовc                 \   t         j                  j                  dd|gg dgddg      }|sBt         j                  ddd	||d
      }|j                  dv rd	|_        |j                  d	       t         j                  j                  d      }t               }| j                  |d         D ]A  }| j                  j                         r y |d   }| j                  j                  j                  j                   d|d    }t         j                  j                  dd|gdd|ggg dd	      }	|	s#t         j                  ||| j                  d	      }	|	j                  }
|	j                  rQ||	_        ||	_        |d   |	_        | j&                  j(                  s5|j                  dd      r#|	xj$                  d|j*                   dz  c_        |j                  d      |	_        |j                  d      |	_        ||	_        |	j2                  r|	j                  d	       |d k(  r!|	j4                  j7                  d!      |	_        nK|d"k(  r!|	j4                  j7                  d#      |	_        n%|d$k(  r |	j4                  j7                  d%      |	_        |d$k(  rd	nd|	_        |	j2                  r|	j                  d	       t=                d&}| j                  j>                  jA                  d'|	j$                   d(tC        |d)                 |d)   jE                         D ]r  \  }}|d*   }|d+   }| j                  j                  j                  j                   d| }t         jF                  j                  |g d,d	-      }|rw|	jH                  jK                  |       |jL                  d%k(  s|d$k(  r-|jN                  D ]  }||	k7  s	|j:                  r n d	|_        nd|_        |j                  d	.       |d   |d   k7  rK| j                  jQ                  d/|d    d0| d1| d2|d    d1|d*    d3tR        jT                  4       |d5z  }3| xjV                  d5z  c_+        | j                  jY                  d/|d    d0| d1| d6d7|	8       u |r(| j                  jY                  d/|d    d9| d:d;|	8       |	j                  d	       |d"k(  r|
s t         jZ                  j]                  |	<      s|	j4                  j7                  d!      |	_        |	j                  d	       | j                  j>                  jA                  d=|	j$                   d>       |	j_                          d	|	_        |	j                  d	       t=                |ja                  tc        |	jd                               | j                  xjf                  d5z  c_3        | j                  ji                  dd?       D tk        t         j                  jm                  dd|gg d@gdAgd	            |_7        |jn                  rd	|_8        n4tk        t         j                  jm                  dd|gdAgd	            |_8        |j                  d	       t         j                  js                  tu        |      B       y )CNrb  rY  )r[  rY  rq  rg  r  r  Sprintsrq  Ti  r3   r[  r  ra  rb  r  )r  r  ri  zlist.agile_sprint:defaultrg   r   r  r^  rf  r  ra  )rf  r3   rh   r  r[  r~  rd  re  rb  r   r  )r   r   include_archived)rh   rf  rJ   r  r3   multiprojectFr1  r  r_  r`  futurer  r  r  closedr  r   u0   Добавляем задачи в спринт r  issuesr4   rC  )zlists.cmf_archivedrf  cache_status_typerB  zop_gantt_task.sched_durationrD  rC  r  )rf  r   r  r  u   В спринт 'u5   ' не удалось добавить задачу 'r  u   ) проекта 'u\   ). Возможно проект или задача еще не импортированы.rc  rF   u$   ). Задача не найдена.zERR-0044r  uX   ' не удалось добавить задачи из других проектов: u]   . Возможно проекты или задачи еще не импортированы.zERR-0133)	task_listu   Запуск спринта "ry  r  r  r  Tr  )list_ids);ro   rk  rq   r  tree_hiddenrp  r  rd  _get_all_sprintsrJ   rL   rl  rm  ro  r-  r  rh   rb  r3   rb   rn   r  rd  re  r  rD  r~  get_default_statusr   r  rM   r}   r
  r  r   r?  r[  r   r  rA  rK   r{   r>  rO   rP   CmfListHistoryOTRr;  do_startrf  r.   r   r_  r  r   r  r  rg  recalculate_count_cacher  )r&   r  rb  sprint_foldersprint_logic_type
sprint_idsrq  sprint_staterf  
sprint_objsprint_is_newexternal_tasks_countr  r  r  issue_projectissue_ext_idrA  r  s                      r)   r  zJiraAPIImport._process_sprints  s   ((,,k2,
 &' - 	
 ",,!"' - M ''+SS,0)40"//339T3UU
++L,>? J	<F((*!'?L..55AAB"VD\NSF++sF+sK0 "&% , J( #^^0!#$(	 , 
 '--M))(9
%)6
&"(.
 yy6::ne+LOOK,H,H+I'KKO-3ZZ-D
*+1::i+@
(-3
*((OOO58+(2(;(;(N(Nv(VJ%!X-(2(;(;(N(N}(]J%!X-(2(;(;(N(Nx(XJ%2>(2J$PU
'((OOO5L#$ OO""''*Z[e[j[jZkkmnqrx  zB  sC  oD  nE  )F  G(.x(8(>(>(@ /$*&u-	 *9 5"&//"8"8"?"?"K"K!LBxjY~~))'	 &* *  &&--d3--9'83-1ZZ 9	#,
#:9CYCY$)9 59 105D-		D	1!$'=+>>OO''+F6N+; <NNW[X[\d[e f++8+@*A]SXEYDZ [tu &oo (  )A-(OOq(OOO--+F6N+; <NNW[X[\d[e f<= $.& . S/b $))'v'7 8HH\G] ^rs  *" *  OOO- ("&*B*B*H*HS]*H*^$.$7$7$J$J6$R
!D1&&++.KJOOK\\],^_##%-1
*D1LNN3z}}-.OO11Q61OO$$X{;UJ	<\ /3NN"C7/ v!%   	/
+ ..04M-04##)3> 6%) $ 1M- 	t, 	..Z8H.Ir*   c                 &    |sd}|sd}| d| d| S )Nu   Не указаноr  u    ➔ r@   )r&   rL  	old_value	new_values       r)   _simple_html_diffzJiraAPIImport._simple_html_diff  s)    -I-I"YKuYK88r*   c                 j   |dk(  ry	 | j                  |      }| j                  |dd|      \  }}|st        d|       	 |S # t        $ re}|r | j                  }| j                  rd| nd}| j
                  j                  | d| d	d
       | xj                  dz  c_        Y d}~|S d}~ww xY w)u  
        Возвращает пользователя по какому-либо идентификатору (id, имя, логин, email и др.).

        Args:
            user_id (str): Идентификатор пользователя для поиска.
            obj (optional): Объект в контексте которого был поиск пользователя. Defaults to None.
            raise_on_error (bool, optional): Вызвать исключение при ошибке поиска
                или вернуть резервного пользователя ('Система' или пользователь по умолчанию).
                Defaults to False.

        Raises:
            Exception: Исключение при ошибке поиска пользователя.

        Returns:
            CmfPerson: Объект пользователя.
        unknownNFr|  ue   Пользователь с указанными данными не найден в системе:    по умолчанию    'Система';   . Будет установлен пользователь zERR-0045r   r%  rF   )r  r[  rN   r   r   rJ   rP   rO   )	r&   r  rQ   rz  rB  r  r  r  
person_msgs	            r)   r~  zJiraAPIImport._get_person  s    $ i	%009D,,T5%S,IIFA  #H  IM  HN  !O  P  P    	%..DHDYDY7x@_q
))eVWaVbc( * 
 1$	%s   9A 	B2AB--B2	dump_pathc                    |j                  d      }|j                         rJt        |d      5 }|D ]/  }t        j	                  |      }|d   |d   k(  s$|c cd d d        S  	 d d d        t        |d      5 }|j                  t        j                  |      dz          d d d        |S # 1 sw Y   GxY w# 1 sw Y   |S xY w)Ngroups.jsonre  r3   r  r*  )r   r   r   r   r  writedumps)r&   rZ  r  groups_pathr   rowrQ   s          r)   _dump_groupszJiraAPIImport._dump_groups  s    ((7k3' #1 #C**S/CV}F3"
	# ### +t$ 	-GGDJJu%t+,	-# #	-s#   &B*B*"B*8(B6*B36C c                    |sy 	 | j                  |       y # t        $ r) 	 |j                  d      }|j                  dd      5 }|j	                  d       |D ]E  }	 t
        j                  |      }||| j                     k(  r na.# t
        j                  $ r Y Cw xY w | j                  j                  |      }|r)|j                  t
        j                  |d      dz          d d d        n# 1 sw Y   nxY wY y Y y # t        $ r<}| j                  j                  d	| d
| t        j                          Y d }~Y y d }~ww xY ww xY w)N
users.jsonr  zutf-8)encodingr   Fensure_asciir*  uI   Неудалось выполнить дамп пользователя 'r  rc  )r  rN   r   r   seekr   r  rm   JSONDecodeErrorrb   get_user_infor  r  rJ   rK   r{   r>  )r&   r  r  
users_filer   r  r  r  s           r)   
_dump_userzJiraAPIImport._dump_user  sR   	))'2 	&//=
__TG_< VFF1I  
V%(,

3I&)DMM*BB %  C#33 %$%
V %)II$;$;G$D	$GGDJJyuJ$MPT$TUV V V V  ##_`g_hhklokpq!// $  !	si    
E
$DC1'BC1B	C1B	A
C1(	D1C:	6D	E
1E;E
EE
u,   Обработка журнала работrQ  c                 N   | j                   j                  j                  d       |d   }d|d    d|d    d}d }|j                  d      r|d   j                  d	      }||d
z  }d}d}| j	                  |      }	t        |	      }
t        |	d      D ]k  \  }}t               }d|d<   |j                  di       j                  | j                        r.| j                  |d   | j                     |      |d<   |d   |d<   |j                  di       j                  | j                        r&| j                  |d   | j                     |      |d<   ||d<   |d   |d<   |d   |d<   |d   |d<   |d   d
z  |d<   |j                  dd       |d!<   | j                   j                  j                  j                   d"|d#    |d$<   ||d%<   ||
k(  r|||d&<   nd|d&<   t        j                  j                  |d$   t        |      d'gz   (      }|s!t        j                  | j                   d)      }|j                  r|D ]  }t!        ||||           t#        j$                  |j&                  j(                  *      }|j*                  j(                  |z   |_        |j.                  r|j1                  d+       ||j&                  j(                  z  }A| j                   j                  j3                  d,| d-       d.}n |P|rM	 t        j4                  j                  |d/g0      }||z   |_        |j.                  r|j1                  d+       y y y y # t8        $ rE | j                   j;                  d1t<         d2t>         dd3d45       | xj@                  dz  c_         Y y w xY w)6Nu*   Загружаем журнал работr   u%   Журнал работ задачи r4   r  r   r  timetrackingremainingEstimateSecondsr;  Tr   rF   r  r   r	  r|  r  r   updateAuthorcmf_modified_byra  r   r   r   r   started
start_datetimeSpentSeconds
time_spentcommentr   r   r^  r   rf  r  remaining_estimateend_dater  )rJ   r  )r  ri  u'   Запись журнала работ ux    была изменен пользователем. Новые данные из импорта не примененыFtimetracker_sched_workrA  r   u2   Не удалось обработать Гант u    задачи 'ERR-0112rT  r%  )!rJ   r}   r
  rq   _get_issue_worklogsr  rN  r  rm   r~  rl  rm  ro   CmfTimeTrackerHistoryr  r  r?  datetime	timedeltar  r   r  r  rD  rp  r6  rT  r  rN   rP   ganttr  rO   )r&   rA  rQ  issue_fieldsrQ   r  remaining_estimate_secr  actual_workworklogslengthr  worklogtimetracker_historyhistoryr   r  
gantt_tasks                     r)   _process_issue_worklogz$JiraAPIImport._process_issue_worklog  s   ##$PQX5eEl^3|T]G^F__`a "N+%1.%A%E%EF`%a"%1%;b%@"++E2X#Ha0 *	(JAw"&&,4){{8R(,,T]];484D4DWXEVW[WdWdEekn4D4o#L13F|3T#K0{{>2.224==A9=9I9I'R`JabfboboJpvy9I9z#$56,0)4;I4F 015<Y5G 1207	0B-078J0Kb0P-*1++i*D'/3/E/E/L/L/X/X.YY[\cdh\i[j,k)5< 12F{1=<N#$89<=#$892266*84/0J<? 7 G  66#$( 7  &&0 HEGU,?,FGH%//8J8J8P8PQ
#*#5#5#;#;j#H %%LLTL2w11777&&..=gY GZ [ #(U*	(Z )o%#0044$H`Ga4b
4?BT4T
1((OOO5 )	 />)  %))H_h^iijk+ * 
 1$%s   A
M AN$#N$c                    |j                  d      D ]  }|j                  d      }|j                  |j                         |j	                          |j                  |       |j                  dg       }|D cg c]  }|j                  d      s| }}|s
|dgz   |d<   |d   j                  dd      d   }|d	| gz   |d<    y
c c}w )uF   
        Конвертирует "Фрагмент кода"
        prer   r  zcode-zlanguage-noner   r  rF   z	language-N)	r  r  extendcontentsclearr   rq   r  r  )r&   r  r  code_tag	class_tagclass_
code_classr   s           r)   _convert_codezJiraAPIImport._convert_code,  s     %%e, 	@C ((0HOOCLL)IIKJJx ,I/8WVF<M<Mg<V&WJW(O+<<G!!}**3215(iv,>+??G	@ Xs   8CCc                    |s|S t        |d      }| j                  ||       | j                  |||       | j                  |       dj	                  |j
                  j                  D cg c]  }t        |       c}      }|S c c}w )Nlxmlr   )r   r  r  r  r   r  childrenr.   )r&   r   rQ   datar  cs         r)   _convert_textzJiraAPIImport._convert_text?  sx    K!$/	y#.IsD19%ww	(?(?@1A@A As   *Bu8   Обработка комментариев задачиc                    d|d    d|d   d    d}d}d}| j                  |      D ]  }|dz  }| j                  j                  j                  j                   d	|d
    }t        j
                  j                  |      }|r.|j                  s"| j                  j                  d| d|       |s$t        j                  ||| j                  d      }n|j                  dg       |j                  di       j                  | j                        r9| j                  |d   | j                     |      |_        |j                  |_        |j                  di       j                  | j                        r(| j                  |d   | j                     |      |_        |d   |_        |d   |_        ||_        |j"                  |_        | j'                  |d   ||      |_        ||_        |j                  d      r|dz  }|d   d   dk(  rIt        j,                  j                  |d   d         }	|j.                  j1                  |	       d|_        n;| j                  j                  d|d    d|       | xj4                  dz  c_        m|j                  d      rAt7        t9        d |d         i       }
|
j                  di       j                  d d!      |_        |j:                  r|j=                  d"       | j                  j?                  d#d$        | j                  jA                  d%| d&|        y )'Nu$   Комментарий задачи r4   rx  r   r   ry  r   rF   r^  r   ro  uN   Комментарий уже есть, и правился в системе zERR-0046r|  Tr"  z**r	  r  r   r   r
  
visibilityr  r  r   r  uL   Ошибка обработки приватного комментария zERR-0047
propertiesc                 *    | j                  d      dk(  S )Nr4   zsd.public.commentr   )ps    r)   r   z7JiraAPIImport._process_issue_comments.<locals>.<lambda>z  s    !%%,2E"E r*   internalFri  r  r  u   Обработано u:    комментариев, из них приватных )!_get_issue_commentsrJ   rl  rm  ro   r@  rq   r  rP   r9  rm   r~  r  r   r  r   r   ra  rC  r  r   r  r  r  r   r-  rO   r   r   rD  rp  r  rK   )r&   rA  rQ  rQ   cntprivate_cntr  rf  cmf_commentr  sd_public_comments              r)   _process_issue_commentsz%JiraAPIImport._process_issue_commentsL  sg   4U5\N$uXW`GaFbbde//6 2	=G1HC..55AAB"WT]OTF ++//v/>K;#>#>)),z  |G  {H  +I*4$ * @$//tFW[WfWfx|/}''/{{8R(,,T]];)-)9)9'(:KDMM:Z`c)9)d&(3(>(>%{{>2.224==A.2.>.>w~?VW[WdWd?ekn.>.o+*1)*<K')0);K& "&K"&++K#11'.2I;X]^K*1K'{{<(q <(0F:!0044',:OPW:X4YD**11$7*.K'OO--0|  ~E  FR  ~S  }T  /U.8d . DOOq(O {{<($(E- %! '8&;&;GR&H&L&LZY^&_#%%  T 2OO$$Y<e2	=f 	3C58rs~r  A  	Br*   c                 p   t         j                  j                  dd|gg dgddg      }|rX|j                  r|j                  r@|j                  rdnd}| j
                  j                  j                  d	| d
| d| d       y |s4t         j                  || j
                  d      }|j                  d       t         j                  j                  dd|gdg dg dggd      }|r-| j
                  j                  j                  d	| d
| d       y t         j                  j                  |      D ]  }|j                  d        |d   }ddddd}d}	d}
t        j                  dt        j                        }|j!                  |      D ]  }|j#                         \  }}}}}|j%                         }|rHdj'                  d |j)                  d       D              j%                         }|j+                  dd!      }n|}|t-        |      |||d"}|	d#z  }	|d$k(  r|
d#z  }
t         j                  |||||j                  |d      | j
                  d|%      }|j                  d        t        j                  d&t        j                        }|j/                  |      }|rf|j#                         \  }}|j%                         |_        |r5d!j'                  d' |j)                  d       D              j%                         }||_        |	|_        |
|_        ||_        |j                  d       y )(Nra  r  r  Tr  )r   r  r   u   Удаленu   Изменен   Задача u   . Чек-лист r{  uf    пользователем. Изменения из импорта не будут применены)ra  rJ   r  ri  r,  )r  r  Fr  r  u   . Пункты изменены пользователем. Изменения из импорта не будут примененыr  r  r   r  r  r  CANCEL)r  ~r3  xr   z{(?P<status>[x~+-])(?P<mandatory>!)?\s*(?:\[(?P<custom_status>[^\]]+)\]\s*)?(?P<name>[^\n]*)(?P<description>(?:\n>[^\n]*)+)?r*  c              3   @   K   | ]  }|r|j                           y wr7   r  r4  lines     r)   r5  z3JiraAPIImport._process_checklist.<locals>.<genexpr>  s!      ( JJL(   z
>rE   )r   	mandatorycustom_statusr3   r   rF   r3  )
cache_taskra  r3   r   r   rJ   r  r  z6#\s*(?P<header>[^\n]*)(?P<description>(?:\n>[^\n]*)+)?c              3   @   K   | ]  }|r|j                           y wr7   r  r&  s     r)   r5  z3JiraAPIImport._process_checklist.<locals>.<genexpr>  s!      ' JJL'r(  )ro   CmfChecklistrq   r  r  rJ   r}   r6  rp  CmfChecklistItemr  r  r  r  compileMfinditerr4  r7  r   r  r.  r   r  r3   r   checklist_items_countchecklist_items_done_countr  )r&   checklist_datar  	checklist
action_msgmodified_itemr  	items_strstatus_mappingitems_countitems_done_countitems_patternmatchr   r)  r*  r3   r   r   	item_dataheader_patternheaders                         r)   _process_checklistz JiraAPIImport._process_checklist  s   ''++3	** !!? , 
	 i779;P;P+4+@+@FVJOO""**	{*<YKr* V\ ] ++ ?? $ , I
 NNtN,//443	*3. ! 5 

 OO""**	{*<YK H\ ] ++00	0B 	/DKKK.	/ #7+	 	
 

0 DD
 #++I6 #	(EBG,,.?FI}dK::<D"ii ( + 1 1% 8(  %'	 
 #**45" !!)_!.*I 1K} A% **$ %))&&9?? $ ) + 	D II$I'G#	(J 0DD

 %%i0"',,.FK#\\^IN!hh ' + 1 1% 8'  %'	 
 )IN*5	'/?	,$2	!4(r*   u0   Обработка плагинов задачиc                 r    | j                  |      D ]#  }|d   dk(  s|d   s| j                  ||       % y )Nr4   z&com.railsware.SmartChecklist.checklistr   )_get_issue_propertiesrA  )r&   rQ  r  issue_propertys       r)   _process_propertiesz!JiraAPIImport._process_properties  sE    "88? 	CNe$(PPUcdkUl''	B	Cr*   c                    ddddddd}|j                         D ]  \  }}g }|d   j                  |d   g       D ]  }| j                  j                  j                  j                   d	|d
    }t
        j                  j                  |      }	|	r|j                  |	       i| j                  j                  d| d| dd       | xj                  dz  c_	         t        ||d   |        y )Nr=  r<  )attrr   r;  r:  )FixAffectedr   r   
::version:r   ro  u   Не найдена 'u   ' версия zERR-0050ro  r%  rF   rG  )r   rq   rJ   rl  rm  ro   ro  r   rP   rO   r?  )
r&   rQ  r  version_typesversion_typeversionr:  version_datarf  version_objs
             r)   _process_issue_versionsz%JiraAPIImport._process_issue_versions
  s    '&
 ,#	
 &3%8%8%: 	:!L'H %h 3 3GG4Db I ) OO2299EEFjQ]^bQcPde$nn000?OOK0OO--/~_\N["!* . 
 OOq(O) Iwv9	:r*   c                    g }|d   j                  dg       }|D ]  }| j                  j                  j                  j                   d|d    }t        j
                  j                  |      }|s6| j                  j                  d| dd	       | xj                  d
z  c_        |j                  |        ||_	        y )Nr   r>  r^  r   ro  u%   Не найден компонент zERR-0051CmfComponentr%  rF   )
rq   rJ   rl  rm  ro   rR  rP   rO   r   r>  )r&   rQ  r  issue_componentsr>  	componentrf  comp_objs           r)   _process_issue_componentsz'JiraAPIImport._process_issue_components%  s    8_((r:
# 
	.I..55AAB"Yt_DUVF**..f.=H));I;G+ * 
 1$##H-
	.  0	r*   c           	      
   ddl m} g }|d   j                  dg       }|D ]  }|j                  dd      j                  dd      } ||d	d
      }	 dddd| dgdd|gddd| dgg}t        j
                  j                  |      }	|	s&t        j                  |      }	|	j                          |j                  |	        ||_        y # t        $ r.}
| j                  j                  d| d|
 d|       Y d }
~
d }
~
ww xY w)Nr   r  r   r  rE   r  r  r   r  Tr  r,  r  r0  ry  r  r3   r]  r  u+   Не удалось создать тег 'r  zERR-0125r  )r  r  rq   r.  ro   r  rp  r   rN   rJ   rP   r  )r&   rQ  r  r  r  r  labelr  filter_r  r  s              r)   _process_issue_tagsz!JiraAPIImport._process_issue_tags5  s%   *x$$Xr2 	EMM#s+33C<EU$FEg5'}5We,g5'}5	 mm''w'7 --U-3CHHJC 	* 	  ))A%C5Q)! *  s   A0C	D$C==Dc           
         ddl m} g d}d||xr |j                  j                  xs d |t	        |j                        t	        |j
                        d}d }	d }
|d   }|d   }|dv r-|r| j                  ||	      }	|rn| j                  ||	      }
nY|d
k(  r|rNt        j                  j                  | j                  j                  j                  j                   d| |      }	|rt        j                  j                  | j                  j                  j                  j                   d| |      }
n|dk(  r|}	|}
n|dk(  r| j                  j                  j                  j                   d|j                  j                   }|r-t        j                  j                  dd| d| g|dgz         }	|r/t        j                  j                  dd| d| g|dgz         }
ny t        j                  j                  j                  |      }t!        ||j"                        r|	xr |	j                  j                  xs d |d<   |
xr |
j                  j                  xs d |d<   |	xr |	j
                  j                  xs d |d<   |
xr |
j
                  j                  xs d |d<   |	xr |	j$                  j                  xs d |d<   |
xr |
j$                  j                  xs d |d<   n
|	|d<   |
|d<   t        j&                  j)                  |d   |d   |d   |d   |d   |d   |d   dg      }|s|S d S ) Nr   r   )r  r   r3   r?  )r  r   cmf_author_idr   obj_idobj_coderF  rG  )r   rj   r|  r   r^  r  ri   r   rf  r  rr  r  
from_valueto_valuefrom_value_codeto_value_codefrom_value_nameto_value_namer   r  r]  r   r^  r  )r   r  r]  r   r^  from_value_idto_value_idr   )cmfr   r   r   r.   r   r~  ro   r  rq   rJ   rl  rm  r~  r  r?  
issubclassCmfRelationBaser3   CmfOrmColumnHistoryr  )r&   r   history_itemr	  
created_atr  r   fields_history_datar`  ra  item_from_id
item_to_idr  	field_clscolumn_historys                   r)   _get_history_fieldz JiraAPIImport._get_history_fieldQ  sn   ( ($#7		?4(),,'INN+
 
#F+!$'
55!--l	-J
++JI+F<'#1155"oo44;;GGH<.Y" 6 
 !//33"oo44;;GGH:,W" 4  :%%J!H8#!%!7!7!>!>!J!J K2iN`N`NcNcMdeO#--11$co->b+OP"m_4 2 
 !++//$co->b+MN"m_4 0 
 NN))--j9	i!7!78)3)K
8K8K)StL&'/'EHKK4E4E'ML$.8.RZ__=R=R.ZVZL*+,4,L9L9L,TPTL).8.RZ__=R=R.ZVZL*+,4,L9L9L,TPTL))3L&'/L$  3388#L1'(89&7'(89)&|4$Z06 9 	
 $2|;t;r*   u.   Обработка истории задачиc           	      <   dddddd}d|d    d	|d
   d    d}g }|d   d   D ]  }| j                   j                  j                  j                   d|d    }d }|j                  d      r$| j	                  |d   | j
                     |      }n(| j                   j                  j                  d|        |d   |d|d}	|d   D ]  }
|j                  |
d   |
d         }| j                  j                  |      }|rF|d   rA|d   d   }|d   d   r1| j                  |d   d   |
||d   |      }|r|j                  |       | j                  ||
d   |
d         }d|	vr||	d<   |	d    d | |	d<    t        j                  j                  |g d!"      }|s"t        j                  | j                   d#|$      }|	D ]  }t        |||	|           |j                  s|j!                  d#%        |r!t        j"                  j%                  |&       y y )'Nr  r  r  r  u   Статус)r   rl   ri   r   r   u   История задачи r4   rx  r   r   ry  	changelog	historiesz	::historyr   r	  r|  u   Аудит без автора r   rF   )r   r  	log_levelra  r   r   r   rL  rs  r   
fromStringtoStringr   z<br>)r   r  rx  ra  r   r  T)rJ   r  rf  ri  )r   )rJ   rl  rm  rq   r~  rm   r}   r6  jira_map_fieldsrt  r   r  ro   r@  r?  rD  rp  rk  bulk_insert)r&   rQ  r  field_title_maprQ   history_fieldsr  rf  r  r  r  rL  r   history_fieldr  history_commentr4   s                    r)   _process_historyzJiraAPIImport._process_history  s    %0,*$
 -U5\N$uXy?Y>ZZ\][)+6 ,	7G..55AAB)GTXM?[FJ{{8$!--gh.?.NTW-X
&&..1PQXPY/Z[)0);:deqz{G( 0)--d7mT']K,,009U=1#M29=G]+,<=(,(?(?!-0> &#I.%) )*11-@--gtL7I4PZK[\(&*GFO)0(9)-'0GFO'0* %//33 4 	O #"("3"3t`dms"3"t <gcl;<))$$$6Y,	7\ &&22.2I r*   u]   Обработка связей с документами Wiki и веб-страницамиc                    g }|j                  dg       D ]L  }| j                  j                  j                  j                   d|d    }|d   }|d   }|st        j
                  j                  |      }|s#t        j                  ||| j                  d      }|j                  s|d	   |_        |d
   |_        ||_	        |j                  d       |d   dk(  s|j                  d      dk(  st        j                  d|d
         }	|	s|	j                  d      }
t        j                  j                  ddd|
 g      }|s7|j                  |       d|d<   O ||_        y )Nremotelinksr^  r   objectapplicationro  Tr"  r,  r  ri  r  zcom.atlassian.confluencerelationshipz	Wiki Pagez$/pages/viewpage.action\?pageId=(\d+)rF   rf  r(  r-  r]  r  )rq   rJ   rl  rm  ro   CmfLinkr  r3   r  r  rp  r  r  rZ  rp  r   local_links)r&   rQ  r  r  
remotelinkremotelink_ext_idremotelink_objremotelink_applinkr=  page_iddocs               r)   _process_remotelinksz"JiraAPIImport._process_remotelinks  sy   ))M26  	3J#'??#9#9#@#@#L#L"MRPZ[_P`Oa b'1N'6N!~~))1B)C!>>(0#'??(,	 * D '' .w 7DI-e4DH+5D(II$I/v&*DDNN>2kA 		"I>Z_K`a#kk!nG ,,006SQXPY?8[0\C &&s+.2J{+A 	3D !,	r*   c                    i }|d   }|j                  d      r&|d   j                  d      }||dz  |d<   |d   |d<   | j                  d      }|r+|j                  |d         r|j                  |d         |d	<   | j                  d
      }|r+|j                  |d         r|j                  |d         |d<   |sy 	 t        j                  j                  ||D cg c]  }| c}      }	|D ]  }
t	        |	|
||
           |	j
                  r|	j                  d       y y c c}w # t        $ r= | j                  j                  d| d| ddd       | xj                  dz  c_
        Y y w xY w)Nr   r  originalEstimateSecondsr;  
sched_workr  rK  r   sched_start_daterL  sched_finish_dater  Tri  u8   Не удалось импортировать Гант u    для задачи 'r  r  rT  r%  rF   )rq   r   ro   rT  r?  rD  rp  rN   rJ   rP   rO   )r&   rQ  r  r  r  estimate_secbaseline_start_fieldbaseline_end_fieldr   r  r   s              r)   _process_ganttzJiraAPIImport._process_gantt  s   X N+'7;;<UVL'&2R&7l#272E./  $66? 
  L$4$45I$5O$P(4(8(89Md9S(TE$% "44=
 ,"2"23Ed3K"L)5)9)9:LT:R)SE%&	!,,00iTYHZqHZ0[J 9
E5<89 $$D1 %	 I[  	!OO%%J5'Qghqgrrst' & 
 OOq O	!s%   ?D* 	D%
&=D* %D* *AE0/E0c                    | j                   j                  j                  j                   d|d    }t        j                  j                  |dg      }|s$t        j	                  |d|| j                   d      }| j                  j                  | j                  j                  d|d	          }d
| d| d|_	        |j                  r|j                  d       y y )Nz
::comment:r   r   r  r   T)ra  rx  rf  rJ   r  z/browse/r4   u<   Задача импортирована из Jira: <a href="z" target="_blank">z</a>ri  )rJ   rl  rm  ro   r@  rq   rb   
url_joinerr  r   rD  rp  )r&   r  rQ  comment_ext_idr  r  s         r)   _add_comment_link_to_issuez(JiraAPIImport._add_comment_link_to_issue2  s     OO2299EEFjQVW[Q\P]^##''!8 ( 
 '' %?? $ ( G yy##DIIMMXeEl^3LMv/vT; 	 LLTL* r*   u   Обработка задачиc           	      b  , d}|d   }|d   }d| d| d|d   d    d	}| j                  || j                  t        j                  j                     d         }||d
<   | j
                  |d<   d|d<   | j                  j                  j                  j                   d| |d<   | j                  r |j                  | j                   n||d<   t        |j                  d            |d<   |d   j                  d      r| j                  j                  j                  j                   d|d   j                  d      d    }	t        j                  j                  |	      |d<   |d   sH| j                  j                  d|d   j                  d       dd       | xj                  dz  c_        | j!                  d      }
|
r|d   j                  |
d         |d<   |d   j                  d      }|r-| j#                  |j                  | j$                        |      }n| j&                  }t(        j*                   d}| j,                  rd | nd!}| j                  j                  | d"| d#d       | j                  j/                  |t0        j2                  dd$       ||d%<   |d   j                  d&      }|r-| j#                  |j                  | j$                        |      }nf|}t(        j*                   d'}| j                  j                  | d(| d)d#d       | j                  j/                  |t0        j2                  dd$       ||d*<   |d   j                  d+      r| j#                  |d   j                  d+      j                  | j$                        |      |d,<   |d,   s| xj                  dz  c_        | j                  j                  d-|d   j                  d+       d#d       | j                  j/                  d-|d   j                  d+      j                  | j$                         t0        j2                  dd$       nd.|d,<   |d   d/   d   ,|d   d0   j                  d1      }|r|d   d0   d    d2, }n,}d| j                  j                  j                  j                   d| d}t        j4                  j                  dd3d4| d4g5      |d6<   |j6                  j8                  j                  d7      }| j:                  j<                  r|r|j6                  j8                  j                  d      }| j?                  |      }tA        tC        ,fd8|      d.      }| j                  j                  j                  j                   d|d    }t        jD                  j                  dd9|g5      }n|d:   }|d;   }|j                  ,|      }| j                  j                  j                  j                   d| }t        jD                  j                  dd3| d<g5      }ntA        tC        ,fd=|d>         d.      }|r|d?   }n|d@   d:   }tG        jH                  |      }| j                  j                  j                  j                   dA| }t        jD                  j                  dd9|g5      }||dB<   |d   dC   d   }| j                  j                  j                  j                   d|jJ                   d| }t        jL                  j                  dd9|gdDgE      } | su|d   dC   d?   }!|d   dC   dF   d   }"tO        jP                  |"      }#|jS                  |#G      } | j                  j                  t(        j*                   dH|! dI| dJdKd       | |dC<   |dC   jT                  |dL<   |d   j                  dM      r| j                  j                  j                  j                   d|d   dM   d    }$t        jV                  j                  |$      |dM<   |dM   sH| j                  j                  dN|d   j                  dM       dOd       | xj                  dz  c_        |jY                  dPd.      }%|%r|dQ   dR   }%| j                  jZ                  j]                  dS| dT|        tO        j^                  | j                  t        j                  |ddU|d   gV      \  }&}'|| ja                  |&|      z  }|&jb                  r|&je                  g dW       | jg                  |%|&|      |&_4        |xs g }|D ]  }(|&jj                  jm                  |(        | jo                  ||&       | jq                  ||&       | js                  ||&       | ju                  ||&       |&jv                  dXk(  rPt        jx                  j                  |dYddZg[      })|)|&_=        |)j|                  sd|)_>        |)j                  d\       |d   d]   |&_@        | j                  |&|       ||&_        |&j                  r|&j                  d\       t                | j                  ||&       | j                  ||&       | j                  |&|       n)| j                  jZ                  j                  d|& d^       | j                  ||&       |d   d_   d`   r| j                  |&|       | j                  j                  da      r| j                  |&|       t                | j                  j                  dbdc       t        |dd         j                  de      }*t        |*df      5 }+|+j                  dg       d.d.d.       |S # 1 sw Y   |S xY w)hu   
        Общая логика обработки которая потом разделяется на задачи и эпики
        r   r   r4   r!  r1  z): 'r   r   r  ra  r  Tapprovedr^  rf  r   archiveddater  rE  ro  r@  u:   Не найден уровень безопасности zERR-0048r?  r%  rF   rG  rB  r?  r|  u;    Не указан создатель(creator) задачиr  r  r  zERR-0049)rP  exc_infor  r   u    Не указан автор(reporter) задачи. Будет установлен тот же пользователь, что и создательr  r  r   rl   rj   u6   Не найден исполнитель задачи Nrk   rC  r  r}  r(  r)  r]  rh   r  c                     | d   d   d   v S )Nrz  r   r{  r@   wfissuetype_ids    r)   r   z.JiraAPIImport._process_issue.<locals>.<lambda>  s    <26F3G3J<3X#X r*   r  defaultWorkflowissueTypeMappingsr.  c                     | d   v S )Nr{  r@   r  s    r)   r   z.JiraAPIImport._process_issue.<locals>.<lambda>  s    |r,/?? r*   r  r3   r
  r  r~  r   rr  r  rm  )rr  u!    Не найден статус 'r  u  ). Необходимо проверить схему бизнес-процесса проекта и бизнес-процесс задачи в Jira. У задачи установлен статус по умолчанию аналогичного типа.zERR-0071r  r   u'   Не найдена резолюция zERR-0116r   renderedFieldsr   u4   Создание/обновление задачи 'r  rY  rg  )
r   r=  r>  r  r  r  rb  r   r  r  z	task.epicr  rg  rb  r[  r  r   ri  r   u[    была изменена пользователем и не будет обновленаr  totaltimeTrackingEnabledrA  r  r  r  wr   )QrV  rP  ro   r?  r.  rr   rJ   rl  rm  r   r.  r   rq   CmfSecurityLevelrP   rO   r   r~  rm   r   rI   rD   r   rK   r{   ERRORr  r  r   rb   rn   r  r   r   r  r   r  r   r  r   rq  r  rr  r  r  r}   r
  rn  r  r  r9  r  r   rA  r   rP  rV  rZ  r  r  rk  rb  rg  rp  r   r  rD  rM   r  r  r  r6  rE  r  ru   r  r  r   r   r   r  )-r&   rQ  rC  sprintsr  r  r  rQ   normalized_issuerf  story_p_fieldissue_creatorr  rU   r  issue_reporterr   simplified_projectissuetype_ext_idr  r  r  r  r  r  r~  r  issue_type_mappingsrl  r  r  r  
status_objrs     status_сategoryrr  r  
issue_textr  r  rq  r  r  r   r  s-                                               @r)   r  zJiraAPIImport._process_issueH  s   
 ;%L	i[8*Dx9S8TTUV  ..udmmFNND_D_6`ai6jk%,"'+'<'<$'+$(,(>(>(E(E(Q(Q'RRTU]T^%_"HL#49#4#4dmm#D[d +/		.0I+J(?z*..55AAB"U8_EXEXYcEdeiEjDklF6<6M6M6Q6QY_6Q6`23#$9:)),fglmugvgzgz  |F  hG  gH  +I*4y * J1$//?5:8_5H5HW[I\5]12 h++I6))!!$--0 * J
 ..J%..//jkIDHDYDY3J<@_qJOO%%+XYcXde" & 
 OO	7==DSWX)3& x,,Z8((""4==1 ) I
 #I&&' (u v  OO%%+Qzl!," & 
 OO	7==DSWX(1% ?z*.2.>.>uX?R?RS]?^?b?bcgcpcp?qwz.>.{]+#M21$)),bchiqcrcvcv  xB  dC  cD  +E*4y * J##&\]bck]l]p]pq{]|  ^A  ^A  BF  BO  BO  ^P  ]Q  %R  T[  Ta  Ta  mq  |@#  A.2]+X{3D9"8_Y7;;LI"'/)"<T"B!C1\NS+ !7!7!>!>!J!J K2N^M__ab)/)<)<)@)@f*;)<A&>? *A *
&  '66<<@@AWX99??!$44::>>tD
!%!G!G
!S $X& ! &*__%;%;%B%B%N%N$OrR_`dReQf"g!--11(C9Y1Z#78I#J &:;N&O# 3 7 7FV W%)__%;%;%B%B%N%N$OrR_Q`"a!--11(FN__bLc9d1e ?(4 M  -f 5 4V <=N O!,!:!:=!I!%!7!7!>!>!J!J K:VhUijO))--h_5U-VH'/$(OH-d3	??1188DDER}TVW`Vab%%))c=1!? * 

 /(3F;K$Xx89IJ5Q.>>?OPK!444MJOO%%&&''HUXYbXc d @ " &  &0"0@0J0V0V,-?|,#'??#9#9#@#@#L#L"MRPUV^P_`lPmnrPsOt u-3-A-A-E-EM^-E-_\*#L1))=eHo>Q>QR^>_=`a& * 
 1$%))&$7
/0?J##&Z[dZeehiyhz${|+DDOOV^^ $(8(BC
	1 	$++Iu==$$!! #  "//
IuMIN mG! /&&v./ ((	: **5)< $$UI6 %%eY7 %%4%//33 '##'12	  4   )5	%#777;L4 %%$%7 */x9I)JI& ""9e4(-I%##40L y1 !!%3 ++Iu=OO""**	{  +F  G
 	  	2 ?9%g.((E: $$(()>?''	59  5 |,-66zB	)S! 	QGGBK	 	 s   n$$n.u&   Обработка всех задачc                     | j                   j                         }|D ]/  }| j                  j                         r y | j	                  |       1 y r7   )rb   r=  rJ   rL   r  )r&   r  rQ  s      r)   _process_issueszJiraAPIImport._process_issues\  sD    %%' 	'E((*&	'r*   u3   Обработка связей всех задачc                    |s&| j                   j                  j                  d       yt        t	        d | j
                  j                               d      }t        j                         }| j                         D ]f  }| j                  |d         \  }}| j                  |d   |      D ]2  }| j                   j                         r  y|d   j                  d      }|r|d   j                  |d         nd}	| j                   j                  j                  j                   d|d    }
|ro| j                   j                  j                  j                   d|d    }| j                   j                  |g       }|j#                  |
       || j                   |<   n>|	r<| j                   j                  |	g       }|j#                  |
       || j                   |	<   |d   j                  d	g       }|D ]  }| j                   j                  j                  j                   d|d    }d
|v rV|
|d   d|d<   | j                   j                  j                  j                   d|d
   d    |d
   d<   || j$                  |<   d|v s|
|d   d|d
<   | j                   j                  j                  j                   d|d   d    |d   d<   || j$                  |<    5 i t        j                         |z
  }| j                   j                  j'                  d|dd       | j                   j)                  dt+        | j                                 t        j                         }t,        j.                  j                  d      }t,        j.                  j                  d      }| j                   D ]0  }| j                   j                         r yt,        j0                  j                  ddd|gdd|gddd| dggddg      }|s*| j                   j                  j                  d| d        | j                   |   D ]  }t,        j0                  j                  |d!dg"      }|s*| j                   j                  j                  d| d        S	 |j2                  |j2                  k(  rt,        j4                  j7                  g d#dd$d%|gd&d%|ggd$d%|gd&d%|gggg'      }|D ]G  }||_        |j;                  d()       | j                   j                  j                  d*| d+| d,       I ||_        |j;                  d()       n| j                   j                  j                  d-| d.| d/       |j>                   d0| }t,        j4                  j                  |1      }|s6t,        j5                  ||||| j                   2      }|j;                  d()        3 tG                t        j                         |z
  }| j                   j                  j'                  d:|dd       d;d<dd=d>}| j                   j                  j'                  d?t+        | j$                  jI                                       t        j                         }| j$                  jK                         D ]B  \  }}| j                   j                         r y	 | j                   j                  j                  j                   d|d@   d    }
|j                  |d@   dA         }|r!t,        j.                  j                  |      } n t,        j.                  j                  |
1      } | s)t,        j.                  j                  dAd|d@   dA   g'      } | sTt,        j/                  |
| j                   |d@   dA   B      } |d@   dC   | _&        |d@   dD   | _'        | j;                  d()       t,        j0                  j                  |d   d   d!g"      }!|!s:| j                   j                  j                  dE|d   d    dF|d   d    dG       t,        j0                  j                  |d
   d   d!g"      }"|"s:| j                   j                  j                  dH|d
   d    dF|d
   d    dG       | j                   j                  j                  j                   d|d    }#t,        j4                  j                  |#dIg"      }|s"t,        j5                  | |#| j                   J      }|j8                  jP                  d;k(  r|!j<                  |"k(  s|"j<                  |!k(  rxt,        j.                  j                  d      |_        |!j<                  |"k(  r|"}|!}n|"j<                  |!k(  r|!}|"}| j                   j                  j                  d* d+ d,       |!|_)        |"|_*        |j;                  d()       E tG                t        j                         |z
  }$| j                   j                  j'                  dP|$dd       t        j                         |z
  }%| j                   j                  j'                  dQ|%dd       tW        | dR      r@| j                   j                  j'                  dS       | jX                  j[                          yy# t@        $ rE}| j                   jC                  d3| d4| d5d6d78       | xjD                  d9z  c_"        Y d}~d}~ww xY w#  | xjD                  d9z  c_"        | j                   jC                  dK|d@    dL|d   d    dF|d   d    dM|d
   d    dF|d
   d    dNdOd78       Y xY w)TuD   
        Постобработка связей задач
        uF   Отключена обработка связей всех задачNc                 J    | j                  di       j                  d      dk(  S )Nr   r   rF  r   )r   s    r)   r   z2JiraAPIImport._process_relations.<locals>.<lambda>q  s"    !%%"-11(;?hh r*   r   r3  r   ra  r^  
issuelinksr  r4   rf  r4   r  rf  uD   Анализ связей всех задач выполнен за r9      сек.u   Подзадачи: zsystem.additional_parentrg   zsystem.linkr,  rY  r   r  r(  z%"key":"r  rC  r  uP   Не удалось связать задачи, возможно задача 'u#   ' не попала в импортparent_taskr  )relation_type.coder  system.finish:finishin_linkr  out_linkr]  Tri  u,   Тип связи родительской 'u$   ' и дочерней задачи 'ud   ' изменен с 'Блокируется/Блокирует (ОО)' на 'Относится к'.u   У задачи 'u3   ' эпик(родительская задача) 'uo   ' из другого проекта. Создана связь 'Дополнительный родитель'z:additional_parent:ro  )r  r  relation_typerf  rJ   u<   Не удалось создать связь задачи 'u&   ' с дочерней задачей 'r  zERR-0114r?  r%  rF   uG   Создание связей подзадач выполнено за r  zsystem.duplicatezsystem.clone)Blocks	DuplicateRelatesClonersu   Связи: r  r3   )rf  rJ   r3   inwardoutwardu=   Не удалось найти входящую задачу r1  u   ). Возможно задача не попала в импорт или находится в проекте, который еще не импортирован.u?   Не удалось найти исходящую задачу r  )r  rf  rJ   u.   Не удалось создать связь z. in_link: z), out_link: r  zERR-0052uA   Создание связей задач выполнено за uL   Обработка связей всех задач выполнена за bigganttuB   Обработка связей задач плагина BigGantt).rJ   r}   r6  r   r   r   r   r<  r=  r:  r  r;  rL   rq   rl  rm  rx   r   rw   r
  rK   r  ro   CmfRelationTyper?  rC  CmfRelationOptionr  r  rp  r  rf  rN   rP   rO   rM   r  r   in_type_nameout_type_namer   r  r  rH   r  r   )&r&   r  epic_link_fieldtotal_t1rC  r  r  rQ  issue_parentissue_epic_keyrf  parent_ext_id	sub_tasksissue_links
issue_linklink_ext_idanalysis_t2subtasks_t1additional_parent_relationlink_relationr  child_ext_id
child_task	relationsrelation_optionrelation_ext_idr  subtasks_t2	map_namesrelations_t1issue_relationrelation_coder  r  r  
rel_ext_idrelations_t2total_t2s&                                         r)   _process_relationsz JiraAPIImport._process_relationsd  s~   
 OO""**+st h  '') 
 >>#))+  	GG!66wt}ENK//[/Q G??,,.$X228<O^x!4!4_T5J!Kdh OO2299EEFbtV'+'='='D'D'P'P&QQST`aeTfSg$hM $ 1 1- DI$$V,3<DMM-0# $ 1 1." EI$$V,4=DMM.1 $Ho11,C"- 	GJ%)__%;%;%B%B%N%N$OrR\]aRbQc"dK$
2@FuUZ|5\
>2AEAWAWA^A^AjAj@kkmnx  zG  oH  IM  oN  nO  ?P
=1(;<F,,[9':5?EeTYl4[
=1BF//BXBXB_B_BkBkAllnoy  {I  pJ  KO  pP  oQ  @R
>28<<F,,[9	G+G 	GB nn&1##RS^_bRcckl	
 	23t}}3E2FGHnn&%+%;%;%?%?E_%?%`"..222F!]] X	)M((* ..,,t]3T=1&(=/0LM	 !), - K &&..66C_Dgi  $m < D)#^^//')95 0 
 "OO**22::FGjl 8) #**j.@.@@$*$<$<$A$A S$(&/k%BZQTV`Da$b&/j%AJPSU`Ca$b!"$ %B 	%	 09 O<IO9+00T0B OO22::"N{m \EEOL QE!F 2=
."D9..66/
| <PP[} ]hi
 .9-?-?,@@ST`Sa*b*0*B*B*F*Fo*F*^..4.F.F(2)4.H'6+/?? /G /O ,00T0ByD))X	)t 	nn&4##UVabeUffno	
  6"4 - .	
 	##l3t7K7K7P7P7R3S2T$UV~~'/3/C/C/I/I/K Y	+O^((*V OO2299EEFbX^I_`dIeHfg )nV.DV.L M $*$:$:$>$>M$>$RM$*$:$:$>$>f$>$MM$$*$:$:$>$>vtUcdjUklrUsFt$>$uM$$*$:$:&UYUdUd@Nv@VW]@^ %; %`M1?1G1QM.2@2H2SM/!&&4&8 ..,,).9(C)? -  OO**22W).9%@ANSaDbckDlCm n|}
 !>>--)-8B)? .   OO**22Y)-8?@>R_C`aiCjBk l|}
  $ 6 6 = = I IJ"^\`MaLbc
"(":":">">%01 #? # '&,&>&>&3)#'?? '? 'O $1166:PP ,,8H<P<PT[<[ 5;4J4J4N4NTa4N4bO1**h6&.%,
!--8&-%-
OO**22F{m T==GL I}~ +2'+3($$$6aY	v 	~~',6##OP\]`Oaaij	
 >>#h.##Z[cdgZhhpq	
 4$OO""''(lmMM++- %} ! )OO--VWbVc d??Il!M"!*	 .  OOq(OO)N1$))D^TZE[D\ ]  .~ >u EFbXfIghpIqHr s!!/!>u!E FbXeIfgoIpHqqrt & * s5   EkE2l%A"l%1El%	l":ll"%A nu)   Обработка компонентовc                    t         j                  j                  |ddddg      }|sBt         j                  ddd||d      }|j                  d	v rd|_        |j                  d
       | j                  |d         D ]d  }	 | j                  j                         r y| j                  j                  j                  j                   d|d    }t         j                  j                  |g d      }|s"t         j                  || j                  d      }||_        |d   |_        ||_        |j                  d      rd|_        nd|_        |j                  d      r/| j!                  |d   | j"                     d|d          |_        nd|_        |d   dk(  r|j&                  |_        nC|d   dk(  r|j*                  |_        n)|d   dk(  r|j$                  |_        n|d   dk(  rd|_        |j,                  r|j.                  r|j                  d
       |j                  dd      r|j0                  s!|j3                          d|j0                  _        |j0                  j,                  rG|j                  dd      |j0                  _        |j0                  j6                  j                  d
       t9                | j                  xj:                  dz  c_        g tA        t         j                  jC                  d#d$|gg d%gd&            |_"        |jD                  rd|_#        n1tA        t         j                  jC                  d#d$|g'            |_#        |j.                  r|j                  d
       yy#  | xj<                  dz  c_        | j                  j?                  d| d d!d"       Y ?xY w)(uG  https://docs.atlassian.com/software/jira/docs/api/REST/1000.824.0/#api/2/project-getProjectComponents
        Пока грузим как списки, после доработки будут отдельные обекты

        Args:
            project_info (dict): проект из джиры как есть
        r>  Trg  r  r  u   КомпонентыiI r  r  ri  r   Nr^  )descr_documentdefault_ownerdefault_responsibler  rb  ra  r  r  rs  r3   r  Fr  u   Компонент r|  assigneeTypePROJECT_DEFAULTPROJECT_LEADCOMPONENT_LEAD
UNASSIGNEDr   r   rF   u3   Ошибка загрузки компонента ERR-0053rR  r^  rb  r  r  r   r  r]  )$ro   rk  rq   r  r  rp  _get_project_componentsrJ   rL   rl  rm  rR  ra  r3   rb  r  r~  rm   r  rj   r  r   r  rD  r  create_descr_document
text_draftr   rM   r_  rO   rP   r   r;  r  rg  )r&   r  rb  component_folderrT  rf  components_lists          r)   r  z!JiraAPIImport._process_componentsv  s    "++//#!%'	 0 
  %//+%"'  0   ''+CC/3 ,!!d!355l46HI A	I@??,,. OO2299EEFbSWHYZ"("5"5"9"9! #: # '&,&9&9TXTcTcuy&9&zO)4&'0'8$.>+==,37O038O0==(484D4D!&)$--81)F2C1DE 5E 5O1
 59O1^,0AA:E:Q:QO7~..@:E:O:OO7~.2BB:I:W:WO7~.,>:>O7"227Q7Q#((T(:==3*99'==?IM66F&55EEDMMMR_acDd66A'66<<AAdAS55:5sA	J 26%%"C)9:/ "& & 2
. 1137037##))-FV1W)X40 &&!!d!3 '51$))I)U+!	 * s   NIN9N=u   Обработка версийc                     t         j                  j                  d|ddg      }|sBt         j                  ddd||d      }|j                  d	v rd|_        |j                  d
       | j                  |d         D ]$  }	 | j                  j                         r y | j                  j                  j                  j                   d|d    }t         j                  j                  |g d      }|s"t         j                  || j                  d      }|j                  r,t         j                  j                  d      |_        ||_        ||_        |d   |_        |j                  dd      |_        |j                  d      |_        |j                  d      |_        |j*                  j,                  |_        ||_        |j2                  r|j                  d
       |d   rd|_        nd|_        |j.                  r-|d   s|d   r|j7                  d       n|j7                  d       |j2                  r<|j                  d
       n)| j                  j8                  j;                  d| d       t=                | j                  xj>                  dz  c_        ' tE        t         j                  jG                  d$d%|gg d&gd'            |_$        |jH                  rd|_%        n1tE        t         j                  jG                  d$d%|g(            |_%        |j2                  r|j                  d
       y y #  | xj@                  dz  c_         | j                  jC                  d | d!d"d#       Y xY w))Nreleaserg  r  )r[  rb  r   ReleasesTi0 r  r  ri  r   r  rJ  )rf  r3   ra  rh   r   rd  re  r~  rb  r   r  r  rs  zlist.release:defaultrg   r3   r   r   r_  releaseDater  Freleasedr  r  u   Релиз |    был изменен пользователем. Изменения из импорта не будут примененыrF   u+   Ошибка загрузки версии r  ro  r^  rb  r  r  r  r]  )&ro   rk  rq   r  r  rp  _get_project_versionsrJ   rL   rl  rm  ro  r  r  rh   ra  rb  r3   r   rd  re  r  r  r~  r  rD  r  set_default_statusr}   r6  rM   r_  rO   rP   r   r;  r  rg  )r&   r  rb  release_folderrM  rf  version_lists          r)   r  zJiraAPIImport._process_versions  sc   ))--#%' . 
 #--""' . N ''+CC-1*D111\$=O1P @	G???,,. OO2299EEFjQXY]Q^P_`%~~11!  2    $#)>>DOOmq>#rL//.4.A.A.E.EKa.E.bL+*5L'/=L,(/L%(/M2(FL%3:;;{3KL018]1KL.,7,A,A,Z,ZL)3:L0#..$))d);z*481491#,,":.'*2E(;;HE(;;FC#..$))d);OO**22%l^ 4d e
 55:5q@	H 04NN  "C8/ "& ! 0
, //15N.15$$]C,P$Q2N. $$D1 %51$))A'K&!	 * s   MHM9M=u*   Обработка JQL в фильтрахc           
         t               }t        | j                  j                  j                  j                        }t        j                         }t        j                  j                  g dg dgg d      }|D ]c  }d|j                   d|j                   d}|j                  s.|j                  j                  j                  d      }|s%|j                  j                  j                  d	      }|s|j                  j                  j                  d
      }t        j                   j#                  | j                  j                  j                  j$                  j                        }|j                  j                  j                  d      xs i }	|	j                  d      xs d}
|r|j&                  |
vrB|sF	 | j                  j)                  d       | j                  j)                  d|        |j+                  ||      \  }}||_        t.        j1                  |d      |_        |j5                  d       t7                | j                  j)                  d|        | j                  j)                  d|        | j                  j)                  d|        |j8                  D ]'  }| j                  j:                  j=                  |       ) f t        j                         |z
  }| j                  j:                  jC                  d|dd        y# t>        $ r3}| j                  jA                  d| d| d| ddd       Y d}~d}~ww xY w)!uP   
        Пост обработка JQL в фильтрах задач
        r  )r  rY  T)r  ubqlbqlr3   r  ry  " (r  jqlr  jqlQueryapplinkrpcUrlr   2--------------------------------------------------u   ФИЛЬТР: Fr  Tri  zJQL:	zUBQL:	zBQL:	r8  u0   : ошибка преобразования JQL r{  zERR-0066r7  r^  NuC   Обработка JQL в фильтрах выполнена за r9  r  )"r   r.   rJ   rl  rm  r<  r  ro   r7  r  r3   r   r  r   rq   r  r  r  ext_urlnetlocrK   get_modifiedr
  r   r  r  rp  rM   r  r}   r6  rN   rP   r
  )r&   r  rm  rD  task_filtersr   
filter_msgr  r  r  rpc_urlr
  r  rU   r  rK  s                   r)   rC  z%JiraAPIImport._process_jql_in_filtersX  s   
 o$//0077CCD **//*/ > 0 
 ( (	K[--.c+2B2B1C1EJ..//5599%@E#3399==gF#3399==jI#\\224??3I3I3P3P3X3X3^3^_
%55;;??	JPb!++h/52Z..g=##H-##nZL$AB,,UK@	c#' "&**Su*"E  T 2##fUG$45##gdV$45##fSEN3!$ >IOO**229=>A(	T  2%##&ijlmpiqqy$z{  ))#J</_`e_ffhilhmn+!	 *  s   DL&&	M"/(MM"u   Обработка аудитаc                      y)u)   
        Грузим аудит
        Nr@   r9   s    r)   _process_auditzJiraAPIImport._process_audit  s     	r*   c           
      	   |d   }| j                   j                  j                  j                   d| }ddd| dg}|j                  d      rK|d   d   d    d	| }| j                   j                  j                  j                   d| }d
|ddd| dgg}t        j
                  j                  |ddg      }d| j                   j                  j                  j                   d}|rt        t        j                  ||j                  j                              dkD  rx| j                   j                  j                  d| d|j                          t        j                  |dt        |j                              |_	        |j                  d       d }|j                  d|d         j!                         }|d   j!                         }	|sO| j                   j                  j#                  d| d       t        j
                  j                  dd|gddg      }|r|j                  sd| d|_	        n*d| dt        |j                        vr|j                  d      r_d| j                   j                  j                  j                   d|d    d}
|j                  j                  j%                  |
d      |_	        d| |j                   }t        t        j                  ||            dkD  rd| j                   j'                  d| d| j                   j                  j                  j                   dd|d       | xj(                  dz  c_        n||_	        |	|k7  r)|	|j*                  vr|j*                  j-                  |	       |j                  d       t/                y | j                   j                  j#                  d| d        | j0                  j                  |j3                               }|s*| j0                  j                  |	j3                         d!      }| j4                  j6                  r|d"   d#k(  rd$}n|d"   dk(  r
d%}n|d&   rd$}t        j
                  j                  d'd(|gd)g      }t        j                  ||d*   d+|t        |j8                        d| d| j                   ,      }||	k7  r|	g|_        |j                          t/                y )-Nr   r^  rf  r(  r-  r.  scoperC  r}  r,  r  r  r  z::\d+)::rF   u   ext_id типа задачи r*  r   Tr  rn  r3   u2   Поиск типа задачи по имени 'r  r0  uW   Ошибка объединения одноименных типов с именем 'u*   ': одинаковый источник 'zERR-0118r  )rQ   r&  u   Тип задачи 'u2   ' не найден. Создание новогоtask.agile:defaultr|  r  task.sub:defaulttask.epic:defaultsubtaskr   rY  ui_colorr   r?  )r3   r   r  ry  r   rf  rJ   )rJ   rl  rm  rq   ro   r  r  r  findallrf  r   r}   r6  r<  r.   rp  r7  r
  r.  rP   rO   r  r   rM   	name2coder  rb   rn   r   )r&   r  r  r  rY  issue_type_scope_idrh   ext_id_patternr  issue_type_aliaslogic_type_ext_id_oldlogic_type_ext_id_mergedtemplate_codery  s                 r)   _process_issue_typez!JiraAPIImport._process_issue_type  s	   "4(#55<<HHIM?[Vs+<*=S%AB>>'" &0%8%CD%I$J!M?"[#'??#9#9#@#@#L#L"MRPcOd e6S):(;3#?@G ((,,g& - 


 doo44;;GGHQBJJ~z/@/@/F/FGH1L OO""**/
| <OOYO`O`Nac !#~r3z?P?P;Q RJOOdO+J$..);Z=OPVVX%f-335OO""''D_DUUVW  ,,009 '* 1 J
 $$&():(;2$>
!'(+3z7H7H3II>>'*.01G1G1N1N1Z1Z0[[]^him^n]ooq,r)(2(9(9(?(?(G(G-)J%
 .00A/B:CTCTBU+V(rzz.2JKLqPOO--q  sB  rC CBBF//BXBXB_B_BkBkAllmo"&!/ .  OOq(O(@J% !O3$J,<,<<  ''(89OOdO+L###O#44fg	
 **?+@+@+BC NN../?/E/E/GI]^M99??*+r1 2,-2 3)$ 2&&**D-0< + 
 (( M*$**+)*"- ) 

 .. 01Jr*   u2   Обработка логических типовc                 B   dddddddddddddddd| _         | j                  d      D ]  }| j                  j                         r y|j	                  d	|d
         j                         }|d
   j                         }d| d| d}| j                  j                  j                  d| d|        	 | j                  |       | j                  xj                  dz  c_	         y# t        $ r/}| j                  j                  d| d| ddd       Y d}~d}~ww xY w)u$   Маппим issueType в logic_typer  ztask.userstory:defaultr  ztask.bug:defaultr  )zsub-taskr  u   подзадачаz
user story	userstorystoryu   историяrA  u   задачаbugu   багu   ошибкаdefectu   эпикr  r  Nrn  r3   r  r  r  u   Обработка типа r  rF   u)   Ошибка обработки типа zERR-0141r  Tr^  )r"  r<  rJ   rL   rq   r7  r}   r
  r)  r_  rN   rP   )r&   r  r  r%  log_issue_typer  s         r)   _process_issue_typesz"JiraAPIImport._process_issue_types  sO   
 +)"421-6(0%(.(+'
$ **=9 	J((*(nn-?FASTZZ\O)&1779  15E4FaHNOO""''*F~FVVXYcXd(ef	((455:5	  ))??OrRUQVW+!	 *  s   30C&&	D/%DDu2   Обработка бизнес-процессовc                 :
   i }| j                  d      D ]
  }|||d   <    | j                  d      D ]  }| j                  j                         r y| j                  j                  j	                  |d   d           | j                  j
                  j
                  j                   d|d   d    d|d   d    }t        j                  j                  |      }|sBt        j                  j                  d	
      }t        j                  ||| j                        }|d   |_
        |d   d   |_        |j                  d       |d   D ]  }| j                  |||d              t        j                  j                  dd|gg dgdg      D ]J  }t        j                  j                  dd|j                   gdd|gg dg      s9|j#                  d       L |j%                          |d   D ]  }| j                  j                         r  y| j                  j
                  j
                  j                   d|j&                   d|d    }	t        j(                  j                  |	|      }
|
s#t        j)                  ||	| j                  d      }
|
j*                  sA| j                  j                  j-                  d|
j                   d|j                   d       |d   |
_        |d   |
_
        |d   D cg c]>  }| j                  j
                  j
                  j                   d|j&                   d| @ }}t        j                  j                  dd|g      |
_        t1        |
j.                        t1        |      k(  sJ d        | j                  j
                  j
                  j                   d|j&                   d|d!    }t        j                  j                  |      }|d"   j3                         }|d#k(  r|rd|_        |j                  d$       ||
_        |j                  d%      rN|d%   d   t9        t;        fd&| j                  d'            d      }	 | j=                  |      |
_        d|
_         |
j                  d        tE                | j                  xjF                  d/z  c_#         yc c}w #  | j                  jC                  d( d)|
j                   d*|j                   d+d,d-|.       Y xY w)0u   Импортируем workflowrl  r   rd  Nr3   r^  entityIdro  r  rg   )rf  ry  rJ   r   Tri  r~  rY  r/  rr  r  r  r]  r  r  )rf  r~  rB  rC  rD  rE  rF  rf  r  uN   DEV: Fatal Вероятно, сломали создание статусов!rG  r  r  r  rL  c                 P    t        | j                  d            t              k(  S r  rJ  rK  s    r)   r   z2JiraAPIImport._process_workflows.<locals>.<lambda>  s    3vzz$/?+@C	N+R r*   rN  rO  rP  rQ  r  rR  rS  rT  rF   )$r<  rJ   rL   r}   r
  rl  rm  ro   r  rq   r   r3   rp  r  r  r  rr  r  r  r   r  r  r6  r  r  r  r  r  r   r   rU  rV  rW  rP   rM   r_  )r&   jira_statusesjira_statusjira_workflowworkflow_idr~  template_workflowr   jira_transitionr  r  str  r  r  r  r[  rM  s                    @r)   _process_workflowsz JiraAPIImport._process_workflowsB  s      ++J7 	;K/:M+d+,	; "--k: Q	7M((*OO""''=+>v+F*GI!__33::FFGr-X\J]^dJeIffhivw{i|  ~H  jI  iJ  KK))--[-AH$*$6$6$:$:@T$:$U!!--[K\imixix-y)-8HM)$/7HMMMdM+  -Z8 Y,,X}[QUEV7WXY !**//T88TVl7m8E 0 H * ''++]D&J\J\4]5?x4PRh4j+ kD)* ((*#0#? 32??,,.'+'='='D'D'P'P&QQST\T_T_S``bcrswcxby$z!#__008IT\0]
!!'!)0#'??(,	 "1 "J "11OO**22*:??*;;_`h`m`m_n oT U "1&"9
"1-"@
 zI  JP  zQ  +Rsudoo.D.D.K.K.W.W-XXZ[c[f[fZggijlim+n  +R'  +R)/)9)9)>)>xQUWnFo)>)p
&:112c:Q6RR  e  Ue  eR&*oo&<&<&C&C&O&O%PPRS[S^S^R__abqrvbwax#y ",,008H0I	"1&"9"?"?"A"h.97;I4NNTN2'0
$"&&x0 / 9$ ?I"&R ,,Y7 #K
151P1PQ\1]
.59
2 D1g32h LOO11Q61cQ	7b +R,11UV_U` a88B7HHijrjwjwixxy{&%0 ( 2 s   AS5S?Tu    Обработка схем БПc                 	   | j                  d      D ]p  }| j                  j                         r y | j                  j                  j                  j                   d|d    }t
        j                  j                  dd| dg      }|sJ d|d           | j                  j                  j                  j                   d|d	    }t
        j                  j                  |
      }|sCt
        j                  j                  d      }t
        j                  ||| j                  d      }|j                  rI|d   |_
        |j                  dd      |_        ||_        ||_        ||_        |j                  d       n3| j                  j                   j#                  d|j                   d       g }|d   j%                         D ]D  \  }}	| j                  j                  j                  j                   d| }
t
        j&                  j                  ddd|
 dg      }t
        j(                  j                  dd|gdd|gg      }|ru|j                  si| j                  j                   j#                  d|j                   d|j*                   d|j                   d       |j-                  |j*                         |st
        j(                  j                  dd|gdd|gg dg dgd       }|rj| j                  j                   j#                  d|j                   d|j*                   d|j                   d!       |j-                  |j*                         t
        j)                  d"||| j                  #      }| j                  j                  j                  j                   d|	 }t
        j                  j                  dd| dg      }||_        |j                  d       |j-                  |j*                         G t
        j(                  j1                  d$d%|gdd|gg dgd       }|D ]  }|j3                  d&        t5                | j                  xj6                  d'z  c_        s y )(Nworkflow_schemer^  r  rf  r(  r.  r]  u+   Не импортировался workflow r   ro  r  rg   Trx  r3   r   r   ri  r  r  r  r-  rh   r  r  r  r  u)    для логического типа 'r  r  r  r  r  r?  r  r   r  r  rF   )r<  rJ   rL   rl  rm  ro   r  rq   r  r  r3   r   r  r  r  rp  r}   r6  r   r  r  r   r   r  r  r  rM   r_  )r&   r=  default_task_workflow_ext_idr  r  r  ry  r  logic_type_idrl  r  rh   r  r  r~  r  s                   r)   _process_workflow_schemesz'JiraAPIImport._process_workflow_schemes  s   #//0AB _	7O((*.2oo.D.D.K.K.W.W-XXZ[jk|[}Z~+($*$6$6$:$:8VXtWuuxUyBz$:${!(|,WXghyXzW{*||("&//"8"8"?"?"K"K!LB_cOdNef**..6F.GI!--117H1I"..%+#$(	 / 	 ((!0!8	!0!4!4]B!G	2G	/5J	2,;	)40&&..@@P Q< = M0?@S0T0Z0Z0\ /0,}'+'='='D'D'P'P&QQSTaSb$c!#0044XvQTUfTggjOk<l4m
--11%sJ7$c95 2   4 4OO**22G	GW X**.))4]^h^m^m]n oCD
 "((3!1155)3
;(#y966	  )- 6 D ..66KINNK[ \..2ii[8ablbqbqar sst
 &,,TYY7 !11'0#-"+#'??	 2 D &*__%;%;%B%B%N%N$OrR_Q`"a!--11(FN__bLc9d1e'/$		d	+$$TYY/_/0d "(!7!7!<!<X}5 #y1.
 !% "= " + 3T23 LOO11Q61_	7r*   c                    t         j                  j                  }| j                  d      D ][  }|j	                  | j
                        }|j                  | j                  j                   d| t        j                  |             ] y )Nr2  r  )r  r  r  r<  rq   rm   rd  rJ   r   r  r  )r&   r  r  r4   s       r)   _cache_all_userszJiraAPIImport._cache_all_users  sl    <<%%))'2 	VI--.CLLDOO../vcU;V\\)=TU	Vr*   c                    t               | _        g dg dg}|r8t        j                  j	                  dd|gg      }|j                  dd|g       t        j                  j	                  |dg      }|D ]T  }|j                  j                  j                         D ]+  \  }}| j                  j                  t        |      |f       - V t	        | j                        | _        y	)
u  
        Кеширует приоритеты системы

        Args:
            field_config_scheme (CmfCustFieldConfScheme, optional):
                Схема кнфигурации полей установленная проекту.
                Если не указана, то кешируются все импортированные приоритеты системы.
                Defaults to None.
        )r3   r  ri   r  cache_schemesr  r]  ra  r  r  N)rd  priorities_cachero   r  r  r   r  r  r   r   rf  r.   )r&   field_config_schemerY  r
  field_configsfield_configkvs           r)   r  zJiraAPIImport._cache_priorities  s     !$ &&
 %66;;'0C/DE  <   NNHd,<=>4499; : 
 * 	7L$,,2288: 71%%))3q61+67	7 !%T%:%: ;r*   r   c                     t        fd| j                  D        d      }||S t        fd| j                  D        d      }||S t        d d      )u  
        Получает приоритет из кеша

        Args:
            value (str): Имя или id приоритета.

        Returns:
            tuple (str, str): Кортеж, содержащий id и имя приоритета
        c              3   4   K   | ]  }|d    k(  s|  yw)rF   Nr@   r4  ri   r   s     r)   r5  z5JiraAPIImport._get_cached_priority.<locals>.<genexpr>7       T(x{e?SXT   Nc              3   4   K   | ]  }|d    k(  s|  yw)r   Nr@   rM  s     r)   r5  z5JiraAPIImport._get_cached_priority.<locals>.<genexpr>?  rN  rO  u   Приоритет 'uP   ' не найден. Возможно он еще не импортирован.)r   rE  rN   )r&   r   priority_tuples    ` r)   r  z"JiraAPIImport._get_cached_priority+  s{     Td&;&;T
 %!! Td&;&;T
 %!!.ug  6F  G  H  	Hr*   u   Простой дампr3   c                    t        j                         }| j                  j                         j	                  | d      }| j                  j                         j	                  | d      }|j                         rt        j                  |       t        |d      5 } |       D ]H  }| j                  xj                  dz  c_	        |j                  t        j                  |      dz          J 	 d d d        t        j                  ||       | j                  j                  d       t        j                         |z
  }| j                  j                   j#                  d|j$                   d	|d
d       y # 1 sw Y   xY w)N.jsonz.json.dirtyr  rF   r*  Tr  u
   Дамп 'u   ' выполнен за r9  r  )r<  r=  rJ   r   r   r   r   r8  r   json_object_countr  r   r  r   r   rp  r}   r
  r+   )	r&   api_funcr3   rD  r   r   r   r  rK  s	            r)   _simple_dumpzJiraAPIImport._simple_dumpG  s8   ^^OO557@@D6P	99;DDv[EYZIIi -& 	0!z 011Q61

3$./0	0 	M9-t,^^"##j1B1B0CC[\^_b[cck$lm	0 	0s   AE;;Fc              #     K   | j                   j                         j                  | d      }|j                         r5t	        |d      5 }|D ]  }t
        j                  |        	 d d d        y y # 1 sw Y   y xY ww)NrS  r+)rJ   r   r   r   r   r   r  )r&   r3   r   r   r  s        r)   r<  zJiraAPIImport._simple_getY  sw     OO557@@D6P	i& *! *C**S/)** * s   A	BA5+
B5A>:Bc              #     K   | j                   j                         D ]  }|j                  j                  d      r|j	                  d      }|j                         s*| j                  j                  j                  d| d       j|| _	        t        |d      5 }t        j                  |       d d d         y # 1 sw Y   xY ww)N)r^   r]   r  uN   Отсутствует файл info.json в каталоге проекта 'r  re  )r   r  r3   re  r   r   rJ   r}   r6  rh  r   r   r   )r&   rh  r  r   s       r)   r:  zJiraAPIImport._get_projectsa  s     ,,446 	#K(()<=#,,[9I##%&&..depdqqrs *Di% #iil"# #	## #s   BC	B=2C	=C	C	c                 F    | j                         D ]  }||d   k(  s|c S  y r  )get_projects)r&   r  r  s      r)   get_projectzJiraAPIImport.get_projectr  s-     --/ 	$L\$//##	$r*   c                     | j                   j                  |d      }t        |d      5 }t        j	                  |      cd d d        S # 1 sw Y   y xY w)Nworkflows.jsonre  )r   r   r   r   r   )r&   r  workflows_filer   s       r)   r  z/JiraAPIImport._get_simplified_project_workflowsw  sG    **33J@PQ.#& 	 !99Q<	  	  	 s   AAc              #      K   | j                   j                  |d      }|j                  d      5 }|D ]  }t        j	                  |        	 d d d        y # 1 sw Y   y xY ww)Nissue_types.jsonre  r   r   r   r   r  )r&   r  issue_types_filer   r  s        r)   r  z*JiraAPIImport._get_issue_types_for_project|  sa     ,,55jBTU""3' 	&1 &jjo%&	& 	& 	&   .A%A	A%A"A%c              #      K   | j                   j                  |d      }|j                  d      5 }|D ]  }t        j	                  |        	 d d d        y # 1 sw Y   y xY ww)Nstatuses.jsonre  rb  r&   r  statuses_filer   r  s        r)   r  z'JiraAPIImport._get_statuses_for_project  _     ))22:O$ 	& &jjo%&	& 	& 	&rd  c              #      K   | j                   j                  |d      }|j                  d      5 }|D ]  }t        j	                  |        	 d d d        y # 1 sw Y   y xY ww)N
roles.jsonre  rb  )r&   r  
roles_filer   r  s        r)   rj  z JiraAPIImport._get_project_roles  s]     &&//
LI
__S! 	&Q &jjo%&	& 	& 	&rd  c              #      K   | j                   j                  |d      }t        j                  |      D ]4  }t	        | d| dd      5 }t
        j                  |       d d d        6 y # 1 sw Y   AxY ww)Nry   r  
/info.jsonrX  r   r   r   listdirr   r   r   )r&   r  	board_dirr  r   s        r)   r  z!JiraAPIImport._get_project_boards  sv     %%..z8D	

9- 	#H1XJj94@ #Aiil"# #	## #   AA8	A,!A8,A5	1A8c              #      K   | j                   j                  |d      }t        j                  |      D ]4  }t	        | d| dd      5 }t
        j                  |       d d d        6 y # 1 sw Y   AxY ww)Nr  r  rn  rX  ro  )r&   r  sprints_dir	sprint_idr   s        r)   r  zJiraAPIImport._get_all_sprints  sv     ''00YGK0 	#IQyk<dC #qiil"# #	## #rr  c              #      K   | j                   j                  |d      }|j                  d      5 }|D ]  }t        j	                  |        	 d d d        y # 1 sw Y   y xY ww)Nversions.jsonre  rb  )r&   r  versions_filer   r  s        r)   r  z#JiraAPIImport._get_project_versions  ri  rd  c              #      K   | j                   j                  |d      }|j                  d      5 }|D ]  }t        j	                  |        	 d d d        y # 1 sw Y   y xY ww)Ncomponents.jsonre  rb  )r&   r  components_filer   r  s        r)   r  z%JiraAPIImport._get_project_components  s`     ++44ZARS!!#& 	&! &jjo%&	& 	& 	&rd  c                 T   d}d}| j                   j                  |d      }|j                         ru|j                         D ]b  }|j	                         s|j
                  j                  | j                        r:|j                  d      j                         r|dz  }|dz  }d ||fS )Nr   rD  r  rF   )r   r   r   r  r  r3   re  r  )r&   r  r  unprocessedr  r  s         r)   r  z"JiraAPIImport._count_project_tasks  s    %%..z7C	%--/ (==))$*H*HI$$]3::<1$K
 k!!r*   c              #   b  K   | j                   j                  |d      }|j                         s,| j                  j                  j                  d| d|        y d}|j                         D ]  }|j                         s|j                  }|j                  | j                        r<|r |j                  d      j                         s^||k  r|dz  }i|||z   k\  r y t        |j                  d      d      5 }	t        j                  |	       d d d        |dz  } y # 1 sw Y   xY ww)	NrD  u   Каталог u    отсутствует. Возможно он был удален или еще не создан. Необходимо повторно запустить импорт проекта r   r  rF   r  rX  )r   r   r   rJ   r}   r6  r  r  r3   re  r  r   r   r   )
r&   r  r'  r4  only_processingr  r;  r  r  r   s
             r)   r;  zJiraAPIImport.get_project_tasks  s*    %%..z7C	!OO""**!) -hhrgsu !))+ 	H??$mmG > >?x'8'8'G'N'N'Pu}
%h''4d; #qiil"#QJE#	# #s   C9D/;D#D/#D,	(D/c                    |j                  d      sy|d   d   }i }|d   D ]t  }|d   dvr|d   j                         D ]T  \  }}|j                  |d|i      }|j                  d	i       }|j                  |d         rAt        |d
         ||d   <   V v |j	                         D ]  }i }	|d	   j                         D ]0  \  }}
|	j                  |
t                     }|j                  |       2 i |d	<   |	j                         D ]+  \  }}t        |      dkD  r	||d	   d<   |D ]
  }||d	   |<    -  |j	                         D cg c]  }| c}|d<   |S c c}w )u   
        Создает структуру схемы экранов проекта из данных плагина "Smart Jira Configuration"
        r  NissueTypeScreenSchemeglobalActionsr   )BROWSEPROJECTSCREATEISSUES
EDITISSUESrN  issueTypeIdactionsrL  rF   r  r  )rq   r   r  rB  r   rd  rf  r  )r&   smart_configscreen_schemer  r9  r  r   r  r  issue_type_screensrM  rL  issue_type_screenrJ  s                 r)   $_get_screen_scheme_from_smart_configz2JiraAPIImport._get_screen_scheme_from_smart_config  s    	*$Y/0GH "?3 	AFd|#SS(.y(9(?(?(A A$u(33MMS`Cab
$//	2>{{6$<0,/h,@GF4L)	A	A &,,. 	FJ!#%/	%:%@%@%B #!	+66y#%H

6"# %'Jy!.@.F.F.H F*!7w<!#7HJy))4% FF4EJy)&1F	F	F 4?3E3E3G'Ha'Hm$ (Is   	Ec                     | j                   j                  r|s| j                   j                  |      S y | j                  |      S r7   )rb   rn   get_project_screen_schemer  )r&   r  r  r  s       r)   _get_project_screen_schemez(JiraAPIImport._get_project_screen_scheme  s=    99??yy:::FF  <<\JJr*   c                    | j                   j                  d      }|j                         rt        j                  |       |j                          |d   }|D ]  }|d   }	 | j                  j                  j                  d| d       | j                  j                  t        j                  j                  |            }t        j                  d| dd	      }|j                  |      }t!        |d
      5 }	|	j#                  |       d d d         y # 1 sw Y   xY w# t$        $ r/}
| j                  j'                  d| d|
 ddd       Y d }
~
d }
~
ww xY w)Nrd  r  r3   u(   Дамп бизнес-процесса 'u   ' как XMLr`  ra  Trb  zwb+uB   Не удалось получить бизнес-процесс 'u   ' как XML: r  r  r   r&  
error_type)rh  r   r   r   rmtreer   rJ   r}   r
  rb   get_workflow_as_xmlr  r  quoter   rg  r   r  rN   rP   )r&   r=  workflows_dirr  r  rl  r  rm  rn  r   r  s              r)   _get_project_workflows_as_xmlz+JiraAPIImport._get_project_workflows_as_xml   sW   ((11+>!MM-((4+ 	M)&1M&&++.VWdVeeq,rs#yy<<V\\=O=OP]=^_$+$9$9d3#'%! !. 6 67H I-/ *1GGL)*	* * ))XYfXgguvyuz{*%	 *  s1   !BD#:DD#D 	D##	E,%EEc                    | j                   j                  |      D cg c]  }t        |d          }}g }|r| j                   j                  |      }n<| j                   j	                  d      }|j                  dt        |d         d       |D cg c]  }|d   dk7  rt        |d          }}i }	|D ]  }t        |d         }
t        |d         }| j                   j                  |      D ]S  }|	j                  |d   |d   i d	      }|
dk(  r|D ]  }||v r||d
   |d   d|d   |<    B|
|d
   |d   d|d   |
<   U  |	S c c}w c c}w )Nr  r   T)
is_defaultr  )r  fieldConfigurationIdr  r  )r   contextisHidden
isRequired)issuetypeIdr  r  r  )rb   get_issue_for_projectr.   "get_field_configuration_issue_typeget_field_configr   get_field_config_fieldsr  )r&   field_configuration_scheme_idr  r  issue_types_projectfield_configuration_mappingfield_config_defaultfield_configurationissue_types_schemefields_usedr  field_configuration_idr   
field_useds                 r)   _get_field_config_issue_typez*JiraAPIImport._get_field_config_issue_type  s    #ii===T
 
4 !
 
 ')#(*.))*V*VWt*u'#'99#=#=#=#N '..#,,/0DT0J,K (C
#"=1Y> #M23
 
 #> 	 3M BCM%()<=S)T%U"::;QR (33$K#Dk#%
 !I-&9 
%);;$ ,6(-j(9*/*==
9-j9	 (5$)*$5&+L&9<Jy)-8'		: q
&
s   EEc                    | j                   j                  |      }| j                  ||      }|j                         D ]  }|d   }|j	                  d      s| j                   j                  ||      }|s:| j                   j                  ||      }	 | j                   j                  ||      }| j                   j                  ||      }|j!                  d      r5|d   j#                         D ]  \  }}|j%                  |       |||d<     |D ]2  }|d   j!                  |      }|s|j%                  |       |.||d<   4  |S # t        $ rt}	i }| xj                  dz  c_	        d| d| d|	 }
t        |	d      r|
d|	j                  j                   z  }
| j                  j                  |
d	d
d       Y d}	~	d}	~	ww xY w)u   
        Возвращает список используемых полей в проекте
        в виде сруктуры как через плагин "Smart Jira Configuration" в box версии
        r   rQ  rF   u9   Не удалось получить опции поля u    в контексте r  responsez HTTP: Response text -> zERR-0109r  r   r  NisAnyIssueTyper  options)rb   &get_project_field_configuration_schemer  r   r  !get_field_context_project_mappingget_field_contextget_field_context_optionrN   rO   rH   r  r   rJ   rP   #get_field_context_issuetype_mappingrq   r   rF  )r&   r  r  r  r  field_used_id
context_idr  context_optionr  
error_textcontext_issuetypesr  context_issue_types                 r)   _get_cloud_project_fields_usedz,JiraAPIImport._get_cloud_project_fields_usedX  s    
 )-		(X(XYc(d%778UWab%,,. *	GJ&t,M ++N;DD]T^_Jii11-LG!%!C!CMS]!^ "&!N!N}^h!i{{+,9CI9N9T9T9V G5M#5&--g6%18F*95G
 &8 GM)3I)>)B)B=)Q&- &--g6%18F*95GI*	GX =  !#1$XYfXgg~  @J  K  KM  NQ  MR  S
3
+$<S\\=N=N<O"PPJ))4%	 *  s   E	GA)GGc                     | j                   j                  r|s| j                  |      S y |j                  di       }| j	                  |       |S )N
fieldsUsed)rb   rn   r  rq   _get_field_contexts)r&   r  r  r  r  s        r)   _get_project_fields_usedz&JiraAPIImport._get_project_fields_used  sN    99??:::FF  '**<<K$$[1r*   c              #   t   K   |d    d}t         j                  |      D ]  }|dk(  r	|| d| d  y w)Nr  z/attachmentsall_attachments.zipr  )r  r   )r   rp  )r&   rQ  attachments_pathr  s       r)   r  z$JiraAPIImport._get_issue_attachments  sX     #L12,?$45 	[I11 );K:LAi[8YZZ	[s   68c              #      K   |d    d}t        |d      5 }|D ]  }t        j                  |        	 d d d        y # 1 sw Y   y xY ww)Nr  z/comments.jsonrX  )r   r   r  )r&   rQ  comments_file_pathr   r  s        r)   r  z!JiraAPIImport._get_issue_comments  sW      %l 34NC$d+ 	&q &jjo%&	& 	& 	&s   AA 	A A	Ac                     |d    d}t        |d      5 }t        j                  |      }d d d        xs g S # 1 sw Y   xY w)Nr  z/worklog.jsonrX  r   r   r   )r&   rQ  r  r   rT   s        r)   r  z!JiraAPIImport._get_issue_worklogs  sN     %l 34MB$d+ 	q))A,C	yb	 	s	   9Ac                     |d    d}t        |d      5 }t        j                  |      cd d d        S # 1 sw Y   y xY w)Nr  z/properties.jsonrX  r  )r&   rQ  properties_file_pathr   s       r)   rC  z#JiraAPIImport._get_issue_properties  sC    "'"5!66FG&- 	 99Q<	  	  	    4=c                     |d    d}t        |d      5 }t        j                  |      cd d d        S # 1 sw Y   y xY w)Nr  z/watchers.jsonrX  r  )r&   rQ  watchers_file_pathr   s       r)   r}  z!JiraAPIImport._get_issue_watchers  sB     %l 34NC$d+ 	 q99Q<	  	  	 r  c                     | j                   j                         j                  d      }|j                         r+t	        |d      5 }t
        j                  |      cd d d        S i S # 1 sw Y   i S xY w)Nglobal_settings.jsonrX  )rJ   r   r   r   r   r   r   )r&   global_settings_file_pathr   s      r)   rt   z'JiraAPIImport._get_jira_global_settings  sd    $(OO$E$E$G$P$PQg$h!$++-/6 $!yy|$ $	$	s   A''A1c                    | j                   j                         }| j                  j                         j	                  d      }t        |d      5 }t        j                  ||       d d d        |d   | _        y # 1 sw Y   xY w)Nzcloud_id.jsonr   cloudId)	rb   get_cloud_idrJ   r   r   r   r   r   rs   )r&   r  	data_filer   s       r)   _get_cloud_idzJiraAPIImport._get_cloud_id  sk    yy%%'OO557@@Q	)T" 	aIIdA	Y	 	s   A::Bc                    | j                   j                  j                  d       | j                  j	                         D ]p  }|d   s		 | j
                  j                  |d         |d<   |d   D ]>  }	 | j
                  j                  |d   |d         }||d<   |d   j                  |       @ r | j                  | j                         y #  Y cxY w#  Y xY w)Nu0   Получение контекста полейr   r   r  r  )
rJ   r}   r
  r   r   rb   _get_field_context_get_field_optionsr  r   )r&   r   r  r  s       r)   _get_fields_contextz!JiraAPIImport._get_fields_context  s    ##$VW%%,,. 	E?#'99#?#?d#Li $Y/ G"&))">">uT{GTXM"Z-4	*i(//8		" 	 0 01s$   
)C4;C/CCCCc                    t         j                  j                  }| j                  |      \  }}| j	                  ||      D ]  }| j
                  j                         r yt        |d         j                  d      }| j
                  j                         j                  d      }| j
                  j                         j                  d      }|j                         r
t        j                  ||       t        |d      5 }	t        |d      5 }
t        |d      5 }|	D ]  }||
vs|j                  |       t        j!                  |      }|j#                  | j$                        }|sL|j'                  | j
                  j(                   d| t+        j,                  |              	 ddd       ddd       ddd       |j/                          t        j0                  ||       t        |d         j                  d	      }| j
                  j                         j                  d	      }| j
                  j                         j                  d
      }|j                         s+t        |d      j3                          t        j                  ||       t        |d      5 }	t        |d      5 }
t        |d      5 }|	D ]  }||
vs|j                  |        	 ddd       ddd       ddd       |j/                          t        j0                  ||        y# 1 sw Y   xxY w# 1 sw Y   }xY w# 1 sw Y   xY w# 1 sw Y   jxY w# 1 sw Y   nxY w# 1 sw Y   rxY w)u]   
        Собирает пользователей и группы из задач
        r3  Nr  r  zusers.json.newre  r  r  r  zgroups.json.newa)r  r  r  r  r;  rJ   rL   r   r   r   r   r   r  r   r  r   r  rq   rm   rd  r   r  r  r  r   close)r&   r  r  r  r  rQ  issue_users_pathall_users_pathall_users_path_newf1f2f3r'  r  r4   issue_groups_pathall_groups_pathall_groups_path_news                     r)   _collect_users_and_groupsz'JiraAPIImport._collect_users_and_groups  s    <<%%22:>Q++Jk+J %	BE((*#E,$78AA,O!__>>@II,WN!%!B!B!D!M!MN^!_&&(N,>?*C0 *Bnc2 *b!"4d; 
*r(* 	*#'r>$&HHTN04

40@I*3--*FC'*(0/3/A/A.B&,N,2LL,C)*	*
*** !'').? $U<%8 9 B B= Q"oo??AJJ=YO"&//"C"C"E"N"NO`"a '')_c*002O-@A+S1 3Ros3 3r!"5t< 3(* 3#'r>$&HHTN3333 "((*/AK%	B
* 
** ** *03 33 33 3s   L>L1
L$	)AL$	-A L$	.L16L>)M#6M
M	M	"M*M#$L.)L11L;6L>>M	MMM M##M,	c                     | j                   j                         }| j                  j                         j	                  d      }t        |d      5 }t        j                  ||       d d d        y # 1 sw Y   y xY w)Nr  r   )rb   get_configurations_of_jirarJ   r   r   r   r   r   )r&   global_settings_datar  r   s       r)   _dump_jira_global_settingsz(JiraAPIImport._dump_jira_global_settings  se    #yyCCE$(OO$E$E$G$P$PQg$h!+T2 	/aII*A.	/ 	/ 	/s   A00A9c                 "   | j                   D ]  }| j                   |   d   s|j                  |      s(||   j                  di       }|j                         D ]  }|j                  d      s|d   |d   |d   |d   d}|j                  d      r$|d   j                         D cg c]  }| c}|d<   | j                   |   j                  dg       }||vr|j	                  |          | j                  | j                          y	c c}w )
u   
        В box версии, контексты полей получаем из плагина "Smart Jira Configuration"
        r   r  r   r3   isGlobalContextr  )r   r3   r  r  r  N)r   rq   r   r  r   r   )r&   r  r   contextsr  context_dataoptionfield_contexts           r)   r  z!JiraAPIImport._get_field_contexts  s%    ** 	J##J/9??:.":.229bAH#??, {{4(!$-#FO'./@'A&-.>&?	  ;;y)DKIDVD]D]D_.`&v.`L+ $ 0 0 < G G	SU V}4!((6	, 	 0 01 /as   (	Dc                 z   | j                   j                  |d         }| j                  D ]r  }| j                  |   d   s|d   j                  |      s,|d   |   j                  d      }|r|D ]  }|j                  d      s.| j                  j                  d| t        j                         B| j                   j                  rK| j                  |   j                  dg       D ](  }|d   |d   k(  s|j                  d      s!|d   |d<   * || j                  |   d   vs| j                  |   d   j                  |        | j                  |   d	   d   j                  d
d      d   }|dk(  r-|d   |   }	|	s[| j                  |	| j                     |       ||dk(  r4|d   |   xs g }
|
D ]!  }	| j                  |	| j                     |       # |dk(  r&|d   |   }|s| j                  |d   |   |       |dk(  r'|d   |   xs g }|D ]  }| j                  ||        |dk(  s|d   |   }| j                  |   j                  dg       }|s>|j                  |       t        t!        |            | j                  |   d<   u | j#                  | j                         y)u   На коробке только через мету задачи можно получить варианты выбора полей

        Args:
            issue (dict): задача
        r4   r   r   allowedValuesr   u   Выбор без id: r  r  r   r}  rF   r  
userpickermultiuserpickergrouppickermultigrouppickerr  N)rb   get_issue_metar   rq   rJ   rK   r{   r>  rn   r   r  r  rm   r  r  r  rd  r   )r&   rQ  r  metar   r  r  cur_optcustom_field_typesrB  r2  rZ  r4  r   s                 r)   r  z JiraAPIImport._get_field_options*  s    yy''e5** 0	QJ##J/9>%%j18nZ044_EG% SF!::d+++.DVH,Mw_ yy'+'7'7
'C'G'G	SU'V MG&t}t<#)::j#9:@:LGJ$7M
 ")9)9*)Ei)PP ,,Z8CJJ6RS "&!1!1*!=h!G!Q!W!WX[]^!_`b!c!\1Xz2OOD$7B#'88h
39r! CDOOD$7BC#}4h
3%%eHoj&A8L#'99x4:# 7E%%eX67#x/x4**:6::9bINN6*>B3w<>PD$$Z0;a0	Qd 	 0 01r*   c                    i }|r| j                   j                  | j                   d|        | j                  j	                  |d   d      }| j                  || j                     | j                   j                                |S )Nu4    Поиск руководителя проекта r&   Tabsolute)rJ   rK   r  rb   rq   r  rm   r   )r&   r  	lead_datas      r)   _get_project_leadzJiraAPIImport._get_project_leade  su    	OO4#3#3"44himhn op		d6lTBIOOIdmm4doo6W6W6YZr*   r  r  c                    | j                   j                  | j                  ||      }| j                  j	                  d      }|j                  d      5 }t        j                  ||d       d d d        y # 1 sw Y   y xY w)Nr^  r  Fr  )rb    get_simplified_project_workflowsrs   rh  r   r   r   r   )r&   r  r  rd  r_  r   s         r)   "_dump_simplified_project_workflowsz0JiraAPIImport._dump_simplified_project_workflowsm  su    
 II>>MM
	 ))223CD  % 	8IIiI7	8 	8 	8s   A66A?c                    | j                   j                  j                  t        j                   d       | j                   j
                  j
                  j                   d|d    }|d   d   }|D ]  }|d   }| d| }t        j                  j                  || j                   j
                  j
                  j                  g d      }|sKt        j                  || j                   j
                  j
                  j                  | j                   d	      }|d
   |_
        |d   |_        t        |j                  t        |                  |_        t        j                  j                  dt        |            }	|j                   s|	j#                         sd|_        ||_        |j)                          |j                  d      s[| j+                  |d   | j,                     t        j                          t/                y )Nu    Дамп вложенийr^  r   r   r  )r3   r  r  )
obj_ext_idrm  r   T)r  rm  rJ   r  r  contentr  Fr	  )rJ   r}   r
  rI   r  rl  rm  ro   CmfImportDownloadrq   r3   r  r.   r   r  r  rD  r   
downloadedr  rp  r  rm   rM   )
r&   rQ  attachments_dirr  r  attr  
att_ext_iddownload_jobatt_paths
             r)   _dump_issue_attachmentsz%JiraAPIImport._dump_issue_attachments|  s   ##z':':&;;U$VW//66BBC2eDk]SHol3 	SCYF'=6(3J!3377% OO2299EE/ 8 L
  %77) $ 6 6 = = I I#$(	  8   !$JL #IL #O$<$<S[$I JL!**33M3v;OH&&hoo.?*/'/2,!!#wwx Hdmm <j>Q>QR5	S8 	r*   c                    | j                   j                  d      r_| j                  j                  j	                  t
        j                   d       t
        j                  j                  d      }|j                  d      5 }| j                  j                  |      }|D ]  }|j                  di       j                  | j                        r0| j                  |d   | j                     t
        j                         |j                  di       j                  | j                        s| j                  |d   | j                     t
        j                          t        j                  ||       d d d        y y # 1 sw Y   y xY w)Nr  u#    Дамп журнала работzworklog.jsonr  r	  r  )ru   rq   rJ   r}   r
  rI   r  r  r   r   rb   issue_get_worklogrm   r  r   r   )r&   r  worklog_filer   r  r  s         r)   _dump_issue_worklogz!JiraAPIImport._dump_issue_worklog  s8   $$(()>?OO""'':+>+>*??b(cd%..77GL""3' '19966x@' eG{{8R044T]]C(9$--(H*J]J]^{{>26::4==I(?(NPZPcPcd	e
 		(A&' '	 @' 's   B'E=+AE==Fc                    | j                   j                  rj|d   dkD  rb| j                  j                  j	                  t
        j                   d       | j                   j                  |      D cg c]  }| c}|d<   |d   D ]D  }|j                  d      s| j                  |d   | j                     t
        j                         F |S c c}w )Nr  (   u+    Дамп истории измененийrw  r	  )rb   rn   rJ   r}   r
  rI   r  get_changelogrq   r  rm   r  )r&   r  rv  r  s       r)   _dump_issue_changelogz#JiraAPIImport._dump_issue_changelog  s     99??y1B6OO""'':+>+>*??j(kl=AYY=T=TU]=^%_'g%_Ik" - 	WG{{8$ 1$-- @*BUBUV	W  &`s   2	Cc                     | j                   j                  j                  t        j                   d       | j
                  j                  |      S )Nug    Дамп связей задачи со страницами Confluence и веб-страницами)rJ   r}   r
  rI   r  rb   get_issue_remotelinks)r&   r  s     r)   _dump_issue_remotelinksz%JiraAPIImport._dump_issue_remotelinks  sI    ##""#  $K  L	
 yy..x88r*   c                     | j                   j                  j                  t        j                   d       t        j
                  j                  d      }|j                  d       |j                  d      5 }| j                  j                  |d         D ]^  }|j                  t        j                  |      dz          |j                  di       j                  | j                        r0| j!                  |d   | j                     t        j
                         |j                  d	i       j                  | j                        r0| j!                  |d	   | j                     t        j
                         |j                  d
      r3t#        |d
   d      }| j%                  |||       | j'                  |       | j                   xj(                  dz  c_        | j                   j+                  d       a 	 d d d        y # 1 sw Y   y xY w)Nu"    Дамп комментариевzcomments.jsonTr  r  r   r*  r	  r  r
  r  rF   r  )rJ   r}   r
  rI   r  r  r   r  r   rb   get_commentsr  r   r  rq   rm   r  r   _dump_attachments_from_text_dump_users_from_textrT  r  )r&   rQ  r  comments_filer   r  r  s          r)   _dump_issue_commentsz"JiraAPIImport._dump_issue_comments  s   ##z':':&;;]$^_"++44_E-$ 	49911%+> 4

7+d23;;x,00?OO)$--8"++ ;;~r266t}}EOO/>"++ ;;~. -gn.Ev NI44YW..y911Q61((3%4	4 	4 	4s   9FHHc                 \   | j                   j                  j                  t        j                   d       | j
                  j                  |      }t        j                  j                  d      }|j                  d      5 }t        j                  ||       d d d        y # 1 sw Y   y xY w)Nu)    Дамп свойств плагиновzproperties.jsonr  )rJ   r}   r
  rI   r  rb   get_issue_propertiesr  r   r   r   r   )r&   r  r  properties_filer   s        r)   _dump_issue_propertiesz$JiraAPIImport._dump_issue_properties  s    ##z':':&;;d$efYY33H=
$--667HI!!#& 	%!IIj!$	% 	% 	%s   B""B+c                    | j                   j                  j                  t        j                   d       | j
                  j                  |      }t        j                  j                  d      }|j                  d      5 }t        j                  ||       d d d        |D ]/  }| j                  || j                     t        j                         1 y # 1 sw Y   >xY w)Nu"    Дамп наблюдателейzwatchers.jsonr  )rJ   r}   r
  rI   r  rb   get_watchersr  r   r   r   r   r  rm   )r&   r  watcherswatchers_filer   r  s         r)   _dump_issue_watchersz"JiraAPIImport._dump_issue_watchers  s    ##z':':&;;]$^_99))(3"++44_E$ 	#IIh"	#   	IGOOGDMM2J4G4GH	I	# 	#s   CCc                    | j                   j                  j                  t        j                   d       |d   d   }| j                   j
                  j
                  j                   d|d    }|j                  d       D ]  }|j                  d      rdnd}|j                  |   }	 |j                  d	      r;|j                  d
      s4t        j                  j                  | j                  j                  |      }|j                  | j                  j                        st!        j"                  |j%                  d      d         \  }	}
|	s*| j                   j                  j'                  d| d       t)        j*                  dt        j                  j-                  |            }|rc|d   |d   j%                  dd      }|d   k(  rAt/        fd|D        d       }|r*| j                   j                  j'                  d|        t        j                  j-                  |j%                  d      d   j%                  d      d         }t0        j2                  j5                  |      }t0        j6                  j9                  ||| j                   j
                  j
                  j                  ddg      }|sLt0        j7                  ||| j                   j
                  j
                  j                  | j                   d      }||_        t=        |j?                  |            |_         t        jB                  j?                  d|      }|jD                  s|jG                         sd|_$        |jK                          tM                 y # tN        $ r@}tQ                | j                   j                  jS                  d| d|        Y d }~\d }~ww xY w) Nu,    Дамп вложений из текстаr   r  r^  r   c                 J    | j                  d      xs | j                  d      S r  r  r  s    r)   r   z;JiraAPIImport._dump_attachments_from_text.<locals>.<lambda>  r  r*   r  r  zmailto:httpr  r   u"   Ссылка не на файл: 'r  r  rF   r   r  c              3   L   K   | ]  }|j                  d       k(  s|  yw)r   Nr   )r4  r  r  s     r)   r5  z<JiraAPIImport._dump_attachments_from_text.<locals>.<genexpr>  s!     &]sSWWT]V\E\s&]s   $$u<   Файл уже обработан во вложениях: r  r  r3   r  )r  r  rm  r   T)r  r  rm  rJ   r  r  Fu5   Не удалось обработат ссылку 'r  )*rJ   r}   r
  rI   r  rl  rm  r  r  r  r  r  r  urljoinrb   r  r  r  r  r  r  r  r  r   ro   rp  _get_filenamer  rq   r3   r.   r   r  r  rD  r   r  rp  rM   rN   cmf_rollbackr6  )r&   r  rQ  r  r  r  r  r4   r  r  r  r  att_filenamer  r3   r  r
  r  r  r  s                      @r)   r  z)JiraAPIImport._dump_attachments_from_text  sJ   ##z':':&;;g$hiHol3//66BBC2eDk]S%%&]^ 6	tCLL0&eC))C.C3t>>),~~f- ,,..tyy}}cBC~~diimm4&/&:&:399S>!;L&M#	8 OO**003UVYUZZ[1\]II?LL((-	 &q\F#,Q<#5#5c1#=La0!%&]k&]_c!d! OO2288;wx{w|9}~$||++CIIcN2,>,D,DS,I!,LM"..<<TB	%77;;* $ 6 6 = = I I"F+	  <   $#)#;#; #.$(OO$:$:$A$A$M$M#'??(, $< $L %)!$'(@(@(K$L!%..77yQ**(//2C.3L+ %%'g6	th  t&&..1fgjfkknopnq/rssts4   -N?A*N*AN BNF N	O%%5O  O%c                 d   | j                   j                  j                  t        j                   d       |j                  ddi      D ]  }|j                  j                  d      r|j                  d   }n|j                  j                  d      r|j                  d   }nkt        j                  j                  |j                  d         }t        j                  j                  |j                        }|d   d	   j                         }| j                  |t        j                          y )
Nu6    Дамп пользователей из текстаr  r  r  r  r  r  r3   r   )rJ   r}   r
  rI   r  r  r  rq   r  r  r  r  r  r  r  r  )r&   r  r  
user_identr  r  s         r)   r  z#JiraAPIImport._dump_users_from_text-  s    ##z':':&;;q$rs%%Wl,C%D 
	=Cyy}}./ YY'89
/ YY7
#\\22399V3DE
--j.>.>?"6]1-335
OOJ
(;(;<
	=r*   c                     d}|D ]V  }|d   j                  |      s| j                  |d   |   j                  | j                        t        j                         X y )N)r   r?  rl   r   )rq   r  rm   rI   r  )r&   rQ  user_fields
user_fields       r)   _dump_users_from_issue_fieldsz+JiraAPIImport._dump_users_from_issue_fields<  s\    

 & 	JX"":.(OJ/33DMMB''	r*   c                    |j                  d      }|d   }| j                  |t        j                         | j	                  |       | j                  ||       | j                  ||       | j                  |       | j                  |       | j                  |       | j                  ||d         |d<   | j                  |      |d<   t        |      |d<   |d   d   r6t        |d   d   d      }| j                  |||       | j                  |       t        j                  j                  d	      }|j!                  d
      5 }t"        j%                  ||       d d d        t        j                  j                  d      }t!        |d
      5 }|j'                  d       d d d        y # 1 sw Y   OxY w# 1 sw Y   y xY w)Nr  r   rv  r  r  r  r   r  r  r  r  r   )r   r  rI   r  r4  r  r  r  r&  r!  r  r  r.   r   r  r  r   r   r   r  )	r&   rQ  r  r  r  r  r  r   r  s	            r)   _dump_issue_detailsz!JiraAPIImport._dump_issue_detailsI  s   "++M:;z':':;**51$$UO<!!%9  *!!(+##H-!77%BTUk#;;HEm!(ml!"=1%e,<&=m&LfUI,,YO&&y1''00=	^^C  	 AIIeQ	  ''00?	)S! 	QGGBK	 		  	 
	 	s   F,F8,F58Gc              #   R  K   | j                   j                  |      }|j                  d      }|j                  d      }|j                  d      }	 |j                         r|j	                  |       ny|j                         r|j	                  |       nW|j                         r|j	                  |       n5|j                  d       |j                  d      }|j                  d       |t        _        | |j	                  |       |t        _        y # t        $ r  w xY ww)Nr`   ra   r^   Tr   r  )	r  r   r  r   r.  r   rI   r  rN   )r&   	base_pathr  task_archived_dirtask_moved_dirtask_dirty_dirr  s          r)   issue_directoryzJiraAPIImport.issue_directoryi  s    >>**95$00=!--h7!--h7	   0"))+!)).9&&(&&~6$$d$3"0"9"9-"H%%t%4"0JN""8,"*J 		s   AD'CD D'D$$D'c           
      6   t        d      5  d}	 |j                         }||j                  |       n	 ddj                  |D cg c]  }| c}       d}| j                  j                  |t        |      d      }|d	   }|D ])  }	| j                  j                         r
 d d d        y
t        |	d         }
|	d   }d| d|
 dt        _        	 | j                  j                  j                  t        j                   d       | j                  |
      5 }| j                  |	|       d d d        | j                  j                  j                  t        j                   d       | j                  xj                   d
z  c_        | j                  j#                  d       t)                , 	 |j                  |       	 d d d        y c c}w # 1 sw Y   xY w# t$        $ rD}|d
z  }| j                  j'                  t        j                   d|	 d| ddd       Y d }~d }~ww xY w# t)                w xY w# t$        $ r@}| j                  j'                  | j*                   d| d| ddd       |d
z  }Y d }~d }~ww xY w# 1 sw Y   y xY w)NFr  r   zid in (r  r  zchangelog,renderedFields)r4  expandr  rF   r   r4   r    r1  r  u    Дамп задачиu'    Выполнен дамп задачиrA  u>    Не удалось выполнить дамп задачи r{  zERR-0111r?  r   r  uC    Не удалось получить задачи проекта: )r   rq   r  r   rb   r  r  rJ   rL   r.   rI   r  r}   r
  r<  r6  rT  r  rN   rP   rM   r  )r&   task_chunk_queuetasks_that_are_doner  r  r  r  r  r  rQ  r  r  r  r  s                 r)   _dump_task_partzJiraAPIImport._dump_task_part  s   51 :	0F-113
%$((4/ #DIIj.Q7w.Q$R#SSTUC#yy}}!*o9  -  H
 &h/F!' )??446#$':	0 :	0* $'uT{#3$)%L	01)Bxj.K
+) OO2277:;N;N:OOe8fg!%!5!5h!? J8 $ 8 8 IJ !OO2277#-#6#6"77^ _ !OO==B= OO44V< 'L=)R $''/o  :	0 :	0 /R$J J  ) "aKF OO55#-#6#6"77uv{u||~#&%!) *)2+1 6   'L   OO--++,,o%,b/"!*#) .  aKF a:	0 :	0s   )JI	GAI0%IAG$G0A8G$(I5JIG!G$$	H1-:H,'H4,H11H44I  I	J6JJJJJc           	      6   d}| j                   j                         }t        | j                        }d}||k  r|}t	        dt        | j                        |      D cg c]  }| j                  |||z     }}| j                   j                         }|D ]  }|j                  |        |j                  d        g }	t	        | j                        D ]|  }| j                  j                  | j                  d|dz    ||d      }
|	j                  |
       |
j                          | j                  j                  j                  d|
        ~ d}||z  }t        |      | j                  z   dz
  | j                  z  }||z  }| j                  j                  j                  d	|d
z   d|d
z  dz   d|dz   d       |	D ]N  }
|
j                  |       |
j!                         s&| j                  j#                  dddd       t%        d       | j                  j                  j                  d       |j'                         s$||j)                         z  }|j'                         s$| j                  j                  j                  d|        |S c c}w )Nr   2   _dump_task_part_rF   )r?  r@  targetr3   r'   u   Запущен r;  u&   Тайм-аут дампа задач r  u   ч u   м u   сtimeoutu$   Возможно завис дампzERR-0055r?  r   r  u"   Ошибка дампа задачuK   Закончили параллельное скачивание задачu   Ошибок: )r   Queuer  task_id_listr  r  r   r   ThreadrA  r   r'  rJ   r}   r
  r   is_aliverP   TimeoutErroremptyrq   )r&   r  r@  r  task_chunk_sizer  task_chunksr?  r  threadsthreadtime_per_tasktime_per_chunkchunks_per_threadtotal_time_per_threads                  r)   _dump_taskszJiraAPIImport._dump_tasks  s   "jj..0
 $++,/))O 1c$"3"34oF
 aO 34
 

  ::++-% 	-J  ,	-T"t889 	DA^^**++'Aw/(8+> + F NN6"LLNOO""''/&(BC	D &8 -0Q0QQTUUZ^Z{Z{{ 1N B##4$,-S%,34C$r)*".	
  		IFKK 5K6 )):&%	 *  ##GHH		I 	##$qr%++-)--//F &++-##nVH$=>o
s   Jc                 P   | j                   j                  j                  | j                   d       | j                  j                  |      }|r|si }| j                  j                  r| j                  j                  |d         }n5|j                  dg       D ]   }|d   dk(  s|d   D ]  }|d   ||d   <    " |j                  dg       D ]k  }g |d<   |j                  |d   g       D ]L  }	|d   j                  |	       |	d	   d
k(  s | j                  |	d   | j                   j                                N m | j                  j                  d      }
|
j                  d       |
j                  d      5 }t         j#                  ||       d d d        y # 1 sw Y   y xY w)Nu8    Дамп схемы безопасности задачr   r  r4   BROWSE_PROJECTSrE  r[  levelsr  rB  r   zissue_security_scheme.jsonTr  r  )rJ   r}   r
  r  rb   !get_project_issue_security_schemern    get_issue_security_level_membersrq   r   r  r   rh  r   r  r   r   r   )r&   r  r  r  security_schemesecurity_level_membersr9  security_levelr   memberissue_security_scheme_filer   s               r)   #_dump_project_issue_security_schemez1JiraAPIImport._dump_project_issue_security_scheme  s   ##t'7'7&88p$qr))EEjQ:%'"yy)-)S)S#D)*& +..C eFe}(99.4Z.@ eNKYZcKd2>$3GHee
 ),,Xr: ^#%i 488tbI ^F)$++F3f~/w9Z9Z9\]^^ &*%5%5%>%>?[%\""))T):',,S1 	*QIIoq)	* 	* 	*s   <FF%c                 J   | j                   j                  ry | j                  j                  j	                  | j
                   d       i }| j                  j                  d      }|j                  d       |j                  d      5 }	 d}| j                   j                  |dj                  |            }t        j!                  ||       d d d        |S # t        $ r2}| j                  j                  t        |      d	d
d       Y d }~Vd }~ww xY w# 1 sw Y   |S xY w)Nud    Дамп конфигурации проекта через плагин 'Smart Jira Configuration'zsmart_config.jsonTr  r  )	projectInformationprojectSchemesprojectIssuetypesprojectVersionsprojectComponentsprojectMembersprojectCustomfieldsprojectGlobalActionsprojectWorkflowActionsr  )r  ERR-0056r  r   r  )rb   rn   rJ   r}   r
  r  rh  r   r  r   get_project_smart_configr   rN   rP   r.   r   r   )r&   r5   r  smart_config_filer   r  r  s          r)   _dump_project_smart_configz(JiraAPIImport._dump_project_smart_config"  s(   99??
 	##   !E  F	G  ,,556IJ  D 1##C( 	'A
  $yyAAHHW-  B   IIlA&1	'4   ))H)%	 *  #	'4 s6   
D.C:D	D#(DDDDD"dtfrom_tzto_tzr  c                 |   | xsA t         j                   j                  t        j                  |            j	                  |      } t         j                   j                  | |      }|j                  t        j                  |            j                  t        j                  |            }|j	                  |      S )u0  
        Преобразует дату из одного часового пояса в другой

        Args:
            dt: строка с датой (если None, используется текущее время)
            from_tz: исходный часовой пояс (по умолчанию UTC)
            to_tz: целевой часовой пояс (по умолчанию UTC)
            format: формат даты

        Returns:
            строка с датой в целевом часовом поясе
        )tzinfo)r  nowr   gettzstrftimestrptimer.  
astimezone)rq  rr  rs  r  naive_dtconverted_dts         r)   _datetime_convertzJiraAPIImport._datetime_convertL  s    & L8$$(('):;DDVL$$--b&9''rxx/@'ALLRXXV[_]$$V,,r*   c                     | j                   j                  |      }|d   d   s|d   d   }t        dd| d| d      y	)
uj   Проверяет права текущего поьзователя в контексте проектаr  rY  havePermissionr3   zERR-0128u   Не удалось выполнить дамп задач проекта. Пользователь не имеет разрешения 'uA   '. Предоставьте пользователю право 'u.   ' в схеме прав для проектаN)rb   get_permissionsr   )r&   r  user_permissionsr  s       r)   _check_project_permissionsz(JiraAPIImport._check_project_permissionsd  st    9944
4K 123CD./@A&IORRaQb cQQ`Pa b?@  Er*   c                    | j                   j                  j                  | j                   d       g }| j                  j                  d      }|j                  d       |j                  d      5 }| j                  j                  |      D ]\  }|j                  |d          | j                   xj                  dz  c_        |j                  t        j                  |      d	z          ^ 	 d d d        |S # 1 sw Y   |S xY w)
Nu.    Дамп типов задач проектаra  Tr  r  r  r   rF   r*  )rJ   r}   r
  r  rh  r   r  r   rb   r  r   rT  r  r   r  )r&   r  r  rc  r   r  s         r)   _dump_project_issue_typesz'JiraAPIImport._dump_project_issue_typesq  s    ##t'7'7&88f$gh++445GH40""4( 	7A"ii===T 7
%%j&6711Q61

:.567	7 	7 s   3A<C::Dc                    | j                   j                  re|s#| j                   j                  |      d   d   }|S | j                  |      }| j	                  ||       | j                   j                  |      }|S | j                   j                  |      }d|vr	|d   |d}n!| j                   j                  |d         |d<   |j                  di       |d<   | j                  |       |S )Nr   workflowSchemer   r3   )r   r
  r
  rd  )	rb   rn   get_project_schemer  r  get_project_workflow_schemeget_workflow_schemerq   r  )r&   r  r5   r  r  r=  r  s          r)   _dump_project_workflow_schemez+JiraAPIImport._dump_project_workflow_scheme  s    99??"&))">">z"J1"MN^"_$ ! "&!?!?
!K77
NS"&))"G"G"T  #iiCCKPO?*)&1+#
 +/))*G*GX\H]*^'+7+;+;K+LOK(..?r*   c                    | j                   j                  j                  | j                   d       | j                  j                  d      }|j                  d       |j                  d      5 }	 | j                  j                  |      }|d   D ]  }|d   d   d	k(  s| j                  j                  rF|d   j                  d
      s:| j                  |d   d
   | j                   j                                k| j                  |d   d   | j                   j                                 	 t         j#                  ||       d d d        y # t        $ r}t        dd|       d }~ww xY w# 1 sw Y   y xY w)Nu0    Дамп схемы проектных правzpermissions.jsonTr  r  permissionsholderr  rB  r   	parameterrm  uX   Не удалось выполнить дамп схемы проектных прав. )rJ   r}   r
  r  rh  r   r  r   rb   get_project_permission_schemern   rq   r  r   rN   r   r   r   )r&   r  permissions_filer   permission_scheme	perm_dictr  s          r)   _dump_project_permission_schemez-JiraAPIImport._dump_project_permission_scheme  sm   ##t'7'7&88h$ij++445GH40""3' 	,1$(II$K$KJ$W!!2=!A I *62f<99??(266w? $$-h$7$@$(OO$E$E$G!"
 !OO )( 3K @ $ A A C& II'+-	, 	,   nornst !	, 	,s=   1E03.E"*EA#E0E0	E-E((E--E00E9c                    | j                   j                  j                  | j                   d       | j                  j                  d      }|j                  d       |j                  d      5 }| j                  j                  |      D ]H  }| j                   xj                  dz  c_
        |j                  t        j                  |      dz          J 	 d d d        y # 1 sw Y   y xY w)	Nu)    Дамп статусов проектаrf  Tr  r  r  rF   r*  )rJ   r}   r
  r  rh  r   r  r   rb   get_statusesrT  r  r   r  rg  s        r)   _dump_project_statusesz$JiraAPIImport._dump_project_statuses  s    ##t'7'7&88a$bc((11/B-% 	0yy---D 011Q61

3$./0	0 	0 	0s   1A(C##C,c                    | j                   j                  j                  | j                   d       | j                  j                  d      }|j                  d       |j                  d      5 }| j                  j                  |      }|j                         D ]  }| j                   j                         r
 d d d        y | j                   xj                  dz  c_        g }| j                  j                  |d      }|j                  d	g       D ]  }|d
   dk(  s	 | j                  j                  rE| j                  j                  |d   j                  d      |d   j                  d            |d<   n"| j                  j                  |d         |d<   |j                  d      s| j/                  |d   | j0                     | j                   j3                                 |j                  d	      r|D ]  }
|d	   j5                  |
        |j7                  t8        j;                  |      dz           	 d d d        y # t         j"                  j$                  $ re}	|	j&                  j(                  dk(  rF|j+                  |       | j                   j                  j-                  d|d    d|	 d       Y d }	~	 d }	~	ww xY w# 1 sw Y   y xY w)Nu#    Дамп ролей проектаrk  Tr  r  r5   rF   r  ra  r  r]  	actorUserr3   re   )r5  r  r  r5    u&   Пользователь к роли 'u   ' не найден. u+   . Возможно он был удаленr*  )rJ   r}   r
  r  rh  r   r  r   rb   get_project_rolesr   rL   rT  rq   rn   rB  requests
exceptions	HTTPErrorr  r  r   r6  r  rm   r   r8  r  r   r  )r&   r5   rl  r   rk  role_urlunfound_actors	role_inford  r  unfound_actors              r)   _dump_project_rolesz!JiraAPIImport._dump_project_roles  s   ##t'7'7&88[$\]%%..|<
T*__T" *	6aII//K/HE!LLN (6??,,.	*	6 *	6 11Q61!# IIMM(TMB	&]]8R8 EV}(CC&#yy59YY^^-2;-?-C-CF-K/4[/A/E/Ek/R 6D 6Tk 2 6:YY^^USY]^5[k 2 !99[1 OO %k 24== A $ A A C/8 ==*)7 B!(+22=AB 

9-45Q(6*	6 *	6&  (22<< &"||773> !/ 5 5e < $ 6 6 > >&LYW]M^L__t'*e+V%X!" !) %&'*	6 *	6sM   1AKAK#A=I K2BKK	+AK	K
K	K	KKc                    | j                   j                  j                  d       	 |d   }| j                  j	                  |      D ]  }| j                   j                         r y |d   |k7  r)| j                   xj                  dz  c_        t        |d         }|j                  |      }|j                  d       |j                  d      }|j                         r-| j                   j                  j                  d|d	    d
       | j                  j                  s|d   d   |d<   i |d<   | j                   j                  j                  d|d	           | j                  j                  |dg      }|D ]T  }	| j                   j                         r  y |	d   }
|
|	d   |	d   d   d   |	d   d   d   |	d   d   d	   dd}||d   |
<   V |j                  d      5 }t        j                  ||       d d d        | j                   j!                  d        y # 1 sw Y   (xY w# t"        j$                  j&                  $ r}|j(                  j*                  dk(  r?dt        |      v sdt        |      v r%| j                   j-                  t        |             n#| j                   j/                  d| ddd        Y d }~y d }~wt0        $ r+}| j                   j/                  d| d| ddd        d }~ww xY w)Nu&   Дампим спринты доскиr   originBoardIdrF   Tr   r  u   Спринт r3   u    уже скачанr
  r  r  rC  r\  r4   r   )r   r4   r3   )r   r4   rC  r  rq  i  z"The board does not support sprintsuD   Данная доска не поддерживает спринтыuA   Не удалось выполнить дамп спринтов ERR-0057ro  r   r  r{  )rJ   r}   r
  rb   get_sprintsrL   rT  r.   r   r   r   rn   get_sprint_issuesr   r   r   r  r  r  r  r  r  rK   rP   rN   )r&   r  rt  r  rq  ru  sprint_pathsprint_info_filesprint_issuesrQ  r  r  r   r  r  s                  r)   _dump_board_sprintsz!JiraAPIImport._dump_board_sprints  s   ##$LMD	T{H))//9 (3??,,./*h611Q61t-	)229=!!4!0#.#7#7#D #**,OO**//-v?OOc0deyy-26]>-JF>*#%x &&++mF6N;K,LM $		 ; ;%; !< ! + <E002$T{H&$U|"'/)"<T"B#(?9#=e#D$)(OI$>v$F$"J 2<F8$X.< &**3/ )1IIfa()((2Q(3L) ) "",, 	

&&#-8CFB]adefagg ##CF+))WX]W^_&%	 *   ,  	OO%%STYSZZ\]`\ab"!	 &  	sJ   ?H1 'D7H1 AH1 'H%>&H1 %H.	*H1 1LA;KL&L  Lc                    | j                   j                  j                  d|d           t        |d         }| j                  j                  |      |d<   | j                  j                  |d   d   d         |d   d<   | j                  j                  |      }| j                  j                  r>dd| j                  j                  |      D cg c]  }| c}ii}|j                  |       ||d   d<   | j                  j                  s8| j                  j                  |      }t        t        |      d	kD        |d   d
<   ||d<   |j                  |      }	|	j                  d       |	j                  d      }
|
j!                  d      5 }t"        j%                  ||       d d d        |S c c}w # 1 sw Y   |S xY w)Nrw  r3   r   r
  r   rl  rm  r   rF   r  r  Tr   r  r  )rJ   r}   r
  r.   rb   get_agile_board_configuration
get_filterget_advanced_board_settingsrn   get_board_quick_filtersrF  get_agile_board_projectr   r  r   r   r   r   r   )r&   r  r  
boards_dirr  advanced_settingsqfquick_filtersboard_projectsrq  board_info_filer   s               r)   _dump_boardzJiraAPIImport._dump_board9  s   ##k%-$ABuT{#		??If"&))"6"6uV}X7Nt7T"Ufh !IIAA(K99??#"%)YY%F%Fx%P%!%&M $$]3"3fhyy "YY>>xHN,0^1Dq1H,IE&M.)(l''1	&#,,[9!!#& 	 !IIeQ	  /%(	  s   	F2F77Gc                 n   | j                   j                  j                  | j                   d       | j                  j                  d      }|j                         rt        j                  |       |j                          | j                  j                  d      }|j                         rt        j                  |       |j                          	 | j                  j                  |      D ]j  }| j                   j                         r y | j                   xj                  dz  c_        | j                  |||      }|d   dv sY| j                  ||       l y # t         $ rM}| xj"                  dz  c_        | j                   j%                  | j                   d| d	d
d       Y d }~y d }~ww xY w)Nu#    Дамп досок проектаry   r  r  rF   r  )rb  simpleu    Не удалось выполнить дамп досок, возможно проект не поддерживает доски или у вас нет прав. r  ro  r   r  )rJ   r}   r
  r  rh  r   r   r   r  r   rb   get_all_agile_boardsrL   rT  r  r  rN   rO   rP   )r&   r  r  rt  r  r  s         r)   _dump_project_boardsz"JiraAPIImport._dump_project_boards`  s   ##t'7'7&88[$\]%%..x8
MM*%&&//	:MM+&	77J7O 	A??,,.11Q61((UJG=$77,,UK@	A  	OOq OOO%%##$ %||  |AB"! &  	s%   :E 9E 	E 	F4'AF//F4c                    | j                   j                  | j                   d       | j                  j	                  d      }|j                  d       |j                  d      5 }| j                  j                  |      D ]l  }| j                   j                         r
 d d d        y | j                   xj                  dz  c_
        |j                  t        j                  |      dz          n 	 d d d        y # 1 sw Y   y xY w)Nu%    Дамп версий проектаrw  Tr  r  rF   r*  )rJ   rK   r  rh  r   r  r   rb   get_project_versions_paginatedrL   rT  r  r   r  )r&   r5   rx  r   rM  s        r)   _dump_project_versionsz$JiraAPIImport._dump_project_versions  s    t//00UVW((11/B-% 	499CCKP 4??,,.	4 	4
 11Q61

7+d234	4 	4 	4s   ':C<*AC<<Dc                    | j                   j                  | j                   d       | j                  j	                  d      }|j                  d       |j                  d      5 }| j                  j                  |      D ]  }| j                   j                         r
 d d d        y |j                  d      r:| j                  |d   | j                     | j                   j                                | j                   xj                  dz  c_        |j                  t         j#                  |      dz           	 d d d        y # 1 sw Y   y xY w)	Nu/    Дамп компонентов проектаrz  Tr  r  r  rF   r*  )rJ   rK   r  rh  r   r  r   rb   get_project_componentsrL   rq   r  rm   r   rT  r  r   r  )r&   r5   r{  r   rT  s        r)   _dump_project_componentsz&JiraAPIImport._dump_project_components  s   t//00_`a**334EF$/!!$' 	61!YY==kJ 
6	??,,.	6 	6
 ==(OO!&)$--899; 11Q61

9-45
6	6 	6 	6s   ':E*BEEc                 >   | j                   j                  | j                   d       | j                  j	                  |      }| j
                  j                  d      }|j                  d      5 }t        j                  ||dd       d d d        y # 1 sw Y   y xY w)Nu%    Дамп ссылок проектаro  r  r   F)r   r  )
rJ   rK   r  rb   get_project_shortcutsrh  r   r   r   r   )r&   r5   project_shortcutsshortcuts_filer   s        r)   _dump_project_shortcutsz%JiraAPIImport._dump_project_shortcuts  s    t//00UVW II;;KH))223CD  % 	JII'15II	J 	J 	Js   0BBc                    | j                   j                  r1| j                   j                  | j                   j                        }n0| j                   j                  | j                   j                        }|r|d   d   S dS )N)r  r  r   timeZoneEtc/UTC)rb   rn   user_find_by_user_stringr5  )r&   r  s     r)   _get_user_tzzJiraAPIImport._get_user_tz  se    99??		::ASAS:TI		::DIIDVDV:WI+4y|J'C)Cr*   c                 .   d}| j                   j                  d      }|j                         r[|j                  d      5 }t        j                  |      }|j                  d      }ddd       r|r| j                  ||      }|S |}|S # 1 sw Y   &xY w)ut  
        Возвращает дату последнего успешного дампа.
        Если указан парамет user_tz, то возвращает дату с учетом часового пояса.

        Args:
            user_tz (str, optional): Часовой пояс. Defaults to None.

        Returns:
            str: Дата
        Nr  re  	dump_daters  )rh  r   r   r   r   r   rq   r}  )r&   user_tzlast_dump_dater  r   current_dumplast_dump_date_utcs          r)   _get_last_dump_datez!JiraAPIImport._get_last_dump_date  s     $$--k:	$ C#yy|%1%5%5k%B"C "g!%!7!78JRY!7!Z  "4C Cs   'BBc                 &    | j                  |      S )Nr  )r}  )r&   r  s     r)   _get_new_dump_datez JiraAPIImport._get_new_dump_date  s    %%G%44r*   c                 x   | j                   j                  d      }| j                  |      \  }}|j                         sC| j                  j
                  j                  | j                   d| j                    d| d       y|s6| j                  j
                  j                  | j                   d| d       yy)	uq   Проверяет условия для сброса даты последнего успешного дампаrD  u%    В каталоге проекта 'u5   ', отсутствует каталог задач 'u[   '. Дата последнего успешного дампа будет сброшена.Tu0    В каталоге задач проекта 'u   ' отсутствуют задачи. Дата последнего успешного дампа будет сброшена.F)rh  r   r  r   rJ   r}   r6  r  )r&   r  r  r  r  s        r)   _reset_last_dump_datez#JiraAPIImport._reset_last_dump_date  s     $$--g6	22:>Q!OO""**##$$I$JZJZI[ \EENK Pkl
 OO""**##$$TU^T_ `k l
 r*   c                     | j                         }| j                  j                  d      s| j                  |      rd }n| j	                  |      }| j                  |      }|||fS )Nr   )r  r   rq   r  r  r  )r&   r  r  r  new_dump_dates        r)   _get_dump_date_rangez"JiraAPIImport._get_dump_date_range  sc     ##% ;;??>*d.H.H.T!N!55g>N//8}g55r*   c                 (   | j                   j                  d      }|j                  d      5 }t        j	                  |      }||d<   |j                  d       t        j                  ||       |j                          d d d        y # 1 sw Y   y xY w)Nr  rX  r  r   )rh  r   r   r   r   r  r   truncate)r&   r  r  r   r  s        r)   _save_dump_datezJiraAPIImport._save_dump_date  st    $$--k:	^^D! 	Q99Q<L(1L%FF1IIIlA&JJL	 	 	s   ABBc                    i }d| j                   j                  j                  j                   d| d}t        j                  j                  ddd| dg      }|rdd|gg dg d	g}d
}d}	 ||z   }t        j                  j                  |g d||g      }	|	s	 |S |	D ]F  }
t        |
j                        j                  dd      \  }}|
j                  |
j                  d||<   H ||z  }|S )Nr^  rf  r(  r)  r]  ra  r  r  r  r  Tr     )r  r   rf  r   r   slicerF   )r4   rf  )rJ   rl  rm  ro   r  rq   r?  slistr.   rf  r  r   )r&   r  current_tasksr%  rC  r   r'  r  r  rD  rA  r  r  s                r)   _get_current_tasksz JiraAPIImport._get_current_tasks   s(   doo44;;GGH:,VXY##''&AnEUUVBW/X'Y3(*.K EDdl,,&3 #, - 
   " D!$T[[!1!7!7a!@JAw#yy"&++.M'*  " r*   c                     d| d}| j                   j                  |d      D ch c]  }t        |d          }}|S c c}w )Nproject = 'r  r   r\  )rb   jql_get_list_of_ticketsr.   )r&   r  r  rQ  	issue_idss        r)   _get_active_issue_idsz#JiraAPIImport._get_active_issue_ids!  sY    J<q) ::3t:L
 d
	 
 	
s   ?c                    | j                  |      }|j                         D ch c]  }| }}| j                  |      }||z
  }i }|D ]  }||   }	|	d   }
|	d   }|
|d||<   	 | j                  j	                  |ddg      }|d   }|j                  d      r||   j                  d|d   d	       n||   j                  d
|d   |d   d        | j                   j#                  |d      }|j%                  d      5 }t&        j)                  ||d       d d d        y c c}w # t        j                  j                  $ r<}|j                  j                  dk(  r||   j                  ddi       n Y d }~3d }~wt        $ r?}| j                  j                  | j                   d| d| d| ddd       Y d }~yd }~ww xY w# 1 sw Y   y xY w)Nrf  r4   r  rC  r  r\  r   r  )r  r  r  )r  r  rC  r  r  r  uG    Ошибка проверки отсутствующей задачи r1  z): zERR-0000r  r   r  r  r  Fr  )r  r  r  rb   	get_issuerq   rF  r  r  r  r  r  rN   rJ   rP   r  r   r   r   r   r   )r&   r  r  current_taskcurrent_task_idsactive_issue_idsmissing_task_idsr  r  rA  r  r  rQ  r  r  r  r   s                    r)   _get_missing_tasksz JiraAPIImport._get_missing_tasks)  s    //
;=J=O=O=QR\LRR55jA+.>>' $	G )Dx.KE{H &&M'"
		++GY<W+X$X##N3!'*11!+(4^(D3 
 "'*11!(#(<#/	#:3 '$	L "..77
DXY$$S) 	<QIImQUI;	< 	<[ S< &&00 <<++s2!'*117I2FG H  ))''((oj7)3se5)% *  	< 	<s6   	D#$A.D(G
(G1E<<G4GG
Gc                     d}| j                   j                  d      | _        | j                  j                  d       | j	                  |      \  }}}| j
                   d}|s|r"|dz  }|r|d| z  }|r|d| z  }|d	| d
z  }| j                  j                  |       | j                  j                  |||      }|rl| j                  j                  d      r6| j                  j                  j                  | j
                   d| d       n5| j                  j                  j                  | j
                   d| d       t        j                          }d| d}	|r	|	d| dz  }	|r	|	d| dz  }	|	dz  }	| j                  j#                  |	d      D 
cg c]  }
t%        |
d          c}
| _        || j)                         z  }t        j                          |z
  }| j                  j                  j                  | j
                   d| d|dd       | j+                  |       n2| j                  j                  j                  | j
                   d       |s$| j-                  ||      }| j/                  |       |S c c}
w )Nr   rD  Tr   u#    Дамп задач проектаu    за периодu    с u    по u4    включительно (часовой пояс: r  )r  r  r   u    Дамп всех u6    задач проекта будет обновленu
    Дамп u<    новых/обновленных задач проектаr  r  z AND updated >= 'z AND updated <= 'z ORDER BY updatedr   r\  u1    задач проекта выполнен за r9  r  uF    В проекте нет новых/обновленных задач)rr  )rh  r   r  r   r  r  rJ   rK   rb   get_project_issues_count_duringr   rq   r}   r6  r
  r<  r  r  r.   rJ  rW  r  r}  r  )r&   r  task_errorsr  r  r  info_msgr  rD  r  rA  rK  r  s                r)   _dump_project_issuesz"JiraAPIImport._dump_project_issues[  s   ))227;d+151J1J:1V.w&&''JK],,Hd>"233f]O44NwiWXYYHH%YY>>%" ? 


 {{~.&&..''((;J<G}~ &&++''(
:,>z{ ""$B  
|1-C*>*:!<<*=/;;&&C !II==c$=O! DJ!D 4++--K""$r)BOO""''##$Jzl:klnorkss{|
 **:6OO""''##$$jk
 ..}g.NI  +3!s   Jc              #   0  K   | j                   j                  |      }|j                  d      }	 |j                         r|j	                  |       n|j                  d       || _        | |j	                  |       || _        y # t        $ r  w xY ww)Nr^   Tr   )r   r   r  r   r.  r   rh  rN   )r&   r8  rh  project_dirty_dirs       r)   project_directoryzJiraAPIImport.project_directory  s     ''00;'33H=	!!###$56!'''60D%%k2*D 		s   -BAB BBBc                 z   t        j                         }| j                  j                  |      }d| j                  j
                  j
                  j                   d| d}|d   }| j                  j                  ||      }||k7  r6||d<   | j                  j                  | j                   d| d| ddd	       |j                  d
      }	| j                         |d<   t        |      |d<   |j                  d      r:| j                  |d   | j                     | j                  j                                | j!                  |      }
| j#                  ||	|
      |d<   | j%                  ||	|
      |d<   | j'                  |||	|
      |d<   | j)                  ||	|
       | j+                  |       | j-                  |       | j/                  |       | j1                  |       | j3                  |       | j5                  |       | j7                  |       | j8                  j;                  d      }|j=                  d      5 }t>        jA                  ||       d d d        t        j                         |z
  }| j                  jB                  jE                  | j                   d|dd       y # 1 sw Y   WxY w)Nr^  r4   r  u    Код проекта 'u   ' содержит недопустимые символы. Код проекта и коды задач заменены на 'r  zERR-0144r  r%  r  r  rh  r  jira_screen_schemer  r  r  r  u<    Дамп данных проекта выполнен за r9  r  )#r<  r  rb   r\  rJ   rl  rm  get_correct_keyrP   r  rq   r  r.   r  rm   r   rp  r  r  r  rb  r  r  r  r  r  r  r  rh  r   r   r   r   r}   r
  )r&   r  r5   rh  rD  r  r%  original_keyr  r  r  r  r   rK  s                 r)   _dump_projectzJiraAPIImport._dump_project  s    yy,,[9doo44;;GGH:,VXY#E*88~V\)-;L)*OO%%##$$<\N KWWeVffgi%	 &  "%%l3
$($<$<$>[!&)+&6]#F#OOV$T]]3113 66{C-1-L-L.
)*
 '+&C&C'
]#
 04/Q/Q	0
+, 	00	

 	,,Z8##J/  -!!*-##K0%%k2$$[1 $$--k:	^^C  	'AIIlA&	'  2%##  \]_`c\ddlm	
		' 	's   J11J:c                    | j                   d   d   d   }|d   st        d      |d   D cg c]  }|d   r
|d   r|d    c}| _        t        | j                        }t	        d|z        }| j                  D ]  }| j
                  j                         r y | j
                  xj                  d	z  c_        |d
   }|d   }|j                  d      xs |d   }d| d| d| _	        | j
                  j                  j                  | j                   d       	 | j                  |       | j                  |      5 }	| j                  |||	       d d d        dt        j                   d<   | j
                  xj"                  |z  c_        | j
                  j%                  d       t'                dt        j                   d<   | j)                  |      }
| xj*                  |
z  c_        | j,                  j                  d      r| j/                  |        | j
                  j9                  d        y c c}w # 1 sw Y   xY w# t0        $ rb}| xj*                  d	z  c_        | j
                  j3                  | j                   d|j4                   |j6                  dd       Y d }~3d }~wt        $ r}| xj*                  d	z  c_        |j                  d      r-| j
                  j3                  | j                   dddd       n.| j
                  j3                  | j                   d| ddd       Y d }~d }~ww xY w)!Nr7  r   r   	isCheckedu5   Не выбрали ни одного проекта!r  rQ   P   rF   r   r4   original_namer3   r    r1  r  u    Дамп проектаr   NO_CACHETr  1r   u)    Ошибка дампа проекта: r  r   r  r  u    Приватный проект не может быть импортирован. Отключите приватность в Jira или предоставьте пользователю праваzERR-0058uA    Не удалось выполнить дамп проекта. u0   Закончили дампить проекты)rP  rN   rz   r  rB  rJ   rL   rT  rq   r  r}   r
  r  r  r	  r   environrJ  rp  rM   r  rO   r   r  r   rP   r"   r   rK   )r&   rootvalr  r  rC  r  r5   r$  rh  r  r  s               r)   _dump_projectszJiraAPIImport._dump_projects  s   }}./8;K STT #'z"2"
5zc+. J"
 $(()28}-- 7	G((*OO--2- J!%.K";;7J76?L!"<.;-rBDOO""''4+;+;*<<T(UV*//
;++J7 M;&&z;LM *,

:&((D0($$t$4),

:&"77
C;.;;??#78++J7=7	r 	NOA"
.M M  1$))''((QRURYRYQZ[HH)%	 *    1$;;{+OO--++, -P Q"!-#) .  OO--++,,mnqmrs"!-#)	 . sD   H6"I>H;CI;I	 I	MAJ--M9BM  Mc                 0   | j                   j                  d      r| j                  j                  szddlm}m} 	  || j                  | j                        }| j                  j                  j                  d|j                          || _        | j                  j                          y y y # |$ r/}| j                  j                  j                  |       Y d }~y d }~wt        $ r,}| j                  j                  d| ddd	       Y d }~y d }~ww xY w)
Nr   r   )BigGanttManagerPluginNotFoundErroru3   Дамп данных из плагина BigGantt u]   Не удалось произвести дамп данных из плагина BigGantt. zERR-0138BigGanttr   r  )r   rq   rb   rn   modules.jira.managersr	  r	  rJ   r}   r
  plugin_versionr  	dump_datar6  rN   rP   )r&   r	  r	  r  r  s        r)   _dump_bigganttzJiraAPIImport._dump_biggantt=  s    ;;??,-diiooR*4??DIIF&&++I(JaJaIbc !)'') 7F- ' 4&&..s33 ))003u6'% *  s$   A0B. .D3%CD)"DDc                 	   | j                   j                         }t        j                  |      \  }}}||z  dz  }| j                   j	                  d| d       | j                   j
                  j                  d       | j                  j                  r | j                          | j                          | j                   j
                  j                  d       | j                          | j                         | _        | j                  j                  d      rL| j                   j
                  j                  d       | j!                  | j                  j"                  d       n+| j                   j	                  d	t$        j&                  
       | j)                          | j                   j
                  j                  d       | j!                  | j                  j*                  d       | j                   j
                  j                  d       | j!                  | j                  j,                  d       | j!                  | j                  j.                  d       | j                  j                  r| j                   j
                  j                  d       | j!                  | j                  j0                  d       | j                   j
                  j                  d       | j!                  | j                  j2                  d       | j                   j	                  d       | j!                  | j                  j4                  d       | j!                  | j                  j6                  d       | j                   j	                  d       | j!                  | j                  j8                  d       | j!                  | j                  j:                  d       | j                   j	                  d       | j!                  | j                  j<                  d       | j                   j	                  d       | j!                  | j                  j>                  d       dt@        jB                  d<   d | j                   _"        | j                   jG                          tI                d!t@        jB                  d<   | j                   j
                  j                  d"       | jK                          | jM                          y#)$u_   
        Загружаем все данные из апи, кроме аттачей
        d   u   Свободно места: r)  u$   Скачаем данные из APIu9   Дампим глобальные настройки Jirar   u'   Дампим пользователейr2  uA   Не дампим пользователей из-за опцийrc  u   Дампим статусыrl  u    Дампим типы задачr  issue_security_schemesu*   Дампим бизнес процессыrd  u7   Дампим схемы бизнес процессовr=  u   Дампим экраныrN  r  u!   Дампим приоритетыr  r   u+   Дамп решений(резолюций)r  u   Дамп фильтровr)  r   r	     r	  u   Дампим проектыN)'rJ   r   r   
disk_usagerK   r}   r
  rb   rn   r  r  r  rt   ru   r   rq   rV  r>  r{   r>  rB  r  get_issue_typesget_issue_security_schemesget_workflowsget_all_workflow_schemesget_all_screensget_screen_schemeget_all_prioritiesget_priority_schemesget_all_resolutionsget_all_filtersr   r	  rJ  rp  rM   r	  r	  )r&   download_pathr  usedfreefree_percents         r)   download_datazJiraAPIImport.download_dataU  s    99;"--m<tTe|c);L>KL##$JK99?? $$&##$_`'')$($B$B$D!;;??<(OO""''(QRdii117;OO ckrkzkz{##$AB$))00*=##$FG$))33]C$))>>@XY99??OO""''(TUdii55{COO""''(abdii@@BST78$))33Y?$))55G?@$))66E$))88:LMIJ$))77G78$))33Y? "$

:#% !$

:##$ABr*   c                 b   dt         j                  d<   t        j                  j	                  | j
                  j                  g d      }|j                  rFt        |j                  |j                  z        dz  |_
        |j                  d       t                dt         j                  d<   y )	Nr   r	  )r_  rT  rJ  r   r   r	  Tr  r	  )r   r	  ro   	CmfImportrq   rJ   r   rT  rB  r_  rJ  rp  rM   )r&   rJ   s     r)   r  zJiraAPIImport._calc_progress  s    !#

:%%))T__-?-?1k * m
''"%j&F&FIeIe&e"fil"lJOOdO+L!$

:r*   c                    ddl m} t        |d    d      } |       }|d   D ci c]  }|j                  d      r	|d   |d    }}t	        |d      5 }t
        j                  |      }d d d        | j                  j                  j                  j                   d	d
    }	t        j                  j                  |	      }
|
s"t        j                  |	d| j                        }
|
j                  r|d   |
_        |
j                  d       n)| j                  j                  j!                  d|
 d       ddg}g d}||z   }dg|z   }t        j"                  j%                  |
|      D ]  }|j                  sA| j                  j                  j!                  d|
 d|j&                  j                   d       P|D ]  }t)        ||g         |D ]  }t)        ||d        |j                  d        |d   D ]  }	 d	| j                  j                  j                  j                   d	|d
    d	}	|j                  |d         r(t        j*                  j                  ||d      d      }n)| j                  j                  j!                  d|        dd d!|	 d!g}t        j"                  j                  ||"      }|st        j"                  j                  ||
|#      }|s8| j                  j-                  d$| d%|
&       | xj.                  d'z  c_        &|j0                  r|j0                   |	 |_        n|	|_        |j                  s]|d(   d)   d*k(  r| j                  j                  j                  j                   d	|d(   d*   d
    }t        j2                  j                  |      }|r|j4                  j7                  |       n)| j                  j-                  d+| d,|&       | xj.                  d'z  c_        |d(   d)   d-v r	d|_        n|d(   d)   d.k(  r	d|_        n|d(   d)   d/k(  r	d|_        n|d(   d)   d0k(  rd|_        d|_         n|d(   d)   d1k(  r	d|_!        n|d(   d)   d2k(  r| jD                  jF                  r,|d(   j                  d3      r/| jI                  |d(   d3         }n| jI                  |d(   d4         }r|jJ                  j7                  |       n| j                  j-                  d5| d6|&       | xj.                  d'z  c_        <|d(   d)   d7k(  r| jD                  jF                  r8d	| j                  j                  j                  j                   d	|d(   d3    d	}	n:d	| j                  j                  j                  j                   d	|d(   d7   d    d	}	t        jL                  j                  dd d!|	 d!gdg"      }|s0|d(   d7   d   }t        jL                  j                  dd8|gdg"      }|re|j0                  s|	|_        n#|	|j0                  vr|j0                   |	 |_        |j                  d       |jJ                  j7                  |       nv| j                  j-                  d9| d:|&       | xj.                  d'z  c_        | j                  j-                  d;|d(   d)    d<|&       | xj.                  d'z  c_        |j                  d        g dAdBgdCdDgdE}|jO                         D ]  \  }}	 t        j"                  j                  dFdG|gdHdG|
gg|"      }|D ]h  }t        j"                  j                  dFdG|gdHdG|
gg|"      }|j                  s9|D ]  } t)        || tQ        ||               |j                  d       j  tS                |
S c c}w # 1 sw Y   xY w#  | j                  j-                  d=| d>d?@       | xj.                  d'z  c_        Y 0xY w#  | j                  j-                  dI|
 dJ| dK| dLdMdN@       | xj.                  d'z  c_        Y =xY w)ONr   r  rh  z/permissions.jsonr  r  r   re  r^  r   ro  Trf  r  rJ   r3   ri  u#   Схема прав доступа u@    была изменена и не будет обновленаaccess_project_roleaccess_members)access_local_useraccess_owneraccess_owner_assistantaccess_authoraccess_spectatorsaccess_executorsaccess_responsibleaccess_list_owneraccess_project_owneraccess_project_owner_assistantaccess_project_spectatorsaccess_project_executorsaccess_sdesk_clientaccess_anonymousaccess_guestaccess_sharelink_anonymousr   r  u&   В схеме прав доступа u+    было изменено правило 'u,   ', оно не будет обновленоFr  r  )r   r  u4   Не нашли соответствия права rf  r(  r)  r  )project_permissionra  r   u*   Не найдено правило для zERR-0059r|  rF   r  r  projectRoleu<   Не нашли проектную роль для прав zERR-0142)applicationRoleanyoneprojectLeadrl   r   sd.customer.portal.onlyrB  r   r  u9   Не нашли пользователя для прав zERR-0060rZ  r0  u-   Не нашли группу для прав zERR-0061u'   Неизвестный тип прав zERR-0062u6   Не удалось загрузить правило zERR-0063CmfProjectPermPermissionr%  )zPPP-RELEASE-EDITzPPP-OBJ-CREATEzPPP-OBJ-EDITzPPP-OBJ-DELETEzPPP-OBJ-TREEMOVEzPPP-OBJ-ORDERzPPP-TSK-ASSIGN-EXECUTORSzPPP-TSK-DEADLINEzPPP-TSK-ORDER)zPPP-PR-ADMINzPPP-TSK-ASSIGNzPPP-TSK-SCHEDULEzproject_permission.coder  ra  u   В схеме uR    не удалось скопировать разрешения из права 'u   ' в 'r  zERR-0113CmfProjectPermSchemeRule)*r  r  r   rq   r   r   r   rJ   rl  rm  ro   CmfProjectPermSchemer  r3   rp  r}   r6  rF	  r  r?	  r?  rE	  rP   rO   rf  r  r-	  r   r/	  r7	  r5	  r0	  r2	  r;	  rb   rn   r~  r.	  r@  r   r   rM   )!r&   r  r  permission_filer  rQ   map_permr   perm_scheme_dictrf  perm_schemerule_list_access_fieldsrule_bool_access_fieldsrule_access_fieldsrule_fieldsscheme_rule
list_field
bool_fieldr  r  rs  r  r  r  rZ  r#  copy_access_rulesfrom_rule_codeto_rules	from_ruleto_rule_codeto_rulerule_access_fields!                                    r)   r  z"JiraAPIImport._process_permissions  sp	   ,,}"=!>>OPQj ##<=
ww{# c&k)
 

 /3' 	,1#yy|	,OO**11==>bAQRVAW@XY1155V5D 55VUYfjfufu5vK&&/7K.OO""**5k]  CC  D
 "#
#
$ 57NNe55 "::?? @ 
 	/K ..&&..<[M JAALA_A_AdAd@e f@A
 5 5
Z455 8
Z78.	/$ *-8 ^	%I]%doo44;;GGH9UY?J[[]^<<	, 78!::>>HYWcMdDew{>|DOO**225ijsit3uv#Vq];$==AAYdAe""("A"A"E"EY]fq  {F"E  #GK&114^_h^i2j2<+ 2 O1, "))0;0B0B/CF8-L*-3*"22X&v.-?%)__%;%;%B%B%N%N$OrR[\dRefsRtuyRzQ{"|K!0044K4HD#77>>tD11Z[dZef& + 2 
 1, x(04QQ48K1x(0MA7;K4x(0J>59K2x(0J>/3K,04K-x(04MM6:K3x(0F:yy$X.227;%)%5%5i6I'6R%SF!%!1!1)H2Ek2R!S#2299&A114mnwmx2y2<+ 2 O1, x(0G;yy#%doo&<&<&C&C&O&O%PPRS\]eSfgnSoRppr!s#%doo&<&<&C&C&O&O%PPRS\]eSfgnSopvSwRxxz!{"1155hRSTZS[[\P]=^hpgq5rE %.x%8%A&%I
 & 5 5 9 9&'S]A^hpgq 9 r$||+1EL#5<<7.3ll^F8+DEL

t
4#2299%@114abkal2m2<+ 2 O1, OO--0WXabjXklrXsWt.u.8k . KOOq(O  T 2u^	%F + #!
" ):(?(?(A !	%$NH %";;??2CH!34 . @ 	 %- 3L$==AA6\J%sK8   2 B G #22 -? )#-#I/@A LLTL2!3!	%F 	o

	, 	,l%)),bclbm*n*4?Y * [1$^%))$[M 2((6'7vhZqJ7	 *  1$sY   !_#_(B_5B_5&5_5B8_5D#_5<F_5
<_5_5?B`3(_258`03?a5c                    t        d      5  d}	 |j                         }|dk(  rn| j                  j                         rnt        j
                  j                  |g d      }t        |j                        }t        |j                        }t        |j                        }t        |j                        j                  d      }	t        |	      d	kD  r	d
|	d	    dnd}
d| d}|j                  r|j                  d   }|dz  }| d|dd}| j                  j                  j                  |
 d| d| d       	 | j                   j#                  ||t$        j&                         | j                  j                  j                  |
 d| d| d       d|_        |j+                          t-                | j                  j/                  d       |j5                  |       d d d        y # t0        $ r;}| j                  j3                  |
 d| d| d| ddd|d       |d	z  }Y d }~[d }~ww xY w# 1 sw Y   y xY w)NFr  r   Tr  )r3   r  r  r  r  r)	  r^  rF   u   [Задача ID: r!   r   r  r  i   r1  r:  z MB)u   Скачивание r  rG  u	   Файл u    сохранен в 'r  u"   Ошибка скачивания r  zERR-0027r  r   )r+  r&  r  ext_hrefrG   )r   rq   rJ   rL   ro   r  r.   r3   r  r  r  r  r  r  r}   r
  rb   download_filer   IMPORT_DOWNLOAD_TIMEOUTr  rp  rM   r  rN   rP   r  )r&   download_queueerror_queuer  download_job_iddownload_objr  file_urlr   ext_id_splittask_id_msg	file_sizefile_size_mbr  s                 r)   _download_file_workerz#JiraAPIImport._download_file_workers   sl   51 ;	$F"0"4"4"6"f,??,,.%77;;&  < 	    1 12	|001 1 12	"<#:#:;AA$GJMlJ[^_J_ 2<?2C2Feg	{!,	// , < <V DI#,#8L#,+RS/A FI&&++{m;PQZP[[^_g^hhi,jk II++ ! & > > , 
 OO**//&-y;QR[Q\\]^ /3L+ %%'LOO,,\:Y p OOF#w;	$ ;	$` ! 	 OO--&-'I)TWX`Waadehdij#-!4#)!)!% .  aKF	 a;	$ ;	$s7   D3H:BG3H:3	H7<1H2-H:2H77H::Ic                    | j                   j                  j                  d       | j                  j	                         }| j                  j	                         }d}| j                   j                  dg       dd| j                   j                  j                  j                  gg dg dg}d}g }| j                  D ]  }|d   }| j                  j                  |      }	t        |	      j                  d	      st        |	      d	z   }	d
d|	 dgg}
t        j                  j                  ||
z         }|sz||z  }|j!                  ||
z           |s'| j                   j                  j                  d       |S | j                   j                  j                  d|        g }t#        | j$                        D ]y  }| j&                  j)                  | j*                  d| ||d      }|j!                  |       |j-                          | j                   j                  j                  d|        { |D ]D  }t        j                  j/                  |dg      D ]  }|j1                  |j2                          F t5                |D ]  }|j1                  d        |j7                         s|D ]  }|j9                           | j                   j;                         r|S |j7                         s$||j=                         z  }|j7                         s$| j                   j                  j                  d|        |S )Nu=   Скачиваем все найденные вложенияr   zplugin.plugin.source_hashrm  r  )r  r  F)r3   r  r  r   r  r  r(  r)  r]  u3   Нет вложений для скачиванияu'   Скачивание вложений: _download_file_worker_)r^	  r_	  rE  u    Запустили задачу r  r  r  uC   Закончили скачивание файлов, ошибок )rJ   r}   r
  r   rI  r9  rl  rm  rz   r   r   r.   re  ro   r  r;  r   r  r   r   rK  rg	  r'  r  r  r   rM   rN  r   rL   rq   )r&   r^	  r_	  rO   main_filterattachment_countr)  rC  r  project_pathpath_filterdownload_countrQ  r  rR  rY  r
  s                    r)   download_fileszJiraAPIImport.download_files   s   ##$cd))+jj&&(
##%@$AB C!7!7!>!>!J!JK&1	
  -- 		:G J,,55jAL|$--c2"<036"F|nA,>?@K#55;;;Q\C\;]N N2 {[89		:  OO""''(]^OO""''*QRbQc(det889 	UA^^**11-aS1&4#. + F NN6"LLNOO""''*J6((ST	U  	4G & 8 8 > >gW[V\ > ] 4""<??34	4 	 	'Fv&	'##%!  ??$$&##%+//++J ##%##&ijtiu$vwr*   c           	         | j                   j                         ry | j                   j                  j                  d|d    d|d    d       d }t	        |d    d      }t        |      5 }t        j                  |      }d d d        r| j                   j                  j                  j                   d|d	    }t        j                  j                  |
      }|s"t        j                  || j                   d      }|j                  r |d   |_        |j                  d      |_        ||_        |j#                  d       |d   D ]5  }|d    d|d	    d}| j                   j                  j                  j                   d|d	    }	t        j$                  j                  |	
      }
|
s#t        j%                  ||	| j                   d      }
|
j                  r-|d   |
_        |j                  d      |
_        t        j&                  j)                  |
      D ]  }|j+                  d        |j                  dg       D ]  }	 t        j'                  |
      }|j                  d      }|j                  d      }|dk(  r't        j,                  j                  d      |_        n<|dk(  r| j                   j                  j                  j                   d| }t        j0                  j                  |
      }|r't        j0                  j                  |
      |_        nt3        d|       |dk(  r't        j,                  j                  d      |_        n|dk(  r't        j,                  j                  d      |_        nY|d k(  r't        j,                  j                  d!      |_        n-|d"k(  r)|r d| j                   j                  j                  j                   d| d}t        j4                  j                  d#d$d%| d%gd#g&      }|sB| j6                  j8                  r|d'   n|}t        j4                  j                  dd(|gd#g&      }|rR|j:                  s||_        n#||j:                  vr|j:                   | |_        |j#                  d       ||_        n2t3        d)|       t        j4                  j                  d*      |_        n|d+k(  rA	 | j=                  |      }| j?                  |d-d-.      \  }}|r||_        nt3        d/|       |d0v r{| j                   j                  j                  j                   d| }t        j@                  j                  |
      }|rtC        |j                        g|_"        nGt3        d1|       |d2k(  r&t        j0                  j                  d3      |_        nt3        d4|       |j#                  d       tG                 |
j#                  d       tG                |j                  d;      stM        |j                  d;            tM        |d	         k(  s|
|_'        |j#                  d       8 tG                |S # 1 sw Y   xY w# t2        $ r}t3        | d,      d }~ww xY w# t2        $ rD}| xjH                  d5z  c_$        | j                   jK                  d6| d7| d8d9:       Y d }~d }~ww xY w)<NuV   Импортируем схему безопасности задач проекта "r3   r  r4   r  rh  z/issue_security_scheme.jsonr^  r   ro  Trs  r   ri  rZ  r1  r"  r  r  r[  r  r   rA	  zvar:current_userrg   r@	  u0   Не найдена проектная роль rC	  zvar:project_ownerr   z
var:authorrl   zvar:responsiblerZ  rf  r(  r)  r  r  r0  u!   Не найдена группа UsersrB  r  Fr  u+   Не найден пользователь )groupCustomFielduserCustomFieldu>   Не найдено пользовательское поле rD	  zsdesk-client:defaultu-   Неизвестный тип правила rF   uF   Не удалось создать правило для уровня r{  zERR-0070r  r%  defaultSecurityLevelId)(rJ   rL   r}   r
  r   r   r   r   rl  rm  ro   CmfSecurityLevelSchemerq   r  r3   r   r  rp  r  CmfSecurityLevelRuler  r  r   access_memberr  rN   r@  rb   rn   rf  r  r[  rS  r.   access_task_fieldsrM   rO   rP   rB  default_task_security_level)r&   r  r  	dump_filer   r  scheme_ext_idr   	level_msglevel_ext_idr_  
level_ruler`  member_typemember_valuer  r  rf  rZ  r#  r  r  r  r  r]  r^  s                             r)   r  z&JiraAPIImport._process_security_levels   s1   ??$$&##efrsyfze{{  AM  NS  AT  @U  UV  W	
 !%L788STU	)_ 	 99Q<D	 #55<<HHIDQUJ<XM$*$A$A$E$E]$E$[!((.(E(E(#$( )F )% %44-1&\%*-1XXm-D%*48!1!&&4&8h pA$V}oRd}A>	"&//"8"8"?"?"K"K!LBuUY{m\!'!8!8!<!<L!<!Q%%+%<%<!6+#'??(,	 &= &N "11*/-N'*/))M*BN'&,&A&A&F&Fn&F&] A
"))4)@A #())Ir": VU)/)D)DN)D)[J*0**V*<K+1::g+>L*.??;A;K;K;O;OUg;O;h
 8!,!=151G1G1N1N1Z1Z0[[]^j]k.l'-'<'<'@'@'@'T#'?E?T?T?X?X`k?X?lJ$<*36fgsft4u*v$v!,!=;A;K;K;O;OUh;O;i
 8!,
!:;A;K;K;O;OUa;O;b
 8!,
!:;A;K;K;O;OUf;O;g
 8!,!7#//1$//2H2H2O2O2[2[1\\^_k^lln-oF,2,A,A,E,E08&AfXQ-/P08z -F -&E ,1LPIIOOVK5Ham
060E0E0I0I4:GZ3P4<: 1J 1* (-/4||;AEL-35<<-G>Cll^F8;TEL(-

t
(DCH
(@.7:[\h[i8j.k(k @F?T?T?X?X^e?X?fJ$<!,!6!F040M0Ml0[I -1,@,@SXaf,@,g	#)?EJ$<*36abnao4p*q$q!,0W!W7;7M7M7T7T7`7`6aacdpcq4r 1-3-@-@-D-DL]-D-^
#-EHEYDZJ$A*36t  vB  uC  5D  +E  %E!,0I!I;A;P;P;T;TZp;T;q
 8&/2_`k_l0m&n n&OOO=&L_Vp ###58845#dhhG_>`:aehinositeu:uHV)E)..4.@apAd L$$O	  	 ~ (1 !F*3se  <D  5E  +F  %F!F.  )  OOq0O OO55"hirhssuvyuz { *); 6  sJ   ,ZJ'Z>9Z
DZ>Z	Z;(Z66Z;;Z>>	\9\\r   c           	      ~   |d   d   j                  dd      }|d| j                  j                  j                  j                   j	                         z  }|d   d|g g g g dd	d	d
}|d   }|d   d   j                  dd      d   }|dk(  rd|d<   |S |dk(  rd|d<   |S |dk(  rd|d<   |S |dk(  rd|d<   |S |dv r$d|d<   |d   D ci c]  }|d   |d    c}|d<   |S |dv r$d|d<   |d   D ci c]  }|d   |d    c}|d<   |S |dk(  rd|d<   |d   |d<   |S |d k(  rd!|d<   i |d<   |S |d"k(  rd#|d<   |S |d$k(  rd$|d<   |S |d%k(  rd&|d<   |S |d'k(  rd(|d<   |S |d)v rd*|d<   |S | j                  j                  d+|d,    d-|d    d.|d   d    d/d0d12       | xj                  dz  c_        d }|S c c}w c c}w )3Nr   r   customfieldcfr  r,  T)r  r~  r  r  F)rL  r   r  visible_filterrequiredrequiredChangedr   r   r}  rF   r  textarear   field_custom_type	textfieldr.   floatr  )r}  radiobuttons
choice_strr  r   r  )multiselectmulticheckboxeschoice_multir  r  cascadingselectchoice_cascade_multi
datepickerdater  r  rB  r  r2  )r  r  r4  r  r3   r  u6   ) имеет неподдерживаемый тип 'r  zERR-0064rS  r%  )r.  rJ   rl  rm  r  r  rP   rO   )r&   r   r  rT   r   r  opts          r)   
_map_fieldzJiraAPIImport._map_field!  s   ;'-55mTJ
$//0077CCDEKKMM
.D
+-22_a"b!e= +&	&x0:@@aHL+'-C#$f 
e  ;.',C#$` 
_  7*'.C#$Z 
Y  5(',C#$T 
S  #=='3C#$AJ9AUV#c$iW5VC	NL 
K  #EE'5C#$AJ9AUV#c$iW5VC	ND 
C  8+'-C#$&y1C	N< 
;  #44'=C#$C	N4 
3  </'-C#$. 
-  :-'1C#$( 
'  </'-C#$" 
!  #44'.C#$ 
  #FF'/C#$ 
 OO%%Yv./s9T?2C DGGPQYGZ[cGdFeefh'	 &  OOq OC
M W Ws   F50F:c                    d | _         | j                  D ]  }| j                  t        j                  j
                     d   D ]Q  }d|vr-| j                  j                  dt        j                           y |d   d   |k(  s@| j                  |   |d<   S  | j                  j                  j                  j                  }t        j                  j                  |dg      }|s#t        j                  d|d| j                  	      }d
|_        |j                          t        j                   j                  dd|      }| j"                  j                  d      s&| j                  j$                  j'                  d       y | j                  j                  d       t        j                  j)                         D ci c]  }|d   |
 }}g }g }	| j                  t        j                  j
                     d   D ]  }|j                  d      r|d   d   s"| j                  j                  d|d           ?| j+                  |      }
|d   d   j-                  dd      }|d| j                  j                  j                  j                   j/                         z  }||d<   |
s|
d   dv r|	j1                  |       | j                  j                  j                  j                   d|d   d    }t        j2                  j                  |g d      }|s/t        j3                  |d   |d   |
d   d|| j                  d      }||v r||   d   |j4                  j6                  k7  rI| j                  j9                  d|d   d    d |d   d    d!|j4                   d"||   d    d#	d$d%&       | j                  j                  d'| d(|d    d)       ||   |d*<   n6| j                  j                  d+| d(|d    d,       |j1                  |       |j:                  rW|d   |_        |
d   d-k(  r|j>                  j6                  xs i }tA        |jB                  j6                        xs
 tA               }|d   d.   D ]  }|d/   s	i }tA               }|j                  d0g       D ]<  }tE        jF                  |d1   d2d34      }|d1   ||<   |d5   s,|jI                  |       > |D ch c]  }||vr|
 }}|jK                  |       |jK                  |        n |}||_        tM        |      |_!        |jN                  rd|_(        |j1                  |       |j                  d6       tS                t        jT                  j                  ||||7      }|rt        jU                  ||||7      j                  d6        tS                |jW                          |rt        j                  jY                  tZ        jZ                  j]                         j_                  d8      d
d9d:       t        j                  ja                  d;d
i       t        j                  j)                         D ci c]  }|d   |
 }}|D ]  }||d      |d*<    dAfd<	|	D ]V  }t        j                  jb                  |d*   d      }te        t              |jf                     |d   d0   D ]
  } |        X | j                  jh                  j6                  }|d=   D ]P  }|d   t        j                  j
                  k(  s$| j                  t        j                  j
                     d   |d<   R || j                  _4        d>tj        jl                  d?<   d| j                  jh                  _'        | j                  j                          tS                d@tj        jl                  d?<   y c c}w c c}w c c}w )BNr   r   uj   Текущая настройка не поддерживает импорт кастомных полейr   r   r  u8   Экран проектов Jira по умолчаниюTr3   rf  r  rJ   r?  _customrZ  )r3   r  ra  r   uI   Отключен импорт пользовательских полейu8   Импорт пользовательских полейr   r   u!   Поле не кастомное r,  r	  r	  r  r3   r	  )r	  r  r	  r^  )widgetr  rL  disabled_choices)rL  r3   r	  dirtyrf  rJ   r  r	  u,   Неудалось смапить поле 'r  u   ): widget поля 'u7   ' не совпадает с существующим 'r  zERR-0065rS  r%  u   Поле с именем r1  u4   ) есть в таблице, мапим в негоr   u(   Создаем поле с именем u   ), и мапим в негоr	  r  r  r  r   r      sepr  disabledri  )r^  r3   ra  ui_form_groupz%Y%m%d%H%M%SF)meta_version
model_namer  r  c                    t        | t              r;j                  |       }|s	 |       }|j                  r|j	                          y y t        | t
              rj                  | d         }|s | d         }| j                  dd      |_        |r|j                  |_        |j                  r|j	                          | j                  dg       D ]  } ||        y y )Nr  r   r	  Fr  )	r  r.   rq   rD  rp  r  
cmf_hiddenr   choice_parent_id)r  
parent_optr   childchoice_modelcreate_options       r)   r	  z;JiraAPIImport._process_custom_fields.<locals>.create_optionl"  s    &#&$((f(5(f5E##JJL $FD)$((fWo(>(fWo>E#)::j%#@ -7]]E*##JJL#ZZ
B7 0E!%/0 *r*   rH  r   r	  r	  r7   )7r\   r   rP  ro   r?  r.  rJ   rK   r{   r>  rl  rm  rS  rq   r  rp  CmfUiFormGroupr   r}   r6  r   r	  r.  r  r   rS  r	  r   rP   r  rL  r  rd  r	  r   translit_striprf  rF  r  rD  r	  rM   CmfUiFormFieldinvalidate_cachecustom_fields_gen_metar  rv  rx  custom_field_sync_update_modelsr   varsr   r   r   r	  )r&   ext_field_namer   rf  ui_view_formr	  r   shop_fields
new_fields
m2m_fieldsui_fieldr3   r^  current_choicescurrent_disabled_choicesr  default_choicesdefault_disabled_choicesr  
option_keyr4   r	  ui_form_fieldfield_classrP  r  r	  r	  s                             @@r)   _process_custom_fieldsz$JiraAPIImport._process_custom_fields!  s-   !".. 	JNv~~'B'BCHM J"e+OO''  )U  W^  Wf  Wf  g%d+~=)-)9)9.)IE+&J	J %%,,88''++63%+H!++O $??	 , L '0#--11ywWc1d{{56OO""**[ VW39>>3T3T3VWaq)WW

]]6>>#>#>?I i	)E99[){1CH1M##&GgGW$XYu-H%d+33M4HDa..55AABCIIKKD E&M+,0``!!%(..55AAB"U;EWX\E]D^_F,,00K 1 J #00!'Nv&./B&C!#$( 1 
 {"t$X.*2C2C2I2IIOO--!+.v67s5;Md;S:T U,,6,=,=+> ?88CD8I(8S7TTUW #!/ .  ##&?vRgGW  XL  %M  N'24'8m$##&NtfTVW\]dWeVf  gC  %D  E!!%())%*7^
"/0L@&0&8&8&>&>&D"O/2:3N3N3T3T/U/^Y\Y^,#(#5i#@ D&'89$*,3650&-kk)R&@ IF)0)?)? &w$'')*J
 ;A/OJ7%j1 8 < <Z HI ,;,$'"/9  ,( , )//0HI'..?-D0 ,D()8J&267G2HJ/(('+J$%%e,D1 #1155%#+	 6 M !%%)'"/	 & 
 $4$(Si	)V 	%%'NN11$,$5$5$9$9$;$D$D^$T"+" NN::<Li;XY7=~~7X7X7Z[!1\?A-[K[# B'25='Am$B	0(   	&E ..//m0D\0RSK<(9(9:L,Y7 &f%&	& ??0066+, 	SAyFNN777"mmFNN,G,GHR(	S )1%!#

:37%%0!$

:G XV,^ \s   ?_/2_4=_9c                    i dt         j                  j                  dt         j                  j                  dt         j                  j                  dt         j                  j
                  dt         j                  j                  dt         j                  j                  dt         j                  j                  dt         j                  j                  d	t         j                  j                  d
t         j                  j                  dt         j                  j                  dt         j                  j                  dt         j                  j                  dt         j                  j                  dt         j                  j                   dt         j                  j"                  dt         j                  j$                  t         j                  j&                  t         j                  j(                  d}t         j                  j+                         D ci c]  }|d   |
 }}d}|d   }|d   }|dz  }| j,                  j.                  j.                  j0                   d| }| d}	t         j2                  j5                  |	ddg      }
|
sOt         j2                  j5                  |ddg      }
|
r*t         j6                  j9                  dd|
g      }|rd }
nd!}|
sO| j,                  j:                  j=                  d"| d#| d$       t         j3                  d%|	| j,                  d!&      }
|
j>                  r?|	|
_         ||
_        |j5                  dd'      |
_	        ||
_!        |
jE                  d!(       n)| j,                  j:                  jG                  d)|
 d*       |r;t         jH                  jK                  |
d!+      }|D ]  }|jM                  d!d!,        tO        |d-   d.      D ]g  \  }}|d   }|d   }|d/z  }|	 d| }t         jH                  j5                  |g d0d!1      }|sS| j,                  j:                  j=                  d2|
 d3| d#| d$       t         jI                  d4|
|| j,                  d!5      }|jP                  r=| j,                  j:                  jG                  d6|
 d7|j                   d#| d8| d9	       n|j>                  s=| j,                  j:                  jG                  d:|
 d;|j                   d#| d8| d9	       n|jB                  rZ|jB                  jR                  j5                  d<      r5|jT                  |jB                  d<   k(  r||d<<   n|jB                  d<   |d<<   n||d<<   |d<   |_*        ||_        ||_!        |jE                  d!(       |d=   D ]  }|d   }|j5                  |      }|r|jV                  }n|jY                  d>      r|d   }|j5                  |      }|r|jV                  }n|j[                  d?d@      }|dA| j,                  j.                  j.                  j0                   j]                         z  }||vr| j,                  j.                  j.                  j0                   d| }t         j^                  j5                  |dBdCg      }|s
t         j`                  j5                  ddgdd|
ggdDgE      }|r[|j>                  sO| j,                  j:                  jG                  d:|
 dF|jb                   dG|jd                  j                   dH       |st         j`                  j5                  dd|gdd|
gg dIg dJgd!K      }|r8| j,                  j:                  jG                  d:|
 dF|jb                   dL       t         ja                  ||
| j,                  d!M      }tg        |t         j^                        r||_4        ||_2        |jj                  sU| j,                  j:                  j=                  d2|
 dN|jb                   d#| dO| dP	       |jE                  d!(        j |
jm                          to                |
S c c}w )Qu  
        Создает отдельный экран для перехода бизнес-процесса
        Экран перехода создается без вкладок и групп,
        в него добавляются только те вкладки, которые есть в Jira

        Args:
            screen_data (dict): сырые данные экрана

        Returns:
            CmfUiForm: объект экрана
        r   r  r:  rl   r<  r>  r  r   ri   r   r  r   r   rk   rE  ra  z	Epic Link)SprintrG  r   Fr   r3   u    [переход]r^  z::transitionr   rJ   r  rF  r  r]  NT   Создан экран 'r  r  r?  )r  rf  rJ   r  u   Экран переходаri     Экран uv    был изменен пользователем. Новые данные из импорта не применены)ra  r  )r  r  tabsrF   r  )r  r  r  rf  r   r     На экран $    добавлена вкладка 'tab)r  ra  rf  rJ   r     C экрана D    пользователем была удалена вкладка 'r  uF   ). Новые данные из импорта не применены   На экране F    пользователем была изменена вкладка 'r  r   rQ  r	  r	  r  rL  r	  r	  r      поле 'm   ' было изменено или уже добавлено пользователем во вкладку 'uF   '. Новые данные из импорта не примененыr  r  r  uy   ' было удалено пользователем. Новые данные из импорта не примененыr      добавлено поле 'u   ) во вкладку 'r  )8ro   r?  r   r  r;  rj   r=  r>  r  r   ri   r   r   r   r3   rh   r@  r  r  rA  rB  r   rJ   rl  rm  rS  rq   CmfUiFormSchemeRuler  r}   r
  r  rf  r  rp  r6  r	  r  r  rN  r  r   r  r  r  r.  r  rS  r	  rL  r	  r  r^  rD  r	  rM   )r&   r[  task_field_mapr   r	  purge_groupsrM  screen_namescreen_ext_idtransition_screen_ext_idui_formin_screen_schemeui_form_groupsr	  r  tab_datatab_idtab_namer  
tab_ext_idr  jira_field_idr_  r   jira_field_namer]  r	  s                              r)   rU  z(JiraAPIImport._process_transition_screen"  s   
00
 &..44
 88	

 22
 6>>66
 &..33
 fnn))
 6>>..
 //
 &..33
 v~~99
 v~~..
 v~~**
 22
  ::!
" fnn00#
& ,,'
( nn**"NN==+
< 4:>>3T3T3VWaq)WW%	!&)**??1188DDER	{S&3_L#A ""&&+& ' 
  &&**$\* + G #)#=#=#B#B8UXZaJb#B#c #"G#'LOO""''+K=I;aH &&(/?? $	 ' G ""5GN&GL&??=:WXGL&1G#LLTL*OO""**gY 'V W
 #2277 $ 8 N "0 H$$d$$GH  )V)<a@ M	9OE8d^F'HdlG45Rx@J"1155!
 !% 6 M !&&++&wi/ST\S]]`ag`hhij !' 5 5"%#$( !6 ! ((&&..%gY /''4'9'9&:#fXRz RZ[
 #22&&..(	 2''4'9'9&:#fXRz RZ[ "11%55;;??	J$,,0M0Mi0XX.5+.;.K.KI.V+*1HY'(0(;%%-"08-""t"4&x0 S9
 *4 0+//>
!+!6!6J"--n=&0&8O!/!3!3O!DJ!%/%:%:
%2%:%:=$%O
"$//*@*@*G*G*S*S)T&U&[&[&]]
%[8$/3/E/E/L/L/X/X.YY[\i[j,k)%+%8%8%<%<#4 ) 3$ &= &
 " & 5 5 9 9j1!30
 ( !: ! !)F)FOO**22,WI 6%%/%7%7$8 900=0K0K0P0P/Q R^_ $$*$9$9$=$=#S*5%sG466	  )- %> %M %..660	 :))3););(< =bc
 !$*$9$9'&#'??(,	 %: %M "*f.A.AB3=0.;+ ++OO**//*7) 488B8J8J7K3zl [008z<
 "&&4&8gS9uM	9^ 	  "] Xs   #bc                     t         j                  j                         D ci c]  }|d   |
 }}|d   }|d   }| j                  j                  j                  j
                   d| }t         j                  j                  |ddg      }|sO| j                  j                  j                  d| d	| d
       t         j                  d|d| j                        }|j                  }|j                  r6||_        |j                  dd      |_        ||_        |j                          n)| j                  j                  j!                  d| d       |r:t         j"                  j%                  |d      }	|	D ]  }
|
j'                  d        |r| j(                  j*                  sddddddddddddddiddddddddddd dd!	}t         j,                  j%                  |"      }|D ]i  }|j                  |j                        }|r8|j                  d#d$      |_        |j                  d%d$      |_        |d   |_        |j                  d&       k ng }t         j"                  j%                  d'd(|gg d)g d*gd+g,      }|D ]M  }||v r|j'                  d       |j                  |_        |j                  d&       |j5                  |       O d d d d d d-}| j(                  j*                  s|D ]  }dd(|gd.d(|d/k7  rd0nd1gd'd(|gg}|d2k(  r|j5                  g d3       t         j,                  j                  |dd.g4      }|srt         j,                  j%                  |d.g5      }|r|d6   }d|_        |j                  d&       n/| j                  j                  j!                  d7| d8| d9| d:       |||<    t7                t9        |d;         }|d;   D ]M  }|d<k(  r|d=   r|d=   }n<|d   }|d   }| d| }t         j,                  j                  |d.d>gd?      }|sS| j                  j                  j                  d@| dA| d	| d
       t         j-                  d1||d| j                  B      }|j:                  r=| j                  j                  j!                  dC| dD|j                   d	| dE| dF	       ni|j                  s=| j                  j                  j!                  d7| dG|j                   d	| dE| dF	       n ||_        ||_        |j                  d&       |dH   D ]  }|d     j=                  dI      s j?                  dJdK      }|dL| j                  j                  j                  j
                   jA                         z  }||vrptC        tE         fdM| jF                  t         j                  jH                     dH         d       }|s| j                  j                  j                  j
                   d|dN   d    }t         jJ                  j                  |dOdPg      }t         j"                  j                  dQd(|gd'd(|ggdRg5      }|r[|j                  sO| j                  j                  j!                  d7| dS|jL                   dT|jN                  j                   dU       |st         j"                  j                  dQd(|gd'd(|gg dVg dWgdX      }|r8| j                  j                  j!                  d7| dS|jL                   dY       t         j#                  |||| j                  dZ      }|jP                  d[v r|d\   xs ||_'        n$|jP                  d]v r|d^   xs ||_'        n||_'        |jR                  sq|jN                  jT                  }|jN                  j                  }| j                  j                  j                  d@| d_|jL                   d	| d`|d1k(  rdandb dc| dd       |j                  d&        P |jW                          t7                |S c c}w )eNr   r   r3   r^  r   rJ   r  r	  r  r  r?  T)r  rf  r  rJ   r   r   r	  r  waiting_for)ra  r3   r  r  )r  r  i  i  i  r  i  ip  )hiddenr  iX  i@  i(#  )	_main   Участники   Даты   Планu   Разработкаu
   Связи_addonr	  _descrr  r  Fr	  ri  ra  r  r  )rJ   r  Nz-cmf_created_at)r   order_by)r	  r	  r	  r	  r	  r  r	  rZ  r	  r	  )r9  r  click)r   r  r   r  r   r	  u6    не найдена системная группа 'u   '. Возможно она была удалена пользователем. Поля на экране могут отображаться некорректно. Создайте группу с названием 'u$   ' и повторите импортr	  rF   r	  r  r	  r	  r	  )r  ra  rf  r  rJ   r	  r	  r  uL   ). Изменения из импорта не будут примененыr	  r   rQ  r	  r	  r  c                 @    | j                  d      xr | d   d   k(  S )Nr   r   r   )r   r	  s    r)   r   z/JiraAPIImport._process_screen.<locals>.<lambda>t$  s,    !IIk2 J %k 24 8M I r*   r   rL  r	  r^  zui_form_group.typer	  r	  uL   '. Изменения из импорта не будут примененыr  r  r  u   ' было удалено пользователем. Изменения из импорта не будут применены)r^  r3   ra  rJ   r  )rB  r2  r4  rk  r	  )r	  r  r	  r	  r2  u   во вкладкуu   в группуr)  r  ),ro   r?  r   rJ   rl  rm  rS  rq   r}   r
  r-  r  r3   r   r  rp  r6  r	  r  r  rb   rn   r	  r  r	  r  r   rM   r  r  r  r.  r  r   r   rP  r.  rS  rL  r	  r	  rD  r  r	  )!r&   rL  r   r	  rM  r	  r	  r	  ui_form_is_newform_fields
form_fielddefault_groupsr	  r	  group_configcurrent_ui_form_fieldsui_form_fieldsr	  r#  rY  r4  num_tabsr	  r	  r	  r	  
jira_fieldr3   r   r]  r^  
group_typer	  s!                                   @r)   _process_screenzJiraAPIImport._process_screen#  s	   39>>3T3T3VWaq)WW4L	Vn??1188DDER	{S""&& & ' 
 OO""''+K=I;aH &&($ $??	 ' G !""&GL!::mR8GL&,G#LLNOO""**gY '\ ]
  //44" 5 K * 9
!!4!89 $))// ##
 ##'
 ##
 ##
 t) ##
 ##
 ##
 ##A$NJ $2277w7GN!/ 5-11-2D2DE+7+;+;He+LM(+7+;+;He+LM(,8,CM)""t"45 &("#2277sG,2-
 ,, 8 N "0 = $::!(($(?+2+=+=(""t"4&--m<= #'  
 yy, ;
S*-SZ8-C'PsG,
 +NN#;< & 5 5 9 9""8 !: !
 % $2277& &x 8 F (.q	/3,%**t*<..660	9opzo{ |T U_S_  `DE .;z*?;B 	vf~&&> Z	9C1}!8 !/w 7Tv; -b9
 & 5 5 9 9%% %) !: ! %OO**//*7)3WX`Waadekdllmn %+$9$9"&)(,#'?? %: %M !,,OO**22)' 3++8+=+=*>c&H: Vde
 '66OO**22,WI 6++8+=+=*>c&H: Vde *2M&47M1!&&4&8!(m j9
 *4 0$//?$,,]DA!DOO2299EEFGMMOO{* fnn&A&AB8L 	 '+'='='D'D'P'P&QQSTYZeTfgkTlSm$n!#0044,!+ 5 
 !' 5 5 9 9%sJ7!30
 - !: ! !)F)FOO**22,WI 6%%/%7%7$8 900=0K0K0P0P/Q Rde $$*$9$9$=$=)3
;%sG466	  )- %> %M %..660	 :))3););(< =hi
 !$*$9$9#-!&#'??(, %: %M // 4  3AAU2V2gZgM/11 6  3A2L2]P]M/ 3@M/ ++!.!<!<!A!AJ!.!<!<!A!AJOO**//*7) 488B8J8J7K3tfTV4>%4G0M^__ablammnp
 "&&4&8Uj9aZ	9x 	  "S
 Xs   au,   Обработка схемы экрановc           
         |j                  d      r|d   }|d   }| j                  j                  j                  j                   d| }t        j
                  j                  |dg      }|s"t        j                  || j                  d      }|j                  r| j                  d      D ci c]  }|d   |
 }}|j                  s5t        j                  j                  |	      D ]  }|j                           |d
   |_        |j                  d       |d   D ]  }	|	d   }
d }|
dk7  rz| j                  j                  j                  j                   d|
 }t        j                  j                  ddd| dg      }|s"| j                  j                  d|
 dd       |	d   j!                         D ]  \  }}|j                  |      }|s%| j                  j                  d| d| dd       ?	 | j#                  |      }dddd ddd d!}| j                  j%                         r  y ||d"|j                  |d      | j                  d#}t	        j                  j                   d*i |d$d%gi}|st	        j                  d*i |}|r|j&                  j)                  |       |j                  d         ne| j                  j                  j                  j                   d|d    }t        j
                  j                  |dg      }|s@t        j                  |d&    d'|d
    || j                  d(      }|j                  d       t        j*                  j                  | j                  j                  j                  j                  dg      }|j                  ryt        j                  j                  |dg      }|s"t        j                  |d| j                  )      }|j                  r'||_        ||_        d"|_        |j                  d       t3                |S c c}w #  | j                  j                  d| d| dd       Y xY w)+Nr  r   r^  r   r  Trs  rN  )r  r3   ri  r  r  r  rf  r(  r-  r.  r]  ;   Не удалось найти логический тип r  CmfUiFormSchemer%  r  u8   Не удалось найти в дампе экран u    для zERR-0069u:   Не удалось импортировать экран zERR-0068rE  rF  r  )r  rE  r0  r1  r  r  r  r?  )r  rF  r  crud_choicerJ   r   logic_typesr4   u+   : Схема экранов проекта rQ  r,	  r@   )rq   rJ   rl  rm  ro   r	  r  r<  r-  r	  r  r  r3   rp  r  rP   r   r	  rL   r	  r   rS  r  rF  r  rM   )r&   r  screen_scheme_datascreen_scheme_idrf  r  r  rN  r  issue_type_datar  rh   r  r9  rM  rL  r	  action_mappingr  r	  s                       r)   r  z$JiraAPIImport._process_screen_scheme$  s   01!-.B!C1$7..55AAB"EUDVWF#3377vse7TN!!'!7!7!#$( "8 " --.2.>.>y.IJ1T719JJ%,, & : : ? ?~ ? ^ && '9&@####5'9-'H >4O$3M$BM!%J$	1/3/E/E/L/L/X/X.YY[\i[j,k)%+%8%8%<%<XvY\]n\oorWsDt%<%u
) OO55"]^k]l m *): 6 
 %-<Y-G-M-M-O /4)	!(Y!7% OO55"Z[dZeemntmu v *): 6 
 %%&*&:&:6&BG (1&.$,$*,4*2.4*  ??446" /=&-.7+9+=+=fi+P*.//%	  &99==b	bS`Rab##)#=#=#J	#JD% ,,33J?		d	3_/4>4@ ..55AAB"\RVEWDXYF#3377vse7TN!!'!7!7(/00[\hio\p[qr!#$(	 "8 " ###5!++//t7M7M7T7T7`7`jmin/oL--1155VSE5R!55%(,#'?? 6 D
 ''*8D'".DK*3D'II$I/M KH% OO55"\]f\ggopvow x *): 6 
 %s   2P= Q&Q+c                 v
   i }t               }|j                  d      s|S t        j                  j	                         D ci c]  }|d   |
 }}|d   j                         D ]<  }|d   j                  d      s|d   j                  dd      }|d| j                  j                  j                  j                   j                         z  }||vrq| j                  t        j                  j                     d   D ]  }|j                  d	      s|d   |d	   d   k(  s$|d
   j                         D ]f  \  }	}
|
j                  d      s|j                         }|
|d
<   |j!                  |	i       }|||d   <   |
d   sM|j!                  di       }|||d   <   h  ? |j                         D ]~  \  }	}d}| j                  j                  j                  j                   d|d    }|d    d|d    }|	dk7  rd| j                  j                  j                  j                   d|	 d}t        j"                  j                  ddd| dg      }|s"| j                  j%                  d|	 dd       |d|	 z  }|d|d    z  }n|dz  }t        j&                  j                  |dg      }|s5t        j'                  ||d| j                        }|j)                  d        |j+                  ||f       |j                         D ]  \  }}|d
   }
| j                  j                  j                  j                   d| }t        j,                  j                  |g d!      }t        j.                  j                  ||"      }|s"t        j/                  ||| j                  #      }|
j                  d$d%      |_        |
j                  d&d%       |_        |j4                  d'k(  r|j6                  j8                  xs i }t        |j:                  j8                        xs
 t               }i }t               }|
j                  d(i       j                         D ]Q  }t=        j>                  |d)   d*d+,      }|d)   ||<   |d-   r|j+                  |       ||vsA|j+                  |       S |jA                  |       ||_        tC        |      |_        ||_        tC        |      |_        |j)                          |jD                  r|j)                  d        tG                   |S c c}w ).u1    Импорт конфигураций полейr  r   r   rQ  r	  r	  r  r   r   r  r  r?  Nr^  r4   5   : Конфигурация полей проекта r3   rf  r(  r)  r]  r	  r  CmfCustFieldConfSchemer%  u    для типа     по умолчаниюr   r  Tr	  ri  )r	  r  r	  )r^  ra  )r^  ra  rJ   r  Fr  r	  r  r   r  r	  r	  r	  )$rd  rq   ro   r?  r   r   r  r.  rJ   rl  rm  r  rP  r.  r   r  r  r  rP   r  rp  rf  rS  r  r	  visibler	  r  r   r	  r   r	  rF  r  rD  rM   )r&   r  logic_type_fieldslogic_type_field_confr   r	  r  r   r_  r?  r  r   r   rh   r	  r3   r  r  field_idfield_ext_idr^  r  r	  r	  r  r	  r  r	  s                               r)   _process_field_confz!JiraAPIImport._process_field_confR%  s    #.((39>>3T3T3VWaq)WW '}5<<> 	8Jd#..~>#D)11-FJAdoo44;;GGHIOOQQJ,"mmFNN,G,GHR 8
!~~k2d#z+'>t'DD2<Y2G2M2M2O 8.w&{{40$ * 1+2i(!2!=!=mR!P.3uT{+"#34%6%A%A%%LF27F5;/88	8< &7%<%<%> \	!M6J(,(>(>(E(E(Q(Q'RRTUabfUgTh%i""5)**_`lms`t_uvD%&()?)?)F)F)R)R(SSUVcUddf$g!#0044XvQRSdReefOg<h4i
!OO--UVcUde"!9 . 
 &B}o*>>&+Jv,>+?@@22$5599AWad`e9fO""("9"91$(#	 #: #  $$$6!%%z?&CD $*<<> 9%	*"&//"8"8"?"?"K"K!LBxjY#0044' 5 
 )/(D(D(H(HT^gv(H(w%,,2,H,H#-.#'?? -I -)
 29\51Q%.4;KK
E4R0R%-//<?&0&8&8&>&>&D"O/2:3N3N3T3T/U/^Y\Y^, G'*u$")++i"<"C"C"E E%,%;%;"7O ##%&

 /5Wo
+!*-,00< &_<488DE $**734;)1=ABR=S):)8J&267O2PJ/%**,((OOO5s9G\	| %$ Xs    T6uA   Обработка схемы конфигурации полейc                    | j                   j                  j                  j                   d|d    }t        j                  j                  |dg      }|s@t        j	                  |d    d|d    || j                   d	      }|j                  d
       t        j                  j                  |dg      }|sAt        j                  |d    d|d    d|d| j                         }|j                  d
       | j                  |      }|j                  d |f       |j                  rt        j                  j                  |      D ]  }|j                  d        t               }|D ][  \  }}	|j                  |	       ||	|r|gng d| j                   d}
|sd|
d<   t        j                  di |
}|j                  d
       ] |D ]$  }	|	j                          |	j                  d
       & |j!                          || _        |S )Nr^  r   r   r  r4   u@   : Схема конфигурации полей проекта r3   TrQ  ri  r	  r
  r	  r  r  )ra  r  r	  r  rJ   rF   r  r@   )rJ   rl  rm  ro   r 
  rq   rp  r  r
  rf  r  CmfCustFieldConfSchemeRuler  r  rd  
calc_cacher	  r  )r&   r  rf  r  r  r
  r  field_confsrh   
field_confr  s              r)   r  z(JiraAPIImport._process_field_conf_scheme%  sN   OO**11==>bdAS@TU!'!>!>!B!B&Z]Y^!B!_%%+%B%B$U+,,lmy  {A  nB  mC  D?? $	 &C &" #''D'9 1155VSE5R$55$U+,,abnoubvaw  xP  Q $??	 6 O   T 2 $ 8 8 F!!4"9:!1199>>F\>] 3T23%K*? ,&
J
+4'13=J<2'+"&//	 "+,Ii(88E9E		d	+, * 2
%%'D12 	//1&<#%%r*   c           	         |d   }d| d| d}t         j                  j                  ddd| dg      }	|	sy|d   }
t         j                  j	                  |
	      set         j                  ||	|
||||
      }|j                          | j                  j                  j                  d|j                   d|
 d|	        y| j                  j                  j                  d|j                   d|
 d       y)u   Добавляет предыдущий код задачи в историю кодов при изменении проектаrF  r^  rf  r(  r)  r]  Nry  rg   )rA  rC  r   r  r   r   r   r    uE   ] В историю кодов задачи добавлен код 'u   ' из проекта u
   ] Код 'u6   ' уже добавлен в историю кодов)ro   r  rq   CmfTaskCodeHistoryr  rp  rJ   r}   r
  r   r  )r&   rA  project_datakey_datar	  r   rm  project_from_idproject_from_ext_idproject_fromkey_fromcode_historys               r)   _add_code_historyzJiraAPIImport._add_code_history&  s   &v. ";-r/1B"E((,,XvK^J__`Ga4b,cL)((--8-<!44$! & ' 5 L OO""''DII;cdlcm n''3n6
 OO""((DII;j
2hir*   c           	         t        |j                        j                  dd      \  }}|j                  j                  }|j                  di       j                  dg       }|D ]o  }t        d |d   D        d       }t        d |d   D        d       }|r|s4| j                  |d   | j                     |	      }	| j                  ||||	|d
   |       q y )Nr^  rF   rv  rw  c              3   2   K   | ]  }|d    dk(  s|  yw)r   rC  Nr@   r4  r  s     r)   r5  z;JiraAPIImport._process_task_code_history.<locals>.<genexpr>5&  s     Q$d7my6PQ   r   c              3   2   K   | ]  }|d    dk(  s|  yw)r   KeyNr@   r
  s     r)   r5  z;JiraAPIImport._process_task_code_history.<locals>.<genexpr>9&  s     M$d7mu6LMr
  r	  r|  r   )
r.   rf  r  r  r   rq   r   r~  rm   r
  )
r&   rA  rm  r  r  rw  r  project_itemkey_itemr	  s
             r)   _process_task_code_historyz(JiraAPIImport._process_task_code_history.&  s    T[[)//a8Q((..	MM+r266{BG	  	GQ''"2QL M''"2MH
  x%%gh&7&FD%QF""	"	r*   c                    t        d      5  	 | j                  j                         rn{|j                         }||j	                  |       nW	 t
        j                  j                  |g d      }|j                  j                  s{| j                  |       t                d d d        y # t        $ r/}| j                  j                  d| d| dd	d
       Y d }~=d }~ww xY w# 1 sw Y   y xY w)NFr  T)r  r   r  rf  r)	  r    uS   ] Не удалось обработать историю кодов задачи: zERR-0140r?  r^  )r   rJ   rL   rq   r  ro   r?  r  r   r
  rM   rN   rP   )r&   
task_queuer  rA  r  s        r)   _code_history_workerz"JiraAPIImport._code_history_workerK&  s    51 	??,,.$..*?NN7+!>>--"  . D  //55 33D9L/ 	 	2 ! OO--G9$wx{w|}"!*!%	 .  3	 	sB   AC)9B.C)	B.$C).	C&7%C!C)!C&&C))C2u$   История кодов задачrC  c           	         |s&| j                   j                  j                  d       yd}|O|}t        j                  j                  ddd|gdd|gdd|gd	d|ggg d
g      }|s| j                  d| d       yg d
g}|r|j                  dd|g       d| }t        j                  j                  |      }t                |sy| j                   j                  j                  d| d|        t        j                         }| j                  j                         }g }	t!        | j"                        D ]P  }
| j$                  j'                  | j(                  d|
 d|i      }|	j                  |       |j+                          R d}t!        d||      D ]Y  }t-        ||z   |      }t        j                  j/                  |dd	g||g      }|D ]  }|j1                  |j2                          [ |j1                  d       t                |	D ]  }|j5                           t        j                         }||z
  }| j                   j                  j                  d|dd       y)u  
        Обрабатывает историю кодов задач.
        Добавляет в историю кодов старые коды задачи при перемещинии в другой проект.

        Args:
            project (str, optional): Префикс кода задач, код, название или id проекта. Defaults to None.
            is_process (bool, optional): Отключение запуска обработки. Defaults to True.
        uJ   Отключена обработка истории кодов задачNr   r,  r  r  r   r3   r   r  r]  u    Не найден проект 'r  ra  r\  u-   Обработка истории кодов r  _code_history_worker_r!
  rE  r  r   r  r  uL   Обработка истории кодов задач завершена: r9  r  )rJ   r}   r6  ro   r  rq   rP   r   r?  r;  rM   r
  r<  r  r   rI  r  r   r   rK  r"
  r'  r9  r  r  r   r   )r&   rC  r  r  project_identrY  r  
perf_startr!
  treadsr  treadr  r'  r  rD  rA  perf_enddurations                      r)   _process_code_historyz#JiraAPIImport._process_code_historym&  s    OO""**+wx#M''++ +S-@m4m4sM2 /	 , G 6}oQG -.NNHc734,WI6K^^)))9
##&ST^S__jkvjw$xy&&(
ZZ%%'
t//0 		ANN))00,QC0 * * E MM% KKM		 1j$/ 	(EedlJ/CNN((d|cl ) E
  (tww'(	( 	t 	EJJL	 $$&j(##&rs{|  sA  AI  %J  	Kr*   c                 x   | j                          | xj                  | j                         z  c_        | j                  j	                          | j                          | j                          | j                          | j                          | j                          | j                          | j                          | j                          | j                          | j                          | j                          | j                          | j                  j                  r@| j                          | j                          | j                          | j                          | j                          | j!                  | j"                  j%                  d             | j'                  | j"                  j%                  d             | j)                  | j"                  j%                  d             | j+                          | j"                  j%                  d      r.| xj                  | j,                  j/                         z  c_        n%| j,                  j0                  j3                  d       | j,                  j5                         ry d| j,                  _        | j,                  j9                          t;                | j,                  j=                  d       | j?                         D ]  }|d	   | j@                  D cg c]  }|d	   	 c}vr&| j,                  j0                  jC                  d
|d    d       t"        jD                  sc	 d| j,                  jF                  jF                  jH                   d|d	    d}| j,                  jK                  || j,                  j0                          | j,                  j=                  d| j,                  jP                          | j                   S c c}w # tL        $ r3}| j,                  j0                  jO                  d|        Y d }~Fd }~ww xY w)Nr   )r  r   r   r   u2   Отключена обработка ссылокr	  r  r   u'   Импортирован проект 'r3   r  r^  )r}   uC   Не удалось создать отчет по проекту. u-   Импортировано объектов: ))r'	  rO   ro	  rb   r  r  ra  rj  ru  r0  r	  r  rn   r;  r@  r  r+
  r   rq   r  rM  r  rJ   process_cross_linksr}   r6  rL   rJ  rp  rM   rK   r:  rz   r
  IMPORT_COLLECT_STATSrl  rm  project_statsrN   r  r_  )r&   rC  rQ   r%  r  s        r)   process_importzJiraAPIImport.process_import&  sA   4..00		 !!###%!!#99??##%!**,! ""dkkoo>T.U"V4;;??;N+OP9I)JK;;???+OOtBBDDOOO""**+_`??$$&#& H%))+ 	zGt}$:P:P$Q3SY$QQOO""''*QRYZ`RaQbbc(de..z#%doo&<&<&C&C&O&O%PPRSZ[_S`Raac!d--nT__E[E[-\	z 	KDOOLqLqKrst??"" %R  z&&,,/rsvrw-xyyzs   O8A%O==	P9(P44P9)T)rq  rc  )TTN)   r  )NFr7   )r   r  F)Nr  r  z%Y-%m-%d %H:%M)NT)r+   r,   r-   r>   rB  r?   r   r.   r  r  r   r%   r   r   propertyr   r   r   r   r   staticmethodr8  r	   r
   r   r   r   r  r  r  r&  rF  rS  rV  rv  rY   r  r  r  r  r   r  r[  ra  rj  ru  ro   r  r  r  r	  r@  r\  r^  rp  ru  r  r  r  r  r  r  r  r  r  r  r  r  r   rM  rY  rh  rl  r  r  r  r  r  r  r  r  r/  r8  r`  r  r  r  r~  r   r  r  r  r  r  r  rA  rE  rP  rV  rZ  rt  r  r  r  r  r  r  r  r  r  rC  r  r)  r0  r;  r@  rB  r  r  rV  r<  r:  r\  r  r  r  rj  r  r  r  r  r  r;  r  r  r  r  r  r  r  r  r  rC  r}  rt   r  r  r  r  r  r  r  r  r  r  r  r  r  r  r!  r&  r  r  r4  r6  r   r<  rA  rW  rb  rp  r}  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r	  r	  r	  r'	  r  r  rg	  ro	  r  r	  r	  rU  r	  r  r
  r  r
  r
  r"
  r+
  r0
  r/   r0   s   @r)   r[   r[   U   s	   EOT	?"!#W #$ #J/
" "T#t)_ " ".
2
 'y 'c 'htDz>R ' 'A Dc3h,@  D      E" ! !F<tDz <|d 
DJ 
4 
 =E (2 OP* Q*" :;I <IV YZT3 T T [Tlw& :;;X ;XY ;X <;Xzv"p 45$ 6$L DEc Fc< :;7 <7<OHZHZ Ob5nTlYv:x0Y*/.e'N>+@:,\/0L\ RS T*'* 45 6> @A/= B/=b LM7 N7> 45A'4 A' 6A'FENu
n GH I" 23*2 4*2X./`ct c4 cJ0 "4l+<B_H :;/ </bEN RS T.Q f 45M 6M^ :;@J <@JD9'RT T 8 CDL%$ L% EL%\@& OP7B4 7B Q7Br{)z GHC IC:60 8M<^ EF<J G<J| tu%, v%,N)!V+, 67Q 8Qf =>' ?' JKO.T O. LO.b @Ar4 r4 Br4h 67j2 8j2X AB;| C;|z 67 8wr IJ( K(T IJ]7 K]7~ 78`7 9`7DV<@H# H8 ./n3 n 0n" #"$
 
&&&##&&""8$LK8:x5n[D [& &  4  
   
(2.,B\/2892v88 8"H'944%	I<t|=@  4;0zCJ*8(T  &	--- - 	-
 
- -..,<0/6bGR%N D46$JD25,6*B0<dDL  $@
DEPN04l	%[z<$|DLR%h? ?BE%NxtJX
 CDv EvpH%T XY2& Z2&h:: D ;<QKS QKT QK =QKf5#r*   r[   )?cmf.appr   cmf.includecmf.utilr   r   dataclassesr  r<  r  r  r  r  r  pathlibr   r   r  r   typingr   r	   r
   r   r   r   r   bs4r   
contextlibr   dateutilr   	itertoolsr   textwrapr   r   unicodedatar   
cmf.modelsr   %common.models.cmf_plugin_import_mixinr   modules.jira.apir   modules.jira.base_importr   modules.jira.jql.parserr   localrI   ro   r?  r   r@  r8  rN   r   	dataclassr2   rY   r[   r@   r*   r)   <module>rG
     s      )      	       H H H  %  " # !   F $ 3 1Y__
$v~~&V-=-=(>VEVEV@WWX	0	 0 
% 
% 
%6aZ#N aZ#r*   