U
    0eț                    @   s  d dl mZ d dlT 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  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)JiraBaseImportc                   @   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 jd tj	dd Y dS X d S )Nz================== r      u   Ошибка Texc_info)

cmf_importlog	is_canceldpcommit	Exceptionrollback
has_errorsloggingERROR)objargskwargsres)funcr   r   r   wrapper(   s    
z3catch_exception.<locals>.decorator.<locals>.wrapperr   )r9   r:   r   )r9   r   	decorator'   s    z"catch_exception.<locals>.decoratorr   )r   r<   r   r;   r   catch_exception&   s    r=   c                       s  e Zd ZU dZeed< eeef ed< e	dd fddZ
eeeef dd	d
Zdd Z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dddZee dddZee ddd Zee ed!d"d#Zdd&d'Zed(d)d* Zed+d,d- Zed.eed/d0d1Z d2d3 Z!ed4dee"d5d6d7Z#dd8d9Z$ed:d;d< Z%ed=d>d? Z&e'j(dd@dAZ)dBdC Z*dDdE Z+dFdG Z,edHdIdJ Z-eedKdLdMZ.dNdO Z/dPdQ Z0edRdSdT Z1edRdUdV Z2edWdXdY Z3edZd[d\ Z4d]d^ Z5d_d` Z6e7dadbdcZ8eddededfdgZ9edhededidjZ:edkdldm Z;dndo Z<edpddqdrZ=edsdtdu Z>edvdwdx Z?edyedzd{d|Z@ed}d~d ZAeddd ZBeddd ZCeddd ZDeddd ZEedddZFedddZGdd ZHdd ZIdd ZJdd ZKdd ZLdd ZMdd ZNdd ZOdd ZPdd ZQdddZRededdZSededdZTededdZUededdZVededdZWdd ZXdd ZYee7edddZZdd Z[eedddZ\dd Z]dd Z^ddĄ Z_ddƄ Z`ddȄ Zaddʄ Zbdd̄ Zcdd΄ ZdddЄ ZeedќddӄZfddՄ Zgddׄ Zh  ZiS )JiraAPIImportu;   Класс загрузки объектов через APIr2   _JiraAPIImport__jira_fieldsN)jirareturnc                    s   t  j|| || _d| _| jjjr*d| _tjjdd| _	i | _
i | _i | _i | _g | _g | _d| _|   td}| 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jira_global_settingsZepicsissue_relationssubtasksboardsselected_projectsr2   _prepare_multiprocessingr3   Z	getLoggerr+   loggerZhandlersr?   )r   r@   r6   r7   rU   	__class__r   r   rG   @   s"    

zJiraAPIImport.__init__)rA   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 )Nzfields.jsonw+)r?   r+   get_download_pathjoinpathexistsopenjsonloadr@   Z
get_fieldsdump)r   	file_pathfr   r   r   jira_fieldsU   s    
zJiraAPIImport.jira_fieldsc                 C   s(   | j  D ]}|d |kr
|  S q
d S )Nr   )rb   values)r   r   fieldr   r   r   _get_field_by_named   s    z JiraAPIImport._get_field_by_name)model
field_namerA   c                 C   s&   |sd S | j |gd}|r"|d S d S )N)Zfields_namer   )import_shop_fields)rf   rg   r8   r   r   r   _get_field_namei   s    zJiraAPIImport._get_field_namec                 C   s0   dd l }dd l}|| _ || _tj| _tj| _d S )Nr   )	threadingqueueconfigZIMPORT_THREADSZthreading_max_forksZIMPORT_DOWNLOAD_THREADSdownload_threading_max_forks)r   rj   rk   r   r   r   rT   q   s
    z&JiraAPIImport._prepare_multiprocessingc              	   C   sn   g }ddddddddd	}d
ddd}| j  D ]8\}}d| ||d }|||d||d q0|S )uO    Сопоставление настроек для модели models.CmfTaskr   textprioritystatusZ
alarm_dateZdeadlinecmf_modified_atcmf_created_at)Zsummarydescriptionro   rp   Zcustomfield_10015Zduedateupdatedcreatedz.namez.watchCountz.votes)ro   ZwatchesZvoteszfields. N)model_field	json_path	ext_field)rb   itemsrM   append)r   Zissue_settingsZdefault_local_attrs_mappingZadditional_json_pathZcustom_field_keyZcustom_fieldrx   r   r   r   _get_issue_import_settingsy   s,    

z(JiraAPIImport._get_issue_import_settingsc                  C   s    dddddddddg} | S )Nr   displayNamerw   rx   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 )Nrr   ru   r~   
cmf_authorauthorrn   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   ru   r   bodyr   .r(   rv   r   )splitlenrb   rM   )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 |st| tri }d| kr| d |d< d| kr| d |d< d| kr| d |d< |S |rZt| trZg }| D ]l}d|kr||d d  qd	|kr"||d	 d  qd|kr<||d  q|r|t| qd
|S | S )Nr   r   r}   r   rv   r   r   inwardIssueoutwardIssue,)r   
isinstancedictrM   listr{   r&   join)	r5   rx   to_strrg   Z
str_fieldsZ	str_fieldZnew_objresultZrelated_objr   r   r   _get_file_val   sH    






