U
    {f̗                    @   sD  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	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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Z-dd Z.G dd de$Z/dS )    )cmf_context)*N)Path)TemporaryDirectory)DictOptionalListCallableUnionTypeIterator)BeautifulSoup)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   )r7   r8   r   )r7   r   	decorator+   s    z"catch_exception.<locals>.decoratorr   )r   r:   r   r9   r   catch_exception*   s    r;   c                       sz  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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-d.d/ Z ed0eed1d2d3Z!d4d5 Z"ed6dee#d7d8d9Z$dd:d;Z%ed<d=d> Z&ed?d@dA Z'edBdCdD Z(e)j*ddEdFZ+dGdH Z,dIdJ Z-dKdL Z.edMdNdO Z/edPdQdR Z0eedSdTdUZ1dVdW Z2dXdY Z3edZd[d\ Z4edZd]d^ Z5ed_d`da Z6edbdcdd Z7dedf Z8ddgdhZ9e:didjdkZ;e:didldmZ<ednedodpdqZ=drds Z>edtedodudvZ?edwdxdy Z@dzd{ ZAed|dd}d~ZBeddd ZCeddd ZDededddZEeddd ZFeddd ZGeddd ZHeddd ZIeddd ZJeddd ZKdd ZLededddZMedddZNdd ZOdd ZPdd ZQdd ZRdd ZSdd ZTdd ZUdd ZVdd ZWdd ZXdddZYdd ZZedoddZ[edoddZ\edoddZ]edoddĄZ^edoddƄZ_ddȄ Z`ddʄ Zaed˃ee:ed̜dd΄ZbddЄ ZcdeedќddӄZdd	eeeedԜddքZed
dd؄Zfddڄ Zgedeeeedݜdd߄Zhdd Zidd Zjdd Zkdd Zldd Zmdd Zndd Zodd Zpdd ZqedddZrdd Zsdd Zteddd Zueddd Zvdd  Zw  ZxS (  JiraAPIImportu;   Класс загрузки объектов через APIr1   _JiraAPIImport__jira_fieldsN)jirareturnc                    s   t  j|| || _d| _| jjjr*d| _tjjdd| _	| 
 | _i | _i | _i | _g | _g | _g | _d| _td}| jjj|_|| jjj |   d | _d S )Nr   	accountIdsoftdevcoder   zatlassian.rest_client)super__init__r>   user_keyconncloudmodelsCmfActivitygetdefault_activity_get_jira_global_settingsjira_global_settingsZepicsissue_relationssubtasksboardsfiltersselected_projectsr1   loggingZ	getLoggerr*   loggerZhandlersZsetLevellevel_prepare_multiprocessingr=   )r   r>   r4   r5   rU   	__class__r   r   rE   D   s&    


