U
    	g!                    @   sX  d dl mZ d dlT 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m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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) eee*j+ ee*j, ee*j- f Z.ej/G dd dZ0dd Z1G dd de'Z2dS )    )cmf_context)*N)Path)TemporaryDirectory)DictOptionalListCallableUnionTypeIterator)BeautifulSoup)permutations)cached_property)commit_all_dsinit_ds)	BaseModel)CmfPluginImportMixin)JiraApi)JiraBaseImport)JQLNormalizerc                   @   s:   e Zd ZU dZeed< eed< eed< dd Zdd Zd	S )
EpicDatauD    Данные используемые при создании epic namekeyproject_keyc                 C   s
   t | jS N)hashr   self r   ./modules/jira/api_import.py__hash__%   s    zEpicData.__hash__c                 C   s   | j |j kS r   )r   )r   otherr   r   r    __eq__(   s    zEpicData.__eq__N)__name__
__module____qualname____doc__str__annotations__r!   r#   r   r   r   r    r      s   
r   c                    s    fdd}|S )Nc                    s    fdd}|S )Nc                    s   zD| j d  | j  r$W dS  | f||}| j j  |W S  tk
r   | j j  |  jd7  _| j d  Y dS X d S )Nz================== r      u   Ошибка )	
cmf_importlog	is_canceldpcommit	Exceptionrollback
has_errors	log_error)objargskwargsres)funcr   r   r    wrapper.   s    
z3catch_exception.<locals>.decorator.<locals>.wrapperr   )r8   r9   r   )r8   r    	decorator-   s    z"catch_exception.<locals>.decoratorr   )r   r;   r   r:   r    catch_exception,   s    r<   c                       s(  e Zd ZU dZeed< eeef ed< e	dd fddZ
eeeef dd	d
Zdd Zdd Zdd Zeeeeee  dddZdd Zeeeef  dddZedd Zedd Zdd Zeddd Zee dd!d"Zee dd#d$Zee ed%d&d'Zdd*d+Zed,d-d. Z ed/d0d1 Z!ed2eed3d4d5Z"d6d7 Z#ed8dee$d9d:d;Z%dd<d=Z&ed>d?d@ Z'edAdBdC Z(edDdEdF Z)e*j+ddGdHZ,dIdJ Z-dKdL Z.dMdN Z/edOdPdQ Z0edRdSdT Z1edUdVdW Z2eedXdYdZZ3d[d\ Z4d]d^ Z5ed_d`da Z6ed_dbdc Z7edddedf Z8edgdhdi Z9djdk Z:d dldmZ;e<dndodpZ=e<dndqdrZ>edsedtdudvZ?dwdx Z@edyedtdzd{ZAed|d}d~ ZBdd ZCeddd ZDdd ZEedd!ddZFeddd ZGeddd ZHededddZIeddd ZJeddd ZKeddd ZLeddd ZMeddd ZNeddd ZOdd ZPededddZQedddZRdd ZSdd ZTdd ZUdd ZVdd ZWdd ZXdd ZYdd ZZdd Z[dd Z\dd Z]d"ddƄZ^ddȄ Z_ddʄ Z`dd̄ Zadd΄ ZbedtddЄZcedtdd҄ZdedtddԄZeedtddքZfedtdd؄Zgddڄ Zhdd܄ Ziddބ Zjed߃ee<edddZkdd Zldd ZmeendddZod#eedddZpd$eeeedddZqd%ddZrdd Zsed&eeeedddZtdd Zudd Zvdd Zwdd  Zxdd Zydd Zzdd Z{dd Z|d	d
 Z}edddZ~dd Zdd Zeddd Zdd Zeddd Zdd Z  ZS ('  JiraAPIImportu;   Класс загрузки объектов через APIr2   _JiraAPIImport__jira_fieldsN)jirareturnc                    s   t  j|| || _d| _| jjjr*d| _tjjdd| _	d | _
|  | _i | _i | _i | _g | _g | _d| _td}| jjj|_|| jjj |   d | _d| _d S )Nr   	accountIdsoftdevcoder   zatlassian.rest_clientF)super__init__r?   user_keyconncloudmodelsCmfActivitygetdefault_activitycloud_id_get_jira_global_settingsjira_global_settingsZepicsissue_relationssubtasksboardsselected_projectsr2   loggingZ	getLoggerr+   loggerZhandlersZsetLevellevel_prepare_multiprocessingr>   update_fields)r   r?   r5   r6   rV   	__class__r   r    rF   F   s(    


zJiraAPIImport.__init__)r@   c              	   C   s   | j r| j S | j d}| rL| jsLt|}t|| _ W 5 Q R X n6| j	
 | _ t|d}t| j | W 5 Q R X d| _| j S )Nfields.jsonw+F)r>   r+   get_download_pathjoinpathexistsrY   openjsonloadr?   Z
get_fieldsdump)r   	file_pathfr   r   r    jira_fields^   s    
zJiraAPIImport.jira_fieldsc              	   C   sl   dd l }|| _| j d}| j dt  }t|d}t	| j| W 5 Q R X |
|| d S )Nr   r\   zfields.json.r]   )shutilr>   r+   r^   r_   osgetpidra   rb   rd   move)r   fieldsrh   re   file_path_tmprf   r   r   r    update_jira_fieldsn   s    z JiraAPIImport.update_jira_fieldsc                 C   s(   | j  D ]}|d |kr
|  S q
d S )Nr   )rg   values)r   r   fieldr   r   r    _get_field_by_namew   s    z JiraAPIImport._get_field_by_namec                    s"   t t fdd| j d }|S )Nc                    s   |  di  d kS )NschemacustomrL   rf   
field_typer   r    <lambda>       z2JiraAPIImport._get_field_by_type.<locals>.<lambda>)nextfilterrg   ro   )r   rw   rp   r   rv   r    _get_field_by_type|   s    
z JiraAPIImport._get_field_by_type)model
field_namer@   c                 C   s&   |sd S | j |gd}|r"|d S d S )N)Zfields_namer   )import_shop_fields)r}   r~   r7   r   r   r    _get_field_name   s    zJiraAPIImport._get_field_namec                 C   s   dd l }dd l}dd l}dd l}|| _ || _tj| _tj| _|	 d | _
| jjd| j
d  ddd tjr~ttj| j
| _
| jjdtj dd | j}| jjdt|d	  d
dd tt|d | j
| _
| j
stdd S )Nr   r*   z
cpu_count=u%   , надо не менее 2 ядерT)	anonymouszconfig.IMPORT_PROCESS=zavailable_memory=i   @u-   Гб, по 2 Гигабайта на ядроl        u   Ресурсов системы недостаточно для импорта, обратитесь в техподдержку для дополнительной информации.)	threadingqueuemultiprocessingpsutilconfigZIMPORT_THREADSZthreading_max_forksZIMPORT_DOWNLOAD_THREADSdownload_threading_max_forks	cpu_countmax_processesr+   r,   ZIMPORT_PROCESSminZvirtual_memoryZ	availableintr0   )r   r   r   r   r   Zavailable_memoryr   r   r    rX      s     
 z&JiraAPIImport._prepare_multiprocessingc              
   C   sp   g }ddddddddd	d
	}dddd}| j  D ]8\}}d| ||d }|||d||d q2|S )uO    Сопоставление настроек для модели models.CmfTaskr   textprioritystatusZ
alarm_dateZdeadlinecmf_modified_atcmf_created_atstatus_closed_at)	summarydescriptionr   r   Zcustomfield_10015Zduedateupdatedcreatedresolutiondatez.namez.watchCountz.votes)r   ZwatchesZvoteszfields. N)model_field	json_path	ext_field)rg   itemsrL   append)r   Zissue_settingsZdefault_local_attrs_mappingZadditional_json_pathZcustom_field_keyZcustom_fieldr   r   r   r    _get_issue_import_settings   s.    

z(JiraAPIImport._get_issue_import_settingsc                  C   s    dddddddddg} | S )Nr   displayNamer   r   emailemailAddressdoes_not_workactiver   )Zuser_settingsr   r   r    _get_user_import_settings   s
    z'JiraAPIImport._get_user_import_settingsc                  C   s    dddddddddg} | S )Nr   r   r   
cmf_authorauthorr   renderedBodyr   )Zcomment_settingsr   r   r    _get_comment_import_settings   s
    z*JiraAPIImport._get_comment_import_settingsc                 C   sX   dddddddd}||kr$|| S | d	}t|d
kr>dS | j|d
 i ddS )N   ИмяZEmailu   Активныйu   Созданоu
   Автор
   Текстu   Ключ)r   r   r   r   r   bodyr   .r*   r   r   )splitlenrg   rL   )r   Zjsonpathmappingr   r   r     _get_setting_title_from_jsonpath   s    	
z.JiraAPIImport._get_setting_title_from_jsonpathTc                 C   s  |sd S | dD ](}t| ts& d S | |} | s d S q|rvt| trvdddg}|D ]}|| krX| |   S qXdS |rt| trg }| D ]f}d|kr||d d  qd|kr||d d  qd|kr||d  q|r|t| qd|S | S )	Nr   r   r   r   r   inwardIssueoutwardIssue,)r   
isinstancedictrL   listr   r(   join)r4   r   to_strr~   Z
str_fieldsZ	str_fieldresultZrelated_objr   r   r    _get_file_val   s6    



zJiraAPIImport._get_file_valc           	         sv  g  t ttt f tg tt f ttd fdd}jdg j 	d}d}d}|
 r D ]$}|d D ]} qq~|rl qqldD ]} qq|sd	d
 jjddD }|r|d }|sdd
 jjjjddD }|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  dg d  S )u-    Инициализация настроек )objssettings_funcr}   r@   c                    sz   | D ]p}| }|D ]H} ||d |d< ||d |d< |d |d< |j|d< q |j|d |  S d S )Nr   Zfile_valr   titleicon)r   rl   )r   r   r   r   r   verbose_name)r   r   r}   r4   Zobj_settingssettingr   r   r   r    _get_settings  s    z:JiraAPIImport.tmplt_import_settings.<locals>._get_settingszplugin.plugin.*projectsNidusersc                 S   s   g | ]}|qS r   r   .0r4   r   r   r    
<listcomp>+  s     z7JiraAPIImport.tmplt_import_settings.<locals>.<listcomp>r*   limitr   c                 S   s   g | ]}|qS r   r   r   r   r   r    r   /  s     )usernameZ	limit_enduS   Не найдено ни одной задачи, импорт невозможенTua   Не найдено ни одного пользователя, импорт невозможенz2022-05-22T15:22:22.593+0300r   u!   Электронная почта)r   r   r   )r   r   r   selectedObjects)r   value)r
   r   r   r   r	   	TypeModelr+   load_fieldsr^   r_   r`   _get_projectsget_project_tasks_simple_getr?   
get_issues	get_usersloginr0   rY   r   rJ   CmfTaskr   	CmfPersonr   
CmfCommentr   )	r   r   Zdump_dirtaskuserprojecttasksr   Zcomment_exampler   r   r    tmplt_import_settings  sT      z#JiraAPIImport.tmplt_import_settingsc                 C   s   |  | jjd }ddg g gdg}| jjddD ]}t|tjj d D ]f\}}|d s\qJ| 	||d	 }| 
|d d
 |}|d d |d d  |d d d | qJq2|S )Nimport_settingsu   Задачиzcalendar-today)r   r   titlesrows   r   rl   r   r   r~   r   r   captionr   )Z_normalize_settingsr+   json_settingsr?   r   	enumeraterJ   r   r   r   _normalize_jira_valuer   )r   settingsr   issueZnumr   r   r   r   r    previewK  s    zJiraAPIImport.preview)r   r@   c                 C   s\   i }|D ]N}|d sq| j ||d dd}| |d d ||d}|||d d < q|S )uC    Преобразование настроек для модели r   r   F)r   r~   r   )r   r   rL   )r   r4   r   Znormalized_objr   r   r   r   r    _normalize_objZ  s    zJiraAPIImport._normalize_objsprintkanbanc           
      C   s   dd|j gg}|dr*|dddg n|dd|g tjj|d}| jjjj d|d  }tj	| jtj
|d	 ||||d
|d|ddd|gd\}}	|	r|d	 |_|jdd |S )NZtree_parent_id==completeDatesys_typearchiver{   ::r   r   	startDateendDate)r   parenttree_parent	list_typeplan_start_dateplan_end_dateext_idr   Z
filter_objTZsave_import)r   rL   r   rJ   	CmfFolderr+   pluginsource_hashr   process_any_table_fieldsCmfListr   save)
r   r   r   Zparent_sys_typer   _filterr   r   Zlist_objnewr   r   r    _process_listf  s*    


zJiraAPIImport._process_listu8   Обработка наблюдателей задачиc                 C   s   d|d  d|d d  d}|  |D ]r}| jjjrJ| j|d |d}n| j|d |d}|sntd	| ||jks(||jks(||jkrq(|j	
| q(t  d
S )u;   Добавляем наблюдателей в задачуu$   Наблюдатели задачи r   : "rl   r   "rA   r4   uI   _process_watchers: Не найден наблюдатель задачи N)_get_issue_watchersr?   rH   rI   _get_personCmfErrorresponsibler   	cmf_owner
spectatorsr   commit_with_event)r   	issue_objr   r4   watcherpersonr   r   r    _process_watchers  s    
zJiraAPIImport._process_watchersu#   Обработка вложенийc                 C   s6  ddl m} dd l}d|d  d|d d  d}t|d	  d
}d}| r8||}| D ]}	zz*|		drW W qh|d d D ]}
|
d |	kr qqt
j|	}t
jj||ddddgd}|st
j| j|d|d}|jr|
r(|
dr| j|
d | j |d|_|
d |_||	d}|jdd || |jdd |
r|j|
d kstd|j d|
d  d|j  W 5 Q R X W nx tk
r   | jjd|	 dd |d |j  |d!7 }Y n8   | jjd"|	 d#|d | jj  |d!7 }Y nX W 5 | jdd X qhW 5 Q R X | |D ]}zzt
j|d$ }t
jj||d%}|st
j| j|d|d}|jr|jdd |  t |d& |j! t
j"jj#$ }|%|j&}|'  |j  W n8   | jjd"|	 d#|d | jj  |d!7 }Y nX W 5 | jdd X qB|S )'Nr   )RDisku   Вложения задачи r   r  rl   r   r  
issue_pathz /attachments/all_attachments.zip
attachment	processed/filenameimport_originalurlZurl_preview_imgZurl_previewr   r   rl   T)r+   r   r  r   r   r  r   r   sizeu   Текущий размер z != u    из метыu7   Обранужена проблема вложения uI   , размер файла не совпадает с метой из JIRAzERR-0034r*   :   Не удалось обработать вложение zERR-0035	file_namer   r   re   )(Zrdisk.rdiskr  zipfiler   r`   ZipFileZnamelistr+   inc_statendswithrJ   CmfDocument_get_filenameCmfAttachmentrL   r  r	  rG   r   r   ra   r  Zupload_stream_filest_sizeAssertionErrorr.   r/   r3   r1   _get_issue_attachmentsZ
upload_dirrh   copyZfull_path_fileZCmfRFileZdata_driverZget_rdZ	get_rfileZ
_file_namemake_preview)r   r  
jira_issuer  r   r4   Zall_attach_zip_patherrorsZmyzipZzip_attach_nameattach_infoZattach_namer  Zattach_fattachment_infordiskZrfiler   r   r    _process_attachments  s    






, 
   z"JiraAPIImport._process_attachmentsuB   Обработка упоминаний пользователей)r   r@   c                 C   st  ddl m}m} |sdS t|d}|jddidD ]6}z|jdrX| |jd }n||jd	r| |jd	 }|jd
 |jd< |jd	 |jd< n>||jd }||j}	| 	|	d d 
 }
| |
| j }|jd |jd< |j|jd< d|jd< |jj|jd
< |jj|jd	< W q2 tk
rh } z0|  jd7  _| jjd| d| d|d W 5 d}~X Y q2X q2t|S )u]   
        Упоминания пользователей
        confluence-userlink
        r   )urlparseparse_qsNhtml.parserclass
user-hoverattrsdata-account-iddata-usernamezdata-linked-resource-idzdata-linked-resource-id_origzdata-username_orighrefr   	href_origTcmf_convertedr*   u)   Ошибка обработки тега : zERR-0036r  )urllib.parser2  r3  r   find_allr8  rL   r	  query_get_user_info_from_dumplowerrG   r;  r   r   r   r0   r2   r+   r3   r(   )r   r  r   r2  r3  doc_souptagr  
parsed_urlrA  	user_infoer   r   r    _process_mentions  s8    


 zJiraAPIImport._process_mentionsc                 C   s   t jj}|| jj d| }|d k	r2t|S | dD ]\}|| j	|krX|  S |dd
 |
 krx|  S |dd
 |
 kr<|  S q<td| d S )N:user:r   r   r   r   uQ   Не нашли информацию по пользователю в дампе )APPREDIS_DBredisrL   r+   r   pickleloadsr   rG   rC  r0   )r   user_idredis_dbrG  r   r   r    rB    s    