zJiraAPIImport._get_file_valc                    sN  g  t ttt f tg tt f ttd fdd}jdg j 	d}d}|
 r D ]$}|d D ]} qqz|rh qqhdD ]} qq|sd	d
 jjddD d }dd
 jdD d }|st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_funcrf   rA   c                    sz   | D ]p}| }|D ]H} ||d |d< ||d |d< |d |d< |j|d< q |j|d |  S d S )Nrx   Zfile_valrw   titleicon)r   fields)r   ri   r   r   r{   verbose_name)r   r   rf   r5   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   .0r5   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   )ru   r   r   selectedObjects)r   value)r
   r   r   r   r	   	TypeModelr+   load_fieldsrY   rZ   r[   _get_projectsget_project_tasks_simple_getr@   
get_issues	get_usersr0   r|   rK   CmfTaskr   	CmfPersonr   
CmfCommentr{   )r   r   Zdump_dirtaskprojectuserZcomment_exampler   r   r   tmplt_import_settings   sF      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   r   rw   rx   rg   r   r   captionr   )Z_normalize_settingsr+   json_settingsr@   r   	enumeraterK   r   r   r   _normalize_jira_valuer{   )r   settingsr   issueZnumr   r   r   r   r   preview  s    zJiraAPIImport.preview)r   rA   c                 C   sT   i }|D ]F}|d sq| j ||d dd}| |d d |}|||d d < q|S )uC    Преобразование настроек для модели rw   rx   F)r   rg   )r   r   )r   r5   r   Znormalized_objr   r   r   r   r   _normalize_obj,  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   rM   r{   rK   	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_list8  s*    


zJiraAPIImport._process_listu8   Обработка наблюдателей задачиc                 C   s   |  |D ]j}| jjjr(| |d }n| |d }|sHtd| ||jks
||jks
||jkrhq
|j	
| q
t  dS )u;   Добавляем наблюдателей в задачуrB   r   uI   _process_watchers: Не найден наблюдатель задачи N)_get_issue_watchersr@   rI   rJ   _get_personCmfErrorresponsibler   	cmf_owner
spectatorsr{   commit_with_event)r   	issue_objr   watcherpersonr   r   r   _process_watchersQ  s    
zJiraAPIImport._process_watchersu#   Обработка вложенийc                 C   s  ddl m} dd l}t|d  d}d}| r||}| D ]}z|drbW qJ|d d D ]}	|	d |krn qqntj	
|}
tjj|
|d	d
ddgd}|stj| j|d|
d}|jrb|	r| |	d | j |_|	d |_||d}|jdd || |jdd |	rN|j|	d ksNtd|j d|	d  d|j  W 5 Q R X W qJ tk
r   | jjd| dtjddd |j  |d7 }Y qJ   | jjd| tjddd | jj  |d7 }Y qJX qJW 5 Q R X | |D ]}ztj	
|d }
tjj|
|d}|s<tj| j|d|
d}|jr|jdd |  t !|d |j" tj#jj$% }|&|j'}|(  |j  W n<   | jjd| tjddd | jj  |d7 }Y nX q|S )Nr   )RDisk
issue_pathz /attachments/all_attachments.zip/r   
attachmentfilenameimport_originalurlZurl_preview_imgZurl_preview)r   r   r   T)r+   r   r   r   r   ru   r   sizeu   Текущий размер z != u    из метыu7   Обранужена проблема вложения uI   , размер файла не совпадает с метой из JIRA	anonymousr*   r(   :   Не удалось обработать вложение 	file_name)r   r   r`   ))Zrdisk.rdiskr   zipfiler   r[   ZipFileZnamelistendswithrK   CmfDocument_get_filenameCmfAttachmentrM   r+   r   r   rH   r   rr   r\   r   Zupload_stream_filest_sizeAssertionErrorr.   r/   r,   r3   r4   r1   _get_issue_attachmentsZ
upload_dirshutilcopyZfull_path_fileZCmfRFileZdata_driverZget_rdZ	get_rfileZ
_file_namemake_preview)r   r   
jira_issuer   r   Zall_attach_zip_patherrorsZmyzipZzip_attach_nameattach_infoZattach_namer   Zattach_fattachment_infoZrdiskZrfiler   r   r   _process_attachmentsa  s    





,
 z"JiraAPIImport._process_attachmentsuB   Обработка упоминаний пользователейrn   rA   c                 C   sx  ddl m}m} |sdS t|d}|jddidD ]:}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
rl }
 z4|  jd7  _| jjd| d|
 tj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)   Ошибка обработки тега : r   )Zurllib.parser  r  r   find_allr  rM   r   query_get_user_info_from_dumplowerrH   r  r   r   loginr0   r2   r+   r,   r3   r4   r&   )r   rn   r  r  doc_souptagr   Z
parsed_urlr  	user_infoer   r   r   _process_mentions  s2    


6zJiraAPIImport._process_mentionsc                 C   sr   |  dD ]T}|dd |kr*|  S |dd |krF|  S || j|kr
|  S q
td| d S )Nr   r   rv   usernameuQ   Не нашли информацию по пользователю в дампе )r   rM   r  rH   r0   )r   user_idr   r   r   r   r    s    
z&JiraAPIImport._get_user_info_from_dumpu#   Конвертация ссылок)rn   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r  r   r   r   <lambda>      z.JiraAPIImport._process_links.<locals>.<lambda>r  u   Уже обработали r  #u   Это якорь u&   Обрабатываем ссылку r&  r   ?r   (/attachment(?:/content)?/(\d+)(?:/)?(.*)r(   r   r   c                    s   |  d kS Nr   rM   itemZ	attach_idr   r   r*    r+  r   r   )r   r   r   Zsrc_origTZvideoZcontrolsz100%widthZheightr  u   Заменили на z/people/rv   )r   r  r  rM   r+   rU   infor(  
startswithurllibparseunquoter   researchnextr   rK   r   r   r   sgetr   	mimetypes
guess_typer   r   r  r&   )r   rn   r   r  r  Z	text_soupr  r   r   	url_matchattachmentsattachZ
attach_obj	mime_type
account_idr   r   r4  r   _process_links  sd    

 
 





zJiraAPIImport._process_linksc                 C   s  | j jd|  | jjjrB|d dkrB| 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}|s:t	j
jddd| dg|d}|s:dd|d g}	t	j
j|	|d}
|
st|d	krTdd|d
 g}	nHt|d	krd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t|
 tjdd | j jdt|
 tjddd |
r |
d
 }n| j d|d  tj d}|s|rd}d	}|d }t	j
jdd | g|dr| j d!| d"tj |d d#\}}| d$| d#| }|d	7 }qZt	j
||| j dd%}nd |fS |r|jr|D ]}t||||  q|jr.||jkr4|j | |_n||_t	j }t	j }|j !| |j !| d|_"|d& d' D ]}| jjjrd|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}|st	j|| j d|d |d)}|jr0|d |_#|js@||_n||jkr\|j | |_|j$dd* |j !| qr|j%r|j$dd* ||fS )+Nu0   Импортируем пользователя ZaccountTypeZ	atlassianu   Неизвестный тип r   r   r    r(   r   rv   Z
first_name	last_namer   rg_member_ofr  r   r   r   r   r   LIKE%ORu+   Пользователей с именем z > Tr)   uB   Пользователей с одинаковым именем > r   uM   Не нашли пользователя среди существующих FILIKEuQ   Обнаружена учетная запись с дублирующим email u   , добавляем цифру@+)r   r  r+   r   groupsrz   groupId)r   r+   r   r   import_raw_jsonr   )&r+   rU   r6  r@   rI   rJ   warningr   r   rK   r   r   r   r   rH   r   r   rM   r   r2   r,   r3   r4   INFOr  WARNINGr   setattrr   CmfPersonGroup
jira_group
user_grouprI  r{   Z
user_localr   r   
is_changed)r   r   ZcreateupdateZ	user_dictr   r   r   r   r   Zpersons
is_creatednr  Zprefix_emaildomainr   rY  rZ  Z
group_infogroupr   r   r   _process_person  s      ( 
 

   
zJiraAPIImport._process_personu-   Обработка пользователей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| tjdd	 | j jd|| j  tjddd
 Y q8X q8|r | j jjddr ttjj|gd d S )NZ
load_usersTuA   Не грузим пользователей из-за опцийlevelr   r(   z.evateam.ruu@   Не удалось загрузить пользователя r)   r   Zsend_invites)r6   )r+   r   r   rM   r,   r3   rV  setr   r-   ra  imported_object_countr   r   r   addr2   r4   rH   Zcmf_deferred_taskrK   r   Zregister_persons)r   Znew_user_emailsr   r   r]  r   r   r   _process_userse  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@   rI   rJ   r   r   rK   CmfStatusCoderM   r   r   get_status_typestatus_typer   r   r.   r/   re  )r   rp   rm  r   Zcmf_status_coder   r   r   r   _process_statuses  s*    




zJiraAPIImport._process_statusesc                 C   s  t  }d}d}| |d D ]}| jjjj d|d  d|d  }d|d  d|d  }tjjdd	|gd
}|d dkrd}	n|d dkrd}	nd}	|stjj|	d}
tj||
| jd}||_|j	dd |s|d dkr|}|s|d dkr|}d| jjjj d|d  d}|||< | j
|d dD ]6}|d r.|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 qq| jjjj d|d  }d|d  }tjj|d}|s(tjjd d}
tj||
| jd}||_||_||_|j	dd tjj|d!D ]}|  qT| D ]b\}}| j r qtjjdd"d#| d#gd
}||d$|| jd%}tjf |}|j	dd ql|S )&u)  
        У простого проекта воркфлоу привязан к issue type 1 к 1
        Поэтому надо получит все типы привязанные к проекту, на каждый тип создать WF и замапить через схему
        Nr   
::SIMPLE::r   (   Simple-схема для проекта r       и типа r   =r   hierarchyLevelr(   task.epic:defaultr   task.agile:defaultdefault.system:defaultrD   r   templater+   Tr   r-  
project_idZusagesZ
issueTypesworkflowr   rm  rJ  !=forcerj  softdev:default	scheme_wfrK  rL  r   
logic_typeZtarget_workflowcmf_model_namer  r+   )r   _get_issue_types_for_projectr+   r   r   rK   CmfWorkflowrM   r   r   _get_statuses_for_project_create_status	CmfStatusr   rm  deleteCmfSchemeWfdefault_task_workflowZ!default_subtask_workflow_workflowCmfSchemeWfRulerz   r-   CmfLogicType)r   Zjira_project_info	issue_mapZdefault_task_wfZdefault_subtask_wf
issue_typeworkflow_ext_idworkflow_namer{  rE   rx  issue_type_ext_idjira_statusrp   Zscheme_ext_idZscheme_nameschemerulelogic_type_ext_idr  	rule_dictr   r   r   #_create_schemewf_for_simple_project  sx    $$
 
 z1JiraAPIImport._create_schemewf_for_simple_projectc                 C   s0  | 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gd}|stjjdd
|d gdd
|ggd}|stj|| j |d}||_|d |_|d |_||_||_	|j
|j d |S )Nr   r   rj  ri  r   )r   r   r+   Tr   r   r   r   r{  rr  status_code)r{  r+   r  rs   Z	only_data)r+   r   r   r   rK   rk  rM   r   rl  rm  r   r  r   r   rn   r  is_new)r   Zjira_status_datar{  status_ext_idr   r  rm  rp   r   r   r   r    s6    "

zJiraAPIImport._create_statusc                 C   s<  | j jjj d|d d  }tjj|d}|d d }|sztjjdd}tj|d ||d	d
|| j |d}|jdd t }| j|d dD ],}d|d kr| j jjj d|d  d|d  }d|d  d|d  }	tj	jdd|gd}
d| j jjj d|d  d}|
sxtj
jddd| dgd}tj	j|jdd  dd}|sftj	jdd}tj	||| j d}
|	|
_|
jdd |
||< |d D ]"}|d d  |d< | ||
 qqtjj|d!D ]}|  q| D ]P\}}
tj
jddd| dgd}||
d"|| j d#}tjf |}|jdd q|S )$Nr   jira_workflow_schemer   rj  r6  r  rD   r   rs   rv   )r   r   rn   rS  r+   rx  Tr   ry  	issuetyper   ro  rp  rq  r   rr  r   rK  rL  :r   z:defaultrv  rw  rh  ri  r   r  r   r  )r+   r   r   rK   r  rM   r   r   r  r  r  rE   r   r   r  r  r   r  rz   )r   project_infor   Z	wf_schemeZwf_scheme_inforx  r  r  r  r  r{  r  r  r  r  r  r  r   r   r   _process_wf_scheme  sZ    

$  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-   rM   _process_issueput)r   Zissue_queueZissue_queue_errorsr  r   r   r   r   _process_issue_thread5  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   r   labelsrG  _r,  rv   ruT)Zlanguage_codereversedrM  aliasrN  ""%r   r   r;   r   u*   Не удалось создать тег r  )Ztransliterater  rd  r   _count_project_tasksr+   r-   rM   unionreplacerK   ZCmfTagr   r0   r3   rT  )
r   r  r  tagsr   Ztag_nameZ
name_aliasr   Ztag_objr!  r   r   r   _process_tagsA  s,     
zJiraAPIImport._process_tags)project_structr  c                 C   s  t jjdd|d gddgd}|r|jj|d ksF|jr|j|d kr|d  d|d  d|d< | jjd|j	 d	|d   n|js|d |_|
  d
|d< t jj| jjjjd|d< t jj|d | d}|st j| j|d |d d
d}|jr,|D ]}t||||  q|dr,d|_|j}|
  |rbt jj|dD ]}|jd
d qN| |d D ]T}| jjjj d|d  }t jj|d}	|	st jjddd gdd|d ggd}	|	st j|d | jd
d}	||	_|d |	_	|d|	_|	j
d
d t jj||	d}
|
s2t j||	| jd}
g |
_|
j
d
d |dg D ]d}|d dkr| jjjr| |d  d! }nJz| |d" }W n6   | jjd#|	 d$|d"  t j!d
d
d% d }Y nX |r|
j"| n| jjd&|  n|d d'kr| jjjr(d|d( d)  d}nd|d  d}d| jjjj | }t j#jdd*d+| d+gd}|r~|
j"| n,| jjd,| d-t j!d
d
d% |  j$d.7  _$nt%d/qP|
j
d
d qp| &  | '| | (| | &  | j)|d0 | *||_+t,|d1  d2}t-|}t./|}W 5 Q R X |rd| jjjj d|d  }t j0j|d|_1|j
d
d | 2| | j3 rd S t4  | 5| | &  | 6| | j j7d.7  _7| &  |S )3Nr   r   r  r   rJ  z ()u   Проект с именем u8    уже существует! Переименуем в TZtask_allow_multiple_sprints)Zexit_idui_form_schemer   r   )r+   r   r   r   	isPrivateprivate)r   )ZTEXKOM_db_deleter   r   rj  r   )r   r+   r   rs   r   )r   project_role)r   r  r+   actorstypeatlassian-user-role-actorr   rB   r}   uX   Не удалось найти и добавить пользователя в роль u    проекта:: r   uR   Не удалось привязать пользователя к проекту zatlassian-group-role-actorZ
actorGrouprR  rK  rL  u<   Не найдена группа пользователей u#    для проектной ролиr(   u&   Неизвестный тип ролиr  project_dir/issue_security_scheme.json)8rK   
CmfProjectrM   r  r   r   r+   rU   rT  r   r   CmfUiFormSchemer   r   keysr   rW  Zperm_policyr  r   r   r  _get_project_rolesCmfProjectRolern   ZCmfProjectRoleAssignmembersr@   rI   rJ   r   r,   r3   r4   r{   rX  r2   r0   _calc_progress_process_versions_process_componentsr  _process_permissionsZproject_perm_schemer   r\   r]   r^   CmfSecurityLevelSchemesecurity_level_scheme_process_tasksr-   r   _process_boards_process_sprintsre  )r   r  r  project_objr   r  r   	role_infor   roleZrole_assignactorr   Z	sub_group	dump_filera   r  r   r   r   _process_projectZ  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   z/usr/bin/python3z	manage.pyshellz&plugin = models.CmfPluginJira.get(id="z");plugin.process_issue_fork("z", "r   z", z, z);Tz"/var/log/eva-import-subprocess.loga+z&/var/log/eva-import-subprocess.err.log)Z	close_fdsZstart_new_sessionstdoutstderru   Запустили )
subprocessPopenr+   r   r   rl   IMPORT_OBJ_CNTr\   r,   pidZ
log_detail)r   r  doner  procr   r   r   _execute_task  s    
2  
zJiraAPIImport._execute_taskc                 C   sp  dd l }dd l}dd l}| d }tjr6ttj|}| j}tt	|d |}|s^t
d| jjd|  d}| |d }g }	t|D ]0}
| ||}|tj7 }|	| ||kr qq||k r.|d t|	D ]L}| }|d k	r|  j|7  _|	| | ||}|tj7 }|	| qqt|	D ]&}|  |jr6|  j|j7  _q6| jjd d S )Nr   r(   l        u   Ресурсов системы недостаточно для импорта, обратитесь в техподдержку для дополнительной информации.uD   Грузим задачи в несколько процессов: r   u0   Закончили обработку задач)multiprocessingtimepsutil	cpu_countrl   ZIMPORT_PROCESSminZvirtual_memoryZ	availableintr0   r+   rU   r6  r  ranger  r  r{   sleepr   Zpollr2   removeZcommunicate
returncode)r   r  r  r  r  Zmax_processesZavailable_memoryr  Ztask_cntprocessr  r  r  Znew_procr   r   r   r    sF    






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| tjddd  Y qX qd S )!NrC   rD   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   rs   r   r   r  rn   activityZtask_code_prefixr   r   rS  
simplifiedr  r  rj  r(   <   Не удалось импортировать проект Tr   )rK   rL   rM   r   r   r   rS   r+   r-   r   r   rH   r  r0   r   r   r  r  r  Zrollback_purge_eventr2   r,   r3   r4   )r   r  r  r  project_leadr   r  r  Zproject_simplifiedr  r   r   r   r   _process_projects	  sZ    


zJiraAPIImport._process_projectsc              
   C   s  d }t jjddjj}|  D ]v}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| tjddd Y qX qd S )NrC   rD   r   c                 S   s   g | ]}|d  qS r  r   r   r   r   r   r   O  s     z7JiraAPIImport._process_projects_box.<locals>.<listcomp>r   r   r  r  r  r  r  r  r  r  r  r  r  u$   ERROR! Поректы с типом r  r   rs   r   r  r  r(   r  Tr   )rK   rL   rM   r   r   r   r+   r-   rS   r   r   r   rH   r  r0   r  r  r   r2   r,   r3   r4   )r   r  r  r  r  r   r  r  r   r   r   _process_projects_boxG  sN    
z#JiraAPIImport._process_projects_boxu   Обработка досокc           
      C   s$  |  |d D ]}z| j r*W  dS tjj|d d}| jjjj d|d  |d< tjj|d dddd	gd
}|stj|d | jd}|d |_	|d |_
||_||_|jdd |j  |jr|jD ]}|  q|j  |d d d D ]}ztj|d || jdd}|jdd |d D ]P}| jjjj d|d  }tjj|d}	|	sntd| d|j|	 q,|jdd |j  W q tk
r   |j  | jjd| tjddd Y qX q| j jd7  _W q   | jj  | jjd| tjddd Y qX qd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   Nr   rj  r   kanban_board_columnsrS  r   r   r  r   r+   r   r6  Tr   ZcolumnConfigcolumns)r   r   r+   r   rh  u   Не найден статус u    для колонкиuD   Не удалось создать колонку для доски r   r(   u:   Не удалось импортировать доску )_get_project_boardsr+   r-   rK   r  rM   r   r   ZCmfKanbanBoardr   rS  r   r   r   r.   r/   r   r  r  ZCmfKanbanBoardColumnrk  r  Zmapped_status_codesr{   r1   r,   r3   r4   re  )
r   r  boardr   Z	board_objcolZ	board_colrp   r  Zstatus_globalr   r   r   r  s  sX    
 





 
$zJiraAPIImport._process_boardsu#   Обработка спринтовc                 C   s  t jj|d 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g	d}|st j
|d| j|d}|jr||_|d |_|d|_|d|_|jr|jdd |d dkrZ||_|jsJd|_|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 ]0}	| 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}|sJt j|| jd+}d,|_d-|j d.|j d/|_ ||_!|jr|j|j" d0 |j#dkrt|j$d1kr|j%&| n|j%&| n4|  j'd17  _'| jj(d2|	 d3|d  t)j*ddd4 q|jdd t  | j j+d17  _+qnd S )5Nr   rj  r   r   r   r   r   r   tree_node_is_branchrJ  zlist.agile_sprint:defaultrD   r   r   r   r  r   r  r   r   rp   r  T)r   r   r+   r  r   r   r   stateclosedCLOSEDr   ZIN_PROGRESSu0   Добавляем задачи в спринт r  issueslistscache_status_typer   z::comment-sprint:	log_levelrn   r   r     uB   Задача была в архивном спринте <a href="" target="_blank"></a>r  r(   u-   Неизвестная задача issue_id=u    в спринте r   ),rK   r  rM   r   r  _get_all_sprintsr+   r-   r   r   r   r   r  r   r   r   r[  r   r   r  r{  Zget_default_statusrp   r   rU   r6  r   r   r   r   r  r  rn   r   r  r  r  r  r{   r2   r,   r3   r4   re  )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    sz    "
     
$*zJiraAPIImport._process_sprintsc                 C   s$   |sd}|sd}| d| d| S )Nu   Не указаноr  u    ➔ r   )r   r   	old_valueZ	new_valuer   r   r   _simple_html_diff  s
    zJiraAPIImport._simple_html_diffc                 C   s   |dkrd S z|  |}W n,   | jjd| dtjd tj Y S X | |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	 |  jd
7  _|S )Nunknownu6   Не найден пользователь user_id = "u9   ", в дампе, указываем системногоrb  FZdefault_user_idr  uA   ", ставим пользователя по умолчанию r  r(   )r  r+   r,   r3   r4   gZsystem_userra  r   r   rM   rK   r   rV  rU   errorr2   )r   r$  r   r   r  r   r   r   r     s     zJiraAPIImport._get_person)	dump_pathc                 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.jsonrr  
uM   Неудалось сдампить пользователя по ключу rb  )r  r0   rZ   r[   r\   r]   loadsrH   r@   Zget_user_infowritedumpsr+   r,   r3   rV  )r   r$  r  Z
users_pathra   rowr5   r   r   r   r   _get_user_info  s$    

&zJiraAPIImport._get_user_infou,   Обработка журнала работ)r   c                 C   s*  dd l }| jjd | |D ]}t }d|d< | j|d< | |d | j |d< |d |d< | |d	 | j |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}|s tjf |}|jj|j|jjd |_|jdd q d S )Nr   u*   Загружаем журнал работr	  rp   r+   r   r   r   updateAuthorcmf_modified_byr   started
start_dateZtimeSpentSeconds<   
time_spentr  rv   rn   r   r   r   rS  Zremaining_estimaterj  )ZminutesTr   )datetimer+   rU   r6  _get_issue_worklogsr   r   rH   rM   r   r   rK   ZCmfTimeTrackerHistoryr'  r   Z	timedeltar)  Zend_dater   )r   r   r   r*  worklogZtimetracker_historyhistoryr   r   r   _process_issue_worklog  s.    


z$JiraAPIImport._process_issue_worklogu8   Обработка комментариев задачиc           	      C   s  d}d}|  |D ]v}|d7 }| jjjj d|d  }tjj|d}|rn|jsn| jjd| t	j
dd q|stj||| jdd	}| |d
 | j |_|j|_| |d | j |_|d |_|d |_| |d |_| |jj|||_||_||_|dr~|d7 }|d d dkrNtjj|d d d}|j| d|_n0| jjd|d  t	j
ddd |  jd7  _q|jdd q| jd| d|  d S )Nr   r(   r   r   rj  uM   Комментарий уже есть, и правился в системеT)r   )r   r   r+   r   r   r$  rt   ru   r   Z
visibilityr  r  r   r;   uL   Ошибка обработки приватного комментария r   r   u   Обработано u7    комментариев из ни приватных )_get_issue_commentsr+   r   r   rK   r   rM   r   r,   r3   r4   r   rH   r   r   r%  rq   rr   r"  rn   rF  r   rS  r   r  r   r{   r  r2   r   )	r   r   r   cntZprivate_cntr  r   Zcmf_commentr  r   r   r   _process_issue_comments+  s>    


 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 )Nrv   r   z&com.railsware.SmartChecklist.checklistr   r  Zulr  ztox-checklistr  r  -liztox-checklist--checkedr(   Tr   )rn   r   _get_issue_propertiesr   Znew_tagr   r7  r{   r&   r[  r   )	r   r   r   rn   Zissue_propertysoupZ	checklistvalr3  r   r   r   _process_propertiesP  s"    


z!JiraAPIImport._process_propertiesc              	   C   sb  dd | j tjj d D }|d d D ]2}| jjjj d|d  }d }|drl| |d | j	 }n| jj
d	|  |d
 |d|d}|d D ]h}|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}|s8tj| jd|d}|D ]}t||||  q<|  q(d S )Nc                 S   s   i | ]}|d  |qS )r   r   )r   rd   r   r   r   
<dictcomp>g  s      z2JiraAPIImport._process_history.<locals>.<dictcomp>r   	changelog	historiesz	::historyr   r   u   Аудит без автора ru   r(   )rr   r   r  r   rz   rd   rw   rv   Z
fromStringZtoStringrn   z<br>r+   rr   r   r  r   r  T)r+   r   r   )r   rK   r   r   r+   r   r   rM   r   rH   rU   rT  r  r   rW  r   )r   r   r   Zjira_map_fieldsr-  r   r   r  r3  r   rd   ZdiffZhistory_commentr   r   r   r   _process_historyf  s.    

zJiraAPIImport._process_historyu   Обработка задачиc                 C   s  d}| j jjj d|d d d  }tjj|d}|sRt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rt| j jjj d|d dd  }tjj|d|d< |d st| j jd|d d tjddd |  jd7  _| d}|r|d |d |d< |d dr4| |d d| j|d< |d s4|  jd7  _| j jd|d d tjdd | j jd|d d| j tjddd |d dr| |d d| j|d < |d  s|  jd7  _| j jd!|d d tjdd | j jd!|d d| j tjddd |d d"rh| |d d"| j|d#< |d# sh|  jd7  _| j jd$|d d" tjdd | j jd$|d d"| j tjddd ||d%< |d& r|d' d( |d&< ||d%< |pg }d| j jjj d|d d) d  d}	tjjd	d
d*|	 d*gd+|d,< | j jd-|  tj| j tj	|d	d.|d	 gd/\}
}|| |
|7 }| |
jj|
_| |
jj|
||
_|d d0 d1 rl|  |
| | j!d2r|d d3 d1 r| "|
| |D ]}|
j#$| q|d d4g |d d5g  D ]l}| j jjj d6|d  }tj%j|d}|s.| j jd7| tjddd |  jd7  _n|
j&$| q|d d8g D ]l}| j jjj d|d  }tj'j|d}|s| j jd9| tjddd |  jd7  _n|
j($| qN||
_)|
j*r|
j+dd: t,  | -|
| |d d;g }|r.zt.| j |
| W n   | j j/d< Y nX | 0||
 | 1||
 | j jjj d=|d  }tj2j|d}|stj2|| j d>}|
|_3| j4j5 d?|d  }d@| dA| dB|_dC|_6|j+dd: |j78  |S )Du   
        Общая логика обработки которая потом разделяется на задачи и эпики
        r   r   r   r   r   rj  u$   Не проекта с ключем r   r   rK  %::rp   rm  rJ  r  r  TZapprovedrE   ZsecurityZperm_security_levelu:   Не найден уровень безопасности r   r(   zStory PointsZagile_story_pointsreporterr   u*   Не найден автор задачи r)   creatorr   u?   Не найден ответственный по задаче assigneer   u6   Не найден исполнитель задачи r   rn   renderedFieldsrs   r  rL  r   r  u2   Пытаемся создать задачу из r   r   r  totaltimeTrackingEnabledr,  ZfixVersionsZversions
::version:u!   Не найдена версия 
componentsu%   Не найден компонент r   r  u/   Не удалось привязать тегиz
::comment:r  zbrowse/u<   Задача импортирована из Jira: <a href="r  r  r  )9r+   r   r   rK   r  rM   r   r   r   r   r   r  rm  rN   CmfSecurityLevelr,   r3   r4   r2   re   r   rH   r  rU   r6  r   r   r
  r"  rn   r   rF  r1  rO   r.  r  r{   r   Zfix_versionsCmfComponentrD  rS  r[  r   r   r   Zprocess_tagsZexcepionr7  r;  r   r   r@   r   r  r.   r/   )r   r   sprintsr  Zproject_ext_idr   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   r  r   r   r   r   _process_issues  s
    

zJiraAPIImport._process_issuesu3   Обработка связей всех задачc                 C   s  |   D ]b}| j|d | |d dD ]>}| 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	|i|d
< | jjjj d|d d  |d d	< || j
|	< qd
|krd	|i|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 rf dS zB| 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}|s(tj|| j|d d d}|d d |_|d d |_|jdd | jjjj d|d  }tjj|d}|sftj|| jd }tjj|d
 d	 d|_tjj|d d	 d|_||_|jdd W nN   |  jd!7  _| jjd"|d  d#|d
  d$|d  t j!ddd% Y nX qJ| jj  dS )&uD   
        Постобработка связей задач
        r   r   Nr   r   r   Z
issuelinksr   r   r   u   Подзадачи: rj  parent_taskr  uq   Не удалось связать задачи, возможно задача не попала в импорт Tr   zsystem.finish:finishzsystem.duplicatezsystem.linkzsystem.clone)ZBlocksZ	DuplicateZRelatesZClonersu   Связи: r  r   rD   r   r   )r   r+   r   ZinwardZoutwardr  r(   u.   Не удалось создать связь z out=z in=r   )"r   r   r  r+   r-   rM   r   r   rQ   r{   rP   r,   r   rK   r   rU   rT  rK  r   r.   r/   r6  r  rz   ZCmfRelationTypeZin_type_nameZout_type_nameZCmfRelationOptionZin_linkZout_linkrelation_typer2   r3   r4   )r   r   r   Zissue_parentr   Zparent_ext_idZ	sub_tasksZissue_linksZ
issue_linkZlink_ext_idrK  Zchild_ext_idZ
child_taskZ	map_namesZrelation_ext_idZissue_relationZrelation_coderL  Z
rel_ext_idZrelation_optionr   r   r   _process_relations  s    "



&&


&  z JiraAPIImport._process_relationsu)   Обработка компонентовr  c              
   C   s  t jj|d ddgd}t jj|dddgd}| |d	 D ]}zn|jsZd|_|  | j rlW  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| |d | j |_|d dkr|j|_n.|d dkr|j|_n|d dkr4|j|_|jrP|jrP|jdd |ddr|jsv|  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| tjddd Y q<X q<d
S )uG  https://docs.atlassian.com/software/jira/docs/api/REST/1000.824.0/#api/2/project-getProjectComponents
        Пока грузим как списки, после доработки будут отдельные обекты

        Args:
            project_info (dict): проект из джиры как есть
        r   r   r   r  rD  Tr  )r   r   Zinclude_systemr   r   Nr   descr_documentdefault_ownerdefault_responsibler   r   r   r   r+   r   r   r  ZassigneeTypeZPROJECT_DEFAULTZPROJECT_LEADZCOMPONENT_LEADr   rs   rv   r(   u3   Ошибка загрузки компонента r   ) rK   r  rM   r   _get_project_componentsr  r   r+   r-   r   r   rF  r   r   r   r   rH   rO  r   rP  r   r   r[  rN  Zcreate_descr_document
text_draftr   re  r2   r,   r3   r4   )r   r  r  r   rI  r   Zcomponents_listr   r   r   r  d  sT    
  




z!JiraAPIImport._process_componentsu   Обработка версийc              
   C   s  t jj|d dgd}t jjd|d}t jjd|d}| j|d dD ]X}z| j rbW  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r:|d s$|d r0|d n
|d |jrV|jrV|jdd | j jd7  _W qF   |  jd7  _| jjd| tjddd Y qFX qFd S )Nr   z"scheme_wf.default_release_workflowr  release)r   r   r   r   ry  rC  rj  TrQ  zlist.release:defaultrD   r   rs   rv   r   ZarchivedZreleasedr
  ZOPENr(   u+   Ошибка загрузки версии r   )rK   r  rM   r   _get_project_versionsr+   r-   r   r   r   r  r  r   r   rn   r  Zdefault_release_workflowr{  r   r[  r   r   Zset_default_statusre  r2   r,   r3   r4   )r   r  r  Zrelease_folderr  rH  r   Zversion_listr   r   r   r    s>    




zJiraAPIImport._process_versionsu   Обработка аудита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   rE   Z	UserStoryztask.userstory:defaultz
Task Agileru  Bugztask.bug:defaultEpicrt  )zSub-taskZSubtaskrW  ZStoryu   ИсторияZTasku   ЗадачаrX  u   Багu   Ошибкаu   ЭпикrY  issue_typesu-   Обрабатываем тип задачи Nr   r   r   rK  r<  ::%r   r   rE   r   rJ  Tr  u   Ищем по имени "r  rN  u*   Не нашли, создаем новыйrs  r-  r(   Zsubtaskrs   r   )r   r   rn   r  rx  )r   r+   rU   r6  r-   r   r   rK   r  rM   r   r   stripr@   rI   rJ   r   r   r   r   re  )r   Z	name2coder  r  r  Zlogic_type_dictZtemplate_coderx  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   Импортируем workflowrh  r   	workflowsNr   r   ZentityIdrj  ru  rD   rw  rs   Tr   r{  r   r   rm  rJ  r|  r   r}  Ztransitions)r   r{  )r   r{  r+   c                    s*   g | ]"} j jjj d j d | qS )r   )r+   r   r   r   )r   str   r{  r   r   r   ?  s     z3JiraAPIImport._process_workflow.<locals>.<listcomp>fromINuN   DEV: Fatal Вероятно, сломали создание статусов!tor(   )r   r+   r-   rU   r6  r   r   rK   r  rM   rn   r   r   r  r  r   rm  r  r   ZCmfTransZstatus_fromr   r  Z	status_tore  )r   Zjira_statusesr  Zjira_workflowZworkflow_idZtemplate_workflowrp   Zjira_transitionZtransition_ext_idZ
transitionZ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   rK  r[  r   u+   Не импортировался workflow r   rs   rv   r   rE   r  )r   rn   r   rx  r  Zdefault_subtask_workflowr   r  ZissueTypeMappingsr<  r   r  Tr   r(   )r   r+   r-   r   r   rK   r  rM   r  r   r   r  r  r   r  rz   r  r   re  )r   re  Zdefault_task_workflow_ext_idr  Zscheme_dictZworkflow_scheme_objr  r  r  r  r  r{  r  r   r   r   _process_workflow_schemeG  sP    

 
(z&JiraAPIImport._process_workflow_schemer;   c              	   C   s   | j  | d}| j  | d}| r8d S t|d6}| D ](}| j  jd7  _|t|d  qJW 5 Q R X t	
|| | j jdd t  d S )N.jsonz.json.dirtyr  r(   r  Tr  )r+   rY   rZ   r[   r\   json_object_countr   r]   r!  r  mover   r   )r   Zapi_funcr   r`   Zfile_path_tmpra   r"  r   r   r   _simple_dumpl  s    
 zJiraAPIImport._simple_dumpc              	   c   sN   | j  | d}| rJt|d}|D ]}t|V  q.W 5 Q R X d S )Nrg  r+)r+   rY   rZ   r[   r\   r]   r  )r   r   r`   ra   r"  r   r   r   r   y  s    zJiraAPIImport._simple_getc              
   c   sf   | j  d}| rbt|D ]>}|dr2q"t| d| dd}t	|V  W 5 Q R X q"d S )Nr   .dirtyr   
/info.jsonrk  )
r+   rY   rZ   r[   oslistdirr   r\   r]   r^   )r   r  rz  ra   r   r   r   r     s    
zJiraAPIImport._get_projectsc                 C   s&   |   D ]}||d kr|  S qd S r0  )Zget_projects)r   rz  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.jsonrk  r+   rY   rZ   r\   r]   r  r   rz  r  ra   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.jsonrk  rr  rs  r   r   r   r    s    z'JiraAPIImport._get_statuses_for_projectc              	   c   sH   | j  d|}t| dd}|D ]}t|V  q(W 5 Q R X d S )Nr   /roles.jsonrk  rr  rs  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   rR   r   rm  rk  r+   rY   rZ   rn  ro  r\   r]   r^   )r   rz  	board_dirZboard_idra   r   r   r   r    s    z!JiraAPIImport._get_project_boardsc              
   c   sV   | j  d|d}t|D ]2}t| d| dd}t|V  W 5 Q R X qd S )Nr   rG  r   rm  rk  rv  )r   rz  sprints_dirZ	sprint_idra   r   r   r   r    s    zJiraAPIImport._get_all_sprintsc              	   c   sH   | j  d|}t| dd}|D ]}t|V  q(W 5 Q R X d S )Nr   /versions.jsonrk  rr  rs  r   r   r   rU    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.jsonrk  rr  rs  r   r   r   rR    s    z%JiraAPIImport._get_project_componentsc                 C   s0   | j  d|d}tdd t|D }|S )Nr   tasksc                 s   s   | ]}| d  V  qdS )rl  N)r   )r   entryr   r   r   	<genexpr>  s     z5JiraAPIImport._count_project_tasks.<locals>.<genexpr>)r+   rY   rZ   sumrn  ro  )r   rz  	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{  rl  r   rm  rk  )
r+   rY   rZ   r   rn  ro  r   r\   r]   r^   )r   rz  startr   r  iZtask_idra   r   r   r   r     s    
zJiraAPIImport.get_project_tasksc                 c   sB   |d  d}t |D ]$}|dkr&q|| d| dV  qd S )Nr   z/attachmentsall_attachments.zipr   )r   r`   )rn  ro  )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.jsonrk  )r\   r]   r  )r   r   comments_file_pathra   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.jsonrk  r\   r]   r^   )r   r   r  ra   r8   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.jsonrk  r  )r   r   Zproperties_file_pathra   r   r   r   r4    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.jsonrk  r  )r   r   Zwatchers_file_pathra   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.jsonrk  )r+   rY   rZ   r[   r\   r]   r^   )r   global_settings_file_pathra   r   r   r   _get_jira_global_settings  s
    z'JiraAPIImport._get_jira_global_settingsc              	   C   s@   | j  }| j d}t|d}t|| W 5 Q R X d S )Nr  rX   )r@   Zget_jira_global_settingsr+   rY   rZ   r\   r]   r_   )r   Zglobal_settings_datar  ra   r   r   r   _dump_jira_global_settings  s    
