U
    艭dE                    @   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   z~z<| j d  | j  r*W W Zd S  | f||W W BS  tk
rz   |  jd7  _| j jd tjdd Y nX W 5 | j j  X d S )Nz==================    u   Ошибка Texc_info)	
cmf_importdpcommitlog	is_cancel	Exception
has_errorsloggingERROR)objargskwargs)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                       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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ed"eeef dd#d$d%Zdd(d)Zed*d+d, Zed-d.d/ Zed0eed1d2d3Z d4d5 Z!ed6dee"d7d8d9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-edNdOdP Z.edNdQdR Z/edSdTdU Z0edVdWdX Z1dYdZ Z2d[d\ Z3ed]ed^d_d`Z4ed^dadbZ5edcddde Z6edfddgdhZ7edidjdk Z8edldmdn Z9edoedpdqdrZ:edsdtdu Z;edvdwdx Z<edydzd{ Z=ed|d}d~ Z>eddd Z?edddZ@edddZAdd ZBdd ZCdd ZDdd ZEdd ZFdd ZGdd ZHdd ZIdd ZJed^ddZKed^ddZLed^ddZMed^ddZNdd ZOdd ZPeeQedddZRdd ZSeedddZTdd ZUdd ZVdd ZWdd ZXdd ZYdd ZZdd Z[dd Z\  Z]S )JiraAPIImportu;   Класс загрузки объектов через APIr1   _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_projectsr1   _prepare_multiprocessingr2   Z	getLoggerr+   loggerZhandlersr=   )r   r>   r5   r6   rS   	__class__r   r   rE   >   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 )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_fieldsS   s    
zJiraAPIImport.jira_fields)model
field_namer?   c                 C   s&   |sd S | j |gd}|r"|d S d S )N)Zfields_namer   )Zimport_shop_fields)ra   rb   resr   r   r   _get_field_nameb   s    zJiraAPIImport._get_field_namec                 C   s(   dd l }dd l}|| _ || _tj| _d S )Nr   )	threadingqueueZconfigZIMPORT_THREADSthreading_max_forks)r   re   rf   r   r   r   rR   j   s    z&JiraAPIImport._prepare_multiprocessingc              	   C   sl   g }ddddddddd	}d
ddd}| j  D ]6\}}d| ||d }|||d|d q0|S )uO    Сопоставление настроек для модели models.CmfTaskr   textprioritystatusZ
alarm_dateZdeadlinecmf_modified_atcmf_created_at)Zsummarydescriptionri   rj   Zcustomfield_10015Zduedateupdatedcreatedz.namez.watchCountz.votes)ri   watchesZvoteszfields. Nmodel_field	json_path)r`   itemsrK   append)r   Zissue_settingsZdefault_local_attrs_mappingZadditional_json_pathZcustom_field_keyZcustom_fieldrt   r   r   r   _get_issue_import_settingsq   s*    

z(JiraAPIImport._get_issue_import_settingsc                  C   s    dddddddddg} | S )Nr   displayNamerr   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 )Nrl   ro   rr   
cmf_authorauthorrh   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   Ключ)rx   rz   r|   ro   r   bodyr   .r(   rq   r   )splitlenr`   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 |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   rx   r   rq   rz   ry   inwardIssueoutwardIssue,)r   
isinstancedictrK   listrv   r&   join)	r4   rt   to_strrb   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_funcra   r?   c                    sz   | D ]p}| }|D ]H} ||d |d< ||d |d< |d |d< |j|d< q |j|d |  S d S )Nrt   Zfile_valrs   titleicon)r   fields)r   rd   r   r   rv   verbose_name)r   r   ra   r4   Zobj_settingssettingr   r   r   r   _get_settings   s    z:JiraAPIImport.tmplt_import_settings.<locals>._get_settingszplugin.plugin.*projectsNidusersc                 S   s   g | ]}|qS r   r   .0r4   r   r   r   
<listcomp>   s     z7JiraAPIImport.tmplt_import_settings.<locals>.<listcomp>r(   limitr   c                 S   s   g | ]}|qS r   r   r   r   r   r   r      s     uS   Не найдено ни одной задачи, импорт невозможенua   Не найдено ни одного пользователя, импорт невозможенz2022-05-22T15:22:22.593+0300r   u!   Электронная почта)rx   rz   r   )ro   r   r   selectedObjects)r   value)r
   r   r   r   r	   	TypeModelr+   load_fieldsrW   rX   rY   _get_projects_get_project_tasks_simple_getr>   
get_issues	get_usersr0   rw   rI   CmfTaskr}   	CmfPersonr   
CmfCommentrv   )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 )NZimport_settingsu   Задачиzcalendar-today)r   r   titlesrows   r   r   rs   rt   rb   r   r   captionr   )Z_normalize_settingsr+   Zjson_settingsr>   r   	enumeraterI   r   r   r   _normalize_jira_valuerv   )r   settingsr   issueZnumr   r   r   r   r   preview  s    zJiraAPIImport.preview)r   r?   c                 C   sT   i }|D ]F}|d sq| j ||d dd}| |d d |}|||d d < q|S )uC    Преобразование настроек для модели rs   rt   F)r   rb   )r   r   )r   r4   r   Znormalized_objr   r   r   r   r   _normalize_obj#  s    zJiraAPIImport._normalize_obju:   Обработка исполнителей проекта)settings_usersr?   c                 C   s   i }i }| j |D ]j}|d |d  }}||krDtjj|d||< ||kr^tjj|d||< t| jtj	|| || d qd S )Nproject_nameZproject_member_emailr9   )ry   )leftright)
r>   Zget_project_membersrI   
CmfProjectrK   r   r   process_any_table_fieldsr+   ZCmfProjectExecutors)r   r   Zproject_name_idsZmember_email_idsZproject_memberr   Zexecutor_emailr   r   r   _process_project_executors/  s    z(JiraAPIImport._process_project_executors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   rv   rI   	CmfFolderr+   pluginsource_hashr   r   CmfListr   save)
r   r   r   Zparent_sys_typer   _filterr   r   Zlist_objnewr   r   r   _process_list>  s*    


zJiraAPIImport._process_listu8   Обработка наблюдателей задачиc                 C   s   | j |d D ]j}| j jjr.| |d }n| |d }|sNtd| ||jks||jks||jkrnq|j	
| qt  dS )u;   Добавляем наблюдателей в задачуr   r@   r   uI   _process_watchers: Не найден наблюдатель задачи N)r>   Zget_watchersrG   rH   _get_personCmfErrorresponsibler~   	cmf_owner
spectatorsrv   commit_with_event)r   	issue_objr   Zwatcherpersonr   r   r   _process_watchersW  s    
zJiraAPIImport._process_watchersu#   Обработка вложенийc                 C   s^  ddl m} dd l}t|d  d}d}| r||B}| D ]0}z|dr`W qJ|d d D ]}	|	d |krl qqltj	
|}
tjj|
|d	d
ddgd}|stj| j|d|
d}|jrH|	r| |	d | j |_|	d |_||L}|jdd ||  |jdd |	r8|j|	d ks8tt  W 5 Q R X W qJ   | jjd| tjddd |d7 }Y qJX qJW 5 Q R X | |D ]}ztj	
|d }
tjj|
|d}|stj| j|d|
d}|jr"|jdd |  t |d |j! tj"j#j$% }|&|j'}|(  W n0   | jjd| tjddd |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   ro   r   size:   Не удалось обработать вложение Z	anonymousr*   r(   	file_name)r   r   r^   ))Zrdisk.rdiskr   zipfiler   rY   ZipFileZnamelistendswithrI   CmfDocument_get_filenameCmfAttachmentrK   r+   r   r   rF   r~   rl   rZ   r   Zupload_filereadst_sizeAssertionErrorr   r.   r2   r3   _get_issue_attachmentsZ
upload_dirshutilcopyZfull_path_fileZCmfRFiler,   Zdata_driverZget_rdZ	get_rfileZ
_file_namemake_preview)r   r   
jira_issuer   r   Zall_attach_zip_patherrorsZmyzipZzip_attach_nameZattach_infoZattach_namer   Zattach_fattachment_infoZrdiskZrfiler   r   r   _process_attachmentsg  st    




 z"JiraAPIImport._process_attachmentsuB   Обработка упоминаний пользователейrh   r?   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classz