zJiraAPIImport.__init__)r?   c              	   C   s|   | j r| j S | j d}| rFt|}t|| _ W 5 Q R X n0| j	 | _ t|d}t
| j | W 5 Q R X | j S )Nfields.jsonw+)r=   r*   get_download_pathjoinpathexists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   rZ   zfields.json.r[   )shutilr=   r*   r\   r]   osgetpidr_   r`   rb   move)r   fieldsrf   rc   file_path_tmprd   r   r   r   update_jira_fieldsj   s    z JiraAPIImport.update_jira_fieldsc                 C   s(   | j  D ]}|d |kr
|  S q
d S )Nr   )re   values)r   r   fieldr   r   r   _get_field_by_names   s    z JiraAPIImport._get_field_by_name)model
field_namer?   c                 C   s&   |sd S | j |gd}|r"|d S d S )N)Zfields_namer   )import_shop_fields)rp   rq   r6   r   r   r   _get_field_namex   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intr/   )r   ru   rv   rw   rx   Zavailable_memoryr   r   r   rW      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)re   itemsrK   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lenre   rK   )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dictrK   listr   r'   join)r3   r   to_strrq   Z
str_fieldsZ	str_fieldresultZrelated_objr   r   r   _get_file_val   s6    



zJiraAPIImport._get_file_valc           	         sh  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dD }|r|d }|st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_funcrp   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   rj   )r   rs   r   r   r   verbose_name)r   r   rp   r3   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   .0r3   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     uS   Не найдено ни одной задачи, импорт невозможенua   Не найдено ни одного пользователя, импорт невозможен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_usersr/   r   rI   CmfTaskr   	CmfPersonr   
CmfCommentr   )	r   r   Zdump_dirtaskuserprojecttasksr   Zcomment_exampler   r   r   tmplt_import_settings   sR      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   rj   r   r   rq   r   r   captionr   )Z_normalize_settingsr*   json_settingsr>   r   	enumeraterI   r   r   r   _normalize_jira_valuer   )r   settingsr   issueZnumr   r   r   r   r   preview8  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   rq   r   )r   r   rK   )r   r3   r   Znormalized_objr   r   r   r   r   _normalize_objG  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filter::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   rK   r   rI   	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_listS  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   : "rj   r   "r@   r3   uI   _process_watchers: Не найден наблюдатель задачи N)_get_issue_watchersr>   rG   rH   _get_personCmfErrorresponsibler   	cmf_owner
spectatorsr   commit_with_event)r   	issue_objr   r3   watcherpersonr   r   r   _process_watchersl  s    
zJiraAPIImport._process_watchersu#   Обработка вложенийc                 C   s*  ddl m} dd l}d|d  d|d d  d}t|d	  d
}d}| r,||}| 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| j|
d | j |d|_|
d |_||	d}|jdd || |jdd |
r||j|
d ks|t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%}|sxt
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 q6|S )'Nr   )RDisku   Вложения задачи r   r   rj   r   r   
issue_pathz /attachments/all_attachments.zip
attachment	processed/filenameimport_originalurlZurl_preview_imgZurl_previewr   r   rj   T)r*   r   r  r   r   r   r   r   sizeu   Текущий размер z != u    из метыu7   Обранужена проблема вложения uI   , размер файла не совпадает с метой из JIRAzERR-0034r)   :   Не удалось обработать вложение zERR-0035	file_namer   r   rc   )(Zrdisk.rdiskr  zipfiler   r^   ZipFileZnamelistr*   inc_statendswithrI   CmfDocument_get_filenameCmfAttachmentrK   r  r   rF   r   r   r_   r   Zupload_stream_filest_sizeAssertionErrorr-   r.   r2   r0   _get_issue_attachmentsZ
upload_dirrf   copyZfull_path_fileZCmfRFileZdata_driverZget_rdZ	get_rfileZ
_file_namemake_preview)r   r  
jira_issuer  r  r3   Zall_attach_zip_patherrorsZmyzipZzip_attach_nameattach_infoZattach_namer  Zattach_fattachment_infoZ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   )Zurllib.parser#  r$  r   find_allr)  rK   r   query_get_user_info_from_dumplowerrF   r,  r   r   loginr/   r1   r*   r2   r'   )r   r  r   r#  r$  doc_souptagr  
parsed_urlr1  	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 ]T}|| j	|krX|  S |dd
 |krt|  S |dd
 |kr<|  S q<td| d S )N:user:r   r   r   usernameuQ   Не нашли информацию по пользователю в дампе )APPREDIS_DBredisrK   r*   r   pickleloadsr   rF   r3  r/   )r   user_idredis_dbr8  r   r   r   r2    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r6  r   r   r   <lambda>      z.JiraAPIImport._process_links.<locals>.<lambda>r.  u   Уже обработали r,  #u   Это якорь u&   Обрабатываем ссылку rE  r	  ?r   (/attachment(?:/content)?/(\d+)(?:/)?(.*)r)   rj   r  c                    s   |  d kS Nr   rK   itemZ	attach_idr   r   rI    rJ  r
  r  )r   rj   r   Zsrc_origTZvideoZcontrolsz100%widthZheightr-  u   Заменили на z/people/r   )r   r0  r)  rK   r*   rU   inforG  
startswithurllibparseunquoter   researchnextr   rI   r  r  r  sgetr  	mimetypes
guess_typer   r   r,  r'   )r   r   r   r  r  Z	text_soupr6  r  r  	url_matchattachmentsattachZ
attach_obj	mime_type
account_idr  r   rS  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}t|dkr|d nd|d< t|dkr|d n|d |d< ddg}	t	j
jdd|d g|	d}
|
st	j
jddd| dg|	d}
|
st	j
jdd|d g|	d}t|dkr| j jd|d  dt| d| ddd |  jd7  _g }|sJ| j jd|d  d|  d
d|d
 g}t	j
j||	d}|sJt|dkrdd|d g}nHt|dkr:d dd|d gdd|d ggdd|d gdd|d ggg}t	j
j||	d}t|dkr|  jd7  _| j jd!|d
  d"|d  d#t| d| ddd |r|d }
n*| j d$|d
  d"|d  d%| tj d&}|
sz|rrd'}d}|d }t	j
jdd| g|	dr\| j d(| d)tj |d 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'|
_"|d- d. D ]}| jjjr2d	|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}|st	j|| j d'|d
 |d0}|jr|d
 |_#|js||_n||jkr|j | |_|j$d'd1 |
j !| q|
j%r(|
j$d'd1 |
|fS )2N()r   u0   Импортируем пользователя ZaccountTypeZ	atlassianu   Неизвестный тип rj   r   r    r)   r   Z
first_name	last_namer   rg_member_ofr4  ILIKEr   r   rj   r   LIKE%u+   Пользователей с почтой z > zERR-0037r   obj_typeuH   Не удалось найти пользователя с почтой r   ORu+   Пользователей с именем  (z) > uM   Не нашли пользователя среди существующих z) FTuQ   Обнаружена учетная запись с дублирующим email u   , добавляем цифру@+)r   r4  r*   r  groupsr   groupId)r   r*   r  r   import_raw_jsonr   )&r*   rU   rU  r>   rG   rH   warningr   r   rI   r   r   r   r   rF   r   r   rK   r   r2   r1   r+   rT   INFOr3  WARNINGr  setattrr   CmfPersonGroup
jira_group
user_grouprj  r   Z
user_localr   r   
is_changed)r   r   createupdater3   Zobj_msgZ	user_dictr   r   rj   r  Zpersonsr   
is_creatednr4  Zprefix_emaildomainr   r}  r~  Z
group_infogroupr   r   r   _process_person2  s      " &
 

   
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 )Nru  r   r   r   rm  rn  r   rl  rk  T)r   r   r*   r  rw  r   r)   u4   Не удалось загрузить группу ERR-0038r|  ro  )r   r*   r,   r   r   rI   r|  rK   r  r   r   r   r-   r.   imported_object_countr1   r2   )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   Не грузим пользователей из-за опцийrV   r   r)   z.evateam.ruu@   Не удалось загрузить пользователя r  r   ro  Zsend_invites)r4   )r*   r   r   rK   r+   rT   rz  setr   r,   r  r  r   r   r  addr1   r2   Zschedule_deferred_jobrI   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>   rG   rH   r   r   rI   CmfStatusCoderK   r   r   get_status_typestatus_typer   r   r-   r.   r  )r   r   r  r   Zcmf_status_coder   r   r   r   _process_statuses  s*    




zJiraAPIImport._process_statusesc                 C   s2  i }i }d}d}|  |d D ]n}g }| j|d dD ]2}|d r6|d |d d d kr6||d  q6|  |t|g }	|	| qtjjdd}
t	|
 d	d
D ]z\}\}}| jjjj d|d  dd| }tjjdd|gd}|s0tj||
| jd}d|d  d| d|_|jdd | j|d dD ] }|d |kr@| || q@t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|D ]\}|s|d dkr|}|s|d dkr|}d| jjjj d|d  d}|||< qq| jjjj d|d  }d |d  }tjj|d!}|stjjd"d}tj||| jd}||_||_||_|jdd tjj|d#D ]}|  q|
 D ]b\}}| j r q.tjjdd$d%| d%gd}||d&|| jd'}tjf |}|jdd q|S )(u)  
        У простого проекта воркфлоу привязан к issue type 1 к 1
        Поэтому надо получит все типы привязанные к проекту, на каждый тип создать WF и замапить через схему
        Nr   
project_idZusagesr   
issueTypesdefault.system:defaultrB   r)   )start
::SIMPLE::r   -r   =r   r   templater*   u9   Simple бизнес-процесс для проекта r   rr  rg  Tr   workflowr   r  rl  !=forcehierarchyLevelrL  u(   Simple-схема для проекта r  softdev:default	scheme_wfrm  rn  r   
logic_typeZtarget_workflowcmf_model_namer  r*   )_get_issue_types_for_project_get_statuses_for_projectr   sort
setdefaulttuplerI   CmfWorkflowrK   r   r   r*   r   r   r   r   r   _create_status	CmfStatusr   r  deleteCmfSchemeWfdefault_task_workflowdefault_subtask_workflowCmfSchemeWfRuler,   CmfLogicType)r   Zjira_project_infoZissue_type_group_by_statuses	issue_mapZdefault_task_wfZdefault_subtask_wf
issue_typeZissue_type_status_idsjira_statusZissue_type_listwf_templateindexZ
status_idsissue_typesworkflow_ext_idr  r   issue_type_ext_idscheme_ext_idZscheme_nameschemer  rulelogic_type_ext_idr  	rule_dictr   r   r   #_create_schemewf_for_simple_project  s     &
 
 z1JiraAPIImport._create_schemewf_for_simple_projectc                 C   sH  | 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|_||_||_	|j
|j d |S )Nr   r   r  r  r   )r   r   r*   Tr   r   r   r   r  status_code)r  r*   r  r   FZ	only_data)r*   r   r   r   rI   r  rK   r   r  r  r   r  r   r   r   allow_empty_transitionr  is_new)r   Zjira_status_datar  status_ext_idr   r  r  r   r   r   r   r  O  s>    "

zJiraAPIImport._create_statusc           /      C   s  ddl m} dd l}i }d }d }i }tjjdd}|d d }	|	D ]N}
||
d }| jjjj	 d|d	  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qd|d krq|s(|dr(|}d
| jjjj	 d
|d	  d
}|||< |d D ]*}|d d |d< | ||||d	 < qVqt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d" d#}| jj}| jj}d$}|tj|j
j }z&|j||j||d%d&d'i||d(d)}| j  d*}t!|d+}|"|j W 5 Q R X t#|jd,}|st$d-t% }t }|&d.D ]}|j'dd/id0j() }|| ||d	 < |&d1D ]H} |*| d	 | d | j'dd2id0j() |d	 | &d3d d4 d5 qq|sXt$d6t+| d7t+| d8|&d9D ].} || &d3d d4  }!d|!_,|!jdd: qb| j-d;t+| d<t.j/ |D ]}"| jjjj	 d
|j0 }#|# d
|"d	  }$tj1j|$|d=}%|%stj1|$|| jd>}%|"d |%_
|"d |%_||"d?  g|%_2||"d@  |%_3|%jdd qW qB t$k
r }& z$| jj4dA|j
 dB|& dC|dD W 5 d }&~&X Y qBX qB| jjjj	 d
|d d	  }'tj5j|'dE}(|d dF })|(stj5jdGd}*tj5|)d |'|)dd|)| j|*dH}(||(_6||(_7|(jdd tj8j|(dID ]}+|+  q*|9 D ]P\},}tj:jddJdK|, dKgd}-|-|dL|(| jdM}.tj8f |.}+|+jdd qB|(S )NNr   )cmf_hashlibr  rB   jira_workflow_schemeZmappingsr   r  r   r   r   r  r   r  r   r   Tr   defaultr  r  	issuetyper   subtaskr  r  r   r  r   r  rl  r  r  r	  z&/secure/admin/WebSudoAuthenticate.jspazL/secure/admin/workflows/ViewWorkflowXml.jspa?workflowMode=live&workflowName=FzX-Atlassian-Tokenzno-check)ZwebSudoPasswordZwebSudoDestination)authZverifyZheadersdatazworkflows.xmlr[   lxmlur   Не удалось получить список переходов между статусами в виде XMLzsteps > stepzjira.status.idr(  zactions > actionzjira.descriptionzresults > unconditional-resultstep)r   r   r   fromtou   Из XML получено u    статусов и u'    переходов между нимиzglobal-actions > actionr  u   Настраиваем u1    переходов между статусамиr   r  r   r  r*   r  r  u   Не удалось импортировать переходы между статусами для бизнес-процесса «u   »: ERR-0067r   r  rU  r  )r   r   r   rw  r*   r  r  rm  rn  r   r  );Zcmf.utilr  requestsrI   r  rK   Zshort_str_encr*   r   r   r   r   r   r  r  r  r   r  r  r>   r  rstripr4  passwordrW  rX  Zquoter   Zpostr  ZHTTPBasicAuthr\   r]   r_   writer   r/   r   selectfindr\  stripr   r   r  r+   rT   ry  r   CmfTransstatus_from	status_tor2   r  r  r  r  r   r  )/r   project_infor  r  r  Zdefault_wf_for_taskZdefault_wf_for_subtaskZall_statusesr  Zworkflows_dataZworkflow_dataZworkflow_name_hashr  r  r  r  r  r  r   r  r4  r  Zrequest_urlZdestinationresponseZworkflows_pathrd   ZxmlZ
jira_stepsZjira_transitionsr  Zjira_status_idactionsjira_transitionZworkflow_hash_idtransition_ext_id
transitionr9  r   Z	wf_schemeZwf_scheme_infor  r  r  r  r  r   r   r   _process_wf_scheme{  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,   rK   _process_issueput)r   Zissue_queueZissue_queue_errorsr  r   r   r   r   _process_issue_thread  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   rj   labelsrh  _rK  r   ruT)Zlanguage_codereversedrq  aliasrk  r   z"%r   r   r9   r   u*   Не удалось создать тег r/  )Ztransliterater  r  r   _count_project_tasksr*   r,   rK   unionreplacerI   ZCmfTagr   r/   rT   rx  )
r   r  r  tagsr   Ztag_nameZ
name_aliasr   Ztag_objr9  r   r   r   _process_tags  s,     
zJiraAPIImport._process_tagsu)   Обработка приоритетовc           	      C   s   | j jjj d|d  }tjj|d}d}ddddd	d
}| dD ]F}|d |d kr\qF|d D ]"}|d |krvqd|d ||d < qd qqFtjjd|d}|stjddd|| j d}||_|j	dd d S )Nr   r   r  )ZLowestZLowZMediumZHighZHighestu   Отложено   Минимальныйu   Самый низкийu   Низший   Низкийu   Средний   Обычный   Высокийu   Высшийu   Наивысший   Критичныйu   Критическийr  r  r  r  r   )rL  r   r)      priority_schemesr   ZprojectKeys
prioritiesr   r   r  u   Приоритет)r   r   Zorig_captionr   r*   Tr   )
r*   r   r   rI   CmfCustFieldConfrK   r   ZCmfCustFieldConfFieldchoicesr   )	r   r  Zcust_field_conf_ext_idcust_field_confZpriority_namesr  Zpriority_schemer   Zcust_field_conf_fieldr   r   r   _process_priorities0  s8    z!JiraAPIImport._process_priorities)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< | ||d< t jjddd|d  dg| d}|st j| j|d |d d
d}|jrL|D ]$}|dkr&qt||||  q|drLd|_|j}|
  |rt jj|dD ]}|jd
d qn| |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}	|	st j|d | jd
d}	||	_|d |	_	|d|	_|	j
d
d t jj||	d}
|
sRt 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(|  qp|d d)kr0| jjjrRd|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#d07  _#nt$d1qp|
j
d
d q| %  | &| | '| | %  | j(|d2 | )||_*| +||_,| -| |j
d
d | .| | j/ rd S t0  | 1| | %  | 2| | j j3d07  _3| %  |S )3Nr   r   r  r   rl  rr  rg  u   Проект с именем u8    уже существует! Переименуем в TZtask_allow_multiple_sprintsui_form_schemecust_field_conf_schemerm  rn  )r*   r   r   r  	isPrivateprivater   ZTEXKOM_db_deleter   r   r  r   )r   r*   r  r   r   )r   project_role)r   r  r*   actorstypeatlassian-user-role-actorr8  r@   uX   Не удалось найти и добавить пользователя в роль u    проекта: r   zERR-0039r   uR   Не удалось привязать пользователя к проекту zatlassian-group-role-actorZ
actorGrouprv  rk  u<   Не найдена группа пользователей u#    для проектной ролиzERR-0040r)   u&   Неизвестный тип ролиr  )4rI   
CmfProjectrK   r  r   r   r*   rU   rx  r   r   _process_screen_scheme_process_field_conf_schemekeysr  r{  Zperm_policyr  r   r   r  _get_project_rolesr   r   CmfProjectRoler   ZCmfProjectRoleAssignmembersr>   rG   rH   r   r2   r   r|  r1   r/   _calc_progress_process_versions_process_componentsr  _process_permissionsZproject_perm_scheme_process_security_levelssecurity_level_schemer  _process_tasksr,   r   _process_boards_process_sprintsr  )r   r	  r  project_objr   r  r   	role_infor   roleZrole_assignactorr   Z	sub_groupr   r   r   _process_projectf  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   ry   IMPORT_OBJ_CNTr_   r+   pid
log_detail)r   r  doner8  procr   r   r   _execute_task  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*   rU   rU  r|   r  ranger?  ry   r:  r   timesleepr   pollr1   removecommunicate
returncode)	r   r  r=  Ztask_cntprocessr  r>  rF  new_procr   r   r   r"    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 )"NrA   rB   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   rw  
simplifiedr  r  r  r)   <   Не удалось импортировать проект ERR-0041r  ro  )rI   rJ   rK   r   r   r   rS   r*   r,   r   r   rF   r  r/   r   r   r  r  r)  Zrollback_purge_eventr1   r2   )r   rW  r  r%  project_leadr   r  r	  Zproject_simplifiedr  r   r   r   r   _process_projects  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 )NrA   rB   r   c                 S   s   g | ]}|d  qS rI  r   r   r   r   r   r   e  s     z7JiraAPIImport._process_projects_box.<locals>.<listcomp>r   r   rJ  rK  rL  rM  rN  rO  rP  rQ  rR  rS  rT  u$   ERROR! Поректы с типом rU  r   r   r   rV  r  r)   rY  rZ  r  ro  )rI   rJ   rK   r   r   r   r*   r,   rS   r   r   r   rF   r  r/   r  r)  r   r1   r2   )r   r%  rW  r  r[  r   r  r	  r   r   r   _process_projects_box]  sT    
 z#JiraAPIImport._process_projects_boxu   Обработка досокc                 C   s  t jjddd|d  dgd}t jjd|dgd}|sNt jd||d| jd	}|jsbd
|_|  | |d D ]}z| j rW  dS | jj	j	j
 d|d  |d< t jj|d ddddddddgd}|st j|d | jd}|d |_|d |_||_||_|jd
d |j  |jr:|d d }|r|jrR|j  |j  t j|d |d | jd}|jd
d | j|jj ||_|jd
d dddd d!d"d#}|d d$ }	||	d% d"|_|jD ]}
|
  qd|_|jjd
d |	d& ddd' D ]H}t j|d |d( | jd}
|
jd
d | j|
jj |j|
 q|jd
d |jD ]}|  qbd|_|jjd
d |d d ddd' D ]b}| jjjr|d }n|d( }t j|d || jd}|jd
d | j|jj |j| q|jd
d d)d*d+d,d-}||d d d,|_ |j!D ]}|  q6|j  |d d. d/ D ]}zt j"|d || jd
d0}|jd
d |d1 D ]P}| jj	j	j
 d|d  }t j#j|d2}|st$d3| d4|j%| q|jd
d |j  W n8 t$k
r4   |j&  | jj'd5| d6|d7 Y nX q`| j j(d87  _(W qp   | jj&  | jj'd9| d:|d7 Y qpX qpdS );z
        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
        r   rm  rn  r   u
   Доскиtree_node_is_branchr  N)r   r   r   r   r*   Tr   r   kanban_board_columnsrw  r   r   
limit_dayskanban_filterswimlane_filtersquick_filtersr   rj   r   r*   r   rU  r   r   jql)r   ubql2r*   z	1 queriesz2 userstoryz
3 assigneez4 epicz	5 projectz7 none)customZparentChildassigneeZepicr   ZnoneswimlanesConfigZswimlaneStrategyZ	swimlanesrL  r1  z1 -1wz2 -2wz3 -4wz6 none)z-1wz-2wz-4wZNONEZcolumnConfigcolumns)r   r   r*   r  r  r  u   Не найден статус u    для колонкиuD   Не удалось создать колонку для доски zERR-0042r   r)   u:   Не удалось импортировать доску zERR-0043))rI   r  rK   r   r*   r^  r   _get_project_boardsr,   r   r   ZCmfKanbanBoardr   rw  r   r   r-   r.   r  ra  r  CmfTaskFilterrR   r   r   r   Zswimlane_typerb  rc  r>   rG   rH   r`  r_  ZCmfKanbanBoardColumnr  r  Zmapped_status_codesr0   r2   r  )r   r  r   Zboard_folderboardZ	board_objZboard_filterra  Zswimlane_type_mappingZswimlanes_configZswimlane_filterZswimlanequick_filterZquickfilterZquick_filter_queryZlimit_days_mappingcolZ	board_colr   r  Zstatus_globalr   r   r   r#    s     
 
      









 
  zJiraAPIImport._process_boardsu#   Обработка спринтовc                 C   s8  t jjddd|d  dgd}t jjdd|gdddg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r,|jdd |d dkrj||_|jsZd|_|jdd |jd |_n"||_|d d!kr|jd"|_|jr|jdd t  | jjd#|j d$t|d%   |d% D ],}	| jjjj	 d|	 }
t jj|
d&dd'gd}|r|d(r| jjjj	 d)|j }t jj|d*d+d,gd}|sZt j|| jd-}d.|_d/|j d0|j d1|_ ||_!|jr|j|j" d2 |j#d krt|j$d3kr|j%&| n|j%&| n0|  j'd37  _'| jj(d4|	 d5|d  d6|d7 q|jdd t  | j j)d37  _)| j*dd8 q|d S )9Nr   rm  rn  r   r   r   r   r   r   r^  rl  zlist.agile_sprint:defaultrB   r   r   r   r  r  r  r  r   r   r   rd  T)r   r  r*   r  r   r   r   stateclosedCLOSEDr   ZIN_PROGRESSu0   Добавляем задачи в спринт r/  issueslistscache_status_typer   z::comment-sprint:	log_levelr   r   re  r  uB   Задача была в архивном спринте <a href="" target="_blank"></a>r  r)   u-   Неизвестная задача issue_id=u    в спринте zERR-0044r   r  )+rI   r  rK   r   r  _get_all_sprintsr*   r,   r   r   r   r  r  r   r   r   r  r   r   r^  r  Zget_default_statusr   r   rU   rU  r   r   r   r   rw  r,  r   r   r  rv  ru  r  r   r1   r2   r  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   r$    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_diffT  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CmfUserro  Fr   Zdefault_user_idrI  uA   ", ставим пользователя по умолчанию r  uc   ", указываем системного , в дампе, указываем системногоr)   )r2  r*   r2   gZsystem_userr  r   r   rK   rI   r   r+   rT   rz  r1   )r   rB  r3   r   r  r  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.jsonrr   r2  
)r]   r^   r_   r`   rA  r  dumps)r   r  r  Zgroups_pathrd   rowr3   r   r   r   _dump_groupsq  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  r2  r  uM   Неудалось сдампить пользователя по ключу r  )r2  r/   r]   r^   r_   r`   rA  rF   r>   Zget_user_infor  r  r*   r+   rT   rz  )r   rB  r  Z
users_pathrd   r  r3   r8  r   r   r   _get_user_info~  s$    

&zJiraAPIImport._get_user_infou,   Обработка журнала работ)r   c                 C   sH  | j jd d|d  d|d d  d}| |D ]
}t }d|d	< | j |d
< | j|d | j |d|d< |d |d< | 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   rj   r   r   rr  r   r*   r   r   r   r   updateAuthorcmf_modified_byr   started
start_dateZtimeSpentSeconds<   
time_spentr}  r   r   r   r   r   rw  r   Zremaining_estimater  )ZminutesTr   )r*   rU   rU  _get_issue_worklogsr   r   rF   rK   r   r   rI   ZCmfTimeTrackerHistoryr  r   datetimeZ	timedeltar  end_dater   )r   r   r   r3   worklogZtimetracker_historyhistoryr   r   r   _process_issue_worklog  s.    


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   
        Конвертирует "Фрагмент кода"
        r%  ZprerC   r&  c                 S   s   g | ]}| d r|qS )zcode-)rV  )r   class_r   r   r   r     s     
 z/JiraAPIImport._convert_code.<locals>.<listcomp>zlanguage-noner   r  r)   z	language-)
r   r0  new_tagextendcontentsclearr   rK   r   r'   )	r   r3   r   soupr6  Zcode_tagZ	class_tagZ
code_classrC   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}| j	|d | j
 |d|_|j|_| 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   rj   r   r   r   r)   r   r   r  uN   Комментарий уже есть, и правился в системе zERR-0046r   Tr   r   r*   r  r   r  r   r   r   Z
visibilityr  r'  r   r9   uL   Ошибка обработки приватного комментария zERR-0047r   r}  r  u   Обработано u:    комментариев, из них приватных )_get_issue_commentsr*   r   r   rI   r   rK   r  r2   r   rF   r   r   r  r   r   r   r:  r   re  r   r  rw  r  r   r   r  r1   r   r  r+   )
r   r   r   r3   cntZprivate_cntr}  r   Zcmf_commentr'  r   r   r   _process_issue_comments  sP    
 

 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   r%  Zulr&  ztox-checklistr(  r  r  liztox-checklist--checkedr)   Tr   )r   r   _get_issue_propertiesr   r  r   rV  r   r'   r  r   )	r   r   r   r   Zissue_propertyr  Z	checklistvalr  r   r   r   _process_properties  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   rj   r   r   c                 S   s   i | ]}|d  |qS )r   r   )r   rn   r   r   r   
<dictcomp>  s      z2JiraAPIImport._process_history.<locals>.<dictcomp>	changelog	historiesz	::historyr   r   r   u   Аудит без автора r   r)   )r   r   rw  r   r   rn   r   r   Z
fromStringZtoStringr   z<br>r*   r   r   rw  r   rd  T)r*   r  r   )r   rI   r   r   r*   r   r   rK   r   rF   rU   rx  r  r   r{  r   )r   r   r  r3   Zjira_map_fieldsr  r   r   r}  rR  r   rn   ZdiffZhistory_commentr   r   r   r   _process_history  s0    


zJiraAPIImport._process_historyu   Обработка задачиc                 C   s  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}| || 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#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( |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/< |d0 r|d1 d2 |d0< ||d/< |pg }d| j jjj d|d d3 d  d}
tjjddd|
 dgd	|d4< | j jd5|  tj| j tj	|dd6|d gd7\}}|| ||7 }| ||jj|_|  |jj|||_| !||jj|_|d d8 d9 r| "|| | j#d:r| $|| |D ]}|j%&| q|d d;g |d d<g  D ]h}| j jjj d=|d  }tj'j|d}|sZ| j jd>| d?d@d |  jd 7  _n|j(&| q |d dAg D ]h}| j jjj d|d  }tj)j|d}|s| j jdB| dCdDd |  jd 7  _n|j*&| qz|d dE |_+||_,|j-r|j.ddF t/  | 0|| |d dGg }|rdzt1| j || W n   | j j2dH Y nX | 3|| | 4|| | j jjj dI|d  }tj5j|d}|stj5|| j dJ}||_6| j7j8 dK|d  }dL| dM| dN|_dO|_9|j.ddF |j:;  | j <dPdQ |S )Ru   
        Общая логика обработки которая потом разделяется на задачи и эпики
        r   r   rj   r   r   r   rm  rn  r   u$   Не проекта с ключем r   u   Задача r   r   r   %::r   r  rl  rv  rW  TZapprovedrC   securityr  Zperm_security_levelu:   Не найден уровень безопасности zERR-0048r   ro  r)   zStory PointsZagile_story_pointsreporterr   r   u*   Не найден автор задачи zERR-0049)rt   exc_infocreatorr   u?   Не найден ответственный по задаче ri  r   u6   Не найден исполнитель задачи r   r   renderedFieldsr   r  r  u2   Пытаемся создать задачу из r   r   r}  totaltimeTrackingEnabledZfixVersionsZversions
::version:u!   Не найдена версия zERR-0050r   
componentsu%   Не найден компонент zERR-0051CmfComponentr   r   r  u/   Не удалось привязать тегиz
::comment:re  zbrowse/u<   Задача импортирована из Jira: <a href="rx  ry  r  r   r  )=r*   r   r   rI   r  rK   r   r   r   r   r   r  r  rL   CmfSecurityLevelr2   r1   ro   r   rF   r+   rT   ZERRORr  rU   rU  r   r   r"  r:  r   r   re  r  r  rN   r  ru  r   r   fix_versionsr  r  r   rw  r  r   r   r  Zprocess_tagsZexcepionr  r  r   r   r>   r  rw  r-   r.   r  )r   r   sprintsr  Zproject_ext_idr   r3   Znormalized_issuer   Zstory_p_fieldr  r  r  r   versionZversion_obj	componentZcomp_objr  r|  r}  r,  r   r   r   r  $  s    ",

$
 
$
 .$
 .$
 .

& 
$  
zJiraAPIImport._process_issueu&   Обработка всех задачc                 C   s2   | j  }|D ]}| j r" d S | | qd S r   )r>   r   r*   r,   r  )r   rt  r   r   r   r   _process_issues  s
    

zJiraAPIImport._process_issuesu3   Обработка связей всех задачc                 C   s  |   D ]n}| j|d | |d dD ]J}| j rB  dS |d d}| jjjj d|d  }|r| jjjj d|d  }| 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
|	< qd|kr||d	 d
|d< | jjjj d|d d  |d d< || j
|	< qq*q| jdt| j  | jD ]z}| j r dS tjj|d}
| j| D ]H}tjj|dgd}|s| jjd|  q|
|_|jdd qƐq| jj  ddddd}| jjdt| j
   | j
 D ]J\}}| j rr dS z| jjjj d|d d  }||d d }|rtjj|d}ntjj|d}|stjjdd|d d gd}|s4tj|| j|d d d}|d d  |_|d d! |_|jdd tjj|d d d}|s| jjd"|d d	  d#|d d  d$ W qVtjj|d d d}|s| jjd%|d d	  d#|d d  d$ W qV| jjjj d|d  }tjj|d}|stj|| jd&}||_||_||_|jdd W np   |  jd'7  _| jj d(|d  d)|d d	  d#|d d  d*|d d	  d#|d d  d+d,d-d. Y nX qV| jj  dS )/uD   
        Постобработка связей задач
        r   r   Nrj   r   r   Z
issuelinksr   r   )r   r   r   r   u   Подзадачи: r  parent_taskrd  uq   Не удалось связать задачи, возможно задача не попала в импорт Tr   zsystem.finish:finishzsystem.duplicatezsystem.linkzsystem.clone)ZBlocksZ	DuplicateZRelatesZClonersu   Связи: r  r   rB   r   r   )r   r*   r   ZinwardZoutwardu=   Не удалось найти входящую задачу rr  u   ). Возможно задача не попала в импорт или находится в проекте, который еще не импортирован.u?   Не удалось найти исходящую задачу re  r)   u.   Не удалось создать связь z. in_link: z), out_link: rg  zERR-0052r   ro  )!r   r   r  r*   r,   rK   r   r   rP   r   rO   r+   r   rI   r   rU   rx  r  r   r-   r.   rU  r  r   ZCmfRelationTypeZin_type_nameZout_type_nameZCmfRelationOptionin_linkout_linkrelation_typer1   r2   )r   r   r   Zissue_parentr   Zparent_ext_idZ	sub_tasksZissue_linksZ
issue_linkZlink_ext_idr  Zchild_ext_idZ
child_taskZ	map_namesZrelation_ext_idZissue_relationZrelation_coder  r  r  Z
rel_ext_idZrelation_optionr   r   r   _process_relations  s    "



&&


  Fz JiraAPIImport._process_relationsu)   Обработка компонентовr  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|_|d dkr6|j|_n.|d dkrN|j|_n|d dkrd|j|_|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   rm  rn  r   r   rl  r  Tr^  )r   r   Zinclude_systemrj   uV   Данный тип проекта не поддерживает компоненты r   Nr   descr_documentdefault_ownerdefault_responsibler  r   r   rd  r   r*   r  r   rJ  u   Компонент r   ZassigneeTypeZPROJECT_DEFAULTZPROJECT_LEADZCOMPONENT_LEADr   r   r   r)   u3   Ошибка загрузки компонента ERR-0053r  ro  )rI   r  rK   r   r  _get_project_componentsr^  r   r*   r,   r   r   r  r   r   r   r   rF   r  r   r  r   r  r  r  Zcreate_descr_documentZ
text_draftr   r  r1   r2   )r   r  r%  r   r  r   Zcomponents_listr   r   r   r  )  sf    
  



 z!JiraAPIImport._process_componentsu   Обработка версийc              	   C   s  t jjddd|d  dgdgd}t jjd|d}t jjd|d}| j|d	 d
D ]T}z| j rpW  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rH|d s2|d r>|d n
|d |jrd|jrd|jdd | j jd7  _W qT   |  jd7  _| jjd| ddd Y qTX qTd S )Nr   rm  rn  z"scheme_wf.default_release_workflowrl  release)r   r   r   r   r  r  r  Tr  zlist.release:defaultrB   r   r   r   r   ZarchivedZreleasedrs  ZOPENr)   u+   Ошибка загрузки версии r  r   ro  )rI   r  rK   r   _get_project_versionsr*   r,   r   r   r   r  r  r   r   r   r  Zdefault_release_workflowr  r  r  r   r   Zset_default_statusr  r1   r2   )r   r  r%  Zrelease_folderr{  r  r   Zversion_listr   r   r   r  d  sH    




 zJiraAPIImport._process_versionsu*   Обработка JQL в фильтрахc                 C   sz  | j jjj}| jD ]`}tjj|dgd}|jj}|jrzi }t	|}|
 }| D ]\}}	|	d }