z(JiraAPIImport._dump_jira_global_settings)rn   attachments_dirr   c                    s  |sd S | j jd t|ddd D ]*}d}|drBd}|j| }z|drr| 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
|}	|	rj|	d  |	d dd}
 |
d krj|d d }tt fdd|d }|rj| 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
rT } z*| j j"%  | j jd| d|  W 5 d }~X Y q*X q*t|d}|jdd id!D ]P}|jd"r| &|jd" |d#  n$|jd$rr| &|jd$ |d#  qrd S )%Nu/   Обработка ссылок в текстеZlxmlc                 S   s   |  dp|  dS r%  r'  r)  r   r   r   r*    r+  z+JiraAPIImport._dump_links.<locals>.<lambda>r&  r  zmailto:u   Это почта: ZhttpuH   Это внешняя ссылка, оставляем как есть: r.  r   u   Это не файл: r/  r(   r  r  r   r   c                    s   |  d kS r0  r1  r2  r4  r   r   r*    r+  uE   Этот файл уже обработан во вложениях: r   r-  r   r  
obj_ext_idr   r+   r  r  r   Fu0   Не удалось скачать ссылку r  r  r  r  r  r  r   r  )'r+   rU   r6  r   r  r(  r  r7  rT  r8  r9  Zurljoinr@   r   r?  r@  r   r;  r<  r:  r=  r   rK   r   r   rZ   CmfImportDownloadrM   r   r   pathr   
downloadedr   r.   r/   r0   r1   r#  )r   rn   r  r   r  r   r   rD  encodingrA  Zattach_filenamerB  rC  r   r`   download_jobr!  r  r   r4  r   _dump_links  st    



 