user-hoverattrszdata-account-idz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  rK   r   query_get_user_info_from_dumplowerrF   r  r   r   loginr0   r1   r+   r.   r2   r3   r&   )r   rh   r  r  Z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   rq   usernameuQ   Не нашли информацию по пользователю в дампе )r   rK   r  rF   r0   )r   Zuser_idr  r   r   r   r    s    
z&JiraAPIImport._get_user_info_from_dumpu#   Конвертация ссылок)rh   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   rK   itemZ	attach_idr   r   r     r!  r   r   )r   r   r   Zsrc_origTZvideoZcontrolsz100%widthZheightr  u   Заменили на z/people/rq   )r   r  r  rK   r+   rS   infor  
startswithurllibparseunquoter   researchnextr   rI   r   r   r   sgetr   	mimetypes
guess_typer   r   r  r&   )r   rh   r   r  r  Z	text_soupr  r   r   	url_matchattachmentsattachZ
attach_obj	mime_type
account_idr   r   r*  r   _process_links  sd    

 
 





zJiraAPIImport._process_linksu-   Обработка пользователейc              
   C   sn  t  }| dD ]>}| j r& d S z| jjd|  | jjjrl|d dkrl| jj	d|d   | 
|| jtjj d }d| jjjj d|| j  d}d}|d	 d
}t|dkr|d nd|d< t|dkr|d n|d |d< tjjdd|d gdgd}|s\tjjddd| dgdgd}|s\tjjd	d|d	 gd}|st|dkrxd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r2|  jd7  _| jjd|d	  dt| tjdd | jjdt| tjddd  |rB|d }n| jd!|d	  tj |sd}d}
|d }tjjdd"| gdr| jd#| d$tj |d d%\}}| d&|
 d%| }|
d7 }
qrtj||| jdd'}|jr|D ]}t||||  q|jr*|jr*|j dd( |!dd)g |j"r^||j"krd|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}|s.tj#jd	d|d	 gdgd}|sNtj#|| jd|d	 |d-}|jr`|d	 |_)|j"sp||_"n||j"kr|j" | |_"|j dd( |j&'| q|j dd. | j j*d7  _*|j+r|j,s|j+-d/s|r|.|j+j/ W q   |  jd7  _| jjd0| tjdd | jjd0|| j  tjddd  Y qX q|rjt0tjj1|gd1 d S )2Nr   u0   Импортируем пользователя ZaccountTypeZ	atlassianu   Неизвестный тип r   r   Fr    r(   r   rq   Z
first_name	last_namer  r   ry   r   r   r   r   LIKE%r      ORu+   Пользователей с именем z > Tr)   uB   Пользователей с одинаковым именем > r   uM   Не нашли пользователя среди существующих ILIKEuQ   Обнаружена учетная запись с дублирующим email u   , добавляем цифру@+)r   r  r+   r   r   rg_member_ofgroupsru   groupId)r   r+   r   r   import_raw_jsonZ	only_dataz.evateam.ruu@   Не удалось загрузить пользователя )r5   )2setr   r+   r/   rS   r,  r>   rG   rH   warningr   r   rI   r   r   r   r   rF   r   r   rK   r   r1   r.   r2   r3   INFOr  ZWARNINGr   setattr
is_changedr   r   r   CmfPersonGroup
jira_group
user_grouprG  rv   Z
user_localr   imported_object_country   r{   r   addr   Zcmf_deferred_taskZregister_persons)r   Znew_user_emailsr   Z	user_dictr   Z
is_createdr   r   Zpersonsr   nr  Zprefix_emaildomainr   rR  rS  Z
group_infogroupr   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-   rT  )r   rj   r_  r   Zcmf_status_coder   r   r   r   _process_statusesy  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:defaultrB   r   templater+   Tr   r#  
project_idZusagesZ
issueTypesworkflowr   r_  r?  !=forcer\  softdev:default	scheme_wfr@  rA  r   
logic_typeZtarget_workflowcmf_model_namers  r+   )r   _get_issue_types_for_projectr+   r   r   rI   CmfWorkflowrK   r   r   _get_statuses_for_project_create_status	CmfStatusr   r_  deleteCmfSchemeWfdefault_task_workflowZ!default_subtask_workflow_workflowCmfSchemeWfRuleru   r/   CmfLogicType)r   Zjira_project_info	issue_mapZdefault_task_wfZdefault_subtask_wf
issue_typeworkflow_ext_idworkflow_namerm  rC   rj  issue_type_ext_idjira_statusrj   Zscheme_ext_idZscheme_nameschemerulelogic_type_ext_idru  	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   r\  r[  r   )r   r   r+   Tr   r   r   r   rm  rd  status_code)rm  r+   r  rm   rK  )r+   r   r   r   rI   r]  rK   r   r^  r_  r   r{  r   r   rh   r  is_new)r   Zjira_status_datarm  status_ext_idr   r  r_  rj   r   r   r   rz    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   r\  r,  rq  rB   r   rm   rq   )r   r   rh   rJ  r+   rj  Tr   rk  	issuetyper   ra  rb  rc  r   rd  r   r@  rA  :r   z:defaultrh  ri  rZ  r[  r   rr  r   rt  )r+   r   r   rI   r}  rK   r   r   ry  rx  r  rC   r   r   rz  r  r   r|  ru   )r   project_infor   Z	wf_schemeZwf_scheme_inforj  r  r  r  r  rm  r  ru  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/   rK   _process_issueput)r   issue_queueissue_queue_errorsr  r   r   r   r   _process_issue_fork/  s    
z!JiraAPIImport._process_issue_forku   Обработка теговc           
      C   s  ddl m} t }| |d D ]4}| j r4 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 qZ tk