|	d }dg}|	d D ]v}|dkr|
dkr| d	| }n&|
d
kr| d| }n| d| }|ddd| dg q~||d| g q~t|	d j|d}|rX|jj||< qX||}||_|jdd W q   | j jd| d|j d|j dddd Y qX qdS )uP   
        Пост обработка JQL в фильтрах задач
        rg  r   rj   
task_fieldr   rq  Z	search_byr   )Zaffected_versionsr  r  r   r  r   rk  rn  rp   r   Tr   u+   Ошибка нормализации JQL (u   ) в фильтре "" (rg  zERR-0066rm  ro  N)r*   r   r   rR   rI   rm  rK   rg  r   r   Z
get_valuesr   r   ZcmfutilZget_model_by_namer   Z
set_valuesr   r2   r   rC   )r   r   Z	filter_idZtask_filterrg  Zreplacement_valuesrf  Z
raw_valueskvr  r   Zfilter_Zsearch_fieldr   r3   r   r   r   _process_jql_in_filters  sD    
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   sr  ddddddddddddddddddddddd	ddd	ddd	dd
ddd
ddd}|  dD ]}| jjd|  | j r dS | jjjj d|d  }tjj	ddd| dgd}|rqp|	|d }|r>tjj	dd|d gdgd}|j
r"d| |j
 |_