.
zJiraAPIImport._dump_linksc                  C   s"  t dd || _d}| jjd| d|  z| j|d ||D ]}ztzD| j r|W W ^ W W 5 Q R  dS | jjd|d	  d
 |	t
|d }	|	 rW W qJ|	t
|d d }
|
jdd |
|d< |		d}|d d rl| jjdt|d d   ztj| jjd|d  d}| jjjrft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
r4 } z$| jjdt d| tj dd W 5 d }~X Y nX |d d D ](}|drB| !|d | j" |
 qB| 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$rf| !|d d$| j"|
 |d d%r| !|d d%i | j"|
 |d d&i r| !|d d&i | j"|
 | )|d' d( || |
	d)}| rt$| | jjd* t%|d+}| j*|d D ]h}| !|d | j" |
 | !|d! | j" |
 |+t',|d,  | j j-d7  _-| )|d- || q&W 5 Q R X | j.|d }|
	d.}t%|d }t'(|| W 5 Q R X | j/|d }|D ]}| !|| j" |
 q|
	d/}t%|d }t'(|| W 5 Q R X t01|
|	 |jdd |		d0}t
|	2dd1|d< t%|d "}t'(|| | j j-d7  _-W 5 Q R X W n(   |d7 }| jj3d2|  Y nX W 5 | jj  X qJW n.   | jj3d3|d4  d5 |d7 }Y nX |4| W 5 Q R X d S )6NFr  r   u   Задачи с u    до r   r(   u   Задача 'r   'rl  Texist_okr   rB  r   r   u%   Обработка вложений: zsecure/attachmentzip/z.zipzsecure/issueAttachments/r  r   r  r  r   r  r)   r   rB  zworklog.jsonrX   r$  r9  r:  r=  r>  r?  r@  rs   zcomments.jsonu#   Дампим комментарииr  r  r   zproperties.jsonzwatchers.json	info.jsonrv   u0   Не удалось скачать задачу u2   Не получить задачи проекта r   u    с сервера)5r   r@   r+   rU   r6  Zget_all_project_issuesr.   r/   r-   rZ   r&   r[   mkdirr   rn  r  r   r   rI   rJ   r   r   rK   r  rM   r   r  r   r0   r,   r	  r3   r4   r#  rH   rO   r  r\   Zissue_get_worklogr]   r_   r  Zget_commentsr   r!  rh  Zget_issue_propertiesZget_watchersr  ri  r  	exceptionr  ) r   r  maxr  r  r@   tasks_that_are_doner  r   Ztask_dirZtask_dir_tmpr  r  r   Zattach_file_pathr   r  r!  r  Zworklog_file_namera   Zworklogsr,  r-  Zcomments_file_namer  Z
propertiesZproperties_fileZwatchersr   Zwatchers_fileZ	info_pathr   r   r   _dump_task_part2  s    


 