r }	 ztd| d|	  W 5 d }	~	X Y qZX qZd S )Nr   )translitr   r   labelsr=  _r"  rq   ruT)Zlanguage_codereversedrC  aliasrD  ""%r   r   r9   r   u*   Не удалось создать тег r  )Ztransliterater  rL  r   r+   r/   rK   unionreplacerI   ZCmfTagr   r0   r2   rM  )
r   r  r  tagsr   Ztag_nameZ
name_aliasr   Ztag_objr  r   r   r   _process_tags;  s,    
zJiraAPIImport._process_tags)project_structr  c                 C   sH  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 |_|
  t jj|d | d
}|st j| j|d |d d}|D ]}t||||  q|drd|_|
  | |d D ]H}| jjjj d|d  }t jj|d}|sht 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}|st j||| jd}g |_|j
dd |dg D ]X}	|	d dkr| jjjrRd| jjjj d|	d d  d}t jjddd| dgd}
nt jj|	d d }
|
rx|j|
 n| jjd!|	  n|	d d"krB| jjjrd|	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)q|j
dd q|    | !| | "| |    | j#|d* | $||_%|j
dd g }| j&' }| j&' }| jj(d+ t)| j*D ]L}| j+j,| j-d,| ||d-d.}|| |.  | jj(d/|  q| /|d D ]"}| j0 rH qV|1| q2|D ]}|1d0 qZ| jj(d1 |D ]}|2  q~d2}|3 s|| 7 }q| jj(d3|  |  j|7  _t j4|d4d5}|j
dd d|_5|j
dd6 | j0 r
d S t6  | 7| |    | 8| | j j9d(7  _9|    |S )7Nr   r   ru  r   r?  z ()u   Проект с именем u8    уже существует! Переименуем в r   r   )r+   r   r   	isPrivateprivater   r   r\  r   T)r   r+   r   rm   r   )r   project_role)r   r  r+   actorstypeatlassian-user-role-actorr  r@   r@  rA  rx   r9   uR   Не удалось привязать пользователя к проекту zatlassian-group-role-actorZ
actorGrouprI  u<   Не найдена группа пользователей u#    для проектной ролиr   r(   u&   Неизвестный тип ролиr  u>   Грузим задачи в несколько потоковr  )r  r  targetr   r6   u.   Параллельный обработчик r  u&   Ждем обработки задачr   u?   Закончили обработку задач, ошибок delmer   r   rK  ):rI   r   rK   ru  r   r   r+   rS   rM  r   r   keysrO  Zperm_policy_get_project_rolesr   r   CmfProjectRolerh   ZCmfProjectRoleAssignmembersr>   rG   rH   r   rv   rQ  r.   r2   r3   r1   r0   _calc_progress_process_versions_process_componentsr  _process_permissionsZproject_perm_schemerf   Queuer,  rangerg   re   Threadr  startr   r/   r  r   emptyr   cmf_deletedr   _process_boards_process_sprintsrT  )r   r  r  project_objr   	role_infor   roleZrole_assignactorr   Z	sub_groupZissue_processr  r  iprocr   r1   tr   r   r   _process_projectT  s    "

"
"







zJiraAPIImport._process_projectu#   Обработка проектовc              
   C   sJ  t jjddjj}|  D ](}z|d dd | jD kr@W qd }| j r|r~t j	|dd}|j
dd	 d|_|j
dd
 t  W  d S |di }|r| || j }n
ddd}|d dkrt jjdd}nN|d dkrt jjdd}n2|d dkrt jjdd}ntd|d  d| jjjj d|d  |d< |d |jj|d ||d ||d |d}|d }	|	r| |}
|
|d< n0| jjjj d|d  d  }t jj|d!|d< | ||}W q tk
rB   |rt j	|dd}|j
dd	 d|_|j
dd
 t  |  jd"7  _| jjd#| tj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>r  r  Tr   rK  leaddefault_import_jira@evateam.comdefault_import_jirary   r   projectTypeKeybusinessproject.base:defaultsoftwareproject.agile:defaultservice_deskproject.servicedesk:defaultu$   ERROR! Проекты с типом 3    временно не поддерживаютсяr   r   r   rm   r   r   ru  rh   activityZtask_code_prefixr   r   rJ  
simplifiedrs  r  r\  r(   <   Не удалось импортировать проект r   )rI   rJ   rK   r   r   r   rQ   r+   r/   r   r   r  r   r   rF   r  r0   r   r   r  r}  r  r1   r.   r2   r3   )r   r  r  r  r  project_leadr   ru  r  Zproject_simplifiedr  r   r   r   r   _process_projects  sn    


zJiraAPIImport._process_projectsc           	   
   C   s  d }t jjddjj}|  D ]}z^| j rlt j|dd}|j	dd d|_
|j	dd t  W  d S |d d	d
 | jD krW q| jjjj d|d  |d< |di }|r| || j }n