nd| d|_
|jdd qp| jjd|d  d tjj	dd|d  gdgd}|r|j
rd| |j
 |_
nd| d|_
|jdd qp| jjd  d}| jjjr|d! d"krd}n|d! d#kr
d}n|d$ r
d}tjj	dd|gd}td| d|d  |d% d&|d'}t| jtj| t  | j jd#7  _qpdS )(u$   Маппим issueType в logic_type   Подзадачаztask.sub:default)r   rC   Z	UserStoryztask.userstory:defaultz
Task Agiletask.agile:defaultBugztask.bug:defaultEpicztask.epic:default)zSub-taskZSubtaskr  ZStoryu   ИсторияZTasku   Задачаr  u   Багu   Ошибкаu   Эпикr  r  u-   Обрабатываем тип задачи Nr   r   r   rm  r  ::%r   r   rC   r   rl  Tr  u   Ищем по имени "r   rk  u*   Не нашли, создаем новыйr  rL  r)   r  r   r   )r   r   r   r  r  )r   r*   rU   rU  r,   r   r   rI   r  rK   r   r   r  r>   rG   rH   r   r   r   r   r  )r   Z	name2coder  r  r  Zlogic_type_dictZtemplate_coder  r   r   r   _process_issue_type  sz    


z!JiraAPIImport._process_issue_typeu2   Обработка бизнес-процессовc                    s  i }  dD ]}|||d < q  dD ]P} 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 |	_|d |	_
 fdd|d D }