z&JiraAPIImport._get_user_info_from_dumpu#   Конвертация ссылок)r   r   c                    s  |s|S t |}|dd D ]x}|jdrF| jjd|  q|drv|jd drv| jjd|  q| jjd|  |dr|jd }n
|jd	 }t	j
|d
d dd }tdt	j
|dd }	|	r(|	d  |d d }
tt fdd|
d }|r(|d }tj|}tjj|dg|d}|r|d	r|jd	 |jd< |j|jd	< d|jd< t|jd	 }|r|d r|d drd|_d|jd< d|jd< d|jd< |dr|jd |jd< |j|jd< d|jd< | jjd|j  qd|jdd kr|jd d
d dd }| |}|r|jd |jd< |j|jd< d|jd< | jjd|j  qt|S )!Nc                 S   s   |  dp|  dS Nr;  srchas_attrrE  r   r   r    rx     ry   z.JiraAPIImport._process_links.<locals>.<lambda>r=  u   Уже обработали r;  #u   Это якорь u&   Обрабатываем ссылку rS  r  ?r   (/attachment(?:/content)?/(\d+)(?:/)?(.*)r*   rl   r  c                    s   |  d kS Nr   rt   itemZ	attach_idr   r    rx   $  ry   r  r  )r   rl   r   Zsrc_origTZvideoZcontrolsz100%widthZheightr<  u   Заменили на z/people/r   )r   r@  r8  rL   r+   rV   inforU  
startswithurllibparseunquoter   researchrz   r{   rJ   r$  r%  r&  sgetr  	mimetypes
guess_typer   r	  r;  r(   )r   r   r   r,  r+  Z	text_souprE  r  r  	url_matchattachmentsattachZ
attach_obj	mime_type
account_idr  r   r^  r    _process_links  sd    

 
 





zJiraAPIImport._process_linksc              	   C   s0  |rd| dnd}| j jd|  | jjjrV|d dkrV| j jd|d   | || jt	j
j d }d	| j jjj d	|| j  d	}|d
 dd}d}	|D ]}
t|
|	krt|
}	qtt	j
jjt	j
jjt	j
jj}|	|krzt|dkr|d |d< d|d< d|d< nbt|dkrF|d |d< |d |d< d|d< n2t|dkr|d |d< |d |d< |d |d< n2|  jd7  _| j jd|d
  d| dddd ddg}t	j
jddd| dg|d}|r|jjd	| j jjj d	dkr|rT| j jd| d |j  td	| j jjj d!d|jj|_|jd"d# d }n0|  jd7  _| j jd$| d%|j d&d'd(d) |sd*dd+d,| j jjj d-gdd.d gg}t	j
jd/d0|d1 g|g|d}|st	j
jd1d0|d1 g|g|d}t|dkr>| j jd2|d1  d3t| d| d4dd |  jd7  _g }|sJ| j jd5|d1  d|  d
d0|d
 g|g}t	j
j||d}|sJd*g}t |t|D ]}t|dkrdd0|d g}nnt|dkr|!dd0|d gdd0|d gg n<t|dkr|!dd0|d gdd0|d gdd0|d gg q||g}t	j
j||d}t|dkr|  jd7  _| j jd6|d
  d7|d1  d8t| d| d4dd |r|d }n*| j "d9|d
  d7|d1  d:| t#j$ d;}|sz|rrd"}d}|d1 }t	j
jd/d0|% g|dr\| j "d<| d=t#j& |d1 d>\}}| d?| d>| }|d7 }qt	j
||| j d"d@}nd |fS |r(|j'r|D ]}t(||||  q|jr||jkr|j | |_n||_t	j)* }t	j)+ }|j,!| |j,!| d"|_-|dA dB D ]}| jjjr2d	|dC  d	}nd	|d
  d	}d	| j jjj | }t	j)jddd| dgdgd}|st	j)jd
d.|d
 gdgd}|st	j)|| j d"|d
 |dD}|j'r|d
 |_.|js||_n||jkr|j | |_|jd"d# |j,!| q|j/r(|jd"d# ||fS )EN()r   u0   Импортируем пользователя ZaccountTypeZ	atlassianu   Неизвестный тип rl   r   r       r   r*   	last_name
first_namesecond_name   u?   Часть полного имени пользователя "u   " длиннее u_    символов. Фамилия, Имя и Отчество не были заполнены.zERR-0110r   obj_typer   rg_member_ofr   LIKE%r{   rl   u    ext_id пользователя N    содержит несколько ID из одного источника: z::.+?::Tr   uP   Возможно найден некорректный пользователь ud   ,так как ext_id содержит несколько ID из одного источника: 'uq   '.Необходимо повторно импортировать локальных пользователей.zERR-0004r   )Z
error_codery  ORzNOT LIKE%::::%r   r   ILIKEr   u+   Пользователей с почтой z > zERR-0037uH   Не удалось найти пользователя с почтой u+   Пользователей с именем  (z) > uM   Не нашли пользователя среди существующих z) FuQ   Обнаружена учетная запись с дублирующим email u   , добавляем цифру@+)r   r   r+   r  groupsr   groupId)r   r+   r  r   import_raw_json)0r+   rV   r`  r?   rH   rI   warningr   r   rJ   r   r   r   r   rG   r   r   r   ru  Z
max_lengthrt  rv  r2   r3   rL   r   r   countre  subr  r   r   r   r,   rU   INFOrC  WARNINGr  setattrCmfPersonGroup
jira_group
user_grouprz  Z
user_localr   
is_changed)r   r   createupdater4   Zobj_msgZ	user_dictr   Z	full_nameZcurrent_length_namer   Zmax_length_namerl   r  Znot_source_hash_filterZpersonsr  Z
name_combo
is_creatednr   Zprefix_emaildomainr   r  r  Z
group_infogroupr   r   r    _process_personF  sh    



*" 
&
 

   
zJiraAPIImport._process_personu   Обработка группc              	   C   s:  |  dD ](}z| j r$W  d S d| jjjj d|d  d}tjjddd| dgdgd}|stjjdd	|d gdgd}|stj|d || jd
|d}|jr|d |_	|j
s||_
n||j
kr|j
 | |_
|jd
d |j  | j jd7  _W q
   |  jd7  _| jjd| ddd Y q
X q
d S )Nr  r   r   r   r{  r|  r   r}  r  T)r   r   r+   r  r  r   r*   u4   Не удалось загрузить группу ERR-0038r  rx  )r   r+   r-   r   r   rJ   r  rL   r  r   r   r  r.   r/   imported_object_countr2   r3   )r   Z
group_datar   r  r   r   r    _process_groups  s>    
 


 zJiraAPIImport._process_groupsu-   Обработка пользователейc              	   C   s   | j jjdds(| j jdtjd d S t }| dD ]}z^| j 	 rPW  d S | 
|\}}| j  jd7  _|jr|js|jds|r||jj W q8   |  jd7  _| j jd| d	d
d Y q8X q8|r| j jjddrttjjt|gd d S )N
load_usersTuA   Не грузим пользователей из-за опцийrW   r   r*   z.evateam.ruu@   Не удалось загрузить пользователя r  r   rx  Zsend_invites)r5   )r+   r   r   rL   r,   rU   r  setr   r-   r  r  r   r   r#  addr2   r3   Zschedule_deferred_jobrJ   r   Zregister_personsr   )r   Znew_user_emailsr   r  r  r   r   r    _process_users?  s,    
 zJiraAPIImport._process_usersu#   Обработка статусовc                 C   s   |  dD ]}| j r dS | jjjr2|d }n|d d }| jjjj d|d  }tj	j
|d}|sdd|d gd	ddgg}tj	j
|d
}|stj	|d | jd}||_t||_|d |_|jdd | jj  | j jd7  _q
dS )uc   
        Грузим статусы из Jira и сопостовляем с нашими
        statusesNstatusCategoryr   r   r   r   r   r   r   )r   r+   Tr   r*   )r   r+   r-   r?   rH   rI   r   r   rJ   CmfStatusCoderL   r   r   get_status_typestatus_typer   r  r.   r/   r  )r   r   r  r   Zcmf_status_coder  r   r   r    _process_statusesY  s*    




zJiraAPIImport._process_statusesc               	      s  i }d }d }|d }dd |  |D }tjjdd}| |}|D ]}	| jjjj d|	d  }
tjjdd|
gd	}|stj||
| jd
d}|jr|d  d|	d  |_	|	dd|_
|	|_|jd
d |	d d d }|D ]f}||}|s|d dkr|}|s |d dkr |}d| jjjj d| d| d}|||< q|	d D ]}| || qRtjjdd|gddd ggdgdD ]@}tjjdd|jgdd|gddd ggd	sq|jd
d q| jjjj d|j  |	d D ]}  d|d  }|d   }tjj||d!}|s4tj||| jd"}|d |_	|d |_
 fd#d$|d% D }tjjdd&|gd	|_  d|d'  }tjj|d(}|d)kr|rd
|_|jd
d* ||_|jd
d qqD|d+ }| jjjj d,|d  }tjj|d(}|s$tjjd-d}tj||| jd.}|d |_	||_||_|jd
d tjj|d/D ]}|jd
d0 qT| D ]b\}}| j r qtjjdd1d2| d2gd	}|||| jd3d4}tjf |}|jd
d qp|S )5Nr   c                 S   s   i | ]}|d  |qS r   r   r   
issue_typer   r   r    
<dictcomp>{  s    zEJiraAPIImport._create_schemewf_for_simple_project.<locals>.<dictcomp>default.system:defaultrC   r   r   =r   Ttemplater   r+   r  r   r>  r   r   r   r   ZassociatedWithr   
issueTypeshierarchyLevelrX  :r  workflowr   r  r}  !=forcetransitionstype)r  r   )r  r   r+   c                    s(   g | ] }| d r  d|d   qS )ZfromStatusReferencer   rt   r   sworkflow_hash_idr   r    r     s   
zEJiraAPIImport._create_schemewf_for_simple_project.<locals>.<listcomp>ZlinksINZtoStatusReferencer  globalZ	only_dataworkflow_scheme
::SIMPLE::softdev:default)r  r   r+   )	scheme_wfZTEXKOM_db_deleter{  r|  r   )r  
logic_typetarget_workflowr+   cmf_model_name)_get_issue_types_for_projectrJ   CmfWorkflowrL   !_get_simplified_project_workflowsr+   r   r   r  r   r   r  r  _create_status	CmfStatusr   r  deleter   rC  CmfTransstatus_fromallow_empty_transition	status_toCmfSchemeWfdefault_task_workflowdefault_subtask_workflowCmfSchemeWfRuler   r-   CmfLogicType) r   Zjira_project_info	issue_mapZdefault_workflow_for_taskZdefault_workflow_for_subtask
project_idissue_typeswf_templateworkflows_dataworkflow_dataworkflow_ext_idr  issue_type_idsissue_type_idr  issue_type_ext_idr   Zworkflow_transitiontransition_ext_idtransition_type
transitionstatus_from_ext_id_liststatus_to_ext_idr  Zworkflow_scheme_dataZscheme_wf_ext_idr  Ztemplate_wfrulelogic_type_ext_idr  	rule_dictr   r  r    #_create_schemewf_for_simple_projectu  s    




 






z1JiraAPIImport._create_schemewf_for_simple_projectc           	      C   sZ  | j jjj d|j d|d  }| j jjj d|d  }tjj|d}t|d }|srtj||d | j d}||_	|j
dd tjjd	d
|gd}|stjjdd
|gdd
|gd	d
d ggd}|stjjdd
|d gdd
|gd	d
d ggd}|stj|| j |d}||_|d |_|d |_d|_||_ddddd}||d|_|j
dd |S )Nr   r   r  r  r   )r   r   r+   Tr   r   r   r   r  status_code)r  r+   r  r   F#a0a0a0z#3f82d8z#e36b51z#23a055)OPENIN_PROGRESSZ	IN_REVIEWCLOSED)r+   r   r   r   rJ   r  rL   r   r  r  r  r  r   r   r   r  r  color)	r   Zjira_status_datar  status_ext_idr   r  r  r   Zstatus_type_colorr   r   r    r    sH    "

zJiraAPIImport._create_statusc           2         s  ddl m} dd l}i }d }d }i }t|d d}tjjdd}	|d d }
|
D ]}||d	 }| j	j
j
j d
| }tjjdd|gd}|stj||	| j	d}|d	 |_|dd|_|jdd |s|dr|}|d }| j|d dD ]}|d |kr
q|s |dr |}||ks@|drf||krfd| j	j
j
j d|d  d}|||< |d D ]*}|d d |d< | ||||d < qnqtjjdd|gddd ggdgdD ]@}tjjdd|jgdd|gdd d ggdsq|jdd! qz|d"|j d#}| s4td$|j d%t|d&}| }W 5 Q R X t|d'}|sjtd(t  i }|d)D ]}|jd	d*id+jdd,}||  |d < |d-D ]}|d }|jd.kr|jd/|d0}|s| j	jd1|j d2| d3|d4 q|jd	d5id+}| |||d	 |r6|jdd,ndg |d6d d7 d8}|d9 !|d  |jd	d:id+}|r|jdd,|d;< qq~ std<t"  d=t"| d>|d?D ]}|d6d d7 }  | }!|!rd|!_#|!jdd@ |d }|jd	d5id+}||d	 |r*|jdd,ndg | d8}|jd	d:id+}|r\|jdd,|d;< |||< q| j	$dAt"| dBt%j& |' D ]H}"| j	j
j
j d|j( }#|# d|"d  }$tj)j|$|dC}%|%stj)||$| j	ddD}%|%j*s| j	j+,dE|%j dF|j dG q|"d	 |%_|"d |%_ fdHdI|"d9 D |%_- |"dJ  |%_.|"d;r|"d; t/t0fdKdL| 1dMd }&z| 2|&|%_3W n8   | j	jdN dO|%j dP|j dQdRdS|dT Y nX |%jdd qW qT tk
r }' z$| j	jdU|j dV|' dW|d4 W 5 d }'~'X Y qTX qT| j	j
j
j d|d d  }(tj4j|(dX})|d dY }*|)stj4jdZd}+tj4|+|(| j	dd[})|)j*rH|*d	 |)_|*dd|)_||)_5||)_6g },|d d }|D ]j}d| j	j
j
j d|d  d}tj7jdd\d]| d]gd}-|,!|- |d^ r|-|)_8|d_ r|-|)_9q|,|)_:|*|)_;|)jdd n| j	j+,d`|)j da g }.|< D ]0\}/}tj7jdd\d]|/ d]gd}-tj=jdbd|-gdcd|)ggd}0|0r|0j*s| j	j+,dd|)j de|0j> df|-j dg |.!|0j> ql|0s~tj=jdbd|-gdcd|)gdhddgdid d ggddj}0|0rj| j	j+,dd|)j de|0j> df|-j dk |.!|0j> qltj=dl|-|)| j	dm}0||0_?|0jdd |.!|0j> qltj=jdndo|.gdcd|)gdid d ggddj}1|1D ]}0|0jddp qt@  |)S )qNr   )cmf_hashlibproject_dir	workflowsr  rC   jira_workflow_schememappingsr   r  r   r  r   r   r  r+   r   r   Tr   defaultr  r   r  subtaskr   r  r  r   r  r   r  r}  r  r  	workflow_.xmlu,   XML файл бизнес-процесса 'u   ' не найденrxmlur   Не удалось получить список переходов между статусами в виде XMLzsteps > stepzjira.status.idr7  )stripz)actions > action, actions > common-actionzcommon-actionactionr  u7   В XML разметке бизнес-процесса 'u%   ' не найден common-action ID zERR-0121r  zjira.descriptionzresults > unconditional-resultstep)r   r   r   fromtor  zjira.fieldscreen.idZfieldscreenu   Из XML получено u    статусов и u'    переходов между нимиzglobal-actions > actionr  u   Настраиваем u1    переходов между статусамиr   r  r  r   r+   r     Переход '$   ' в бизнес-процессе ';   ' был изменен и не будет обновленc                    s   g | ]} | qS r   r   )r   r  )
jira_stepsr   r    r     s   z4JiraAPIImport._process_wf_scheme.<locals>.<listcomp>r  c                    s   t | dt  kS r[  r(   rL   screen	screen_idr   r    rx     ry   z2JiraAPIImport._process_wf_scheme.<locals>.<lambda>screens7   Не удалось установить экран ID     для перехода '!   ' бизнес-процесса ''ERR-0122	CmfUiFormry  r4   u   Не удалось импортировать переходы между статусами для бизнес-процесса «u   »: ERR-0067r  r`  r  r  r{  r|  ZdefaultIssueTypeZsubTask*   Схема бизнес-процесса '[   ' была изменена после импорта и не будет обновленаr  r  -   В схеме бизнес-процесса '   ' правило )    для логического типа 'j   ' было изменено или добавлено вручную и не будет обновленоcmf_deletedr+   r{   include_deletedV   ' было удалено вручную и не будет восстановленоr   r  r  r  r+   rD   NOT INr  )AZcmf.utilr  requestsr   r_   rJ   r  rL   Zshort_str_encr+   r   r   r   r   r  _get_statuses_for_projectr  r  r   r  r  r`   FileNotFoundErrorra   readr   r0   r   selectfindZget_textr3   
setdefaultr   r   r  r,   rU   r  ro   r   r  r  rV   r  r  r  rz   r{   r   _process_screencmf_ui_formr  r  r  r  Zdefault_task_logic_typeZdefault_subtask_logic_typestrict_task_logic_typer  r   r  rD   r  
cmf_commit)2r   project_infor  r$  r  Zdefault_wf_for_taskZdefault_wf_for_subtaskZall_statusesworkflows_dirr  r  r  Zworkflow_name_hashr  r  r  r  r  jira_statusr   workflow_filerf   workflow_xmlr  Zjira_transitionsr  Zjira_status_idr   Z	action_idZaction_descriptionZtransition_dataZaction_screen_idZaction_stepr  jira_transitionr  r  r  screen_datarH  r   	wf_schemeZwf_scheme_infor  r-  r  current_rulesr  r  rules_for_deletionr   )r	  r  r    _process_wf_scheme5  s   


 








 




	z JiraAPIImport._process_wf_schemec              	   C   sV   d}t dd4 | j rq>| }|dkr.q>|| |7 }qW 5 Q R X || d S )Nr   FZinit_views_and_dsDONE)r   r+   r-   rL   _process_issueput)r   Zissue_queueZissue_queue_errorsr-  r   r   r   r    _process_issue_threadK  s    