ddd}|d dkrt jjdd}nP|d dkrt jjdd}n2|d dkr*t jjdd}ntd|d  d|d |jj|d ||d ||d |d}| ||d< | ||}W q tk
r   |rt j|dd}|j	dd d|_
|j	dd t  |  jd7  _| jjd | tjddd! Y qX qd S )"NrA   rB   r  r  Tr   rK  r   c                 S   s   g | ]}|d  qS r  r   r   r   r   r   r   ,  s     z7JiraAPIImport._process_projects_box.<locals>.<listcomp>r   r   r  r  r  r  r  r  r  r  r  r  r  u$   ERROR! Поректы с типом r  r   rm   r   r  rs  r(   r  r   )rI   rJ   rK   r   r   r   r+   r/   r   r   r  r   rQ   r   r   r   rF   r  r0   r  r  r1   r.   r2   r3   )	r   r  r  r  r  r  r   ru  r  r   r   r   _process_projects_box  sb    
z#JiraAPIImport._process_projects_boxu   Обработка досокc           
      C   s  |  |d D ]j}| j r$ 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rd|jD ]}|  q|d d d D ]}tj|d || jdd}|jdd |d D ]D}| jjjj d|d  }tjj|d}	|	sFt|j|	 q|jdd q| j jd7  _t  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   r\  r   kanban_board_columnsrJ  r   r   r  r   r+   r   r,  Tr   ZcolumnConfigcolumns)r   r   r+   r   rZ  r(   )_get_project_boardsr+   r/   rI   r   rK   r   r   ZCmfKanbanBoardr   rJ  r   r   r   r   r  r|  ZCmfKanbanBoardColumnr]  r   Zmapped_status_codesrv   rT  r   )
r   r  boardr   Z	board_objcolZ	board_colrj   r  Zstatus_globalr   r   r   r  U  sD    
 



 
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   r\  r   r   r   r   r   r   tree_node_is_branchr?  zlist.agile_sprint:defaultrB   r   r   r   ru  r   r  r   r   rj   r  T)r   r   r+   ru  r   r   r   stateclosedCLOSEDr|   ZIN_PROGRESSu0   Добавляем задачи в спринт r  issueslistscache_status_typer   z::comment-sprint:	log_levelrh   r   r  rB  uB   Задача была в архивном спринте <a href="" target="_blank"></a>rK  r(   u-   Неизвестная задача issue_id=u    в спринте r   ),rI   r   rK   r   r  _get_all_sprintsr+   r/   r   r   r   r   ru  r   r   r   rP  r   r   r  rm  Zget_default_statusrj   r   rS   r,  r   r   r   r   r  r  rh   r   r  r  r  r  rv   r1   r.   r2   r3   rT  )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   sn   |dkrd S d| j jjj d| d}tjjddd| dgd}|sj| j jd| d |  jd	7  _|S )
Nunknownr   r   r@  rA  r   u9   Не найден пользователь ext_id LIKE "%z%"r(   )	r+   r   r   rI   r   rK   rS   errorr1   )r   r   r   r   r   r   r     s    zJiraAPIImport._get_personu,   Обработка журнала работ)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  rj   r+   r   r~   r   updateAuthorcmf_modified_byr   started
start_dateZtimeSpentSeconds<   
time_spentr  rq   rh   r   r   r   rJ  Zremaining_estimater\  )ZminutesTr   )datetimer+   rS   r,  _get_issue_worklogsr   r   rF   rK   r   r   rI   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_worklogc                 C   sR  |  |D ]@}| jjjj d|d  }tjj|d}|rD|jsDq
|sVtj||d}| |d | j	 |_
|j
|_| |d | j	 |_|d |_|d |_| |d	 |_| |jj|||_||_|d
r@|d
 d dkrt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
d S )Nr   r   r\  )r   r   r   r  rn   ro   r   Z
visibilityr  r  r   r9   TuL   Ошибка обработки приватного комментария r   r(   r   )_get_issue_commentsr+   r   r   rI   r   rK   r   r   rF   r~   r   r  rk   rl   r  rh   r<  r   rJ  r  r   rv   r  r.   r2   r3   r1   r   )r   r   r   r  r   Zcmf_commentr  r   r   r   _process_issue_comments  s0    


 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 )Nrq   r   z&com.railsware.SmartChecklist.checklistr   r	  Zulr
  ztox-checklistr  
-liztox-checklist--checkedr(   Tr   )rh   r   _get_issue_propertiesr   Znew_tagr   r-  rv   r&   rP  r   )	r   r   r   rh   Zissue_propertysoupZ	checklistvalr  r   r   r   _process_properties  s"    


z!JiraAPIImport._process_propertiesu   Обработка задачиc           "      C   sh  d}| j jjj d|d d d  }tjj|d}|sRtd|d d d  g }d	d
 | jtjj	 d D }|d d D ]}d}	|dr| 
|d | jtjj	 d }	n| j jd|  |d |	dd}
|d D ]n}|d }||d }|r
|d r
d}| ||d |d }d|
kr4||
d< q|
d  d| |
d< q||
 q~| 
|| 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| |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+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.r| |d d.| j|d/< |d/ s|  jd7  _| j jd0|d d. tjd#d) | j jd0|d d.| j tjd#d#d* ||d1< |d r|d2 d3 |d< |d d4g }|D ]}| j jjj d|d  }d5|krdd|d i|d6< | j jjj d|d5 d  |d5 d< || j|< nJd6|krd|d i|d5< | j jjj d|d6 d  |d6 d< || j|< q||d1< |pg }|d d1}|r*| j jjj d|d  }| j|g }|| j jjj d|d   || j|< d| j jjj d|d d7 d  d}tjjddd8| d8gd9|d:< | j jd;|  tj| j tj|dd<|d gd=\}}|| ||7 }|  |j!j"|_!| #|j!j"|||_!|d d> d? r| $|| | j%d@r&|d dA d? r&| &|| |D ]}|j'| q*|d dBg |d dCg  D ]l}| j jjj dD|d  }tj(j|d}|s| j jdE| tjd#d#d* |  jd7  _n|j'| q^|d dFg D ]l}| j jjj d|d  }tj)j|d}|s:| j jdG| tjd#d#d* |  jd7  _n|j*| q||_+|j,rd|j-d#dH t.  |d dI dJ r| /|| |d dKg }|rzt0| j || W n   | j j1dL Y nX | 2|| | j jjj dM|d  } tj3j| d}
|
stj3| | j dN}
||
_4| j5j6 dO|d  }!dP|! dQ|! dR|
_!dS|
_7|
j-d#dH |
j89  |S )Tu   
        Общая логика обработки которая потом разделяется на задачи и эпики
        r   r   r   r   r   r\  u$   Не проекта с ключем r   c                 S   s   i | ]}|d  |qS )r   r   )r   fieldr   r   r   