2


  


 


zJiraAPIImport._dump_task_partr  r0  c                 C   s  t |d  d}|jdd | j }d}t|| j d }|sFd}d}g }d}	||	kr|| | }	|	|krr|}	| 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 }qR|d }| jjd| d |D ]2}
|
j|d |
 r| jjd tdq| jjd | sv|| 7 }q\| jjd|  | j|d | |d dD ]}| j r|  S t |d  d}| j!  d}| j!  d}|" rt#$|| t%|dR}t%|d<}t%|d&}|D ]}||kr.|&| q.W 5 Q R X W 5 Q R X W 5 Q R X |'  t#(|| q|S )Nr  z/tasksTr  r   r(   r   Z
dump_tasks)r   r  tokenpassword
verify_sslrJ   )r  r  r  r  r@   r  targetr   r7   u$   Форкаем _dump_task_part proc=r(  u%   Таймаут дампа задач u    минут)timeoutu$   Возможно завис дампu"   Ошибка дампа задачuK   Закончили параллельное скачивание задачu   Ошибок: r   r   r   r  zusers.json.newr  r  ))r   r  rk   Queuer  rm   rj   Threadr  r   r@   r   r  r  r  r  rI   rJ   r{   r  r+   rU   r6  r   is_aliver  TimeoutErroremptyrM   r   r  r-   rZ   rY   r[   r  r  r\   r   unlinkri  )r   r  r0  r  r  r  stepr  r  Z	max_limitr  r  r   Zissue_users_pathZall_users_pathZall_users_path_newf1f2Zf3liner   r   r   _dump_tasks  sv    
 	



 