z#JiraAPIImport._process_issue_threadu   Обработка теговc           
      C   s,  ddl m} t }| j|d | |d dD ]4}| j rB d S |d dr.||d d }q.|D ]}|	dd	d	d
}||ddd}z\dddd| dgdd|gddd| dgg}t
jj|d}|st
j|d}|jdd W qh tk
r$ }	 ztd| d|	  W 5 d }	~	X Y qhX qhd S )Nr   )translitr   r   rl   labelsrr  _rW  r   ruT)Zlanguage_codereversedr  aliasr  r  z"%r   r   r:   r   u*   Не удалось создать тег r>  )Ztransliterater?  r  r   _count_project_tasksr+   r-   rL   unionreplacerJ   ZCmfTagr  r0   rU   r  )
r   r/  r?  tagsr   Ztag_nameZ
name_aliasr  Ztag_objrH  r   r   r    _process_tagsW  s,     
zJiraAPIImport._process_tagsu)   Обработка приоритетовc           
      C   s   | j jjj d|d  }tjjdd| dgd}d}dd	d
dddd}| dD ]F}|d |d krjqT|d D ]"}|d |krqr|d ||d < qr qqT|D ]@}tjjd|d}	|	stjddd|| j d}	||	_	|	j
dd qd S )Nr   r   r   r  r|  r   )ZLowestZLowZMediumZHighZHighestu   Отложено   Минимальныйu   Самый низкийu   Низший   Низкийu   Средний   Обычный   Высокийu   Высшийu   Наивысший   Критичныйu   КритическийrJ  rK  rL  rM  rN  u   Блокирующий)rX  r   r*   rs  rw  priority_schemesr   ZprojectKeys
prioritiesr   r   r  u   Приоритет)r   r   Zorig_captionr   r+   Tr   )r+   r   r   rJ   CmfCustFieldConfr   r   CmfCustFieldConfFieldrL   choicesr  )
r   r/  cust_field_conf_ext_idZcust_field_confsZpriority_namesrT  Zpriority_schemer   cust_field_confcust_field_conf_fieldr   r   r    _process_prioritiesp  s<    	z!JiraAPIImport._process_prioritiesu5   Обработка решений(резолюций)c                 C   s   |  dD ]}| j r d S | jjjj d|d  }tjj|d}|s^tj|| j|dd}|jr|d |_	|d |_
|jdd	 | j jd
7  _q
t  d S )Nresolutionsr   r   r  T)r   r+   r  r  r   r   r   r*   )r   r+   r-   r   r   rJ   CmfResolutionrL   r  r   r   r  r  r.  )r   
resolutionresolution_ext_idZresolution_objr   r   r    _process_resolutions  s$    


z"JiraAPIImport._process_resolutions)project_structr/  c                 C   s  t jjdd|d gddgd}|r|jj|d ksF|jr|d |jkr|d  d|d  d|d< | jjd|j	 d	|d   n|js|d |_|
  d
|d< | ||d< t jjddd|d  dg| d}|st j| j|d |d d
d}|jr<|D ]$}|dkrqt||||  q|dr<d|_|j}|
  |rrt jj|dD ]}|jd
d q^| |d D ]}| jjjj d|d  }t jj|d}	|	st jjddd gdd|d ggd}	|	st j|d | jd
d}	||	_|d |	_	|d|	_|	j
d
d t jj||	d}
|
sBt j||	| jd}
g |
_|
j
d
d |dg D ]}|d dkr| jjjr| |d  d! }nRz| |d }W n>   | jjd"|	 d#|d  d|d$  dd%|d& d }Y nX |r|
j | n| jjd'|  q`|d d(kr | jjjrBd|d) d*  d}nd|d  d}d| jjjj | }t j!jddd| dgdgd}|st j!jdd+|d gdgd}|r|js||_n||jkr|j | |_|j
d
d |
j | n(| jjd,| d-d.|d& |  j"d/7  _"nt#d0q`|
j
d
d q| $  | %| | &| | $  | j'|d1 | (||_)| *||_+| ,||_-| .| |j
d
d | /| | j0 rd S t1  | 2| | $  | 3| | j j4d/7  _4| $  |S )2Nr   r   r  r   r}  r  rq  u   Проект с именем u8    уже существует! Переименуем в TZtask_allow_multiple_sprintsui_form_schemer{  r|  )r+   r   r   r  	isPrivateprivater   r  r   r   r  r   )r   r+   r  r   r   )r   project_role)r   rc  r+   actorsr  atlassian-user-role-actorrG  rA   uX   Не удалось найти и добавить пользователя в роль u    проекта: r   zERR-0039r  uR   Не удалось привязать пользователя к проекту zatlassian-group-role-actorZ
actorGroupr  r  u<   Не найдена группа пользователей u#    для проектной ролиzERR-0040r*   u&   Неизвестный тип ролиr/  )5rJ   
CmfProjectrL   r  r   r   r+   rV   r  r   r  _process_screen_schemekeysr  r  Zperm_policyis_newr   r   r  _get_project_rolesr   r   CmfProjectRoler   ZCmfProjectRoleAssignmembersr?   rH   rI   r	  r3   r   r  r2   r0   _calc_progress_process_versions_process_componentsrI  _process_permissionsZproject_perm_scheme_process_security_levelssecurity_level_scheme_process_field_conf_schemecust_field_conf_schemerX  _process_tasksr-   r  _process_boards_process_sprintsr  )r   r^  r/  project_objr   rj  r   	role_infor   roleZrole_assignactorr   Z	sub_groupr   r   r    _process_project  s    "
 
"

  





zJiraAPIImport._process_projectc                 C   s   dd l }|jdddd| jjj d| jj d|d  d	| d
tj dgddtddtddd}| jd|j	  | j
  |S )Nr   /usr/bin/python3	manage.pyshellz&plugin = models.CmfPluginJira.get(id="z(");retcode = plugin.process_issue_fork("", "r   ", , );T"/var/log/eva-import-subprocess.loga+&/var/log/eva-import-subprocess.err.logZ	close_fdsZstart_new_sessionstdoutstderr   Запустили )
subprocessPopenr+   r   r   r   IMPORT_OBJ_CNTra   r,   pid
log_detail)r   r/  doner  procr   r   r    _execute_taskJ  s    
2  
zJiraAPIImport._execute_taskc           	      C   s  | j jd| j  d}| |d }g }t| jD ]0}| ||}|tj7 }|	| ||kr6 qhq6||k rt
d t|D ]L}| }|d k	r|  j|7  _|| | ||}|tj7 }|	| qqht|D ]"}|  |jr|  j|j7  _q| j jd d S )NuD   Грузим задачи в несколько процессов: r   r   r*   u0   Закончили обработку задач)r+   rV   r`  r   rE  ranger  r   r  r   timesleepr   pollr2   removecommunicate
returncode)	r   r/  r  Ztask_cntprocessrA  r  r  new_procr   r   r    rv  U  s2    




zJiraAPIImport._process_tasksu#   Обработка проектовc              
   C   s  t jjddjj}|  D ]}zv|d dd | jD kr@W qd }| j r\t	  W  d S |di }|r~| 
|| j }n
ddd	}|d
 dkrt jjdd}nL|d
 dkrt jjdd}n0|d
 dkrt jjdd}ntd|d
  d| jjjj d|d  |d< |d |jj|d ||d ||d |d}|d }|rZ| |}	|	|d< n0| jjjj d|d d  }
t jj|
d|d< | ||}W q tk
r   t  |  jd7  _| jjd| dd d! Y qX qd S )"NrB   rC   r   c                 S   s   g | ]}|d  qS r  r   r   r   r   r    r   }  s     z3JiraAPIImport._process_projects.<locals>.<listcomp>leaddefault_import_jira@evateam.comdefault_import_jirar   r   projectTypeKeybusinessproject.base:defaultsoftwareproject.agile:defaultservice_deskproject.servicedesk:defaultu$   ERROR! Проекты с типом 3    временно не поддерживаютсяr   r   r   r   r   r   r  r   activityZtask_code_prefixr  r   r  
simplifiedr  r  r  r*   <   Не удалось импортировать проект ERR-0041rg  rx  )rJ   rK   rL   r   r   r   rT   r+   r-   r  r	  rG   r  r0   r   r   r  r  r}  Zrollback_purge_eventr2   r3   )r   r  r/  ry  project_leadr  r  r^  Zproject_simplifiedschemer   r   r   r    _process_projectsx  s`    


 zJiraAPIImport._process_projectsc              
   C   s  d }t jjddjj}|  D ]r}z(| j r:W  d S |d dd | jD krVW q| jj	j	j
 d|d  |d< |di }|r| || j }n
d	d
d}|d dkrt jjdd}nL|d dkrt jjdd}n0|d dkrt jjdd}ntd|d  d|d |jj|d ||d ||d |d}| ||d< | ||}W q tk
r   t  |  jd7  _| jjd| ddd Y qX qd S )NrB   rC   r   c                 S   s   g | ]}|d  qS r  r   r   r   r   r    r     s     z7JiraAPIImport._process_projects_box.<locals>.<listcomp>r   r   r  r  r  r  r  r  r  r  r  r  r  u$   ERROR! Поректы с типом r  r   r   r   r  r  r*   r  r  rg  rx  )rJ   rK   rL   r   r   r   r+   r-   rT   r   r   r	  rG   r  r0   r9  r}  r  r2   r3   )r   ry  r  r/  r  r  r  r^  r   r   r    _process_projects_box  sT    
 z#JiraAPIImport._process_projects_boxu   Обработка досокc           0      C   s  ddd}dddddd	d
}ddddd}t jjddd|d  dgd}t jjd|dgd}|sxt jd||d| jd}|jsd|_|  | |d D ]f}z.| j rW  dS |d }|d }	| jj	
d| d|	  |d d }
d}|d d  }|r|d }|d }| jjjj d!| }t jj|dd"d#gd$}|sVt j| j|dd%}|jrx||_||_|jdd& n"| jj	d'| d(| d| d) g }|
d* }|d+ ddd, D ]}|d }|d }| jjjj d!| }t jj|dd"d#gd$}|st j| j|dd%}|jr2||_||_|jdd& n"| jj	d-| d(| d| d. || qg }|
d/ d0 ddd, D ]}|d }|d }| jjjj d!| }t jj|dd"d#gd$}|st j| j|dd%}|jr|d |_||_|jdd& n"| jj	d1| d(| d| d) || q|| jjjj d!| |d< t jj|d d2d3d4d5d6d7d8d#gd$}|st j|d | jdd9}|jr|d |_||_||_||d: |_||_||_||_||d; d	|_||
d< d|_|d |_|jdd& t  n"| jj	d=| d(| d|	 d. ttd>d? |
d@ dA d}ttdBd? |
d@ dA ddd, d}|rxdC|dD< |rdE|dD< d} t jj |dFd#gdG}!|!D ]X}"|"jj!pi }#|#dH}$|"jr|$r|$|"j"kr| jj	dI| dJ dK}  qqg }%dL}$|
d@ dA D ]J}&z|&d }'|&d }(| jjjj d!|' })t jjddM|)ggd#gddN}"|"st j||)| jddO}"|"jdd& |%|"j# |"j$r| jj	dP|" d(|' d|( dQ W q|"jj!pi }#|"jr|(|"_|&dR |"_%|&dS |"_&g }*|&dT D ]l}+| jjjj d!|+d  },t j'j|,dU}-|-sZ| jj(dV|" d(|' d|( dW|+ dX|dY q|*|- q|*|"_)|&dZ rd[|"_*n |&dT sd\|"_*n|&dDd]|"_*|#+|& n"| jj	dP|" d(|' d|( d. | r|$|"_"|"j"|#dH< |#|"_|"jdd& t  |$dL7 }$W nR t,k
rX }. z2|"j-.  | jj(d^|' d|( d|. d_|dY W 5 d}.~.X Y nX qt jj d`da|%gd2dM|gdFdbdggddc}/|/D ]}&|&j/ddd q|/r| jj	de|/  t  | j j0df7  _0W q   | jj-.  | jj(dg| dh|dY Y qX qdS )iz
        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
        zboard.scrum:defaultzboard.kanban:default)scrumr   z	1 queriesz2 userstoryz
3 assigneez4 epicz	5 projectz7 none)rs   ZparentChildassigneeepicr   Znonez1 -1wz2 -2wz3 -4wz6 none)z-1wz-2wz-4wZNONEr   r{  r|  r   u
   Доскиtree_node_is_branchr  N)r   r   r   r   r+   Tr   r   u!   Обработка доски ID r>  r`  r   r{   r   r  r  r   rl   )r+   r   r  r   u   Основной фильтр z (ID u;   ) был изменен и не будет обновленZswimlanesConfigZ	swimlanesrX  u   Дорожка uA   ) была изменена и не будет обновленаquickFilterConfigquickFiltersu   Быстрый фильтр r   r   kanban_filterswimlane_filtersquick_filters
limit_daysZkanban_board_columnsr   r+   r  r  ZswimlaneStrategyZoldDoneIssuesCutoff   Доска c                 S   s   | d o| d  S NmappedStatusesisKanPlanColumnr   columnr   r   r    rx     ry   z/JiraAPIImport._process_boards.<locals>.<lambda>ZrapidListConfigZmappedColumnsc                 S   s   | d o| d  S r  r   r  r   r   r    rx     ry   z#00875ar  z#42526er+   r   rl   ordernou.   Порядок колонок на доске up    был изменен и не будет обновлен. Упорядочите колонки вручнуюF  r  )r{   rl   r   r   r   r+   r  u   Колонка uG   ) была удалена и не будет восстановленаr   maxr  r  u   Для колонки u!   ) не найден статус zERR-0124r  r  r  z#6b778cz#0052ccu5   Не удалось создать колонку ID zERR-0042rD   r#  r  r  r  uC   Удалены колонки, отсутствующие в Jira: r*   u:   Не удалось импортировать доску zERR-0043)1rJ   rg  rL   r   r+   r  r  _get_project_boardsr-   rV   r`  r   r   CmfTaskFilterr  r   r  r  r   ZCmfKanbanBoardr   r   r  r  r  r  Zswimlane_typer  r.  rz   r{   ZCmfKanbanBoardColumnr   r   r  rD   r  Zmin_sizeZmax_sizer  r3   mapped_status_codesr  r  r0   r.   r1   r  r  )0r   r/  Z
board_typeZswimlane_type_mappingZlimit_days_mappingr   Zboard_folderboardboard_idZ
board_nameZboard_configr  Zboard_filterZboard_filter_idZboard_filter_nameZkanban_filter_ext_idr  Zswimlanes_configZswimlaneZswimlane_idZswimlane_nameZswimlane_ext_idZswimlane_filterr  ZquickfilterZquickfilter_idZquickfilter_nameZquick_filter_ext_idZquick_filterZ	board_objZfirst_column_with_statusesZlast_column_with_statusesZupdate_column_orderZboard_columnsZboard_columnZcolumn_dataZcolumn_ordernoZcurrent_columnsr  Z	column_idZcolumn_nameZcolumn_ext_idr  r   r  Zstatus_globalexcZcolumns_for_deletionr   r   r    rw    s6   
 
 



	









 zJiraAPIImport._process_boardsu#   Обработка спринтовc                 C   s  t jjddd|d  dgd}t jjdd|gdddggd	gd
}t jjdd|gdddggd	gd
}t jjdd}| |d D ]"}| j r d S | jjjj	 d|d  }t j
j|ddddddddddg
d}|st j
|d| j|d}|jr||_|d |_|d|_|d|_|jr0|jdd |d dkrT||_|jd |_n"||_|d d!krv|jd"|_|jjsd|j_|jjdd |jr|jdd t  | jjd#|j d$t|d%   |d% D ]4}	| jjjj	 d|	 }
t jj|
d&dd'd(d)d*d+gd}|r|d,r| jjjj	 d-|j }t jj|d.d/d0gd}|slt j|| jd1}d2|_d3|j d4|j d5|_ ||_!|jr|j|j" d6 |j#d krt|j$d7kr|j%&| n|j%&| n0|  j'd77  _'| jj(d8|	 d9|d  d:|d; q|jdd |d d!kr|j"sFt j)j*|d<s|jd=|_|jdd | jjd>|j d? |+  t  | j j,d77  _,| j-dd@ qd S )ANr   r{  r|  r   r   r   r   r   r  r}  r   zlist.agile_sprint:defaultrC   r   r   r   r  r  rm  r  r   r   r   r  T)r   r  r+   r  r   r   r   stateclosedr  r   r  u0   Добавляем задачи в спринт r>  issueslistscache_status_typeagile_story_pointszop_gantt_task.sched_durationzop_gantt_task.sched_workzop_gantt_task.actual_workr   z::comment-sprint:	log_levelr   r   r   r+   rs  uB   Задача была в архивном спринте <a href="" target="_blank"></a>r  r*   u-   Неизвестная задача issue_id=u    в спринте zERR-0044r  )Z	task_listr  u   Запуск спринта "r  r  ).rJ   rg  rL   r   r  _get_all_sprintsr+   r-   r   r   r   r  r  r   r   r   r  r  r   r  Zget_default_statusr   r  r  rV   r`  r   r   r   r   r  r;  r   r   rj  r  r  rm  r   r2   r3   ZCmfListHistoryOTRr  Zdo_startr  r"  )r   r/  r   Zsprint_folderarchive_folderZsprint_logic_typer   r   Z
sprint_objZissue_idZissue_ext_idr   comment_ext_idcommentr   r   r    rx  H  s     
      

$ 