<dictcomp>'  s      z0JiraAPIImport._process_issue.<locals>.<dictcomp>Z	changelogZ	historiesNr   u   Аудит без автора ro   r(   )rl   r~   r  ru   r  rs   rq   Z
fromStringZtoStringrh   z<br>r   r@  %::rj   r_  r?  r  r  TZapprovedrC   reporterr~   u*   Не найден автор задачи r)   r   Zcreatorr   u?   Не найден ответственный по задаче assigneer   u6   Не найден исполнитель задачи r   renderedFieldsrm   Z
issuelinksr   r   r  rA  r   ru  u2   Пытаемся создать задачу из r   r   r  totaltimeTrackingEnabledr  ZfixVersionsZversions
::version:u!   Не найдена версия 
componentsu%   Не найден компонент r   rp   Z
isWatchingr  u/   Не удалось привязать тегиz
::comment:r  zbrowse/u<   Задача импортирована из Jira: <a href="r  r  rB  ):r+   r   r   rI   r   rK   r   r   r   r   r   r   rS   rM  r  rv   r{  r_  rL   r   rF   r1   r.   r2   r3   rN   rO   r  r,  r   r   r  r  rh   r   r<  r  rM   r  r  r   CmfComponentr  rJ  rP  r   r   r   Zprocess_tagsZexcepionr  r   r   r>   r   r  r,   r-   )"r   r   sprintsr  Zproject_ext_idr   commentsZjira_map_fieldsr  r~   r  r)  r   r  ZdiffZnormalized_issueZissue_linksZ
issue_linkZlink_ext_idZissue_parentparent_ext_idZ	sub_tasksr  r   r  r   versionr   Zversion_obj	componentZcomp_objr  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  | j jdt| j  | jD ]p}| j  r4 dS tjj|d}| j| D ]B}tjj|dgd}|s|| j j	d|  qL||_
|jdd qLq | j j  d	d
ddd}| j jdt| j   | j D ]\}}| j  r dS zB| j jjj d|d d  }||d d }	|	r8tjj|	d}
ntjj|d}
|
shtjjdd|d d gd}
|
stj|| j |d d d}
|d d |
_|d d |
_|
jdd | j jjj d|d  }tjj|d}|stj|| j d}tjj|d d d|_tjj|d d d|_|
|_|jdd W q   |  jd7  _| j jd|d  d|d  d |d  tjddd! Y qX q| j j  dS )"uD   
        Постобработка связей задач
        u   Подзадачи: Nr\  parent_taskr  uq   Не удалось связать задачи, возможно задача не попала в импорт Tr   zsystem.finish:finishzsystem.duplicatezsystem.linkzsystem.clone)ZBlocksZ	DuplicateZRelatesZClonersu   Связи: r   r  r   r   rB   r   r   )r   r+   r   ZinwardZoutwardr  r   r   r   r(   u.   Не удалось создать связь z out=z in=r   )r+   rS   r,  r   rO   r/   rI   r   rK   rM  r  r   r,   r-   rN   r  ru   r   r   ZCmfRelationTypeZin_type_nameZout_type_nameZCmfRelationOptionZin_linkZout_linkrelation_typer1   r.   r2   r3   )r   r  r  Zchild_ext_idZ
child_taskZ	map_namesZrelation_ext_idZissue_relationr   Zrelation_coder  Z
rel_ext_idZrelation_optionr   r   r   _process_relations  sn    




&  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  r  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   rm   rq   r(   u3   Ошибка загрузки компонента r   ) rI   r   rK   r   _get_project_componentsr  r   r+   r/   r   r   r  r   r   r   r   rF   r"  r   r#  r   r   rP  r!  Zcreate_descr_document
text_draftr   rT  r1   r.   r2   r3   )r   r  r  r   r  r   Zcomponents_listr   r   r   r    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   rk  r  r\  Tr$  zlist.release:defaultrB   r   rm   rq   r   ZarchivedZreleasedr  ZOPENr(   u+   Ошибка загрузки версии r   )rI   r   rK   r   _get_project_versionsr+   r/   r   r   r   r  ru  r   r   rh   rs  Zdefault_release_workflowrm  r   rP  r   r   Zset_default_statusrT  r1   r.   r2   r3   )r   r  r  Zrelease_folderr  r  r   Zversion_listr   r   r   r  4  s>    




zJiraAPIImport._process_versionsu   Обработка аудитаc                 C   s   dS )u)   
        Грузим аудит
        Nr   r   r   r   r   _process_auditY  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 Agilerg  Bugztask.bug:defaultEpicrf  )zSub-taskZSubtaskr*  ZStoryu   ИсторияZTasku   Задачаr+  u   Багu   Ошибкаu   Эпикr,  issue_typesu-   Обрабатываем тип задачи Nr   r   r   r@  r  ::%r   r   rC   r   r?  TrK  u   Ищем по имени "r  rD  u*   Не нашли, создаем новыйre  r#  r(   Zsubtaskrm   r   )r   r   rh   rv  rj  )r   r+   rS   r,  r/   r   r   rI   r  rK   r   r   stripr>   rG   rH   r   r   r   r   rT  )r   Z	name2coder  r  ru  Zlogic_type_dictZtemplate_coderj  r   r   r   _process_issue_typea  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   Импортируем workflowrZ  r   	workflowsNr   r   ZentityIdr\  rg  rB   ri  rm   Tr   rm  r   r   r_  r?  rn  r   ro  Ztransitions)r   rm  )r   rm  r+   c                    s*   g | ]"} j jjj d j d | qS )r   )r+   r   r   r   )r   str   rm  r   r   r     s     z3JiraAPIImport._process_workflow.<locals>.<listcomp>fromINuN   DEV: Fatal Вероятно, сломали создание статусов!tor(   )r   r+   r/   rS   r,  r   r   rI   rx  rK   rh   r   r   rz  r{  r   r_  r|  r   ZCmfTransZstatus_fromr   r   Z	status_torT  )r   Zjira_statusesr  Zjira_workflowZworkflow_idZtemplate_workflowrj   Zjira_transitionZtransition_ext_idZ
transitionZstatus_from_ext_id_listZstatus_to_ext_idr   r3  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   r@  r.  r   u+   Не импортировался workflow r   rm   rq   r   rC   rq  )r   rh   r   rj  r~  Zdefault_subtask_workflowr   rr  ZissueTypeMappingsr  r   rt  Tr   r(   )r   r+   r/   r   r   rI   rx  rK   r   r   r   r}  r  r   r|  ru   r  r   rT  )r   r8  Zdefault_task_workflow_ext_idr~  Zscheme_dictZworkflow_scheme_objr  r  r  r  ru  rm  r  r   r   r   _process_workflow_scheme  sP    

 
(z&JiraAPIImport._process_workflow_schemer9   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.dirtya+r(   r  TrK  )r+   rW   rX   rY   rZ   json_object_countwriter[   dumpsr   mover   r   )r   Zapi_funcr   r^   Zfile_path_tmpr_   rowr   r   r   _simple_dump  s    
 zJiraAPIImport._simple_dumpc              	   c   sN   | j  | d}| rJt|d}|D ]}t|V  q.W 5 Q R X d S )Nr:  r+)r+   rW   rX   rY   rZ   r[   loads)r   r   r^   r_   r@  r   r   r   r     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.jsonrB  )