,zJiraAPIImport._dump_tasksc              	   C   sZ   t |d  d}| r$t| t|d"}| j|d }t|| W 5 Q R X d S )Nr  r  rX   r   )	r   r[   rn  r  r\   r@   Z!get_project_issue_security_schemer]   r_   )r   r  r  ra   perm_schr   r   r   #_dump_project_issue_security_scheme  s    
z1JiraAPIImport._dump_project_issue_security_schemec           &      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 ] }
z| j
 rW  d S | j jd7  _| jjd|d  d |t|d }|d}| 
s| jj|d }	t||d  d|	d< tj|	d d
d | jjd t|	d  d}
|
 rVt|
 t|
d}| j|	d }zx|d D ]j}|d d dkr|| jjjr|d dr| |d d | j  n| |d d | j  q|W n&   | jjd| tjd  Y nX t || W 5 Q R X | !|	 | jjjr|	d  sh| j"|	d gd d! |	d"< n| jjd# t|	d  d$}| rt| t|dD}| jj#|	d d%D ]*}| j jd7  _|$t%|d&  qW 5 Q R X n~| j&| jj' d'|	d   |	d"< d|	d" krB|	d" d |	d" d(|	d"< n.| j&| jj' d)|	d" d   |	d" d*< |	d+}|r| jd,|  | j&|d- }|(  | |	d+< | |	d+ | j) | j  | jjd. t|	d  d/}| rt| t|dD}| jj*|	d d%D ]*}| j jd7  _|$t%|d&  q$W 5 Q R X | jjd0 t|	d  d1}| rt| t|d}| jjj+|	d d2, D ]}| j
 r W 5 Q R  W  d S | j jd7  _| j&| }| jjjrt|d3g D ]d}|d d4kr| jjj-|d5 d|d5 d6d7|d8< |d8 r| |d8 | j) | j  q|$t%|d&  qW 5 Q R X | jjd9 t|	d  d:}| rt./| |  t|	d  d;}| rt./| |  | jj0|	d d2D ]}| j
 r. W  d S | j jd7  _| jjd<|d   | jj1|d |d*< | j&|d* d= d-  |d* d=< | jjjrd>d | j2|d D |d* d?< |	d |d@< |t|d }|jd
d |d}t|dA}t || W 5 Q R X z<|d dBkrP| jjdC | j3|d D ]}| j
 rd W  W  d S | j jd7  _|t|d }|jd