tjjdd|
gd|	_t|	jt|
ks*td jjjj dj d|d  }tjj	|d|	_|	jdd qh j jd 7  _q*dS )!u   Импортируем workflowr  r   	workflowsNr   r   ZentityIdr  r  rB   r  r   Tr   r  r   r   r  rl  r  r   r  Ztransitionsr  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  INuN   DEV: Fatal Вероятно, сломали создание статусов!r  r)   )r   r*   r,   rU   rU  r   r   rI   r  rK   r   r   r   r  r  r   r  r  r   r  r  r   r  r  r  )r   Zjira_statusesr  Zjira_workflowZworkflow_idZtemplate_workflowr   r  r  r  Zstatus_from_ext_id_listZstatus_to_ext_idr   r  r   _process_workflow	  sT    
,

 
"

"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  |d	 |d
d| jjjj d|d  ddi||d}t	
| jtj|dd|d g\}}|stjj|dD ]}|  q|d  D ]\}}	| j r  d S | jjjj d| }tjjddd| dgd}
tjjdd| jjjj d|	 dgd}|
|d|| jd}tjf |}|jdd q| j jd7  _q
d S )Nworkflow_schemer   ZdefaultWorkflowr   rm  r  r   u+   Не импортировался workflow r   r   r   r   rC   r  )r   r   r   r  r  r  r   r  ZissueTypeMappingsr  r   r  Tr   r)   )r   r*   r,   r   r   rI   r  rK   r  r   r   r  r  r   r  r   r  r   r  )r   r  Zdefault_task_workflow_ext_idr  Zscheme_dictZworkflow_scheme_objr  r  r  Zworkflow_namer  r  r  r   r   r   _process_workflow_schemeF	  sP    

 
(z&JiraAPIImport._process_workflow_schemec                 C   sH   t jj}| dD ]0}|| j}|| jj d| t	
| qd S )Nr   r;  )r=  r>  r?  r   rK   rF   r  r*   r   r@  r  )r   rC  r8  r   r   r   r   _cache_all_usersk	  s    zJiraAPIImport._cache_all_usersu   Простой дампr9   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.dirtyr2  r)   r  Tr  )r*   r\   r]   r^   rg   rD  r_   json_object_countr  r`   r  rf   ri   r   r   )r   Zapi_funcr   rc   rk   rd   r  r   r   r   _simple_dumpq	  s    

 zJiraAPIImport._simple_dumpc              	   c   sN   | j  | d}| rJt|d}|D ]}t|V  q.W 5 Q R X d S )Nr  r+)r*   r\   r]   r^   r_   r`   rA  )r   r   rc   rd   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   .dirtyz.metau(   Пропускается каталог r	  
/info.jsonr  )r*   r\   r]   r^   rg   listdirr  rU   rx  r_   r`   ra   )r   project_dirr  rd   r   r   r   r   	  s    

zJiraAPIImport._get_projectsc                 C   s&   |   D ]}||d kr|  S qd S rO  )Zget_projects)r   r  r  r   r   r   get_project	  s    zJiraAPIImport.get_projectc              	   c   sH   | j  d|}t| dd}|D ]}t|V  q(W 5 Q R X d S )Nr   /issue_types.jsonr  r*   r\   r]   r_   r`   rA  r   r  r  rd   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.jsonr  r  r  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.jsonr  r  r  r   r   r   r  	  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   rQ   r	  r  r  r*   r\   r]   rg   r  r_   r`   ra   )r   r  	board_dirZboard_idrd   r   r   r   rl  	  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	  r  r  r  )r   r  sprints_dirZ	sprint_idrd   r   r   r   rz  	  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.jsonr  r  r  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.jsonr  r  r  r   r   r   r  	  s    z%JiraAPIImport._get_project_componentsc                 C   s0   | j  d|d}tdd t|D }|S )Nr   r   c                 s   s   | ]}| d  V  qdS )r  N)r  )r   entryr   r   r   	<genexpr>	  s     z5JiraAPIImport._count_project_tasks.<locals>.<genexpr>)r*   r\   r]   sumrg   r  )r   r  	tasks_dircountr   r   r   r  	  s    z"JiraAPIImport._count_project_tasksr     c              
   c   s   | j  d|d}tt|D ]\\}}||k r4q"|dr@q"||| krP qt| d| dd}t	|V  W 5 Q R X q"d S )Nr   r   r  r	  r  r  )
r*   r\   r]   r   rg   r  r  r_   r`   ra   )r   r  r  r   r  iZtask_idrd   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
EDITISSUESscreensissueTypeIdactionsscreenr)   r  c                 S   s   g | ]}|qS r   r   )r   r  r   r   r   r   	  s     z<JiraAPIImport._get_project_screen_scheme.<locals>.<listcomp>r  )r   r  rK   r~   rm   r  r  r   )r   smart_configscreen_schemer  r  issue_type_idr   r  r  Zissue_type_screens	screen_idr  Zissue_type_screenr   r   r   _get_project_screen_scheme	  s0    z(JiraAPIImport._get_project_screen_schemec                 c   sB   |d  d}t |D ]$}|dkr&q|| d| dV  qd S )Nr  z/attachmentsall_attachments.zipr	  )r  rc   )rg   r  )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.jsonr  )r_   r`   rA  )r   r   comments_file_pathrd   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.jsonr  r_   r`   ra   )r   r   r  rd   r6   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.jsonr  r  )r   r   Zproperties_file_pathrd   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.jsonr  r  )r   r   Zwatchers_file_pathrd   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.jsonr  )r*   r\   r]   r^   r_   r`   ra   )r   global_settings_file_pathrd   r   r   r   rM   
  s
    z'JiraAPIImport._get_jira_global_settingsc              	   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]   r_   r`   rb   )r   Zglobal_settings_datar	  rd   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   r  c                 S   s   |  dp|  dS rD  rF  rH  r   r   r   rI  '
  rJ  z+JiraAPIImport._dump_links.<locals>.<lambda>rE  r,  zmailto:u   Это почта: ZhttpuH   Это внешняя ссылка, оставляем как есть: rM  u   Это не файл: rN  r)   r  r  rj   r  c                    s   |  d kS rO  rP  rQ  rS  r   r   rI  @
  rJ  uE   Этот файл уже обработан во вложениях: r	  rL  r   r,  