zJiraAPIImport._process_sprintsc                 C   s$   |sd}|sd}| d| d| S )Nu   Не указаноr>  u    ➔ r   )r   r   	old_valueZ	new_valuer   r   r    _simple_html_diff  s
    zJiraAPIImport._simple_html_diffc                 C   s   |dkrd S z|  |}W n,   | jjd| dddd tj Y S X | j|dd|d\}}|s| jjjd	rt	j
j| jjd	 d
}| jjd| d| tjd n.| jjd| dddd tj}|  jd7  _|S )Nunknownu6   Не найден пользователь user_id = "u9   ", в дампе, указываем системногоzERR-0045ZCmfUserrx  Fr  Zdefault_user_idr  uA   ", ставим пользователя по умолчанию r  uc   ", указываем системного , в дампе, указываем системногоr*   )rB  r+   r3   gZsystem_userr  r   r   rL   rJ   r   r,   rU   r  r2   )r   rP  r4   r   r  rA  r   r   r    r	    s,       zJiraAPIImport._get_person)	dump_pathc              
   C   s   | d}| r`t|d>}|D ]2}t|}|d |d kr"|  W  5 Q R  S q"W 5 Q R X t|d}|t|d  W 5 Q R X |S )Ngroups.jsonr  r   r  
)r_   r`   ra   rb   rO  writedumps)r   r  r  Zgroups_pathrf   rowr4   r   r   r    _dump_groups  s    

 zJiraAPIImport._dump_groupsc                 C   s   z|  |W S  tk
r   z|d}| rt|dB}|D ]6}t|}||| j kr@|  W  5 Q R  W  Y S q@W 5 Q R X | j	|}|rt|d}|
t|d  W 5 Q R X |W  Y S W n$   | jjd| tjd Y nX Y nX d S )N
users.jsonr  r  r  uM   Неудалось сдампить пользователя по ключу r  )rB  r0   r_   r`   ra   rb   rO  rG   r?   Zget_user_infor  r  r+   r,   rU   r  )r   rP  r  Z
users_pathrf   r  r4   rG  r   r   r    _get_user_info  s$    

&zJiraAPIImport._get_user_infou,   Обработка журнала работ)r   c                 C   sp  | j jd d|d  d|d d  d}| |D ]2}t }d|d	< | j |d
< |di | jr| j|d | j |d|d< |d |d< |di | jr| j|d | j |d|d< ||d< |d |d< |d d |d< |dd|d< | j jjj	 d|d  |d< ||d< d|d< t
jj|d d }|s6t
jf |}|jjtj|jjd! |_|jd"d# q6d S )$Nu*   Загружаем журнал работu%   Журнал работ задачи r   r  rl   r   r  r  r   r+   r   r  r   r  updateAuthorcmf_modified_byr   started
start_dateZtimeSpentSeconds<   
time_spentr  r   r   r   r   r   r  r   Zremaining_estimater  )ZminutesTr   )r+   rV   r`  _get_issue_worklogsr   rL   rG   r	  r   r   rJ   ZCmfTimeTrackerHistoryr  r   datetimeZ	timedeltar  end_dater  )r   r   r   r4   worklogZtimetracker_historyhistoryr   r   r    _process_issue_worklog  s2    


z$JiraAPIImport._process_issue_worklogc           	      C   s   |s|S t |d}|dD ]}|d}||j |  || |dg }dd |D }|sv|dg |d< q|d d	d
d
 }|d| g |d< qt	|S )uF   
        Конвертирует "Фрагмент кода"
        r4  ZprerD   r5  c                 S   s   g | ]}| d r|qS )zcode-)ra  )r   class_r   r   r    r   	  s     
 z/JiraAPIImport._convert_code.<locals>.<listcomp>zlanguage-noner   -r*   z	language-)
r   r@  new_tagextendcontentsclearr   rL   r   r(   )	r   r4   r   souprE  Zcode_tagZ	class_tagZ
code_classrD   r   r   r    _convert_code	  s    


zJiraAPIImport._convert_codeu8   Обработка комментариев задачиc           
      C   s"  d|d  d|d d  d}d}d}|  |D ]}|d7 }| jjjj d	|d
  }tjj|d}|r|js| jjd| d|d q0|stj||| jdd}n|	dg |di | j
r| j|d | j
 |d|_|j|_|di | j
r| j|d | j
 |d|_|d |_|d |_||_| ||d |_| |jj|||_| ||jj|_||_|dr|d7 }|d d dkrtjj|d d d}	|j|	 d|_n,| jjd|d  d|d |  jd7  _q0|jdd | jdd  q0| jd!| d"|  d S )#Nu$   Комментарий задачи r   r  rl   r   r  r   r*   r   r   r  uN   Комментарий уже есть, и правился в системе zERR-0046r  Tr  z**r   r  r   r   r   Z
visibilityr  r{  r   r:   uL   Ошибка обработки приватного комментария zERR-0047r   r  r  u   Обработано u:    комментариев, из них приватных ) _get_issue_commentsr+   r   r   rJ   r   rL   r  r3   r   rG   r	  r   r  r  r   r   r   rI  r   ro  r   r  r  rl  r  r   ra  r2   r  r"  r,   )
r   r   r   r4   cntZprivate_cntr  r   Zcmf_commentr{  r   r   r    _process_issue_comments	  sV    
 

 z%JiraAPIImport._process_issue_commentsu0   Обработка плагинов задачиc           	      C   s   |j jp
d}| |D ]}|d dkr|d rt|d}|jdddid	}|d d
D ]N}|sbqX|drx|d}n|jdddid	}||dd   || qX|| t||j _q|j	r|j
dd d S )Nr   r   z&com.railsware.SmartChecklist.checklistr   r4  Zulr5  ztox-checklistr7  r  r  liztox-checklist--checkedr*   Tr   )r   r   _get_issue_propertiesr   r  r   ra  r   r(   r  r  )	r   r   r   r   Zissue_propertyr  Z	checklistvalr  r   r   r    _process_propertiesJ	  s"    


z!JiraAPIImport._process_propertiesc              	   C   s  d|d  d|d d  d}dd | j tjj d D }|d	 d
 D ]8}| jjjj d|d  }d }|dr| j|d | j	 |d}n| jj
d|  |d |d|d}|d D ]j}	|	d }
||	d }|r|d rd}
| |
|	d |	d }d|kr||d< q|d  d| |d< qtjj|ddddddgd }|s\tj| jd!|d"}|D ]}t||||  q`|  qFd S )#Nu   История задачи r   r  rl   r   r  c                 S   s   i | ]}|d  |qS )r   r   )r   rp   r   r   r    r  b	  s      z2JiraAPIImport._process_history.<locals>.<dictcomp>	changelog	historiesz	::historyr   r   r  u   Аудит без автора r   r*   )r   r   r  r   r   rp   r   r   Z
fromStringZtoStringr   z<br>r+   r   r   r  r   r  T)r+   r  r   )r   rJ   r   r   r+   r   r   rL   r	  rG   rV   r  r  r   r  r  )r   r   r  r4   Zjira_map_fieldsr  r   r   r  r]  r   rp   ZdiffZhistory_commentr   r   r   r    _process_history`	  s0    


zJiraAPIImport._process_historyu]   Обработка связей с документами Wiki и веб-страницамиc                 C   s  g }| dg D ]}| jjjj d|d  }|d }|d }|stjj |d}|shtj||| jdd}|jr|d	 |_|d
 |_||_	|j
dd q|d dkr| ddkrtd|d
 }	|	r|	d}
tjj ddd|
 gd}|sq|| d|d< q|jr||_d S )Nremotelinksr   r   objectZapplicationr  Tr  r   r  r   r  zcom.atlassian.confluenceZrelationshipz	Wiki Pagez$/pages/viewpage.action\?pageId=(\d+)r*   r   r{  r  r   r  )rL   r+   r   r   rJ   ZCmfLinkr  r   r  r  r  re  rf  r  r$  r   local_links)r   r   r  r
  Z
remotelinkZremotelink_ext_idZremotelink_objZremotelink_applinkmatchZpage_iddocr   r   r    _process_remotelinks}	  sB    





z"JiraAPIImport._process_remotelinksc              	   C   s  i }|  d}|r:|d |d r:|d |d |d< |  d}|rp|d |d rp|d |d |d< |sxd S zN|dd |D  |D ]}t|jj|||  q|jjjr|jjd	d
 W nD tk
r
   | j	j
d| d| dddd |  jd7  _Y nX d S )Nz1com.atlassian.jpo:jpo-custom-field-baseline-startrl   r   Zsched_start_datez/com.atlassian.jpo:jpo-custom-field-baseline-endZsched_finish_datec                 S   s   g | ]}d | qS )zop_gantt_task.r   r   rf   r   r   r    r   	  s     z0JiraAPIImport._process_gantt.<locals>.<listcomp>Tr   u8   Не удалось импортировать Гант u    для задачи 'r  zERR-0112ZCmfGanttTaskrx  r*   )r|   rL   r   r  Zop_gantt_taskr   r  r  r0   r+   r3   r2   )r   r   r  ZganttZbaseline_start_fieldZbaseline_end_fieldrp   r   r   r    _process_gantt	  s4    
zJiraAPIImport._process_ganttu   Обработка задачиc                 C   sL  d}| j jjj d|d d d  }tjjddd| dgd	}|s`td
|d d d  |d d d}d|d  d|d d  d}| || jtj	j
 d }tjjdd| j jjj d|d d d  gdgd|d< |d j|d< | j|d< d|d< | j jjj d|d  |d< |d |d< |d dr| j jjj d|d dd  }	tjj|	d|d< |d s| j jd|d d ddd  |  jd!7  _| d"}
|
r|d |
d |d#< |d d$rp| j|d d$| j|d%|d&< |d& sp|  jd!7  _| j jd'|d d$ d(dd  | j jd'|d d$| j tjddd) |d d*r| j|d d*| j|d%|d+< |d+ s|  jd!7  _| j jd,|d d* d(dd  | j jd,|d d*| j tjddd) |d d-r| j|d d-| j|d%|d.< |d. s|  jd!7  _| j jd/|d d- d(dd  | j jd/|d d-| j tjddd) nd0|d.< ||d1< |d2 r|d3 d4 |d2< ||d1< |pg }|r|d d d  d5|d d6 d  }n|d d6 d }d| j jjj d| d}tjjddd| dgd	|d7< |d d8r| j jjj d|d d8 d  }tjj|d|d8< |d8 s| j jd9|d d8 d:dd  |  jd!7  _| j jd;|  tj| j tj	|dd<|d gd=\}}|| ||7 }| ||jj |_| !|jj |||_| "||jj |_|d d> d? rz| #|| | j$d@r| %|| |D ]}|j&'| q|(dAdBg |d dCg |d dDg  D ]h}| j jjj dE|d  }	tj)j|	d}|s4| j jdF| dGdHd  |  jd!7  _n|j*'| q|d dIg D ]h}| j jjj d|d  }	tj+j|	d}|s| j jdJ| dKdLd  |  jd!7  _n|j,'| qT| -|| | .|| |j/dMkrtj0j|dNddOgdP}||_1|j2sd|_2|j3ddQ |d dR |_4||_5|j6r@|j3ddQ t7  | 8|| |d dSg }|rzt9| j || W n   | j j:dT Y nX | ;|| | <|| | j jjj dU|d  }tj=j|d}|stj=|| j dV}||_>| j?j@ dW|d  }dX| dY| dZ|_d[|_A|j3ddQ |jBC  | j Dd\d] |S )^u   
        Общая логика обработки которая потом разделяется на задачи и эпики
        r   r   rl   r   r   r   r{  r|  r   u$   Не проекта с ключем r   r  u   Задача r  r   r  r  r   r  r}  r  r  TZapprovedrD   securityr  Zperm_security_levelu:   Не найден уровень безопасности zERR-0048r   rx  r*   zStory Pointsr  reporterr  r  uB   Не найден автор(постановщик) задачи zERR-0049)r   exc_infocreatorr   u>   Не найден создатель(автор) задачи r  r  u6   Не найден исполнитель задачи Nr   r   renderedFieldsr   r  Z	issuetyper  r[  u'   Не найдена резолюция zERR-0116u2   Пытаемся создать задачу из r   r   r  totaltimeTrackingEnabledfix_versionslogic_prefixZfixVersionsZversions
::version:u!   Не найдена версия zERR-0050r   
componentsu%   Не найден компонент zERR-0051CmfComponentz	task.epicr  r  r   r   Zinclude_systemrl   r   r   r@  u/   Не удалось привязать тегиz
::comment:r  zbrowse/u<   Задача импортирована из Jira: <a href="r  r  rs  r   r  )Er+   r   r   rJ   rg  rL   r
  r   r   r   r   r  r  rM   CmfSecurityLevelr3   r2   rq   r	  rG   r,   rU   ZERRORr  rZ  rV   r`  r   r   r1  rI  r   r   ro  r  r   rP   r  r  r   r   r   r  r  r  r  r  r  r   r   r  r  r   r  r  r  r  Zprocess_tagsZexcepionr  r  r   r   r?   r  r  r.   r/   r"  )r   r   sprintsr-  Zproject_ext_idr   Zsimplified_projectr4   Znormalized_issuer   Zstory_p_fieldZissuetype_ext_idr  r\  r  rA  r   versionZversion_obj	componentZcomp_objZepics_folderrH  r  r  r;  r   r   r    r<  	  s.   ",

$
 
$
 .$
 .$
 0

( "

$  
zJiraAPIImport._process_issueu&   Обработка всех задачc                 C   s2   | j  }|D ]}| j r" d S | | qd S r   )r?   r   r+   r-   r<  )r   r  r   r   r   r    _process_issues
  s
    

zJiraAPIImport._process_issuesu3   Обработка связей всех задачc                 C   s:  t tdd | j d}|  D ]}| j|d | |d dD ]}| j r\  dS |d 	d}|r|d 	|d nd}| jj
j
j d|d  }|r| jj
j
j d|d  }| j	|g }|| || j|< n(|r| j	|g }|| || j|< |d 	d	g }	|	D ]}
| jj
j
j d|
d  }d
|
kr||d d|
d< | jj
j
j d|
d
 d  |
d
 d< |
| j|< nLd|
kr||d d|
d
< | jj
j
j d|
d d  |
d d< |
| j|< qqDq"| jdt| j  tjj	dd}| jD ]
}| j r  dS tjj	ddd|gdd|ggddgd}|sf| jjd| d q| j| D ]}tjj	|ddgd}|s| jjd| d qpz|j|jkrVtjjdddgddd|gdd|ggdd|gdd|ggggd }tjj	d!d}|D ]4}||_|jd"d# | jjd$| d%| d& q||_|jd"d# nb| jjd'| d(| d) |j d*| }tjj	|d+}|stj||||| jd,}|jd"d# W nR tk
r } z2| jjd-| d.| d/d0d1d2 |  jd37  _W 5 d}~X Y nX qpq| jj !  dd4d!d5d6}| jj"d7t| j#   | j$ D ]\}}| j rt dS z>| jj
j
j d|d8 d  }|	|d8 d9 }|rtjj	|d}ntjj	|d+}|stjj	d9d|d8 d9 gd }|s6tj|| j|d8 d9 d:}|d8 d; |_%|d8 d< |_&|jd"d# tjj	|d d dgd}|s| jjd=|d d  d>|d d  d? W qXtjj	|d
 d dgd}|s| jjd@|d
 d  d>|d
 d  d? W qX| jj
j
j d|d  }tjj	|dgd}|stj||| jdA}|jj'dkr|j|ksD|j|krtjj	d!d|_|j|krj|}|}n|j|kr~|}|}| jjd$| d%| d& ||_(||_)|jd"d# W np   |  jd37  _| jjdB|d8  dC|d d  d>|d d  dD|d
 d  d>|d
 d  dEdFd1d2 Y nX qX| jj !  dS )GuD   
        Постобработка связей задач
        c                 S   s   |  di  ddkS )Nrr   rs   z'com.pyxis.greenhopper.jira:gh-epic-linkrt   ru   r   r   r    rx   
  ry   z2JiraAPIImport._process_relations.<locals>.<lambda>Nr   r   rl   r   r   Z
issuelinksr   r   )r   r   r   r   u   Подзадачи: zsystem.additional_parentrC   r  r   rD   r   r}  uP   Не удалось связать задачи, возможно задача 'u#   ' не попала в импортparent_taskr  zrelation_type.coder  zsystem.finish:finishin_linkout_linkr   zsystem.linkTr   u,   Тип связи родительской 'u$   ' и дочерней задачи 'ud   ' изменен с 'Блокируется/Блокирует (ОО)' на 'Относится к'.u   У задачи 'u3   ' эпик(родительская задача) 'uo   ' из другого проекта. Создана связь 'Дополнительный родитель'z:additional_parent:r  )r$  r%  relation_typer   r+   u<   Не удалось создать связь задачи 'u&   ' с дочерней задачей 'r  zERR-0114r   rx  r*   zsystem.duplicatezsystem.clone)ZBlocksZ	DuplicateZRelatesZClonersu   Связи: r  r   )r   r+   r   ZinwardZoutwardu=   Не удалось найти входящую задачу r  u   ). Возможно задача не попала в импорт или находится в проекте, который еще не импортирован.u?   Не удалось найти исходящую задачу )r&  r   r+   u.   Не удалось создать связь z. in_link: z), out_link: rq  zERR-0052)*rz   r{   rg   ro   r   r   rE  r+   r-   rL   r   r   rR   r   rQ   r,   r   rJ   ZCmfRelationTyper   rV   r  r   ZCmfRelationOptionr   r&  r  r#  r   r0   r3   r2   r.   r/   r`  ri  r   Zin_type_nameZout_type_namerD   r$  r%  )r   Zepic_link_fieldr   r   Zissue_parentZissue_epic_keyr   Zparent_ext_idZ	sub_tasksZissue_linksZ
issue_linkZlink_ext_idr&  r#  Zchild_ext_idZ
child_taskZ	relationsZrelation_optionZrelation_ext_idr  Z	map_namesZissue_relationZrelation_coder$  r%  Z
rel_ext_idr   r   r    _process_relations
  sl   "