d |d}| r| jjdD|d  dE qDg |dF< | jjdD|d   | j4|d D ]4} | j
 r  W  W  d S |dF 5| d  qt|dA}t || W 5 Q R X qDW n |j6j7k
r }! z^|!j8j9dGkrdHt|!ksdIt|!kr| jt|! n| jjdJ| tjd
d
dK  W 5 d }!~!X Y n*   | jjdJ| tjd
d
dK  Y nX q| jjdL |	d  dM}"t|"db}| j:|	d D ]J}#| j
 	r^ W 5 Q R  W  d S | j jd7  _|$t%|#d&  	q:W 5 Q R X | jjdN |	d  dO}$t|$d}| j;|	d D ]r}%| j
 	r W 5 Q R  W  d S |%d+
r| |%d+ | j) | j  | j jd7  _|$t%|%d&  	qW 5 Q R X dPtj<dQ< | j j=|7  _=| jj>d
dR | jj?@  dStj<dQ< t.A|	d | t||	d< |	d  dT}t|dA}t |	| W 5 Q R X n t|dU}tB|}	W 5 Q R X | jC|	d }| jjdV|  |  jD| jE|	|dW7  _DW qv   |  jDd7  _D|dXrv| jjdY|d  dZtjd
d
dK n| jjd[| tjd
d
dK Y qvX qv| jjd\ d S )]Nr   r   r   	isCheckedu5   Не выбрали ни одного проекта!c                 S   s$   g | ]}|d  r|d r|d  qS )r5   r  r   )r   r6  r   r   r   r     s       z0JiraAPIImport._dump_projects.<locals>.<listcomp>Zchildrenr   Tr  P   r(   u   Дампим "r   r  r   r  r   rl  r  u   Дампим права/permissions.jsonr  permissionsholderr  r   	parameteru0   Не удалось сдампить права rb  r  ZworkflowSchemer  u/   Дампим типы задач проектаrq  ry  r  z$rest/projectconfig/1/workflowscheme/)r   r6  zrest/api/2/workflowscheme/r6  r  u1   Ищем руководителя проекта r   u*   Дампим статусы проектаrt  u$   Дампим роли проектаru  )r   r  r  Z	actorUserrB   )r#  rE  r   u&   Дампим доски проектаz/boards/z	/sprints/u   Доска r   c                 S   s   g | ]}|qS r   r   r   r   r   r   r   b	  s     Zquick_filtersrz  rX   )ZscrumZsimpleu&   Дампим спринты доскиu   Спринт u    уже скачанr  i  z"The board does not support sprintsuD   Данная доска не поддерживает спринтыu4   Не удалось сдампить спринты r   u(   Дампим версии проектаry  u!   Дампим компонентыrz  rv   NO_CACHEr  1rm  r  u*   Дампим задачи проекта: r  r  u   Проект "u   " является приватным и не может быть импортирован, отключите приватность в Jira или предоставьте пользователю праваu2   Не удалось получить проект u0   Закончили дампить проекты)Frequestsr   r0   rS   r+   rY   rZ   r  r   r  r-   rh  rU   r6  r&   r[   r@   rI   rp  rn  makedirsr   r  r\   Zget_project_permission_schemerJ   rM   r#  r,   r3   r4   r]   r_   r  Zget_project_schemeZget_issue_for_projectr   r!  jira_requestr   raise_for_statusrH   get_statusesZget_project_rolesrc   r   r  rmtreeZget_all_agile_boardsZget_agile_board_configurationZget_board_quick_filtersZget_sprintsZget_sprint_issuesr{   
exceptionsZ	HTTPErrorZresponser  Zget_project_versions_paginatedZget_project_componentsenvironprogressr   r.   r/   ri  r^   Zget_project_issues_countr2   r  )&r   r  rootZprojects_dirr0  r  r   r  Z	data_filer  permission_filera   r  	perm_dictZ
types_filer  r  r8   Zstatuses_filer"  Z	role_fileZrole_urir  r  Z
boards_dirrx  r  rw  Zboard_info_filer   Zsprint_pathZsprint_file_pathr   r!  Zversion_list_filenamerH  Zcomponents_list_filenamerI  r   r   r   _dump_projects  sx   





"



$


"



 "




$


*""

$$zJiraAPIImport._dump_projectsc                 C   s`  | j  }t|\}}}|| d }| j d| d | j jd | j jd |   |  | _	| j jd | 
| jjd | j jd | 
| jjd	 | j jd
 | 
| jjd | 
| jjd | jjjr| j jd | 
| j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   Свободно места: rL  u$   Скачаем данные из APIu9   Дампим глобальные настройки Jirau'   Дампим пользователейr   u   Дампим статусыrh  u    Дампим типы задачrZ  issue_security_schemesu*   Дампим бизнес процессыr^  u7   Дампим схемы бизнес процессовre  rv   r     r  u   Дампим проектыN)r+   rY   r  
disk_usager,   rU   r6  r  r  rO   rj  r@   r   r  Zget_issue_typesZget_issue_security_schemesrI   rJ   Zget_workflowsZget_workflow_schemern  r  r  r   r   r  )r   Zdownload_pathrA  usedfreeZfree_percentr   r   r   download_data	  s6    




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 )Nrv   r  re  rh  r  )r   r   r  Tr  r  )rn  r  rK   Z	CmfImportrM   r+   r   rh  r  re  r  r   r   )r   r+   r   r   r   r  	  s    
zJiraAPIImport._calc_progressc                    s  t t d fdd}dddgddd	gg}d
D ]l}tt| }|j|d} jjd|j d|  d}d}|dkr,|j|ddddg|| || | gd}|d7 }||8 }|D ]}	 j	 r  dS zt
|	dr||	jj|	_|	jr|	  |	  n"||	jj|	_|	jr|	jd	d |	jD ]8}
|
jdkr6q"||
jj|
_|
jr"|
jd	d q"W q    jjd|	 tjd	d	d   jd7  _Y qX qqnq,dS )uU   
        Заменим ссылки на задачи и документы
        r  c                    s  | s| S t | d}|dD ]}|jdr0q|jdd jjjrd }d|jd krt	d|jd }|s j
jd|jd   q j
jjj d	|d
dd   }tjj|dgd}|sވ j
jd|  qnd|jd krt	d|jd }|s" j
jd|jd   qtjjddd|d
dd   dgdgd}|D ].}|jd |d
dd  krT|} qqT|s j
jd|d
dd    qnq|tj| qt|S )Nr  ar  r  rv   z/wiki/z\/\d+u:   Не удалось найти ид документа в r   r   r(   r  u:   Не удалось найти документ по ид z/browse/z	\/\w+-\d+u4   Не удалось найти ид задачи в rS  rK  z%"key":"r  rJ  r   u:   Не удалось найти задачу по коду )r   r  r  rM   r7  r@   rI   r   r;  r<  r+   rU   rT  r   r   r`  rK   r   r   r   rS  Zreplace_withZCmfPluginCsvZcreate_tag_linkr&   )rn   r5  r  r5   r   Zext_coder   r"  r   r   r   check_links	  sJ    
$
"z7JiraAPIImport._process_cross_links.<locals>.check_linksr+   r|  Nr   r   T)r   r   r  r   r   u)   Конвертируем ссылки в u=    на локальные задачи и документы: r  r   rn   zcomments.log_levelzcomments.textrS  )r   r   slicer(   r  r  uZ   Не удалось конвертировать перекрестные ссылки в r   )r&   varsrK   r  r+   rU   r6  r   r   r-   hasattrrn   r   rS  r[  r   Z
do_approveZcommentsr  r,   r3   r4   r2   )r   r  r   Z	mode_namerf   r0  r  r  r   r5   r  r   r   r   _process_cross_links	  sJ    (




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 ]}
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|
 t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 nD|
d d  d"kr<d|_|jdd n|
d d  d#krdd|_|jdd n|
d d  d$krd|_|jdd n|
d d  d%krd|_|jdd n|
d d  d&krV| jjj r|
d d'r| !|
d d' }n| !|
d d( }|r(|j"| |jdd n*| jjd)|
 tjddd |  jd7  _n|
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+}|r|j"| |jdd n*| jjd,|
 tjddd |  jd7  _n2| jjd-|
d d   tjddd |  jd7  _W q   | jjd.|
 tjddd |  jd7  _Y qX q|	S )/Nr   )get_datar  r  c                 S   s   i | ]}|d  |d qS )Z	jira_coderE   r   r   r   r   r   r8  9
  s      z6JiraAPIImport._process_permissions.<locals>.<dictcomp>Zproject_perm_permissionr  r   r   rj  T)r   r   r+   r   r   r  Z