obj_ext_idr   r*   r,  r  r   Fu0   Не удалось скачать ссылку r/  r%  r&  r'  r(  r*  r  r+  r   )*r   r0  rG  r)  rV  r*   rU   rx  rW  rX  Zurljoinr>   r  r^  r_  r   rZ  r[  rY  r\  r   rI   r  r  r]   CmfImportDownloadrK   r   r   pathr   
downloadedr   r-   r.   r/   r0   r  r#  r$  r1  r3  )r   r   r  r   r1   r6  r   r  rc  encodingr`  Zattach_filenamera  rb  r  rc   download_jobr9  r5  r7  r1  r   rS  r   _dump_links!
  s~    



 



 zJiraAPIImport._dump_linksc                 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   rh  rj   ZallowedValuesr   u   Выбор без id: optionschildrenschema:r)   rL  
userpickerr  multiuserpickergrouppickermultigrouppickerr  N)r>   Zget_issue_metare   rK   r*   r+   rT   rz  rG   rH   r   r   r  rF   r  r  r   r  rl   )r   r   metarq   r  optionZcur_optcustom_field_typesr   r   r  ru  rm   r   r   r   _get_field_optionse
  sV    







z JiraAPIImport._get_field_options)last_dump_datenew_dump_datec	           "      C   s`  t ddJ || _d}	| jjd| d|  z| jj|d ||||dD ]}
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$Z}| j'|
d }|D ]2}| "|d! | j# | | "|d% | j# | qt()|| W 5 Q R X |
d& d' D ](}|d!r | "|d! | j# | q |
d d(rx| "|
d d(| j#| |
d d)r| "|
d d)i | j#| |
d d*i r| "|
d d*i | j#| |  j*| +|
d+ d, ||
7  _*|	d-}| rt%| | jjd. t&|d/}| j,|
d D ]~}| "|d! | j# | | "|d% | j# | |-t(.|d0  | j j/d7  _/| j0d1 |  j*| +|d2 ||
7  _*qBW 5 Q R X | j1|
d }|	d3}t&|d$}t()|| W 5 Q R X | j2|
d }|D ]}| "|| j# | q|	d4} t&| d$}t()|| W 5 Q R X t|| |jdd |	d5}!t
|3dd6|
d< t&|!d$.}t()|
| | j j/d7  _/| j0d7 W 5 Q R X W n(   |	d7 }	| jj4d8|
  Y nX W 5 | jj  X qPW n.   | jj4d9|d:  d; |	d7 }	Y nX |5|	 W 5 Q R X d S )<NFr  r   u   Задачи с u    до r   )r  maxr  r  r)   u   Задача 'r   'r  Texist_okr  ra  rj   r  u%   Обработка вложений: zsecure/attachmentzip/z.zipzsecure/issueAttachments/r  r   r  r  r  r/  zERR-0054r   rb   rp  Z
error_typer   r  zworklog.jsonr[   r  r  r  r  r  ri  r  r   zcomments.jsonu#   Дампим комментарииr2  r  r}  r   zproperties.jsonzwatchers.json	info.jsonr   r   u0   Не удалось скачать задачу u2   Не получить задачи проекта r   u    с сервера)6r   r>   r*   rU   rU  Zget_all_project_issues_duringr-   r.   r,   r]   r'   r^   rf   ri   mkdirr   r   rg   r  r   r  rG   rH   r   r   rI   r  rK   r   r  r   r/   r2   r!  r  rF   rN   rD  r_   Zissue_get_worklogr`   rb   r1   r  Zget_commentsr  r  r  r  Zget_issue_propertiesZget_watchersr  	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  r9  r   Zworklog_file_namerd   Zworklogsr  r  Zcomments_file_namer}  Z
propertiesZproperties_fileZwatchersr  Zwatchers_fileZ	info_pathr   r   r   _dump_task_part
  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  z/tasksTr%  r   r)   r   Z
dump_tasks)r  r4  tokenr  
verify_sslrH   )r  r#  r  r  r>   r+  r!  r"  targetr   r5   u$   Форкаем _dump_task_part proc=r  u%   Таймаут дампа задач u    минут)timeoutu$   Возможно завис дампzERR-0055r   rb   r'  u"   Ошибка дампа задачuK   Закончили параллельное скачивание задачu   Ошибок: r   r   r  r  zusers.json.newr  r2  r;  r  zgroups.json.newa)4r=  r>  r?  r   r)  rv   Queuer~   rz   ru   Threadr,  r   r>   r  r4  r.  r  r/  rG   rH   r   r  r*   rU   rU  r   is_aliver2   TimeoutErroremptyrK   r   r  r,   r]   r\   r^   rf   r  r_   r  r`   rA  rF   r  r   r@  r  unlinkri   close)r   r  r  r!  r"  rC  r  r+  r  r  r  rG  Z	max_limitr>  r2  r   Zissue_users_pathZall_users_pathZall_users_path_newf1f2Zf3liner8  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   r  r   rg  r   rX  r  ZBROWSE_PROJECTSr  r  levelsr  r   r   r  /issue_security_scheme.jsonr[   )r*   rU   rU  r>   Z!get_project_issue_security_schemerK   rG   rH   Z get_issue_security_level_membersr   r  r\   r   r^   rg   rD  r_   r`   rb   )r   r  r   Zsecurity_schemeZsecurity_level_membersr  security_levelrV   member	dump_filerd   r   r   r   #_dump_project_issue_security_schemeo  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.jsonr2  )	ZprojectInformationZprojectSchemesZprojectIssuetypesZprojectVersionsZprojectComponentsZprojectMembersZprojectCustomfieldsZprojectGlobalActionsZprojectWorkflowActionsr   r   )r  ERR-0056r  rb   r'  )r*   rU   rU  r   r^   rg   rD  r_   r>   Zget_project_smart_configr   r/   r2   r'   r`   rb   )r   r  Zsmart_config_filerd   r   r  excr   r   r   _dump_smart_config  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)rJ  rK  rL  Zdt_tzZdt_strr   r   r   _datetime_in_user_tz  s
    

z"JiraAPIImport._datetime_in_user_tzc           8      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+ sl| j.|d gd d, |d-< | j/|d g|d.< n| jjd/ t'|d  d0}| rt (| t|dD}| jj0|d d1D ]*}| j jd7  _|1t2|d2  qW 5 Q R X n| j3| jj4 d3|d   |d-< d|d- krF|d- d |d- d4|d-< n.| j3| jj4 d5|d- d   |d- d6< |d7r| 5||d.< |d8}|r| j6d9|  | j3|d: }|7  | |d8< | *|d8 | j8 | j  | jjd; t'|d  d<}| r$t (| t|dD}| jj9|d d1D ]*}| j jd7  _|1t2|d2  qBW 5 Q R X | jjd= t'|d  d>} |  rt (|  t| d}| jjj:|d d?; D ]}!| j
 r W 5 Q R  W  d S | j jd7  _| j3|! }"g }#|"d@g D ] }$|$d" dAkr(zT| jjjrv| jjj<|$dB d|$dB dCdD|$dE< n| jjj<|$d d|$dE< W nn |j=j>k
r }% zJ|%j?j@dFkr|#A|$ | jjBdG|"d  dH|% dI W Y q(n W 5 d }%~%X Y nX |$dEr(| *|$dE | j8 | j  q(|"d@rR|#D ]}&|"d@ (|& q<|1t2|"d2  qW 5 Q R X | jjdJ t'|d  dK}'|' rtC|' |'  t'|d  dL}(|( rtC|( |(  zd| jjD|d d?D ]J})| j
 r W W  d S | j jd7  _| jjdM|)d   | jjE|)d |)d6< | j3|)d6 dN d:  |)d6 dN< | jF|)d }*| jjjrdOd | jG|)d D |)d6 dP< ndQd |*dR dS D |)d6 dP< |*dT |)d6 dT< |*dU |)d6 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H|)d D ]}-| j
 	r W  W W  d S | j jd7  _|(t%|-d }.|.jd
d |.d}/|/ 	r| jjd[|-d  d\ 	qxg |-d]< | jjd[|-d   | jI|-d D ]6}0| j
 