r+   rW   rX   rY   oslistdirr   rZ   r[   r\   )r   project_dirrl  r_   r   r   r   r     s    
zJiraAPIImport._get_projectsc              	   c   sH   | j  d|}t| dd}|D ]}t|V  q(W 5 Q R X d S )Nr   /issue_types.jsonrB  r+   rW   rX   rZ   r[   rC  r   rl  rH  r_   r@  r   r   r   rw  %  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.jsonrB  rJ  rK  r   r   r   ry  +  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.jsonrB  rJ  rK  r   r   r   r  1  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   rP   r   rE  rB  r+   rW   rX   rF  rG  rZ   r[   r\   )r   rl  	board_dirZboard_idr_   r   r   r   r  7  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   rE  rB  rN  )r   rl  sprints_dirZ	sprint_idr_   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.jsonrB  rJ  rK  r   r   r   r(  C  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.jsonrB  rJ  rK  r   r   r   r%  I  s    z%JiraAPIImport._get_project_componentsc              
   c   sb   | j  d|d}t|D ]>}|dr.qt| d| dd}t|V  W 5 Q R X qd S )Nr   ZtasksrD  r   rE  rB  )	r+   rW   rX   rF  rG  r   rZ   r[   r\   )r   rl  	tasks_dirZtask_idr_   r   r   r   r   O  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^   )rF  rG  )r   r   Zattachments_pathr   r   r   r   r   W  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.jsonrB  )rZ   r[   rC  )r   r   comments_file_pathr_   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.jsonrB  rZ   r[   r\   )r   r   rU  r_   rc   r   r   r   r   d  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.jsonrB  rV  )r   r   Zproperties_file_pathr_   r   r   r   r	  j  s    z#JiraAPIImport._get_issue_propertiesc              
   C   sD   | j  d}| r@t|d}t|W  5 Q R  S Q R X i S )Nglobal_settings.jsonrB  )r+   rW   rX   rY   rZ   r[   r\   )r   global_settings_file_pathr_   r   r   r   _get_jira_global_settingso  s
    z'JiraAPIImport._get_jira_global_settingsc              	   C   s@   | j  }| j d}t|d}t|| W 5 Q R X d S )NrW  rV   )r>   Zget_jira_global_settingsr+   rW   rX   rZ   r[   r]   )r   Zglobal_settings_datarX  r_   r   r   r   _dump_jira_global_settingsv  s    
z(JiraAPIImport._dump_jira_global_settings)rh   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*d 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(   rB  r  r   r   c                    s   |  d kS r&  r'  r(  r*  r   r   r     r!  uE   Этот файл уже обработан во вложениях: r   r#  r   r  
obj_ext_idr   r+   r  r]  r   Fu0   Не удалось скачать ссылку r  )&r+   rS   r,  r   r  r  r  r-  rM  r.  r/  Zurljoinr>   r   r5  r6  r   r1  r2  r0  r3  r   rI   r   r   rX   CmfImportDownloadrK   r   r   pathr   
downloadedr   r,   r-   r0   Zrollback)r   rh   r[  r   r  r   r   r:  encodingr7  Zattach_filenamer8  r9  r   r^   download_jobr  r   r*  r   _dump_links|  sh    



 


zJiraAPIImport._dump_linksc                 C   s\  t ddF || _d}| jjd| d|  z| j|d ||D ]}zz~| j r|W W  W W 5 Q R  dS | jjd|d	  d
 |	t
|d }	|	 rW W JqJ|	t
|d d }
|
jdd |		d}|d d r.| jjdt|d d   ztj| jjd|d  d}| jjjr^t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
r, } z$| jjdt d| tj dd W 5 d }~X Y nX | j!dr|
	d}| rZt"| t#|d}t$%| j&|d | W 5 Q R X | '|d d  || |
	d!}| rt"| | jjd" t#|d#T}| j(|d D ]<}|)t$*|d$  | j j+d7  _+| '|d% || qW 5 Q R X | j,|d }|
	d&}t#|d}t$%|| W 5 Q R X t-.|
|	 |jdd |		d'}t
|	/dd(|d)< t#|d"}t$%|| | j j+d7  _+W 5 Q R X W n(   |d7 }| jj0d*|  Y nX W 5 | jj  X qJW n.   | jj0d+|d,  d- |d7 }Y nX |1| W 5 Q R X d S ).NFr  r   u   Задачи с u    до r   r(   u   Задача 'r   'rD  Texist_okr8  r   r   u%   Обработка вложений: zsecure/attachmentzip/z.zipzsecure/issueAttachments/rT  r   r\  r^  r   r  r)   r  zworklog.jsonrV   r  rm   zcomments.jsonu#   Дампим комментарииr;  r  r   zproperties.json	info.jsonrq   r   u0   Не удалось скачать задачу u2   Не получить задачи проекта r   u    с сервера)2r   r>   r+   rS   r,  Zget_all_project_issuesr,   r-   r/   rX   r&   rY   mkdirr   rF  r`  r   r   rG   rH   r   r   rI   r_  rK   r   ra  r   r0   r.   r  r2   r3   rM   removerZ   r[   r]   Zissue_get_worklogrd  Zget_commentsr=  r>  r<  Zget_issue_propertiesr   r?  r  	exceptionr  )r   r  maxrS  r  r>   tasks_that_are_doner  r   Ztask_dirZtask_dir_tmpr[  r  r   Zattach_file_pathr   rc  r  Zworklog_file_namer_   Zcomments_file_namer  Z
propertiesZproperties_fileZ	info_pathr   r   r   _dump_task_part  s    


 


2


"


 

zJiraAPIImport._dump_task_partr  cntc                 C   s  t |d  d}|jdd | j }d}t|| j d }|sFd}d}g }|d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 }||8 }qN|d }
| jjd| d |D ]2}	|	j|
d |	 r| jjd tdq| jjd | sj|| 7 }qP| jjd|  |S )NrH  z/tasksTrf  r   r(   r   Z
dump_tasks)r   r  tokenpassword
verify_sslrH   )r  rl  rS  r  r>   rm  r  u$   Форкаем _dump_task_part proc=r  u%   Таймаут дампа задач u    минут)timeoutu$   Возможно завис дампu"   Ошибка дампа задачuK   Закончили параллельное скачивание задачu   Ошибок: )r   ri  rf   r  intrg   re   r  rn  r   r>   r   r  rq  rr  rs  rG   rH   rv   r  r+   rS   r,  r   is_aliver  TimeoutErrorr  rK   )r   r  rp  rS  rm  r  stepr  Zprocessr  rt  r   r   r   _dump_tasks
  sP    
 	