permission)rE   Zinclude_deletedu4   Не нашли соответствия права r   rK  rL  r   access_membersaccess_project_rolerJ  )permr   r   u*   Не найдено правило для r   r(   r  r  ZprojectRoleZapplicationRoleZprojectLeadr?  r=  r   r   r  u9   Не нашли пользователя для прав r`  r   u-   Не нашли группу для прав u'   Неизвестный тип прав u6   Не удалось загрузить правило )$Zcmf.system_datar  r   r\   r]   r^   r+   r   r   rK   ZCmfProjectPermSchemerM   r   r   ZCmfProjectPermPermissionrU   rT  ZCmfProjectPermSchemeRuler,   r3   r4   r2   r   r  r  r{   Zaccess_local_userZaccess_ownerZaccess_responsibleZaccess_authorr@   rI   rJ   r   r  rX  )r   r  r  r  Zsystem_dataZmap_permra   Zperm_scheme_dictr   Zperm_schemer  r  r   r   Zscheme_ruleZrole_ext_idr  r   r`  r   r   r   r  5
  s    
"$&$z"JiraAPIImport._process_permissionsc                 C   sX  t ddB d}| }|dkr&q@| j r4q@| 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|	_|	  W nJ tk
r2 }
 z*|d7 }| jjd|d  d|  W 5 d }
~
X Y nX W 5 Q R X q|| W 5 Q R X d S )NFr  r   r  u    Пытаемся скачать r  T)streamr  r  zwb+i    )Z
chunk_sizeu   Сохранили в r   r  r(   u+   Неудалось скачать файл r  )r   rM   r+   r-   rU   r6  r@   r  rl   ZIMPORT_DOWNLOAD_TIMEOUTr  r   r\   Ziter_contentr   rK   r  r  r   r0   r  r  )r   download_queueerror_queuer  r  r8   Z	save_pathra   chunkZdownload_job_objr!  r   r   r   _download_file_worker
  s.    
<z#JiraAPIImport._download_file_workerc           	      C   s  | j jd | j }| j }d}| j dg dd| j jjjgdddgg}tj	j
|dsp| j jd	 |S g }t| jD ]J}| jj| jd
| ||dd}|| |  | j jd|  q~tj	j|ddgdD ],}| j  r q||j|j|jd q|D ]}|d q| s@|D ]}|  q0| j  rP|S | j jd | s| j  rx|S || 7 }q^|S )Nu=   Скачиваем все найденные вложенияr   zplugin.plugin.source_hashr   r   r  Fr   u   Вложений нетr  )r  r  r  u    Запустили задачу r  r  rJ  )r   r  r  r  u%   Закончили скачивать)r+   rU   r6  rk   r  r   r   r   rK   r  r  r  rm   rj   r  r  r{   r  Zslistr-   r  r   r  r  r  r   rM   )	r   r  r  r8   r   Zprocsr  r  r  r   r   r   download_files
  sD    





zJiraAPIImport.download_filesc                 C   s
  |  dD ]}| j r d S | jjjj d|d  }tjj|d}|s\tj|| jdd}|jrx|d |_	|d|_
||_|jdd	 |d
 D ]p}| jjjj d|d  }tjj|d}|stj|| jdd}||_|jr|d |_	|d|_
|jdd	 qq
d S )Nr  r   r   rj  TrQ  r   rs   r   Zlevels)r   r+   r-   r   r   rK   r  rM   r   r   rn   rS  r   rE  r   )r   r  r   Z
scheme_objrc  Zlevel_ext_idZ	level_objr   r   r   _process_security_levels
  s,    


z&JiraAPIImport._process_security_levels)rd   c                 C   s   |d d|d d  ddg g g g dddd	}|d d
 d dkrVd|d< d|d< n|d d
 d dkr|d|d< d|d< n~|d d
 d dkrd|d< d|d< nX|d d
 d dkrd|d< d|d< n2|d d
 d dkrd|d< d|d< d|d< nd }|S )Nr   Try   r   customfieldcf)r  r{  r  Zlogic_prefixF)r   custom
class_nameZvisible_filterrequiredZrequiredChangedZschemar  z:com.atlassian.jira.plugin.system.customfieldtypes:textareaZCmfStrZ
field_typeZCmfTextwidgetz:com.atlassian.jira.plugin.system.customfieldtypes:datetimeZCmfDateTimez<com.atlassian.jira.plugin.system.customfieldtypes:datepickerZCmfDatez7com.atlassian.jira.plugin.system.customfieldtypes:floatZ
CmfNumericZ	CmfNumberz<com.atlassian.jira.plugin.system.customfieldtypes:userpickerZCmfRelationr   rf   )r  )r   rd   r8   r   r   r   
_map_field
  s.     




zJiraAPIImport._map_fieldc              	   C   s  | j d | j jjj}tjj|dgd}|sNtj|| j ddd}|jdd tjj|dgd}|sxtjd| j |dd	}d
|_	|jdd |j
rtjj|dgd}|stjd| j |d}|j
r||_||_d
|_	|jdd | j jjddsd S |jj}dd tj D }g }| jtjj d D ]|}|d rN| j d|d   q$|drh|d d s| j d|d   q$|d d dd}	| |}
|	|kr"||	 d |
d kr| j jd|d  d|
d  d||	 d  tjd | j d|	 d |d  d! ||	 |d< q$| j d"|	 d |d  d# |
st| j jd|d  tjd |  jd$7  _q$|
|d% |	< |d& d' d |	 || q$|r||_|  tj  tjd(d
i d)d tj D }|D ]}||	 |d< q| j jj}|d* D ].}|d+ tjjkr| jtjj d |d< q|| j _| j jr|d,tjd-< | j   | j j !  d.tjd-< d S )/Nu0   Обработка кастомных полейr   r  TzJira import custom fields)r   r+   r   r   r   z"Jira import custom fields (UiForm))r   r+   r   r   r   )r   r+   r   Zimport_custom_fieldsFc                 S   s   i | ]}|d  |qS rg   r   r   ra   r   r   r   r8    s      z8JiraAPIImport._process_custom_fields.<locals>.<dictcomp>r   rw   u!   Поле уже смаплено r   ry   r  u!   Поле не кастомное r   r  r  r  u+   Неудалось смапить поле u:   ,                                         widget поля u5    не совпадает с существующим rb  u   Поле с именем (u4   ) есть в таблице, мапим в негоu(   Создаем поле с именем u   ), и мапим в негоr(   Z	ui_fieldsZui_group_fieldsr-  r  c                 S   s   i | ]}|d  |qS r  r   r  r   r   r   r8  8  s      r   r   rv   r  r  )"r+   r,   r   r   rK   r  rM   r   Z	CmfUiFormr  r   ZCmfUiFormSchemeRuler  r  r   r   ui_form_jsonr   rh   r   r   r  r  r3   r4   r2   r{   Zcustom_field_syncZcustom_field_sync_update_modelsr[  rn  r  r.   r/   )r   r   r  Zui_view_formr  r  Zshop_fieldsZ
new_fieldsrd   r   Zui_fieldr   sr   r   r   _process_custom_fields
  s    
    








z$JiraAPIImport._process_custom_fieldsc                 C   s  dt jd< d| j_d| j_| j  t  dt jd< tdD ]}|   | j	s< qTq<tdD ]}| 
 }|s\ qrq\|  j	|7  _	|   |   |   |   |   |   |   |   |   | jjjr|   |   |   |   |   n|   |   |   |   | j r,d S d| j_| j  t  |  D ]>}|d dd	 | jD krnqL| jjd
|d  d qL| jj d| j	 t!j"ddd | j d| jj  | j	 S )Nrv   r  r   r     r  r   c                 S   s   g | ]}|d  qS r  r   r   r   r   r   r   s  s     z0JiraAPIImport.process_import.<locals>.<listcomp>u'   Импортирован проект 'r   r  u#   Ошибок обнаружено: Tr   u-   Импортировано объектов: )#rn  r  r+   re  r  r   r   r  r  r2   r  r  rg  rn  r]  r  r  r@   rI   rJ   rd  rf  r  r   r  rM  rV  r-   r   rS   rU   r6  r,   r3   r4   )r   r  r8   r   r   r   r   process_importH  s\    





zJiraAPIImport.process_import)T)r   r   )T)TT)N)r   r  )jr"   r#   r$   r%   r  r'   r   r&   r   r   rG   propertyrb   re   staticmethodr   r   r   ri   rT   r|   r   r   r   r   r   r   r   r   r=   r   r
  r"  r  r   rF  ra  rg  rn  rK   r  r  r  r  r  r  r  r  r  r  r   r  r  r  r   r   r#  r.  r1  r7  r;  r  rJ  rM  r  r  rV  r]  rd  rf  rj  r   r   rp  r  r  r  r  r  rU  rR  r  r   r  r/  r+  r4  r   r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  __classcell__r   r   rV   r   r>   ;   s   
 

	,3  


A 
9
]

E'.
t0
=
+
/
?$
 

U4
$

H
7
$	
=r= P!QT$Or>   )*Zcmf.appr   Zcmf.includeZdataclassesr?  pathlibr   r  Ztempfiler   r8  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   rK   r   r   r   r   Z	dataclassr   r=   r>   r   r   r   r   <module>   s(   $ 