rL  W  W W  d S |-d] A|0d  
q*t|/dX}t,|-| | jJd^ W 5 Q R X 	qxW n |j=j>k
r }1 z\|1j?j@d_k
rd`t%|1k
sdat%|1k
r| j6t%|1 n| jj+db|) dcddd(d)  W 5 d }1~1X Y n(   | jj+db|) dcddd(d)  Y nX qW n4   |  jKd7  _K| jj+de| dcddd(d) Y nX | j6df t'|d  dg}2|2 rt (|2 t|2db}| jL|d D ]J}3| j
 r W 5 Q R  W  d S | j jd7  _|1t2|3d2  qW 5 Q R X | j6dh t'|d  di}4|4 rPt (|4 t|4d}| jM|d D ]r}5| j
 r W 5 Q R  W  d S |5d8r| *|5d8 | j8 | j  | j jd7  _|1t2|5d2  qlW 5 Q R X djt jNdk< | j jO|7  _O| jjPd
dl | jjQR  dmt jNdk< t|d |	 t%|	|d< |d  dn}t|dX}t,|| W 5 Q R X t"# | }6| jjdo| dp|6dqdr t"# }| jjS|d ||ds}dt| }7|s|r|7du7 }7|r|7dv| 7 }7|r|7dw| 7 }7|7dx| dy7 }7| j6|7 |  jK| jT||||dz7  _Kt"# | }6| jjd{| dp|6dqdr | jKs||d< t|dX}t,|| W 5 Q R X W qv   |  jKd7  _K|d|r| jj+d}| d~dd'd(d) n| jj+d| dd'd(d) Y qvX qv| j6d d S )Nr   r   r   	isCheckedu5   Не выбрали ни одного проекта!c                 S   s$   g | ]}|d  r|d r|d  qS )r3   rT  r   )r   r  r   r   r   r     s       z0JiraAPIImport._dump_projects.<locals>.<listcomp>r  r   Tr%  P   r   r   r)   u   Дампим "r   r  r(  )r1  )r<  ZtimeZonerH  r  Z	dump_daterI  r   r  u   Дампим права/permissions.jsonr2  permissionsholderr  r   	parameteru0   Не удалось сдампить права rE  r  rb   r'  )r   rX  ZworkflowSchemer  jira_screen_schemeu/   Дампим типы задач проектаr  r  r  z$rest/projectconfig/1/workflowscheme/)r   rU  zrest/api/2/workflowscheme/rU  r  rJ  u1   Ищем руководителя проекта r   u*   Дампим статусы проектаr  u$   Дампим роли проектаr  )r   r  r  Z	actorUserr@   )r<  rd  r8  i  u&   Пользователь к роли "u   " не найден. u+   . Возможно он был удаленu&   Дампим доски проектаz/boards/z	/sprints/u   Доска r   c                 S   s   g | ]}|qS r   r   r   r   r   r   r   {  s     rc  c                 S   s   g | ]}|qS r   r   )r   ro  r   r   r   r   ~  s    ZquickFilterConfigZquickFiltersrj  ZoldDoneIssuesCutoffr`  r  r[   )ZscrumZsimpleu&   Дампим спринты доскиu   Спринт u    уже скачанrt  r   i  z"The board does not support sprintsuD   Данная доска не поддерживает спринтыu4   Не удалось сдампить спринты zERR-0057r   u   Не удалось сдампить доски, возможно проект не поддерживает доски или у вас нет прав project_info=u(   Дампим версии проектаr  u!   Дампим компонентыr  r   NO_CACHEr  1r  u&   Дамп данных проекта "u   " выполнен за z.3fu    сек.)r  r  u*   Дампим задачи проекта: u    (в периодu    с u    по u4    включительно, часовой пояс: rg  r-  u$   Дамп задач проекта "r  u   Проект "u   " является приватным и не может быть импортирован, отключите приватность в Jira или предоставьте пользователю праваzERR-0058u2   Не удалось получить проект u0   Закончили дампить проекты)Ur  r   r/   rS   r*   r\   r]   r)  r   r~   r,   r  rU   rU  r>   rG   rH   Zuser_find_by_user_stringr4  r^   r_   r`   ra   rK   rS  r  rM  rN  rO  rP  rf   ri   rg   makedirsrA  process_timer  r'   rG  r   rD  Zget_project_permission_schemer  r2   rb   rD  Zget_project_schemeZget_project_screen_schemeZget_issue_for_projectr  r  jira_requestr  r  r+   raise_for_statusrF   get_statusesZget_project_rolesrm   r   
exceptionsZ	HTTPErrorr  r  r   rx  rmtreeZget_all_agile_boardsZget_agile_board_configurationZget_advanced_board_settingsZget_board_quick_filtersZget_sprintsZget_sprint_issuesr  r1   Zget_project_versions_paginatedZget_project_componentsenvironprogressr   r-   r.   Zget_project_issues_count_duringr>  )8r   r  rootZprojects_dirr  r  r   r  Zproject_namer  Zproject_tmp_dirZ	data_filer8  Zuser_tzr!  rd   Zcurrent_dumpZlast_dump_date_utcZnew_dump_date_utcr"  t1r  r   permission_fileZperm_sch	perm_dictZ
types_filer  r[  r6   Zstatuses_filer  Z	role_fileZrole_urir&  Zunfound_actorsr(  rF  Zunfound_actorZ
boards_dirr  rn  Zadvanced_settingsr  Zboard_info_filer   Zsprint_pathZsprint_file_pathr   r9  Zversion_list_filenamer  Zcomponents_list_filenamer  t2Zinfo_msgr   r   r   _dump_projects  sB   









"  


$


"


"



$



*      

"

"


 

    zJiraAPIImport._dump_projectsc                 C   s  | j  }t|\}}}|| d }| j d| d | j jd | 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rH| 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 dtjd< d| j _ | j !  t"  dtjd< | j jd | #  d S )!u_   
        Загружаем все данные из апи, кроме аттачей
        d   u   Свободно места: rn  u$   Скачаем данные из APIu9   Дампим глобальные настройки Jirar  Tu'   Дампим пользователейr   uA   Не дампим пользователей из-за опцийr  u   Дампим статусыr  u    Дампим типы задачr  Zissue_security_schemesu*   Дампим бизнес процессыr  u7   Дампим схемы бизнес процессовr  u   Дампим экраныr  r  u!   Дампим приоритетыr  r  r   r[     r\  u   Дампим проектыN)$r*   r\   rf   
disk_usager+   rU   rU  r
  rM   rN   r   r   rK   r  r>   r   rT   rz  r  ra  Zget_issue_typesZget_issue_security_schemesrG   rH   Zget_workflowsZget_workflow_schemeZget_all_screensZget_screen_schemeZget_all_prioritiesZget_priority_schemesrg   rd  re  r   r   rk  )r   Zdownload_pathr  usedfreeZfree_percentr   r   r   download_data  sH    




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  r  re  r  rl  Tr  r\  )rg   rd  rI   Z	CmfImportrK   r*   r   r  r~   r  re  r   r   )r   r*   r   r   r   r  2  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/  r0  Tr1  r2  r3  r4  r7  )r8  r9  r*   r   r>   rG   r  ry   r:  r_   r+   r;  )r   
model_namer=  r8  r>  r   r   r   _execute_cross_links=  s    
.  z"JiraAPIImport._execute_cross_linksc                 C   s`  dddgdddgg}dD ]2}| j jd| d	| j  d
}tt| }|j|d}|s\qg }t| jD ]0}| ||}|t	j
7 }|| ||krj qqj| 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   r  r   u   Обрабатываем u+    в несколько процессов: r   r   r)   u2   Закончили обработку ссылок)r*   rU   rU  r|   varsrI   r  r@  rs  ry   r:  r   r<  rA  rB  r   rC  r1   rD  rE  rF  )r   r   rr  r=  rp   Zobj_cntrG  r  r>  rF  rH  r   r   r   _process_cross_linksG  s@    








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 ]4}
zd	| jjjj d	|
d
  d	}||
d rt	jj||
d  dd}n| jjd|
  W qddd| dg}ddddg}t	jj||d}|st	jj||	|d}|s| jjd|
 d|	d |  jd7  _W q|jr|j | |_n||_|
d  d! d"kr| jjjj d	|
d  d" d
  }t	jj|d}|j| |jdd n|
d  d! d#kr8d|_|jdd nz|
d  d! d$kr`d|_|jdd nR|
d  d! d%krd|_|jdd n*|
d  d! d&krd|_|jdd n|
d  d! d'krN| jjjr|
d  d(r| |
d  d( }n| |
d  d) }|r$|j | |jdd n&| jjd*|
 d+|d |  jd7  _nd|
d  d! d,kr| jjjrd	| jjjj d	|
d  d(  d	}n&d	| jjjj d	|
d  d, d  d	}t	j!jddd| dgdgd}|s|
d  d, d }t	j!jdd-|gdgd}|r\|js||_n||jkr6|j | |_|jdd |j | |jdd n&| jjd.|
 d/|d |  jd7  _n.| jjd0|
d  d!  d1|d |  jd7  _W q   | jjd2|
 d3d4d5 |  jd7  _Y qX q|	S )6Nr   )get_datar  rV  c                 S   s   i | ]}|d  |d qS )Z	jira_coderC   r   r   r   r   r   r  w  s      z6JiraAPIImport._process_permissions.<locals>.<dictcomp>Zproject_perm_permissionr  r   r   r  Tr   r  r*   r   r   rW  Z
permission)rC   Zinclude_deletedu4   Не нашли соответствия права r   rm  rn  r   access_membersaccess_project_rolerl  )Zproject_permissionr   rj   u*   Не найдено правило для zERR-0059r   r)   rX  r  projectRole)applicationRoleZanyoneprojectLeadri  r  r   r   rY  u9   Не нашли пользователя для прав zERR-0060r  rk  u-   Не нашли группу для прав zERR-0061u'   Неизвестный тип прав zERR-0062u6   Не удалось загрузить правило zERR-0063CmfProjectPermPermissionro  )"Zcmf.system_datarv  r   r_   r`   ra   r*   r   r   rI   ZCmfProjectPermSchemerK   r   r   r}  rU   rx  ZCmfProjectPermSchemeRuler2   r1   r   r  ry  r   Zaccess_local_userZaccess_ownerZaccess_responsibleZaccess_authorr>   rG   rH   r   rx  r|  )r   r  rv  rh  Zsystem_dataZmap_permrd   Zperm_scheme_dictr   Zperm_schemeri  Zpermr   rj   Zscheme_rulerole_ext_idr'  r  r  
group_namer   r   r   r  s  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)streamr2  r  zwb+i    )Z
chunk_sizeu   Сохранили в r   rI  r  r)   u+   Неудалось скачать файл r/  )r   rK   r*   r,   rU   rU  r>   r_  ry   ZIMPORT_DOWNLOAD_TIMEOUTr`  r   r_   Ziter_contentr  rI   r  r  r   r  r/   r*  r  )r   download_queueerror_queuer  r  r6   Z	save_pathrd   chunkZdownload_job_objr9  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  r0  u    Запустили задачу r,  r  rl  )r   r,  r  r  u%   Закончили скачивать)r*   rU   rU  rv   r4  r   r   r   rI   r  r  r@  rz   ru   r5  r  r   r  Zslistr,   r  r   r,  r  r8  r   rK   )	r   r  r  r6   r   Zprocsr  r>  r  r   r   r   download_files  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   r  r   rg  r  r@  r   r   r  Tr  r   r   r?  rr  r  r  r  r  r  r   r{  zvar:current_userrB   rz  u0   Не найдена проектная роль r|  zvar:project_ownerr  z
var:authorri  zvar:responsibler  r   rm  rn  rl  rY  rk  u!   Не найдена группа ZUsersr   uH   . Возможно пользователь был удален в Jira.F)r  r  u+   Не найден пользователь )ZgroupCustomFieldZuserCustomFieldu>   Не найдено пользовательское поле zsd.customer.portal.onlyzsdesk-client:defaultu-   Неизвестный тип правила r)   uF   Не удалось создать правило для уровня z. zERR-0070r   ZdefaultSecurityLevelId)*r*   r,   rU   rU  r   r_   r`   ra   r   r   rI   ZCmfSecurityLevelSchemerK   r  r   r   rw  r   r  ZCmfSecurityLevelRuler   r  r   Zaccess_memberr  r/   r|  r>   rG   rH   r   r2  r  CmfCustFieldr'   Zaccess_task_fieldsr-   r.   r1   r2   r~   Zdefault_task_security_level)r   r  r!  rC  rd   r  r  rV   Z	level_msgZlevel_ext_idrA  Z
level_rulerB  member_typemember_valuer~  r'  r   r  r  r8  rF  r  r  Zcust_field_ext_id
cust_fieldr   r   r   r     s    












 