&
&

(


 
 
Fz JiraAPIImport._process_relationsu)   Обработка компонентовrf  c              	   C   s:  t jjddd|d  dgddgd}t jj|ddd	gd
}|sNtd| | |d D ]}z|jszd|_|  | j	 rW  dS | jj
j
j d|d  }t jj|ddddddgd}|st j|| jdd}||_|d |_||_|dr | j|d | j d|d  d|_nd|_|d dkr>|j|_nD|d dkrV|j|_n,|d dkrn|j|_n|d dkrd|_|jr|jr|jdd  |d!d"r|js|  d|j_|jjr|d!d"|j_|jjjdd  | j jd#7  _W q\   |  jd#7  _| jjd$| d%d&d' Y q\X q\dS )(uG  https://docs.atlassian.com/software/jira/docs/api/REST/1000.824.0/#api/2/project-getProjectComponents
        Пока грузим как списки, после доработки будут отдельные обекты

        Args:
            project_info (dict): проект из джиры как есть
        r   r{  r|  r  r  r}  r  Tr  r  uV   Данный тип проекта не поддерживает компоненты r   Nr   descr_documentdefault_ownerdefault_responsibler  r   r   r  r  r   r  u   Компонент r  ZassigneeTypeZPROJECT_DEFAULTZPROJECT_LEADZCOMPONENT_LEADZ
UNASSIGNEDr   r   r   r*   u3   Ошибка загрузки компонента ERR-0053r  rx  )rJ   rg  rL   r   r(  _get_project_componentsr  r  r+   r-   r   r   r  r   r   r   r	  rG   r)  r  r*  r  r  r  r(  Zcreate_descr_documentZ
text_draftr   r  r2   r3   )r   r/  ry  r   r!  r   Zcomponents_listr   r   r    rp  }  sl    
  





 z!JiraAPIImport._process_componentsu   Обработка версийc              	   C   s  t jjddd|d  dgdgd}t jjd|dgd}t jjd	|dgd}| j|d
 dD ]x}z>| j rxW  d S | jjjj d|d
  }t j	j|d}|st j	|| jdd}t j
jdd|_||_|d |_|dd|_|jj|_|jr
|jr
|jdd |d r||_n||_|jjsBd|j_|jjdd |jrt|d s^|d rj|d n
|d |jr|jr|jdd | j jd7  _W q\   |  jd7  _| jjd| ddd Y q\X q\d S )Nr   r{  r|  z"scheme_wf.default_release_workflowr}  releaser  )r   r   rl   r   r   r  r  r  Tr  zlist.release:defaultrC   r   r   r   r   ZarchivedZreleasedr  r  r*   u+   Ошибка загрузки версии r+  r   rx  )rJ   rg  rL   r   _get_project_versionsr+   r-   r   r   r   r  r  r   r   r   r  Zdefault_release_workflowr  r  r  r  r   r  Zset_default_statusr  r2   r3   )r   r/  ry  Zrelease_folderr  r   r   Zversion_listr   r   r    ro    s^    





 zJiraAPIImport._process_versionsu*   Обработка JQL в фильтрахc                 C   s  t | }t| jjjj}t }tjj	dddgdddggddd	d
gd}|D ]"}d|j
 d|j d}|jspqL|jjd}|s|jjd}|s|jjd}tj| jjjjj}|jjdi dd}	|r|j|	krqL|sqLz^|||\}
}|
|_tj|dd|_|jdd | jjd| d| d|
 d| d	 W qL   | jjd| d| ddd  Y qLX qLt | }| jjd!|d"d# dS )$uP   
        Пост обработка JQL в фильтрах задач
        r+   r  Nr  r   Tr  ubql2bqlr   r}  r  " (rq  jqlrA  ZjqlQueryZapplinkZrpcUrlr   FZensure_asciir   u   Фильтр z: JQL u%    переобразован в UBQL2 z (BQL: "z")u0   : ошибка преобразования JQL zERR-0066r  rx  uC   Обработка JQL в фильтрах выполнена за .3f    сек.)r   r(   r+   r   r   r  process_timerJ   r  r   r   rD   r  r   rL   rb  rc  r2  Zext_urlnetlocZget_modifiedr/  rb   r  r0  r  rV   r`  r3   )r   r2  r   t1Ztask_filtersZtask_filterZ
filter_msgrA  rF  Zapplink_urlr/  r0  t2r   r   r    _process_jql_in_filters  sP    

z%JiraAPIImport._process_jql_in_filtersu   Обработка аудитаc                 C   s   dS )u)   
        Грузим аудит
        Nr   r   r   r   r    _process_audit'  s    zJiraAPIImport._process_auditu2   Обработка логических типовc                 C   st  dddddddddddddddd}|  dD ]>}| jjd|  | j rX d	S |d
r|d
 d d  d|d  }n|d }| jjjj d| }tj	jddd| dgdgd}d| jjjj d}|r6t
t||jjdkr6| jjd| d|j  t|dt|j|_|jdd d	}|r>q.|d|d  }|d  }| jjd| d tj	jdd |gdd!gd}|r~|jr@|d
rd| jjjj d|d  d}	|jj|	d|_d| |j }
t
t||
dkr8| jjd"| d#| jjjj dd$|d%d& |  jd7  _n|
|_nd| d|_||krp||jkrp|j| |jdd q.| jjd'| d( || }|s|| d}| jjjr|d) d*krd}n|d) dkrd}n|d+ rd}tj	jd,d-|gd.gd}tj	||d/ d0|t|jd| d| jd1}||krP|g|_|  t  | j jd7  _q.d	S )2u$   Маппим issueType в logic_typeztask.sub:defaultztask.userstory:defaulttask.agile:defaultztask.bug:defaultztask.epic:default)zsub-taskr  u   подзадачаz
user storyZ	userstoryZstoryu   историяr   u   задачаZbugu   багu   ошибкаZdefectu   эпикr  r  u-   Обрабатываем тип задачи NZscoper   r   r  r   r   r{  r  r  r}  rp  z::\d+)::r*   u   ext_id типа задачи r~  r   Tr  ZuntranslatedNamer   u2   Поиск типа задачи по имени 'r  r  rD  uW   Ошибка объединения одноименных типов с именем 'u*   ': одинаковый источник 'zERR-0118r  )r4   ry  u   Тип задачи 'u2   ' не найден. Создание новогоr  rX  r  rD   r   ui_colorr   r   )r   r   r  r  r=  r   r+   ) r   r+   rV   r`  r-   rL   r   r   rJ   r  r   re  findallr   r   r  r  r(   r  r  rG  r3   r2   rD  r   rC  r?   rH   rI   r=  r  r  )r   Z	name2coder  r  r  r  Zext_id_patternZissue_type_nameZissue_type_aliasZlogic_type_ext_id_oldZlogic_type_ext_id_mergedZtemplate_coder  r   r   r    _process_issue_type/  s    

 



	
z!JiraAPIImport._process_issue_typeu2   Обработка бизнес-процессовc                    sb  i } dD ]}|||d < q dD ]0}j r@ dS jj|d d   jjjj d|d d  d|d d  }tjj	|dstjj	d	d
}tj||jd|d _
|d d _jdd |d D ]}||d   qtjjddgdddggdgdD ]@}tjj	dd|jgddgdddggdsPq|jdd q|d D ]}j r  dS jjjj dj d|d  }tjj	|d}	|	stj|jdd}	|	jsjjd|	j dj d qh|d |	_|d |	_
fdd|d D }
tjjdd |
gd|	_t|	jt|
ksXtd!jjjj dj d|d"  }tjj	|d}|d#  }|d$kr|rd|_|jdd% ||	_|	d&r<|d& d  tt fd'd( d)d}z||	_W n8   jj d*  d+|	j d,j d-d.d/d0 Y nX |	jdd qhj j!d17  _!q*dS )2u   Импортируем workflowr  r   r  Nr   r   ZentityIdr  r<  rC   r  r   Tr   r  r   r   r  r}  r  r   r  r  r  r  r  r  r  c                    s*   g | ]"} j jjj d j d | qS )r   )r+   r   r   r   )r   st)r   r  r   r    r     s     z3JiraAPIImport._process_workflow.<locals>.<listcomp>r  r  uN   DEV: Fatal Вероятно, сломали создание статусов!r  r  r  r  r  c                    s   t | dt  kS r[  r
  r  r  r   r    rx     ry   z1JiraAPIImport._process_workflow.<locals>.<lambda>r  r  r  r  r  r  r  r  r*   )"r   r+   r-   rV   r`  r   r   rJ   r  rL   r   r   r  r  r  r   r  r  r   r  r  r  r  r   r(  rC  r  r  rz   r{   r+  r,  r3   r  )r   Zjira_statusesr1  Zjira_workflowZworkflow_idZtemplate_workflowr   r4  r  r  r  r  r  r  r5  r   )r  r   r  r    _process_workflow  s    
,

 
"

"
zJiraAPIImport._process_workflowu    Обработка схем БПc                 C   s  |  dD ]}| j r  d S | jjjj d|d  }tjjdd| dgd}|sjtd|d  | jjjj d|d	  }tj	j|d
}|stj	jdd}tj	||| jdd}|j
r|d |_|dd|_||_||_||_|jdd n| jjd|j d g }|d  D ]v\}}	| jjjj d| }
tjjddd|
 dgd}tjjdd|gdd|ggd}|r|j
s| jjd|j d|j d|j d ||j q|sFtjjdd|gdd|gdddgdd d ggdd!}|r2| jjd|j d|j d|j d" ||j qtjd#||| jd$}| jjjj d|	 }tjjdd| dgd}||_|jdd ||j qtjjd%d&|gdd|gdd d ggdd!}|D ]}|jdd' q| j jd(7  _q
d S ))Nr  r   ZdefaultWorkflowr   r{  r  r   u+   Не импортировался workflow r   r  r  rC   Tr  r   r   r   r   r  r  ZissueTypeMappingsr  r  r  r  r  r  r  r  r  r+   r  r  r!  r   r"  rD   r#  r  r*   )r   r+   r-   r   r   rJ   r  rL   r(  r  r  r   r   r  r  r  r  rV   r  r   r  r  rD   r   r  r   r  r  )r   r  Zdefault_task_workflow_ext_idr  Zwf_scheme_ext_idr6  r  r7  logic_type_idworkflow_namer  r  r  r  r  r8  r   r   r    _process_workflow_scheme  s    

	z&JiraAPIImport._process_workflow_schemec                 C   sH   t jj}| dD ]0}|| j}|| jj d| t	
| qd S )Nr   rJ  )rK  rL  rM  r   rL   rG   r  r+   r   rN  r  )r   rQ  rG  r   r   r   r    _cache_all_usersx  s    zJiraAPIImport._cache_all_usersu   Простой дампr:   c              	   C   s   | j  | d}| j  | d}| r>t| t|d6}| D ](}| j  jd7  _|t	
|d  qPW 5 Q R X t|| | j jdd t  d S )N.jsonz.json.dirtyr  r*   r  Tr  )r+   r^   r_   r`   ri   r  ra   json_object_countr  rb   r  rh   rk   r  r  )r   Zapi_funcr   re   rm   rf   r  r   r   r    _simple_dump~  s    

 zJiraAPIImport._simple_dumpc              	   c   sN   | j  | d}| rJt|d}|D ]}t|V  q.W 5 Q R X d S )NrF  r+)r+   r^   r_   r`   ra   rb   rO  )r   r   re   rf   r  r   r   r    r     s    zJiraAPIImport._simple_getc              
   c   s   | j  d}| rt|D ]d}|dr2q"|drX| j jd| d|  q"t	| d| dd}t
|V  W 5 Q R X q"d S )Nr   .dirty.metau(   Пропускается каталог r  
/info.jsonrI  )r+   r^   r_   r`   ri   listdirr#  rV   r  ra   rb   rc   )r   r  r  rf   r   r   r    r     s    

zJiraAPIImport._get_projectsc                 C   s&   |   D ]}||d kr|  S qd S r[  )Zget_projects)r   r  r/  r   r   r    get_project  s    zJiraAPIImport.get_projectc              
   C   s@   | j  d|d}t|d}t|W  5 Q R  S Q R X d S )Nr   workflows.jsonrI  )r+   r^   r_   ra   rb   rc   )r   r  workflows_filerf   r   r   r    r    s    
  z/JiraAPIImport._get_simplified_project_workflowsc              	   c   sH   | j  d|}t| dd}|D ]}t|V  q(W 5 Q R X d S )Nr   /issue_types.jsonrI  r+   r^   r_   ra   rb   rO  r   r  r  rf   r  r   r   r    r    s    z*JiraAPIImport._get_issue_types_for_projectc              	   c   sH   | j  d|}t| dd}|D ]}t|V  q(W 5 Q R X d S )Nr   /statuses.jsonrI  rR  rS  r   r   r    r%    s    z'JiraAPIImport._get_statuses_for_projectc              	   c   sH   | j  d|}t| dd}|D ]}t|V  q(W 5 Q R X d S )Nr   /roles.jsonrI  rR  rS  r   r   r    rk    s    z JiraAPIImport._get_project_rolesc              
   c   sV   | j  d|d}t|D ]2}t| d| dd}t|V  W 5 Q R X qd S )Nr   rS   r  rL  rI  r+   r^   r_   ri   rM  ra   rb   rc   )r   r  	board_dirr  rf   r   r   r    r    s    z!JiraAPIImport._get_project_boardsc              
   c   sV   | j  d|d}t|D ]2}t| d| dd}t|V  W 5 Q R X qd S )Nr   r  r  rL  rI  rV  )r   r  sprints_dirZ	sprint_idrf   r   r   r    r    s    zJiraAPIImport._get_all_sprintsc              	   c   sH   | j  d|}t| dd}|D ]}t|V  q(W 5 Q R X d S )Nr   /versions.jsonrI  rR  rS  r   r   r    r.    s    z#JiraAPIImport._get_project_versionsc              	   c   sH   | j  d|}t| dd}|D ]}t|V  q(W 5 Q R X d S )Nr   /components.jsonrI  rR  rS  r   r   r    r,    s    z%JiraAPIImport._get_project_componentsc                 C   s<   d}| j  d|d}| r8tdd t|D }|S )Nr   r   r   c                 s   s   | ]}| d  V  qdS )rJ  rK  N)r#  )r   entryr   r   r    	<genexpr>  s     z5JiraAPIImport._count_project_tasks.<locals>.<genexpr>)r+   r^   r_   r`   sumri   rM  )r   r  r  	tasks_dirr   r   r    rE    s
    z"JiraAPIImport._count_project_tasksr   r  c              
   c   s   | j  d|d}| s:| j jd| d|  d S tt|D ]\\}}||k rZqH|	drfqH||| krv qt
| d| dd}t|V  W 5 Q R X qHd S )	Nr   r   u   Каталог u    отсутствует. Возможно он был удален или еще не создан. Необходимо повторно запустить импорт проекта r[  r  rL  rI  )r+   r^   r_   r`   rV   r  r   ri   rM  r#  ra   rb   rc   )r   r  startr   r_  iZtask_idrf   r   r   r    r     s    
zJiraAPIImport.get_project_tasksc                 C   s$  |d d }i }|d D ]f}|d dkr*q|d   D ]F\}}||d|i}|di }||d s6t|d	 ||d < q6q| D ]}i }	|d   D ] \}}
|	|
t }|| qi |d< |	  D ]8\}}t|d
kr||d d< q|D ]}||d |< qqqdd | D |d< |S )u   
        Создает структуру схемы экранов проекта из данных плагина "Smart Jira Configuration"
        schemesZissueTypeScreenSchemeglobalActionsr   )BROWSEPROJECTSCREATEISSUES
EDITISSUESr  issueTypeIdactionsr  r*   r  c                 S   s   g | ]}|qS r   r   )r   vr   r   r    r     s     z<JiraAPIImport._get_project_screen_scheme.<locals>.<listcomp>r  )r   r*  rL   r   ro   r  r  r   )r   smart_configscreen_schemer  r   r  r   r  rh  Zissue_type_screensr  r  Zissue_type_screenr   r   r    _get_project_screen_scheme  s0    z(JiraAPIImport._get_project_screen_schemec           
      C   s   t |d d}| r$t| |  |d d }|D ]}|d }z`| jjd| d | j	
tj|}|d| d	}t|d
}|| W 5 Q R X W q< tk
r }	 z$| jjd| d|	 dddd W 5 d }	~	X Y q<X q<d S )Nr  r  r  r  r   u(   Дамп бизнес-процесса 'u   ' как XMLr  r  r]   uB   Не удалось получить бизнес-процесс 'u   ' как XML: r  r  rd   ry  Z
error_type)r   r_   r`   rh   rmtreemkdirr+   rV   r`  r?   Zget_workflow_as_xmlrb  rc  quotera   r  r0   r3   )
r   r/  r0  r  r  rC  r3  r2  rf   r  r   r   r    _get_project_workflows_as_xml  s(    
z+JiraAPIImport._get_project_workflows_as_xmlc                 C   s  dd | j j|dD }g }|r.| j |}n&| j jdd}|dt|d d d	d |D }i }|D ]}t|d
 }	t|d }