zJiraAPIImport._dump_tasksc           "      C   s	  | 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}	|	 rNt|	 t|	d"}
| j|d }t||
 W 5 Q R X | jjjr@|d s| 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  qW 5 Q R X nT| j| jj  d |d   |d< | j| jj  d!|d d   |d d"< |!d#}|r| j|d$  |d#< | jjd% t|d  d&}| rt| t|dD}
| jj"|d dD ]*}| j j
d7  _
|
t|d  qW 5 Q R X | jjd' t|d  d(}| rxt| t|d}
| jjj#|d d)$ D ]}| j	 r W 5 Q R  W  d S | j j
d7  _
| j| }| jjjr8|!d*g D ]>}|d+ d,kr| jjj%|d- !d|d- !d.d/|d0< q|
t|d  qW 5 Q R X | jjd1 t|d  d2}| rt&'| |  t|d  d3}| rt&'| |  | jj(|d d)D ]l}| j	 r W  d S | j j
d7  _
| jjd4|d   | jj)|d |d"< | j|d" d5 d$  |d" d5< | jjjrd6d | j*|d D |d" d7< |d |d8< |t|d }|jd
d |d}t|d9}
t||
 W 5 Q R X z<|d+ d:kr| jjd; | j+|d D ]}| j	 r( W  W  d S | j j
d7  _
|t|d }|jd
d |d}| r| jjd<|d  d= qg |d>< | jjd<|d   | j,|d D ]4}| j	 r  W  W  d S |d> -|d  qt|d9}
t||
 W 5 Q R X qW n*   | jj.d?| t/j0d
d
d@  Y nX q| jjdA |d  dB}t|db}
| j1|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dC |d  dD} t| db}
| j2|d D ]J}!| j	 r0 W 5 Q R  W  d S | j j
d7  _
|
t|!d  qW 5 Q R X | j j3|7  _3| jj4d
dE t5  t&6|d | t||d< |d  dF}t|d9}
t||
 W 5 Q R X n t|dG}
t7|
}W 5 Q R X | j8|d }| jjdH|  |  j9| j:||dI7  _9W qn   |  j9d7  _9|!dJ	rx| jj.dK|d  dLt/j0d
d
d@ n| jj.dM| t/j0d
d
d@ Y qnX qn| jjdN d S )ONr   r   r   	isCheckedu5   Не выбрали ни одного проекта!c                 S   s$   g | ]}|d  r|d r|d  qS )r4   rz  r   )r   r  r   r   r   r   6  s       z0JiraAPIImport._dump_projects.<locals>.<listcomp>Zchildrenr   Trf  P   r(   u   Дампим "r   r  r   rh  r   rD  rH  u   Дампим права/permissions.jsonr;  r  ZworkflowSchemer  u/   Дампим типы задач проектаrI  rk  r  z$rest/projectconfig/1/workflowscheme/zrest/api/2/workflowscheme/r,  r  r   u*   Дампим статусы проектаrL  u$   Дампим роли проектаrM  )r   r  r  r  Z	actorUserr@   )r  r;  r  u&   Дампим доски проектаz/boards/z	/sprints/u   Доска r   c                 S   s   g | ]}|qS r   r   r   r   r   r   r     s     Zquick_filtersrl  rV   )ZscrumZsimpleu&   Дампим спринты доскиu   Спринт u    уже скачанr  u4   Не удалось сдампить спринты r   u(   Дампим версии проектаrQ  u!   Дампим компонентыrR  rK  rE  ru*   Дампим задачи проекта: ro  r  u   Проект "u   " является приватным и не может быть импортирован, отключите приватность в Jira или предоставьте пользователю праваu2   Не удалось получить проект u0   Закончили дампить проекты);r   r0   rQ   r+   rW   rX   ri  r   ru  r/   r<  rS   r,  r&   rY   r>   rG   Zget_projectrF  makedirsr   rj  rZ   Zget_project_permission_schemer[   r]   rH   Zget_project_schemeZget_issue_for_projectr=  r>  jira_requestr   rK   get_statusesZget_project_rolesvaluesr   r   rmtreeZget_all_agile_boardsZget_agile_board_configurationZget_board_quick_filtersZget_sprintsZget_sprint_issuesrv   r.   r2   r3   Zget_project_versions_paginatedZget_project_componentsprogressr   r   r?  r\   Zget_project_issues_countr1   ry  )"r   rootZprojects_dirrp  rx  r   rH  Z	data_filer  permission_filer_   Zperm_schZ
types_filer  r  Zstatuses_filer@  Z	role_fileZrole_urir  r  Z
boards_dirrP  r  rO  Zboard_info_filer   Zsprint_pathZsprint_file_pathr   Zversion_list_filenamer  Zcomponents_list_filenamer  r   r   r   _dump_projects2  s>   








$


"

"




$


""$$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jr
| j jd | 
| jjd | j jd | 
| jjd d| j _| j   t  | j jd |   dS )u_   
        Загружаем все данные из апи, кроме аттачей
        d   u   Свободно места: rA  u$   Скачаем данные из APIu9   Дампим глобальные настройки Jirau'   Дампим пользователейr   u   Дампим статусыrZ  u    Дампим типы задачr-  u*   Дампим бизнес процессыr1  u7   Дампим схемы бизнес процессовr8     u   Дампим проектыN)r+   rW   r   
disk_usager.   rS   r,  rZ  rY  rM   rA  r>   r   r  Zget_issue_typesrG   rH   Zget_workflowsZget_workflow_schemer  r   r   r  )r   Zdownload_pathr  usedfreeZfree_percentr   r   r   download_data  s0    