$
z&JiraAPIImport._process_security_levels)rn   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cfr  r   T)r  r  rW  Zlogic_prefixF)r   rh  
class_nameZvisible_filterrequiredZrequiredChangedr  rh  r  r)   rL  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  r  )ZmultiselectZmulticheckboxeschoice_multic                 S   s   i | ]}|d  |d qS r  r   r  r   r   r   r    s      r  r  Zcascadingselectchoice_cascade_multiZ
datepickerdater  r  r   r  r   )r  r  ru  )r  r*   r   r   r3  r   )r   rn   r  r6   r  r   r   r   
_map_field  sP    
 













zJiraAPIImport._map_fieldc              
      s  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d | 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sd S dd tj D }g }g }| jtjj d D ]^}|dr.|d d sH| 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|| |d! r| jd"|d  d#|d!   q| jj
j
j d$|d d  }tjj|d%gd}|s^t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 | jd*|
 d+|d  d, ||
 |d!< q| jd-|
 d+|d  d. |jr2|d |_|	d d/kr&|	d0 |_|jd	d1 tjj||
||d2}|sbtj||
||d2  || q|rtj   t!"d tj#d3di d4d tj D }|D ]}||d  |d!< qd= fd5d6	|D ]D}tjj$|d! d7  }t%t|j&  |d d8 D ]}| qq| jjj}|d9 D ].}|d tjjkr6| jtjj d |d< q6|| j_d:t'j(d;< | j  | jj)*  d<t'j(d;< d S )>Nrj   r   uj   Текущая настройка не поддерживает импорт кастомных полейr   u0   Обработка кастомных полейr   rd  u8   Экран проектов Jira по умолчаниюTr   r   r  r*   r   Z_customr  )r   r  r   Zimport_custom_fieldsFc                 S   s   i | ]}|d  |qS rq   r   r   rd   r   r   r   r    s      z8JiraAPIImport._process_custom_fields.<locals>.<dictcomp>rh  u!   Поле не кастомное r   r  r  r  r   u+   Неудалось смапить поле zERR-0064	CmfUiFormro  r)   r  )r  r  r  r   u	   Поле u    уже смаплено  в r   widget)r   r   r  Zdirtyr   r*   r  u@   ,                                               widget поля u5    не совпадает с существующим zERR-0065u   Поле с именем rf  u4   ) есть в таблице, мапим в негоu(   Создаем поле с именем u   ), и мапим в негоr  r  r   )r  r   r   ui_form_groupr  c                 S   s   i | ]}|d  |qS r  r   r  r   r   r   r  S  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 )Nr9   r   ZdisabledFr  )	r   r'   rK   r  r   r   Z
cmf_hiddenr   Zchoice_parent_id)r  Z
parent_optr   ZchildZchoice_modelcreate_optionr   r   r  W  s"    



z;JiraAPIImport._process_custom_fields.<locals>.create_optionrq   r  r   r   r[  r\  )N)+r=   re   r   rI   r   r   r*   r+   rT   rz  r   r   r  rK   r  r   CmfUiFormGroupr   r   rr   r  r  r3  r2   r1   r   r  r  r  r   r  CmfUiFormFieldZcustom_field_syncZgeventrB  Zcustom_field_sync_update_modelsrj   rt  rp   rg   rd  r-   r.   )r   Zext_field_namern   r   ui_view_formr  shop_fieldsZ
new_fieldsZ
m2m_fieldsZui_fieldr   r  ui_form_fieldZfield_classr  r   r  r   r  r   _process_custom_fields  s    

 

 


 







z$JiraAPIImport._process_custom_fieldsc                 C   sP  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	r:|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sf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rt 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   rd  u   Создаем экран "r   r  rg  Trw  r   r   r   Ztabsr  u   Создаем вкладку "u   ) экрана "r   tab)r  r   r   r  r*   r   rj   Zcustomfield_r  r  r  r   )r   r   r  u   Добавляем поле "u   " на экран "u   " во вкладку ")rI   r   rr   r*   r   r   r  rK   r+   r  r   r   r  r   r  rV  r  r3  r   r   r  Zinvalidate_cacher-   r.   )r   r  r  Zscreen_ext_idui_formr  Z
tab_ext_idr  Z
jira_fieldr   rn   r  r   r   r   _process_screen|  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 |S ),NrZ  r   r   r   rd  Tr  c                 S   s   i | ]}|d  |qS rI  r   )r   r  r   r   r   r    s      z8JiraAPIImport._process_screen_scheme.<locals>.<dictcomp>r  r   r   )r
  r  r  r  r   rm  r  r  r   u;   Не удалось найти логический тип r  CmfUiFormSchemero  r  u8   Не удалось найти в дампе экран u    для zERR-0069u:   Не удалось импортировать экран zERR-0068r  r  read)r  r  Zeditviewr  r  r  r   )r
  r1  r  Zcrud_choicer*   rj   logic_typesr   u+   : Схема экранов проекта r   r   r*   r  rw  )rK   r*   r   r   rI   r  r  r   r   r   r  ZCmfUiFormSchemeRuler   r  r  r2   r   r  r,   r  r   r  r
  r1  r  )r   r  Zscreen_scheme_dataZscreen_scheme_idr   r
  r  r  Zissue_type_datar  r  r  r  r  r  r  Zaction_mappingr  r  r   r   r   r    s    





z$JiraAPIImport._process_screen_schemeuA   Обработка схемы конфигурации полейc                 C   s   | 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| j d}|jdd
 |jrtj	j|dgd}|stj	|||d| j d}|jdd
 |S )Nr   r   r   rd  r   u@   : Схема конфигурации полей проекта r   Tr  r   u5   : Конфигурация полей проекта r  )r   r  r   r  r*   )
r*   r   r   rI   ZCmfCustFieldConfSchemerK   r   r  r  ZCmfCustFieldConfSchemeRule)r   r  r   r  r  r  r   r   r   r  =  s>    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rJq(| jjd|d  d q(| jd	| jj  | j S )
N   rl  r   c                 S   s   g | ]}|d  qS rI  r   r   r   r   r   r     s     z0JiraAPIImport.process_import.<locals>.<listcomp>u'   Импортирован проект 'r   r$  u-   Импортировано объектов: ) r@  rq  r1   r  r  r  r  r  r  r  r>   rG   rH   r  r  r\  r]  ru  r  r  r  r*   r,   re  r   r   r   rS   rU   rU  r+   r  )r   r  r6   r   r   r   r   process_importc  sR    


zJiraAPIImport.process_import)T)r   r   )T)TTN)N)N)r   r  )NN)NN)N)NrH  rI  )yr#   r$   r%   r&   r~   r(   r   r'   r   r   rE   propertyre   rl   ro   staticmethodr   r   r   rs   rW   r   r   r   r   r   r   r   r   r   r;   r  r"  r:  r2  r   re  r  r  r  r  rI   r  r  r  r  r  r  r  r)  r?  r"  r\  r]  r#  r$  r  r   r   r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r   r   r  r  r  r  rl  rz  r  r  r  r   r  r  r  r  r  r   rM   r
  r  r   r,  r>  rD  rG  rS  rk  rq  r  rs  ru  r  r  r  r   r  r  r  r  r  r  __classcell__r   r   rX   r   r<   ?   s4  
	!

	#9 


I!9n
"

V, 

5 #
>
,
 
A)
 

l:
&
1

H
7
$#C=   yU"	  Q+
,b$ = I
w
%r<   )0Zcmf.appr   Zcmf.includeZdataclassesrA  r  rQ  r@  r^  pathlibr   rf   Ztempfiler   rW  typingr   r   r   r	   r
   r   r   Zbs4r   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   rI   r   r   r   r   Z	dataclassr   r;   r<   r   r   r   r   <module>   s2   $ 