| j |
D ]t}||d |d i d}|	dkr|D ]*}||krq||d |d d|d |< qq|	|d |d d|d |	< qqj|S )Nc                 S   s   g | ]}t |d  qS r  r(   r  r   r   r    r   -  s   z>JiraAPIImport._get_field_config_issue_type.<locals>.<listcomp>r  T)Z
is_defaultr  r   )rg  fieldConfigurationIdc                 S   s$   g | ]}|d  dkrt |d  qS )rg  r  rr  )r   field_configurationr   r   r    r   @  s   rg  rs  )r   contextisHidden
isRequired)ZissuetypeIdrv  rw  ru  )r?   get_issue_for_projectZ"get_field_configuration_issue_typeZget_field_configr   r(   Zget_field_config_fieldsr*  )r   field_configuration_scheme_idr  Zissue_types_projectZfield_configuration_mappingZfield_config_defaultZissue_types_schemefields_usedrt  r  Zfield_configuration_idrp   
field_usedr  r   r   r    _get_field_config_issue_type+  sN    
z*JiraAPIImport._get_field_config_issue_typec                 C   s  | j |}| ||}| D ]X}|d }|ds:q | j ||}|sNq | j ||}z| j ||}W nz tk
r }	 z\i }|  j	d7  _	d| d| d|	 }
t
|	dr|
d|	jj 7 }
| jj|
d	d
dd W 5 d}	~	X Y nX | j ||}|dr:|d  D ]&\}}|| |dk	r||d< qq |D ]:}|d |}|sZq>|| |dk	r>||d< q>q |S )u   
        Возвращает список используемых полей в проекте
        в виде сруктуры как через плагин "Smart Jira Configuration" в box версии
        r   customfield_r*   u9   Не удалось получить опции поля u    в контексте r>  responsez HTTP: Response text -> zERR-0109rS  rd   rm  NisAnyIssueTyperu  options)r?   Z&get_project_field_configuration_schemer|  ro   ra  Z!get_field_context_project_mappingZget_field_contextZget_field_context_optionr0   r2   hasattrr~  r   r+   r3   Z#get_field_context_issuetype_mappingrL   r   r  )r   r  ry  rz  r{  Zfield_used_idZ
context_idru  Zcontext_optionr  Z
error_textZcontext_issuetypesr  Zcontext_issue_typer   r   r    _get_project_fields_usedg  sL    





z&JiraAPIImport._get_project_fields_usedc                 c   sB   |d  d}t |D ]$}|dkr&q|| d| dV  qd S )Nr  z/attachmentsall_attachments.zipr  )r  re   )ri   rM  )r   r   Zattachments_pathr  r   r   r    r)    s
    z$JiraAPIImport._get_issue_attachmentsc              	   c   s>   |d  d}t |d}|D ]}t|V  qW 5 Q R X d S )Nr  z/comments.jsonrI  )ra   rb   rO  )r   r   comments_file_pathrf   r  r   r   r    r    s    z!JiraAPIImport._get_issue_commentsc              	   C   s6   |d  d}t |d}t|}W 5 Q R X |p4g S )Nr  z/worklog.jsonrI  ra   rb   rc   )r   r   r  rf   r7   r   r   r    r    s    z!JiraAPIImport._get_issue_worklogsc              
   C   s:   |d  d}t |d}t|W  5 Q R  S Q R X d S )Nr  z/properties.jsonrI  r  )r   r   Zproperties_file_pathrf   r   r   r    r    s    z#JiraAPIImport._get_issue_propertiesc              
   C   s:   |d  d}t |d}t|W  5 Q R  S Q R X d S )Nr  z/watchers.jsonrI  r  )r   r   Zwatchers_file_pathrf   r   r   r    r    s    z!JiraAPIImport._get_issue_watchersc              
   C   sD   | j  d}| r@t|d}t|W  5 Q R  S Q R X i S )Nglobal_settings.jsonrI  )r+   r^   r_   r`   ra   rb   rc   )r   global_settings_file_pathrf   r   r   r    rO     s
    z'JiraAPIImport._get_jira_global_settingsc              	   C   sJ   | j  }| j d}t|d}t|| W 5 Q R X |d | _d S )Nzcloud_id.jsonr]   ZcloudId)	r?   Zget_cloud_idr+   r^   r_   ra   rb   rd   rN   )r   data	data_filerf   r   r   r    _get_cloud_id  s
    
zJiraAPIImport._get_cloud_idc              	   C   s@   | j  }| j d}t|d}t|| W 5 Q R X d S )Nr  r]   )r?   Zget_jira_global_settingsr+   r^   r_   ra   rb   rd   )r   Zglobal_settings_datar  rf   r   r   r    _dump_jira_global_settings  s    
z(JiraAPIImport._dump_jira_global_settingsu/   Обработка ссылок в тексте)r   attachments_dirr   c                    s  d}|s|S t |ddd D ]2}d}|dr8d}|j| }z|drh| jjd|  W q |d	stj	
| jj|}|| jjs| jjd
|  W q t|dd \}}	|s| jjd|  W q tdtj	|}
|
r`|
d  |
d dd} |d kr`|d d }tt fdd|d }|r`| jjd|  W q tj	|dd dd }tj|}||}tjj||d | jjjjd}|stj| j||d | jjjjd}||_||_d|_|   |j!"  W q  t#k
rR } z2| jj!$  | jjd| d|  |d7 }W 5 d }~X Y q X q t |d}|jddid D ]}|jd!r| %|jd! |d"  nb|jd#r| %|jd# |d"  n<tj	&|jd }tj	'|j(}| %|d$ d ) |d"  qp|S )%Nr   Zlxmlc                 S   s   |  dp|  dS rR  rT  rV  r   r   r    rx     ry   z+JiraAPIImport._dump_links.<locals>.<lambda>rS  r;  zmailto:u   Это почта: httpuH   Это внешняя ссылка, оставляем как есть: rY  u   Это не файл: rZ  r*   rs  rA  rl   r  c                    s   |  d kS r[  rt   r\  r^  r   r    rx     ry   uE   Этот файл уже обработан во вложениях: r  rX  r   r;  
obj_ext_idr   r+   r;  r  r   Fu0   Не удалось скачать ссылку r>  r4  r5  r6  r7  r9  r  r:  r   )*r   r@  rU  r8  ra  r+   rV   r  rb  rc  urljoinr?   r  rh  ri  r   re  rf  rd  rz   r{   rJ   r$  r%  r_   CmfImportDownloadrL   r   r   pathr   
downloadedr  r.   r/   r0   r1   r  r2  r3  rA  rC  )r   r   r  r   r2   rE  r   r  rm  encodingrj  Zattach_filenamerk  rl  r  re   download_jobrH  rD  rF  rA  r   r^  r    _dump_links  s~    



 



 zJiraAPIImport._dump_linksc                 C   s   | j D ]}| j | d sq||s&q|| di }| D ]z}|dsNq>|d |d |d |d d}|drd	d
 |d  D |d< | j | dg }||kr||  qq>q| | j  dS )u   
        В box версии, контексты полей получаем из плагина "Smart Jira Configuration"
        rs   ru  r   r   isGlobalContextr  )r   r   r  r  r  c                 S   s   g | ]}|qS r   r   )r   optionr   r   r    r   '  s     z5JiraAPIImport._get_field_contexts.<locals>.<listcomp>N)rg   rL   ro   r*  r   rn   )r   rz  r~   Zcontextsru  Zcontext_dataZfield_contextr   r   r    _get_field_contexts  s*    




z!JiraAPIImport._get_field_contextsc                 C   sL  | j |d }| jD ]"}| j| d s,q|d |s<q|d | d}|r|D ]}|ds|| jd| tj qV| j jj	r| j| dg D ]*}|d |d kr|dr|d |d< qqV|| j| d krV| j| d 
| qV| j| d	 d d
dd }|dkr@|d | }|r:| || j |d  q|dkr|d | pZg }	|	D ]}| || j |d  q`q|dkr|d | }
|
r:| |d | |d  q|dkr|d | pg }|D ]}
| |
|d  qq|dkr|d | }| j| dg }|r|| tt|| j| d< q| | j dS )u   На коробке только через мету задачи можно получить варианты выбора полей

        Args:
            issue (dict): задача
        r   rs   rl   ZallowedValuesr   u   Выбор без id: r  childrenrr   r  r*   rX  
userpickerr  multiuserpickergrouppickermultigrouppickerr@  N)r?   Zget_issue_metarg   rL   r+   r,   rU   r  rH   rI   r   r   r  rG   r  r  r   r  rn   )r   r   metar~   r  r  Zcur_optcustom_field_typesr   r   r  r  ro   r   r   r    _get_field_options/  sV    







z JiraAPIImport._get_field_options)r   r  c              	   C   sR   | j | j|d |}t|d d}t|d}tj||dd W 5 Q R X d S )Nr   r  rO  r]   Fr3  )r?   Z get_simplified_project_workflowsrN   r   r_   ra   rb   rd   )r   r   r  r  rP  rf   r   r   r    "_dump_simplified_project_workflowsj  s    z0JiraAPIImport._dump_simplified_project_workflows)last_dump_datenew_dump_datec	           "      C   s  t dd || _d}	| jjd| d|  zX| jj|d ||||dD ]6}
z z| j rW W 
 W W 5 Q R  dS | jjd	|
d
  d |	t
|
d }|	t
|
d d }| rt|| |jdd ||
d< | |
 |	d}|
d d r~| jjdt|
d d   ztj| jjd|
d  d}| jjjrxtj| jjd|
d  d}d}|	|}| jjjj d|
d  }tjj||| jjjjd}|stj| j||| jjjjd}||_||_d|_|  |j  W nD tk
rF } z$| jj dt! d| dddd  W 5 d }~X Y nX |
d d D ](}|d!rT| "|d! | j# | qT| j$d"r@|	d#}| rt%| t&|d$}| j'|
d }|D ]^}|d!i | j#r| "|d! | j# | |d%i | j#r| "|d% | j# | qt()|| W 5 Q R X |
d& d' D ](}|d!rL| "|d! | j# | qL|
d d(r| "|
d d(| j#| |
d d)r| "|
d d)i | j#| |
d d*i r| "|
d d*i | j#| |  j*| +|
d+ d, ||
7  _*|	d-}| rDt%| | jjd. t&|d/}| j,|
d D ]}|d!i | j#r| "|d! | j# | |d%i | j#r| "|d% | j# | |-t(.|d0  | j j/d7  _/| j0d1 |  j*| +|d2 ||
7  _*qnW 5 Q R X | jj1|
d |
d3< | j2|
d }|	d4}t&|d$}t()|| W 5 Q R X | j3|
d }|D ]}| "|| j# | q|	d5} t&| d$}t()|| W 5 Q R X t|| |jdd |	d6}!t
|4dd7|
d< t&|!d$.}t()|
| | j j/d7  _/| j0d8 W 5 Q R X W n.   |	d7 }	| jj d9|
 d:ddd  Y nX W 5 | jj  X qPW n.   | jj5d;|d<  d= |	d7 }	Y nX |6|	 W 5 Q R X d S )>NFr:  r   u   Задачи с u    до r   )r`  r  r  r  r*   u   Задача 'r   r  rJ  Texist_okr  rk  rl   r  u%   Обработка вложений: zsecure/attachmentzip/z.zipzsecure/issueAttachments/r  r   r  r  r  r>  zERR-0054r   rd   rm  r   r  zworklog.jsonr]   r  r  r  r  r  r  r  r   zcomments.jsonu#   Дампим комментарииr  r  r  r   r  zproperties.jsonzwatchers.json	info.jsonr   r   u0   Не удалось скачать задачу zERR-0111u2   Не получить задачи проекта r   u    с сервера)7r   r?   r+   rV   r`  Zget_all_project_issues_duringr.   r/   r-   r_   r(   r`   rh   rk   ro  r  r   ri   r  r   r  rH   rI   r   r   rJ   r  rL   r   r  r  r0   r3   r/  r  rG   rP   r  ra   Zissue_get_worklogrb   rd   r2   r  Zget_commentsr  r  rG  r"  Zget_issue_remotelinksZget_issue_propertiesZget_watchersrG  	exceptionr=  )"r   r`  r  r_  r/  r?   tasks_that_are_doner  r  r-  r   Ztask_dirZtask_dir_tmpr  r;  r  Zattach_file_pathr   r  rH  r.  Zworklog_file_namerf   Zworklogsr  r  Zcomments_file_namer  Z
propertiesZproperties_fileZwatchersr  Zwatchers_fileZ	info_pathr   r   r    _dump_task_party  s     


 


  


   


*


zJiraAPIImport._dump_task_partr/  r  r  r  c                 C   s  t jj}t|d  d}|jdd | j }d}t|| j d }	|	sNd}	d}
g }d}||kr|
|	 |	 }||kr||}| j	j
| jd|
 |
|	 |||t| jj| jj| jj| jj| jj| jjjd	|||d
d}|| |  | jjd|  |
d7 }
qZ|	d }| jjd|	 d |D ]8}|j|d | r(| jjddddd tdq(| jjd | s|| 7 }qp| jjd|  | j |d | !|d dD ]}| j" r|  S t|d #d}| j$ #d}| j$ #d}|% rt&'|| t(|d}t(|dx}t(|db}|D ]V}||krD|)| t*+|}|| j,}|rD|-| jj. d | t/0| qDW 5 Q R X W 5 Q R X W 5 Q R X |1  t&2|| t|d #d!}| j$ #d!}| j$ #d"}|% rt(|d#3  t&'|| t(|dR}t(|d<}t(|d&}|D ]}||krL|)| qLW 5 Q R X W 5 Q R X W 5 Q R X |1  t&2|| q|S )$Nr  /tasksTr  r   r*   r   Z
dump_tasks)r  r   tokenpassword
verify_sslrI   )r`  r  r_  r/  r?   r  r  r  targetr   r6   u$   Форкаем _dump_task_part proc=r  u%   Таймаут дампа задач u    минут)timeoutu$   Возможно завис дампzERR-0055r   rd   rm  u"   Ошибка дампа задачuK   Закончили параллельное скачивание задачu   Ошибок: r   r   r  r  zusers.json.newr  r  rJ  r  zgroups.json.newa)4rK  rL  rM  r   ro  r   Queuer   r   r   Threadr  r   r?   r  r   r  r  r  rH   rI   r   r`  r+   rV   r`  r   is_aliver3   TimeoutErroremptyrL   r   rE  r-   r_   r^   r`   rh   r*  ra   r  rb   rO  rG   r  r   rN  r  unlinkrk   close)r   r/  r  r  r  rQ  r_  r  r-  r  ra  r  Z	max_limitr  r  r   Zissue_users_pathZall_users_pathZall_users_path_newf1f2Zf3linerG  r   Zissue_groups_pathZall_groups_pathZall_groups_path_newr   r   r    _dump_tasks  s    

 


  
"



B

,zJiraAPIImport._dump_tasksc              	   C   sJ  | j jd|d  d|d  d | j|d }|r|dsi }| jjjrb| j|d }n<|dg D ].}|d d	krn|d
 D ]}|d ||d < qqn|dg D ]R}g |d< ||d g D ]4}|d 	| |d dkr| 
|d | j   qqt|d  d}	|	 r$t|	 t|	d}
t||
 W 5 Q R X d S )NuH   Дамп схемы безопасности задач проекта "r   r1  r   rq  r   r  rc  ZBROWSE_PROJECTSr  rm  levelsr  r   r   r  /issue_security_scheme.jsonr]   )r+   rV   r`  r?   Z!get_project_issue_security_schemerL   rH   rI   Z get_issue_security_level_membersr   r  r^   r   r`   ri   r  ra   rb   rd   )r   r/  rj  Zsecurity_schemeZsecurity_level_membersr   security_levelrW   member	dump_filerf   r   r   r    #_dump_project_issue_security_schemeT  s.    


z1JiraAPIImport._dump_project_issue_security_schemec                 C   s   | j jd t|d  d}| r2t| t|d}i }z"d}| jj	|d d
|d}W n: tk
r } z| j jt|d	d
dd W 5 d }~X Y nX t|| |W  5 Q R  S Q R X d S )Nug   Дампим конфигурацию проекта через плагин "Smart Jira Configuration"r  z/smart_config.jsonr  )	ZprojectInformationZprojectSchemesZprojectIssuetypesZprojectVersionsZprojectComponentsZprojectMembersZprojectCustomfieldsZprojectGlobalActionsZprojectWorkflowActionsr   r   )r  ERR-0056rg  rd   rm  )r+   rV   r`  r   r`   ri   r  ra   r?   Zget_project_smart_configr   r0   r3   r(   rb   rd   )r   r/  Zsmart_config_filerf   rj  r  r  r   r   r    _dump_smart_configq  s$    
 z JiraAPIImport._dump_smart_configEtc/UTC%Y-%m-%d %H:%M)dttzformatr@   c                 C   sN   | pt j t jj|} t|}tjt j | ||}||}|S r   )	r  nowtimezoneutcstrftimepytzZlocalizestrptimeZ
astimezone)r  r  r  Zdt_tzZdt_strr   r   r    _datetime_in_user_tz  s
    