zJiraAPIImport.download_datac                 C   sL   t jj| jjdddgd}|jrHt|j|j d |_|j	dd t
  d S )NrT  r<  r  )r   r   r  TrK  )rI   Z	CmfImportrK   r+   r   r<  ru  rT  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  rq   z/wiki/z\/\d+u:   Не удалось найти ид документа в r   r   r(   r  u:   Не удалось найти документ по ид z/browse/z	\/\w+-\d+u4   Не удалось найти ид задачи в rJ  r@  z%"key":"r  r?  r   u:   Не удалось найти задачу по коду )r   r  r  rK   r-  r>   rG   r   r1  r2  r+   rS   rM  r   r   rX  rI   r   r   r   rJ  Zreplace_withZCmfPluginCsvZcreate_tag_linkr&   )rh   r
  r  r4   r   Zext_coder   r@  r   r   r   check_links	  sJ    
$
"z7JiraAPIImport._process_cross_links.<locals>.check_linksr+   rn  Nr   r   T)r   r   r   r   r   u)   Конвертируем ссылки в u=    на локальные задачи и документы: i  r   rh   zcomments.log_levelzcomments.textr&  )r   r   slicer(   rK  rB  uZ   Не удалось конвертировать перекрестные ссылки в r   )r&   varsrI   countr+   rS   r,  r   r   r/   hasattrrh   r   r&  rP  r   Z
do_approver  r  r.   r2   r3   r1   )r   r  r   Z	mode_namera   rp  rx  r  r   r4   r  r   r   r   _process_cross_links	  sJ    (




z"JiraAPIImport._process_cross_linksc              	   C   sD  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 ]}
d	| jjjj d	|
d
  d	}||
d rt	jj||
d  dd}n| jjd|
  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  _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 q|
d d  d"kr.d|_|jdd q|
d d  d#krTd|_|jdd q|
d d  d$krzd|_|jdd q|
d d  d%krd|_|jdd q|
d d  d&kr<| jjj r| !|
d d' }n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  _q|
d d  d,kr| jjj r~d	| 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  _q| jjd.|
d d   tjddd |  jd7  _q|	S )/Nr   )get_datarH  r|  c                 S   s   i | ]}|d  |d qS )Z	jira_coderC   r   r   r   r   r   r  \	  s      z6JiraAPIImport._process_permissions.<locals>.<dictcomp>Zproject_perm_permissionr}  r   r   r\  T)r   r   r+   r   r   ZpermissionsZ
permission)rC   Zinclude_deletedu4   Не нашли соответствия права r   r@  rA  r   access_membersaccess_project_roler?  )permr   r   u*   Не найдено правило для r   r(   Zholderr  ZprojectRoleZapplicationRoleZprojectLeadr  r  r   r   r   Z	parameterr   u9   Не нашли пользователя для прав rX  u-   Не нашли группу для прав u'   Неизвестный тип прав )%Zcmf.system_datar  r   rZ   r[   r\   r+   r   r   rI   ZCmfProjectPermSchemerK   r   r   ZCmfProjectPermPermissionrS   rM  ZCmfProjectPermSchemeRuler.   r2   r3   r1   r   r  r  rv   Zaccess_local_userZaccess_ownerZaccess_responsibleZaccess_authorr>   rG   rH   r   r   r  rQ  )r   r  r  r  Zsystem_dataZmap_permr_   Zperm_scheme_dictr   Zperm_schemeZ	perm_dictr  r   r   Zscheme_ruleZrole_ext_idr  r   rX  r   r   r   r  X	  s    
"$&$z"JiraAPIImport._process_permissionsc           	      C   s8  t dd" | }|dkr"q*| j r0q*| jjd|d   | jj|d dd}z||  t	|d }|j
jddd	 t|d
"}|jddD ]}|| qW 5 Q R X | jjd|d   || W nB tk
r } z"| 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  u    Пытаемся скачать r  T)streamr`  )parentsrg  zwb+i    )Z
chunk_sizeu   Сохранили в u+   Неудалось скачать файл r  )r   rK   r+   r/   rS   r,  r>   r  Zraise_for_statusr   r   ri  rZ   Ziter_contentr=  r  r0   rk  )	r   download_queue
done_queuerc  rc   Z	save_pathr_   chunkr  r   r   r   _download_file_worker	  s&    
z#JiraAPIImport._download_file_workerc           	      C   s  | j jd | j }| j }| j dg dd| j jjjgdddgg}tj	j
|dsl| j jd d S g }t| jD ]J}| jj| jd	| ||d
d}|| |  | j jd|  qztj	j|ddgdD ],}| j  r q||j|j|jd q|D ]}|d q| s<|D ]}|  q,| j  rLd S | j jd | s| j  rtd S | }tj	j|d d}d|_|  qZd S )Nu=   Скачиваем все найденные вложенияzplugin.plugin.source_hashr   r   ra  Fr   u   Вложений нетr  )r  r  r  u    Запустили задачу r  r`  r?  )r   r  r`  r  u%   Закончили скачиватьr   r  T)r+   rS   r,  rf   r  r   r   r   rI   r_  r  r  rg   re   r  r  rv   r  Zslistr/   r  r   r  r`  r  r   rK   ra  r   )	r   r  r  r   Zprocsr  r  rc  Zdownload_idr   r   r   download_files	  sF    





zJiraAPIImport.download_filesc                 C   sb  d| j _d| j _| j   t  |   |   |   |   |   | 	  |   | 
  |   | jjjr|   |   |   |   |   n|   |   |   |   | j  rd S d| j _| j   t  |  D ]:}|d dd | jD kr
q| j jd|d  d q| j jd	| j tjd
d
d | j d| j j  | j S )Nr   r  r   c                 S   s   g | ]}|d  qS r  r   r   r   r   r   r   
  s     z0JiraAPIImport.process_import.<locals>.<listcomp>u'   Импортирован проект 'r   re  u#   Ошибок обнаружено: Tr   u-   Импортировано объектов: )r+   rT  r  r   r   r  r  r  rY  r`  r0  r>   rG   rH   r7  r9  r  r  r  r   r)  r/   r   rQ   rS   r,  r.   r1   r2   r3   )r   r   r   r   r   process_import	  sF    




zJiraAPIImport.process_import)T)r   r   )T)N)^r"   r#   r$   r%   ru  r'   r   r&   r   r   rE   propertyr`   staticmethodr   r   r   rd   rR   rw   r}   r   r   r   r   r   r   r;   r   r   r   r  r  r  r   r<  rY  r`  rI   r}  r  rz  r  r  r  r  r  r  r  r  r  r   r  r  r  r  r  r   r  r  r)  r0  r7  r9  rA  r   r   rw  ry  r  r  r  r(  r%  r   r   r  r   r	  rY  rZ  r   rd  rn  ry  r  r  r  r  r  r  r  r  __classcell__r   r   rT   r   r<   9   s   


	,3  


: 
9
q
E'.
 
I
6
%
?
  

=4
$

H
7
$	7W( 0	QO$r<   )*Zcmf.appr   Zcmf.includeZdataclassesr5  pathlibr   r   Ztempfiler   r.  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   rI   r   r   r   r   Z	dataclassr   r;   r<   r   r   r   r   <module>   s(   $ 