z"JiraAPIImport._datetime_in_user_tzc           ;      C   s  dd l }| jd d d }|d s*tddd |d D | _| j d	}|jd
d t| j}t	d| }| jD ]`}|d }|d }z| j
 rW  d S | j jd7  _| jjd| d ||}	|| d}
|	d}| jjjr| jjj| jjd}n| jjj| jjd}|r4|d d nd}d }| rt|d}t|}|d}W 5 Q R X |r| ||}tjtjjd}| ||}|	 rt|	|
 nt j!|
d
d t"# }| jj$|d }t%|
|d< d }| jjjs
| &|}| jjd t'|d  d}| r>t (| t|d}| j)|d }zx|d  D ]j}|d! d" d#krd| jjjr|d! dr| *|d! d | j  n| *|d! d$ | j  qdW n(   | jj+d%| d&d'd(d)  Y nX t,|| W 5 Q R X | j-||d* | jjjr:|d+ s~| j.|d gd d, |d-< | j/|d g|d.< | 0|d |d/< n| jjd0 t'|d  d1}| rt (| g }t|dR}| jj1|d d2D ]8}|2|d  | j jd7  _|3t4|d3  qW 5 Q R X | j5|d |d4< | 6|| n| j7| jj8 d5|d   |d-< d|d- kr|d- d |d- d6|d-< n.| j7| jj8 d7|d- d   |d- d8< |d9i |d- d9< | 9| |d:r| :||d.< |d;i |d/< | ;|d/  |d<}|rp| j<d=|  | j7|d> }|=  | |d<< | *|d< | j> | j  | jjd? t'|d  d@}| rt (| t|dD}| jj?|d d2D ]*} | j jd7  _|3t4| d3  qW 5 Q R X | jjdA t'|d  dB}!|! r,t (|! t|!d}| jjj@|d dCA D ]}"| j
 rx W 5 Q R  W  d S | j jd7  _| j7|" }#g }$|#dDg D ] }%|%d" dEkrzT| jjjr| jjjB|%dF d|%dF dGdH|%dI< n| jjjB|%d d|%dI< W nn |jCjDk
r~ }& zJ|&jEjFdJkrl|$2|% | jjGdK|#d  dL|& dM W Y qn W 5 d }&~&X Y nX |%dIr| *|%dI | j> | j  q|#dDr|$D ]}'|#dD (|' q|3t4|#d3  qRW 5 Q R X | jjdN t'|d  dO}(|( r(tH|( |(  t'|d  dP})|) rVtH|) |)  z:| jjI|d dCD ] }*| j
 r W W  d S | j jd7  _| jjdQ|*d   | jjJ|*d |*d8< | j7|*d8 dR d>  |*d8 dR< | jK|*d }+| jjj	r<dSdTdUd | jL|*d D ii},|+M|, |+|*d8 dV< |d |*dW< |(t%|*d }-|-jd
d |-d}.t|.dX}t,|*| W 5 Q R X zL|*d" dYk
r| jjdZ | jN|*d D ]}/| j
 	r W  W W  d S | j jd7  _|)t%|/d }0|0jd
d |0d}1|1 
rP| jjd[|/d  d\ 	qg |/d]< | jjd[|/d   | jO|/d D ]6}2| j
 
r  W  W W  d S |/d] 2|2d  
qt|1dX}t,|/| | jPd^ W 5 Q R X 	qW n |jCjDk
rl }3 z\|3jEjFd_kr@d`t%|3ks.dat%|3kr@| j<t%|3 n| jj+db|* dcddd(d)  W 5 d }3~3X Y n(   | jj+db|* dcddd(d)  Y nX qtW n4   |  jQd7  _Q| jj+de| dcddd(d) Y nX | j<df t'|d  dg}4|4 rt (|4 t|4db}| jR|d D ]J}5| j
 rB W 5 Q R  W  d S | j jd7  _|3t4|5d3  qW 5 Q R X | j<dh t'|d  di}6|6 rt (|6 t|6d}| jS|d D ]r}7| j
 r W 5 Q R  W  d S |7d<r| *|7d< | j> | j  | j jd7  _|3t4|7d3  qW 5 Q R X djt jTdk< | j jU|7  _U| jjVd
dl | jjWX  dmt jTdk< t|d |	 t%|	|d< |d  dn}t|dX}t,|| W 5 Q R X t"# | }8| jjdo| dp|8dqdr t'|d  ds}9|r~|9 sH| jjGdt| du|d  dv|9 dw| dx	 d }n6| Y|d s~| jjGdy| du|9 dz| dx d }t"# }| jjZ|d ||d{}d|| }:|s|r|:d}7 }:|r|:d~| 7 }:|r|:d| 7 }:|:d| d7 }:| j<|: |  jQ| j[||||d7  _Qt"# | }8| jjd| dp|8dqdr | jQsv||d< t|dX}t,|| W 5 Q R X W qv   |  jQd7  _Q|dr| jj+d| ddd'd(d) n| jj+d| dd'd(d) Y qvX qv| j<d d S )Nr   r   r   	isCheckedu5   Не выбрали ни одного проекта!c                 S   s$   g | ]}|d  r|d r|d  qS )r4   r  r   )r   r  r   r   r    r     s       z0JiraAPIImport._dump_projects.<locals>.<listcomp>r  r   Tr  P   r   r   r*   u   Дампим "r  rJ  r  )rA  )r   ZtimeZoner  r  Z	dump_dater  r   r  u   Дампим права/permissions.jsonr  permissionsholderr  r   	parameteru0   Не удалось сдампить права r  rg  rd   rm  )rj  r  ZworkflowSchemer  jira_screen_schemerz  u/   Дампим типы задач проектаrQ  r  r  r  z$rest/projectconfig/1/workflowscheme/)r   r`  zrest/api/2/workflowscheme/r`  r  rb  Z
fieldsUsedr  u1   Ищем руководителя проекта r   u*   Дампим статусы проектаrT  u$   Дампим роли проектаrU  )r   rd  re  Z	actorUserrA   )r   rn  rG  i  u&   Пользователь к роли "u   " не найден. u+   . Возможно он был удаленu&   Дампим доски проектаz/boards/z	/sprints/r  r{   r  r  c                 S   s   g | ]}|qS r   r   )r   Zqfr   r   r    r   p  s    r   r  r]   )r  Zsimpleu&   Дампим спринты доскиu   Спринт u    уже скачанr  r   i  z"The board does not support sprintsuD   Данная доска не поддерживает спринтыu4   Не удалось сдампить спринты zERR-0057r   u   Не удалось сдампить доски, возможно проект не поддерживает доски или у вас нет прав project_info=u(   Дампим версии проектаrY  u!   Дампим компонентыrZ  r   NO_CACHEr  1rL  u&   Дамп данных проекта "u   " выполнен за r4  r5  r  u$   В каталоге проекта "r1  u5   ), отсутствует каталог задач (u@   ). Дата последнего успешного дампа (u   ) будет сброшена.u/   В каталоге задач проекта "ud   ) отсутствуют задачи. Дата последнего успешного дампа ()r  r  u*   Дампим задачи проекта: u    (в периодu    с u    по u4    включительно, часовой пояс: rq  r  u$   Дамп задач проекта "r`  u   Проект "u   " является приватным и не может быть импортирован, отключите приватность в Jira или предоставьте пользователю праваzERR-0058u2   Не удалось получить проект u0   Закончили дампить проекты)\r$  r   r0   rT   r+   r^   r_   ro  r   r   r-   rG  rV   r`  r?   rH   rI   Zuser_find_by_user_stringr   r`   ra   rb   rc   rL   r  r  r  r  r  r  rh   rk   ri   makedirsr  r6  rN  r(   r  r   r  Zget_project_permission_schemer  r3   rd   r  Zget_project_schemeZget_project_screen_schemer  rx  r   r  r  Zget_project_workflow_schemer  jira_requestr  rq  rl  r  r,   raise_for_statusrG   get_statusesZget_project_rolesro   r   
exceptionsZ	HTTPErrorr~  r  r  rn  Zget_all_agile_boardsZget_agile_board_configurationZget_advanced_board_settingsZget_board_quick_filtersr  Zget_sprintsZget_sprint_issuesr"  r2   Zget_project_versions_paginatedZget_project_componentsenvironprogressr  r.   r/   rE  Zget_project_issues_count_duringr  );r   r$  rootZprojects_dirr  r  r   r  Zproject_namer  Zproject_tmp_dirr  rG  Zuser_tzr  rf   Zcurrent_dumpZlast_dump_date_utcZnew_dump_date_utcr  r8  r/  rj  permission_fileZperm_sch	perm_dictZ
types_filer  r  r  r7   Zstatuses_filer  Z	role_fileZrole_urirz  Zunfound_actorsr|  r  Zunfound_actorZ
boards_dirrX  r  Zadvanced_settingsr  rW  Zboard_info_filer   Zsprint_pathZsprint_file_pathr   rH  Zversion_list_filenamer   Zcomponents_list_filenamer!  r9  r_  Zinfo_msgr   r   r    _dump_projects  sr   









"  


"



"


"



$ 



*      

"

"


 
 

    zJiraAPIImport._dump_projectsc                 C   s  | j  }t|\}}}|| d }| j d| d | j jd | jjj	rZ| 
  | j jd |   |  | _| j jjddr| j jd | | jjd	 n| j jd
tjd |   | j jd | | jjd | j jd | | jjd | | jjd | jjj	rZ| j jd | | jjd | j jd | | jjd | j d | | jjd | | jjd | j d | | jjd | | jjd | j d | | jjjd dt j!d< d| j _"| j #  t$  d t j!d< | j jd! | %  d"S )#u_   
        Загружаем все данные из апи, кроме аттачей
        d   u   Свободно места: r|  u$   Скачаем данные из APIu9   Дампим глобальные настройки Jirar  Tu'   Дампим пользователейr   uA   Не дампим пользователей из-за опцийr  u   Дампим статусыr  u    Дампим типы задачr  Zissue_security_schemesu*   Дампим бизнес процессыr  u7   Дампим схемы бизнес процессовr  u   Дампим экраныr  rk  u!   Дампим приоритетыrQ  rP  u+   Дамп решений(резолюций)rY  r   r     r  u   Дампим проектыN)&r+   r^   rh   
disk_usager,   rV   r`  r?   rH   rI   r  r  rO   rP   r   r   rL   rH  r   rU   r  rE  r  Zget_issue_typesZget_issue_security_schemesZget_workflowsZget_workflow_schemeZget_all_screensZget_screen_schemeZget_all_prioritiesZget_priority_schemesZget_all_resolutionsri   r  r  r  r  r  )r   Zdownload_pathr  usedfreeZfree_percentr   r   r    download_data  sP    





zJiraAPIImport.download_datac                 C   s`   dt jd< tjj| jjdddgd}|jrRt|j	|j d |_
|jdd	 t  d
t jd< d S )Nr   r  r  rG  r  )r   rl   r  Tr  r  )ri   r  rJ   Z	CmfImportrL   r+   r   rG  r   r  r  r  r  )r   r+   r   r   r    rn  7  s    
zJiraAPIImport._calc_progressc                 C   st   dd l }|jdddd| jj d| jjj d| d| d	tj d
gddt	ddt	ddd}| j
d|j  |S )Nr   r~  r  r  z&cmf_import = models.CmfImport.get(id="z#");cmf_import.process_cross_links("r  r  r  r  Tr  r  r  r  r  )r  r  r+   r   r?   rH   r  r   r  ra   r,   r  )r   
model_namer  r  r  r   r   r    _execute_cross_linksB  s    
.  z"JiraAPIImport._execute_cross_linksc                 C   sf  dddgdddgg}dD ]8}| j jd| d	| j  d
}tt| }|j|d}|s\qt  g }t| jD ]0}| 	||}|t
j7 }|| ||krp qqp| j   ||k r"td t|D ]V}| }	|	dk	r|  j|	7  _|| | 	||}
|t
j7 }||
 | j   qqt|D ]&}|  |jr*|  j|j7  _q*q| j jd dS )uU   
        Заменим ссылки на задачи и документы
        r+   r  Nr  r   T)r$  r   rg  r   u   Обрабатываем u+    в несколько процессов: r   r   r*   u2   Закончили обработку ссылок)r+   rV   r`  r   varsrJ   r  r.  r  r  r   r  r   r  r  r  r   r  r2   r  r  r  )r   r  r  r  r}   Zobj_cntr  rA  r  r  r  r   r   r    _process_cross_linksL  sB    








z"JiraAPIImport._process_cross_linksc                  C   s  ddl m} t|d  d}| }dd |d D }t|d}t|}W 5 Q R X | jjjj d	|d
  }t	j
j|d}	|	st	j
|d| jd}	|d |	_|	jdd ddg}
ddddddddddddddd d!g}|
| }d"g|
 }t	jj|	|d#D ]@}|
D ]}t||g  q |D ]}t||d$ q|jdd q|d% D ]\}z d	| jjjj d	|d
  d	}||d& rt	jj||d&  dd'}n| jjd(|  W qBd)d*d+| d+g}t	jj||d,}|s:t	jj||	|d-}|s| jjd.| d/|	d0 |  jd17  _W qB|jr4|j | |_n||_|d2 d3 d4kr| jjjj d	|d2 d4 d
  }t	jj|d}|j| |jdd n|d2 d3 d5krd|_|jdd n|d2 d3 d6krd|_|jdd n|d2 d3 d7krd|_|jdd nX|d2 d3 d8kr>d|_d|_|jdd n*|d2 d3 d9krfd|_|jdd n|d2 d3 d:kr| j j!j"r|d2 d;r| #|d2 d; }n| #|d2 d< }|r|j$| |jdd n&| jjd=| d>|d0 |  jd17  _nd|d2 d3 d?kr:| j j!j"rFd	| jjjj d	|d2 d;  d	}n&d	| jjjj d	|d2 d? d  d	}t	j%jd)d*d+| d+gd)gd,}|s|d2 d? d }t	j%jdd@|gd)gd,}|r|js||_n||jkr|j | |_|jdd |j$| |jdd n&| jjdA| dB|d0 |  jd17  _n.| jjdC|d2 d3  dD|d0 |  jd17  _W n2   | jjdE| dFdGdH |  jd17  _Y nX qBdIdJdKdLdMdNgdOgdPdQgdR}|& D ]\}}zzt	jjdSdT|gdUdT|	gg|d,}|D ]P}t	jjdSdT|gdUdT|	gg|d,}|D ]}t||t'|| q|jdd qW n@   | jjdV|	 dW| dX| dYdZd[dH |  jd17  _Y nX q|	S )\Nr   )get_datar  r  c                 S   s"   i | ]}|d  r|d  |d qS )Z	jira_coderD   r   r   r   r   r    r  }  s    z6JiraAPIImport._process_permissions.<locals>.<dictcomp>Zproject_perm_permissionr  r   r   r  Tr   r  r+   r   r   access_project_roleaccess_membersaccess_local_useraccess_ownerZaccess_owner_assistantaccess_authorZaccess_spectatorsZaccess_executorsaccess_responsibleZaccess_list_owneraccess_project_ownerZaccess_project_owner_assistantZaccess_project_spectatorsZaccess_project_executorsaccess_sdesk_clientZaccess_anonymousZaccess_guestZaccess_sharelink_anonymousr   r  Fr  Z
permission)rD   r   u4   Не нашли соответствия права r   r{  r|  r}  )Zproject_permissionr   rl   u*   Не найдено правило для zERR-0059r  r*   r  r  projectRole)applicationRoleZanyoneprojectLeadr  r  sd.customer.portal.onlyr   r   r  u9   Не нашли пользователя для прав zERR-0060r  r  u-   Не нашли группу для прав zERR-0061u'   Неизвестный тип прав zERR-0062u6   Не удалось загрузить правило zERR-0063CmfProjectPermPermissionrx  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  r   u   В схеме uR    не удалось скопировать разрешения из права 'u   ' в 'r  zERR-0113CmfProjectPermSchemeRule)(Zcmf.system_datar  r   ra   rb   rc   r+   r   r   rJ   ZCmfProjectPermSchemerL   r   r  r  r   r  r   rV   r  r3   r2   r   rl  r  r   r  r  r  r  r  r  r?   rH   rI   r	  r  r  r   getattr) r   r/  r  r  Zsystem_dataZmap_permrf   Zperm_scheme_dictr   Zperm_schemeZrule_list_access_fieldsZrule_bool_access_fieldsZrule_access_fieldsZrule_fieldsZscheme_ruleZ
list_fieldZ
bool_fieldr  Zpermr  role_ext_idr{  r  r  
group_nameZcopy_access_rulesZfrom_rule_codeZto_rulesZ	from_ruleZto_rule_codeZto_ruleZrule_access_fieldr   r   r    rq  y  s^   


 " $&    	z"JiraAPIImport._process_permissionsc                 C   sd  t ddN d}| }|dkr&qL| j r4qL| jjd|d   | jj|d dtj	d}z|
  t|d	 }t|d
"}|jddD ]}|| qW 5 Q R X | jjd|d	   tjj|d d}	d|	_|	  | jd W nJ tk
r> }
 z*|d7 }| jjd|d  d|  W 5 d }
~
X Y nX W 5 Q R X q|| W 5 Q R X d S )NFr:  r   r;  u    Пытаемся скачать r;  T)streamr  r  zwb+i    )Z
chunk_sizeu   Сохранили в r   r  r  r*   u+   Неудалось скачать файл r>  )r   rL   r+   r-   rV   r`  r?   r  r   ZIMPORT_DOWNLOAD_TIMEOUTr  r   ra   Ziter_contentr  rJ   r  r  r  r"  r0   r  r=  )r   download_queueerror_queuer-  r  r7   Z	save_pathrf   chunkZdownload_job_objrH  r   r   r    _download_file_worker=  s0    
<z#JiraAPIImport._download_file_workerc           	      C   s  | j jd | j }| j }d}| j dg dd| j jjjgdddgg}tj	j
|dsp| j jd	 |S g }t| jD ]J}| jj| jd
| ||dd}|| |  | j jd|  q~tj	j|ddgdD ],}| j  r q||j|j|jd q|D ]}|d q| s@|D ]}|  q0| j  rP|S | j jd | s| j  rx|S || 7 }q^|S )Nu=   Скачиваем все найденные вложенияr   zplugin.plugin.source_hashr   r   r  Fr   u   Вложений нетr	  )r  r  r  u    Запустили задачу r;  r  r}  )r   r;  r  r;  u%   Закончили скачивать)r+   rV   r`  r   r  r   r   r   rJ   r  r  r  r   r   r  r	  r   r`  Zslistr-   r=  r   r;  r  r  r   rL   )	r   r  r  r7   r  Zprocsra  r  r  r   r   r    download_filesZ  sD    





zJiraAPIImport.download_filesc                 C   s4  | j  rd S | j jd|d  d|d  d d }t|d  d}t|}t|}W 5 Q R X |r0| j jjj	 d|d	  }t
jj|d
}|st
j|| j dd}|jr|d |_|d|_||_|jdd |d D ]B}|d  d|d	  d}| j jjj	 d|d	  }	t
jj|	d
}
|
s@t
j||	| j dd}
|
jr|d |
_|d|
_t
jj|
dD ]}|jdd ql|dg D ]H}zt
j|
d}|d}|d}|dkrt
jjdd|_n|dkr,| j jjj	 d| }t
jj|d
}|rt
jj|d
|_ntd| n>|dkrJt
jjdd|_n |dkrht
jjdd|_n|d krt
jjd!d|_n|d"krn|r\d| j jjj	 d| d}t
jjd#d$d%| d%gd#gd&}|s| jjjr|d' n|}t
jjdd(|gd#gd&}|rL|js||_n||jkr8|j | |_|jdd ||_ntd)| nt
jjd*d|_n|d+krz| |}W n2 tk
r } zt| d,W 5 d }~X Y nX | j |d-d-d.\}}|r||_ntd/| n~|d0kr@| j jjj	 d| }t
j!j|d
}|r0t"|jg|_#ntd1| n*|d2kr\t
jjd3d|_ntd4| |jdd |j$%  W nP tk
r } z0|  j&d57  _&| j j'd6| d7| d8|d9 W 5 d }~X Y nX q|
jdd |
j$%  |d:rt(|d:t(|d	 kr|
|_)|jdd q|j$%  |S );NuV   Импортируем схему безопасности задач проекта "r   r1  r   rq  r  r  r   r   r  Tr  r   r   r  r  r  rb  r  rm  r  r   r  zvar:current_userrC   r  u0   Не найдена проектная роль r  zvar:project_ownerr  z
var:authorr  zvar:responsibler  r   r{  r|  r}  r  r  u!   Не найдена группа ZUsersr   uH   . Возможно пользователь был удален в Jira.F)r  r  u+   Не найден пользователь )ZgroupCustomFieldZuserCustomFieldu>   Не найдено пользовательское поле r  zsdesk-client:defaultu-   Неизвестный тип правила r*   uF   Не удалось создать правило для уровня z. zERR-0070r  ZdefaultSecurityLevelId)*r+   r-   rV   r`  r   ra   rb   rc   r   r   rJ   ZCmfSecurityLevelSchemerL   r  r   r   r  r  r  ZCmfSecurityLevelRuler   r  r   Zaccess_memberrl  r0   r  r?   rH   rI   r   rB  r  CmfCustFieldr(   Zaccess_task_fieldsr.   r/   r2   r3   r   Zdefault_task_security_level)r   r/  rs  r  rf   r  Zscheme_ext_idrW   Z	level_msgZlevel_ext_idr  Z
level_ruler  member_typemember_valuer  r{  r   r  r  rG  r  r  rA  cust_field_ext_id
cust_fieldr   r   r    rr  ~  s    












 


$
z&JiraAPIImport._process_security_levels)rp   c                 C   s  |d d  dd}|d| jjjj  7 }|d d|g g g g dd	d	d
}|d d d ddd }|dkr~d|d< n>|dkrd|d< n*|dkrd|d< n|dkrd|d< n|dkrd|d< dd |d d D |d< n|dkrd|d< dd |d d D |d< n|d kr8d!|d< |d d |d< n|d"krTd#|d< i |d< nh|d$krhd%|d< nT|d&kr|d&|d< n@|d'krd(|d< n,|d)krd*|d< n|d+krd,|d< nd }|S )-Nr   r   customfieldcfrA  r   T)rH  r  r  r  F)r   rs   
class_nameZvisible_filterrequiredZrequiredChangedrr   rs   r  r*   rX  Ztextarear   field_custom_typeZ	textfieldr(   floatr  )r(  Zradiobuttons
choice_strc                 S   s   i | ]}|d  |d qS r   r   r   r   optr   r   r    r  *  s      z,JiraAPIImport._map_field.<locals>.<dictcomp>r  rT  )ZmultiselectZmulticheckboxeschoice_multic                 S   s   i | ]}|d  |d qS r  r   r  r   r   r    r  .  s      r@  rH  Zcascadingselectchoice_cascade_multiZ
datepickerdater  r  r   r  r   )r  r  r  )rG  r+   r   r   rC  r   )r   rp   r  r7   r  r   r   r    
_map_field  sP    
 













zJiraAPIImport._map_fieldc              
      s6  d | _ | jD ]Z}| jtjj d D ]B}d|krF| jdtj	   d S |d d |kr"| j| |d< q"q| jj
j
j}tjj|dgd}|stjd|d| jd	}d
|_|  tjjdd|d}| jjjdds| jjd d S | jd dd tj D }g }g }| jtjj d D ]}|dr<|d d sV| jd|d   q| |}	|d d dd}
|
d| jj
j
j  7 }
|
|d< |	s| jjd|d  ddd |  jd7  _q|	d  d!kr|| | jj
j
j d"|d d  }tjj|d#d$d%d&gd}|sDtj|d |d |	d  d|| jdd'}|
|kr||
 d# |jjkr| jjd|d  d(|j d)||
 d#  d*dd q| jd+|
 d,|d  d- ||
 |d.< n(| jd/|
 d,|d  d0 || |jr|d |_|	d  d1kri }g }|d d2 D ]V}|d3 s4q"|d4g D ].}|d5 ||d < |d6 r@||d  q@ qzq"||_ ||_!|j"rd|_#|| |jdd7 |j$%  tj&j||
||d8}|stj&||
||d8jdd7 q|j$%  |'  |rdtj(t)j)* +d9d
dd: tj,d;d
i d<d tj D }|D ]}||d  |d.< qLdD fd=d>	|D ]D}tjj-|d. d?  }t.t|j/  |d d4 D ]}| qqx| jjj}|d@ D ].}|d tjjkr| jtjj d |d< q|| j_dAt0j1dB< | j  | jj$%  dCt0j1dB< d S )ENrl   r   uj   Текущая настройка не поддерживает импорт кастомных полейr   r   r  u8   Экран проектов Jira по умолчаниюTr   r   r  r+   r   Z_customr  )r   r  r   Zimport_custom_fieldsFuI   Отключен импорт пользовательских полейu8   Импорт пользовательских полейc                 S   s   i | ]}|d  |qS r~   r   r  r   r   r    r  q  s      z8JiraAPIImport._process_custom_fields.<locals>.<dictcomp>rs   u!   Поле не кастомное r   r  r  rA  r   u+   Неудалось смапить поле zERR-0064r  rx  r*   r  )r  rH  r  r   widgetrT  r   disabled_choices)r   r   r  dirtyr   r+   r  u   , widget поля u5    не совпадает с существующим zERR-0065u   Поле с именем r  u4   ) есть в таблице, мапим в негоr   u(   Создаем поле с именем u   ), и мапим в негоr  ru  r  r  r   disabledr   r  r   r   ui_form_groupz%Y%m%d%H%M%S)Zmeta_versionr  r  r  c                 S   s   i | ]}|d  |qS r  r   r  r   r   r    r    s      c                    s   t | tr4 j| d}|s$ | d}|jr|  npt | tr j| d d}|s` | d d}| dd|_|rz|j|_|jr|  | dg D ]}|| qd S )Nr:   r   r#  Fr  )	r   r(   rL   r  r  r   Z
cmf_hiddenr   Zchoice_parent_id)r  Z
parent_optr   childZchoice_modelcreate_optionr   r    r(    s"    



z;JiraAPIImport._process_custom_fields.<locals>.create_optionr~   r   r   r  r  )N)2r>   rg   r   rJ   r   r   r+   r,   rU   r  r   r   r  rL   r  r  CmfUiFormGroupr   r   rV   r  r   r  rG  rC  r3   r2   r   r  r   r  r   rT  r!  r  r"  r.   r/   CmfUiFormFieldinvalidate_cacheZcustom_fields_gen_metar  r  r  Zcustom_field_sync_update_modelsrl   r  r}   ri   r  )r   Zext_field_namerp   r   ui_view_formr%  shop_fieldsZ
new_fieldsZ
m2m_fieldsZui_fieldr   r  rT  r!  ru  r  ui_form_fieldZfield_classr   r  r   r'  r    _process_custom_fieldsO  s   

 



"











z$JiraAPIImport._process_custom_fieldsc                 C   s  dd t j D }| jjjj d|d  }t jj|dgd}|sx| jd|d  d	|d  d
 t j|d| jd}|j	rl|d |_
|dd|_d|_|  |d D ]}| jjjj d|d  d|d  }t jj|d}|s*| jd|d  d	|d  d| d t jd||d| jd}|j	r|d |_
|jdd |d D ]}|d dshqN|d dd}	|	d| jjjj  7 }	|	|krqN| jt jj d D ]}
|
dsƐq|
d d |d kr| jjjj d|
d d  }t jj|d}t jj||	||d}|s\| jd|	 d | d!| d t j||	||djdd  qNqqNq|  |j  |S )"Nc                 S   s   i | ]}|d  |qS r  r   r  r   r   r    r    s      z1JiraAPIImport._process_screen.<locals>.<dictcomp>r   r   r   r  u   Создаем экран "r   r1  rq  Tr  r   r   r   Ztabsr  u   Создаем вкладку "u   ) экрана "r  tab)r  r   r   r  r+   r   rl   r}  r  r  rA  r   r$  u   Добавляем поле "u   " на экран "u   " во вкладку ")rJ   r   r   r+   r   r   r  rL   r,   r  r   r   r  r  r)  ra  rG  rC  r   r   r  r*  r+  r.   r/   )r   r  r-  Zscreen_ext_idui_formr0  Z
tab_ext_idr%  Z
jira_fieldr   rp   r  r  r.  r   r   r    r+    s    
$


zJiraAPIImport._process_screenu,   Обработка схемы экрановc              
   C   s  | dr>|d }|d }| jjjj d| }tjj |dgd}|sZtj|| jdd}|jrdd	 | d
D }|d |_|j	dd |j
stjj|dD ]}|  q|d D ]}|d }	d }
|	dkr$| jjjj d|	 }tjj ddd| dgd}
|
s$| jjd|	 ddd q|d  D ]\}}| |}|sl| jjd| d| ddd q0z| |}W n0   | jjd| d| ddd Y q0Y nX dd d!d"d d!d"d#}| j r  d S ||d$| |d| jd%}tjj f |d&d'gi}|stjf |}|
r*|j|
 |j	dd q0qn| jjjj d|d  }tjj |dgd}|stj|d(  d)|d  || jdd*}|j	dd tjj | jjjjdgd}|jrtjj |dgd}|stj|d| jd+}|jr||_||_d$|_|j	dd t  |S ),Nr  r   r   r   r  Tr  c                 S   s   i | ]}|d  |qS r  r   r  r   r   r    r  c  s      z8JiraAPIImport._process_screen_scheme.<locals>.<dictcomp>r  r   r   )r_  r  rg  r  r   r{  r  r  r   ;   Не удалось найти логический тип r  CmfUiFormSchemerx  rh  u8   Не удалось найти в дампе экран u    для zERR-0069u:   Не удалось импортировать экран zERR-0068r  r  r'  )r  r  Zeditviewre  rf  rd  r   )r_  r  r  Zcrud_choicer+   rl   logic_typesr   u+   : Схема экранов проекта r   r   r+   r  r  )rL   r+   r   r   rJ   r3  r  r   r   r  rj  ZCmfUiFormSchemeRuler   r  r  r3   r   r+  r-   r5  r   r  r_  r  r  r  )r   r/  Zscreen_scheme_dataZscreen_scheme_idr   r_  r  r  Zissue_type_datar  r  r  r   r  r  r1  Zaction_mappingr  r,  r   r   r    rh  R  s    





z$JiraAPIImport._process_screen_schemec                 C   s6  i }t  }|ds|S dd tj D }|d  D ]}|d dsLq8|d dd}|d| jj	j	j
  7 }||krq8| jtjj d	 D ]}|d
sq|d |d
 d kr|d  D ]\\}}	|	dsq| }
|	|
d< ||i }|
||
d < |	d r|di }|
||
d < qqq8| D ]\}}d}| jj	j	j
 d|d  }|d  d|d  }|dkrd| jj	j	j
 d| d}tjjddd| dgd}|s| jjd| ddd q,|d| 7 }|d|d  7 }n|d7 }tjj|dgd}|s.tj||d| jd }|jdd! |||f | D ]\}}
|
d }	| jj	j	j
 d| }tjj|d"gd}tjj||d#}|stj||| jd$}|	d%d&|_|	d'd& |_|jd(kr"i }g }|	d)i  D ].}|d* ||d < |d+ r||d  q||_||_|  qDq,|S ),u1    Импорт конфигураций полейrz  c                 S   s   i | ]}|d  |qS r  r   r  r   r   r    r    s      z5JiraAPIImport._process_field_conf.<locals>.<dictcomp>r   r}  r  r  rA  rl   r   ru  r  anyNr   r   5   : Конфигурация полей проекта r   r   r{  r|  r   r2  r  CmfCustFieldConfSchemerx  u    для типа     по умолчаниюr   r  Tr  r   r  )r  r   )r  r   r+   rw  Frv  r  r  r   r#  )r  rL   rJ   r   r   ro   ra  rG  r+   r   r   rC  r   r   r   r*  r*  r  r3   rR  r  r  r  rS  r  Zvisibler  r   rT  r!  )r   r/  Zlogic_type_fieldslogic_type_field_confr-  r{  r~   Z
task_fieldrB  ru  rp   rl   r  rU  r   r  rV  Zfield_idZfield_ext_idr  rW  rT  r!  r  r   r   r    _process_field_conf  s    




z!JiraAPIImport._process_field_confuA   Обработка схемы конфигурации полейc           
      C   sJ  | j jjj d|d  }tjj|dgd}|sbtj|d  d|d  || j dd	}|jdd
 tjj|dgd}|stj|d  d|d  d|d| j d}|jdd
 | |}|	d |f |j
r>tjj|dD ]}|jdd q|D ]L\}}|||r|gng d| j d}	|s$d|	d< tjf |	}|jdd
 q|  |S )Nr   r   r   r  r   u@   : Схема конфигурации полей проекта r   Tr6  r   r8  r:  r  rb  r  )r   rV  r5  r  r+   r*   r  )r+   r   r   rJ   r9  rL   r  rR  r<  r  r  ZCmfCustFieldConfSchemeRuler   r  r+  )
r   r/  r   ru  rV  r;  r  r  Z
field_confr  r   r   r    rt  8  sJ    
z(JiraAPIImport._process_field_conf_schemec                 C   s  t dD ]}|   | js q qt dD ]}|  }|s( q>q(|  j|7  _|   |   |   |   |   |   |   |   |   | 	  |   | 
  | jjjr|   |   |   |   |   n|   |   |   |   |   | j rd S d| j_| j  t  |  D ]>}|d dd | jD krZq8| jjd|d  d q8| jd	| jj   | j S )
Nrw  r  r   c                 S   s   g | ]}|d  qS r  r   r   r   r   r    r     s     z0JiraAPIImport.process_import.<locals>.<listcomp>u'   Импортирован проект 'r   r  u-   Импортировано объектов: )!r  r  r2   r
  rn  r  r  r  r?  r/  r]  r?   rH   rI   rA  rD  r  r  r  r'  r:  r;  r+   r-   r  r  r  r   rT   rV   r`  r,   r  )r   rA  r7   r   r   r   r    process_importf  sV    


zJiraAPIImport.process_import)T)r   r   )T)TTN)N)N)r   r  )NN)NN)N)Nr  r  )r$   r%   r&   r'   r   r)   r   r(   r   r   rF   propertyrg   rn   rq   r|   staticmethodr   r   r   r   rX   r   r   r   r   r   r   r   r   r  r<   r  r1  rI  rB  r   ro  r  r  r  r  rJ   r  r  r  r9  r>  rI  rX  r]  r}  r  rv  r  r  rw  rx  r  r	  r   r  r  r  r  r   r  r  r  r  r<  r"  r'  rp  ro  r:  r;  r?  rA  rD  rE  rH  r   r   rN  r  r  r%  rk  r  r  r.  r,  rE  r   rl  rq  r|  r  r)  r  r  r  r  rO   r  r  r  r  r  r   r  r  r  r  r  r  r  r  rn  r  r  rq  r	  r
  rr  r  r/  r+  rh  r<  rt  r=  __classcell__r   r   rZ   r    r=   A   sd  
	
!

	#> 


J!9 W
"

 2  

7
 #
>
,
  e
_-

(# ;

 q>
3
6

 
Z
a#<7C=    U"	  m/

- E$ = 6Nxm-r=   )3Zcmf.appr   Zcmf.includeZdataclassesr  r  r  rN  re  rh  pathlibr   rh   Ztempfiler   rb  typingr   r   r   r	   r
   r   r   Zbs4r   	itertoolsr   r   Zcmf.data_providers.baser   r   Z
cmf.modelsr   Z%common.models.cmf_plugin_import_mixinr   Zmodules.jira.apir   Zmodules.jira.base_importr   Zmodules.jira.jql.parserr   rJ   r   r   r   r   Z	dataclassr   r<   r=   r   r   r   r    <module>   s6   $ 