U
    Bd                    @   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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)close_all_ds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                    sz   zfz*| j jd   | f||W W <S  tk
rb   |  jd7  _| j jd  Y nX W 5 | j j  X d S )Nz==================    u   Ошибка )
cmf_importdpcommitloggerinfo	Exception
has_errors	exception)objargskwargs)funcr   r   r   wrapper(   s    z3catch_exception.<locals>.decorator.<locals>.wrapperr   )r5   r6   r   )r5   r   	decorator'   s    
z"catch_exception.<locals>.decoratorr   )r   r8   r   r7   r   catch_exception&   s    r9   c                       s  e Zd ZU dZe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d/e
e
d0d1d2Z ed3de
e!d4d5d6Z"ed7d8d9 Z#ed:d;d< Z$e%j&dd=d>Z'd?d@ Z(dAdB Z)dCdD Z*edEdFdG Z+eedHdIdJZ,edKdLdM Z-edKdNdO Z.edPdQdR Z/edSdTdU Z0dVdW Z1dXdY Z2edZd[d\Z3ed]dd^d_Z4ed`dadb Z5edcddde Z6edfdgdh Z7edidjdk Z8edldmdn Z9edodpdq Z:edrdsdt Z;e
dudvdwZ<e
dudxdyZ=dzd{ Z>d|d} Z?d~d Z@dd ZAdd ZBdd ZCdd ZDdd ZEedZddZFedZddZGe
eHedddZIdd ZJeedddZKdd ZLdd ZMdd ZNdd ZOdd ZPdd ZQdd ZRdd ZS  ZTS )JiraAPIImportu;   Класс загрузки объектов через APIr0   N)jirareturnc                    s   t  j|| || _d| _| jjjr*d| _tjjdd| _	i | _
i | _i | _g | _g | _d| _|   td}| jjj|_d S )Nr   	accountIdsoftdevcoder   zatlassian.rest_client)super__init__r;   user_keyconncloudmodelsCmfActivitygetdefault_activityZepicsissue_relationssubtasksboardsselected_projectsr0   _prepare_multiprocessingloggingZ	getLoggerr*   r-   Zhandlers)r   r;   r3   r4   r-   	__class__r   r   rB   ;   s    

zJiraAPIImport.__init__)r<   c                 C   s
   | j  S r   )r;   Z
get_fieldsr   r   r   r   jira_fieldsN   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)rS   rT   resr   r   r   _get_field_nameR   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   rW   rX   r   r   r   rN   Y   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descriptionr[   r\   Zcustomfield_10015Zduedateupdatedcreatedz.namez.watchCountz.votes)r[   watchesZvoteszfields. Nmodel_field	json_path)rR   itemsrH   append)r   Zissue_settingsZdefault_local_attrs_mappingZadditional_json_pathZcustom_field_keyZcustom_fieldrf   r   r   r   _get_issue_import_settings`   s*    

z(JiraAPIImport._get_issue_import_settingsc                  C   s    dddddddddg} | S )Nr   displayNamerd   emailemailAddressdoes_not_workactiver   )Zuser_settingsr   r   r   _get_user_import_settings   s
    z'JiraAPIImport._get_user_import_settingsc                  C   s    dddddddddg} | S )Nr^   ra   rd   
cmf_authorauthorrZ   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   Ключ)rj   rl   rn   ra   rq   bodyr   .r)   rc   r   )splitlenrR   rH   )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 )Nrw   r   rj   r   rc   rl   rk   inwardIssueoutwardIssue,)rx   
isinstancedictrH   listrh   r'   join)	r2   rf   to_strrT   Z
str_fieldsZ	str_fieldZnew_objresultZrelated_objr   r   r   _get_file_val   sH    






zJiraAPIImport._get_file_valc                    s   g  t ttt f tg tt f ttd fdd}|jjddjt	j
}|sX S dd jdD }||dd jt	j d	d
ddddg}||jt	j  dg d  S )u-    Инициализация настроек )objssettings_funcrS   r<   c                    sz   | D ]p}| }|D ]H} ||d |d< ||d |d< |d |d< |j|d< q |j|d |  S d S )Nrf   Zfile_valre   titleicon)r   fields)r   rV   r{   r   rh   verbose_name)r   r   rS   r2   Zobj_settingssettingr   r   r   r   _get_settings   s    z:JiraAPIImport.tmplt_import_settings.<locals>._get_settingsr)   limitc                 S   s   g | ]}|qS r   r   .0r2   r   r   r   
<listcomp>   s     z7JiraAPIImport.tmplt_import_settings.<locals>.<listcomp>Nz2022-05-22T15:22:22.593+0300rt   u!   Электронная почта)rj   rl   ru   )ra   rq   rv   selectedObjects)r   value)r
   r   r   r   r	   	TypeModelr;   
get_issuesri   rF   CmfTask	get_usersro   	CmfPersonrs   
CmfCommentrh   )r   r   issueusersZcomment_exampler   r   r   tmplt_import_settings   s.       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   re   rf   rT   r   r   captionr   )Z_normalize_settingsr*   Zjson_settingsr;   r   	enumeraterF   r   r   r   _normalize_jira_valuerh   )r   settingsr   r   Z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    Преобразование настроек для модели re   rf   F)r   rT   )r   r   )r   r2   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_emailr7   )rk   )leftright)
r;   Zget_project_membersrF   
CmfProjectrH   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}|d|d  }tj| jtj|d	 ||||d
|d|ddd|gd\}}	|	r|d	 |_	|
  |S )NZtree_parent_id==completeDatesys_typearchivefilterext_ididr   Z	startDateZendDate)r   parenttree_parent	list_typeZplan_start_dateZplan_end_dater   Z
filter_obj)r   rH   rh   rF   	CmfFolderr   r   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_watchersrD   rE   _get_personCmfErrorresponsiblerp   	cmf_ownerZ
spectatorsrh   commit_with_event)r   	issue_objr   Zwatcherpersonr   r   r   _process_watchers8  s    
zJiraAPIImport._process_watchersu#   Обработка вложенийc           
      C   s   ddl m} g }| |D ]}tjj|d |d}|sLtj| j||d d}|j}|jr`|	  |
  t|d |j |rtjjj }||j}	|	  || t  q|S )Nr   )RDisk	file_name)r   r   )r*   r   r   	file_path)Zrdisk.rdiskr   _get_issue_attachmentsrF   CmfAttachmentrH   r*   is_new
is_changedr   Z
upload_dirshutilcopyZfull_path_fileZCmfRFiler+   Zdata_driverZget_rdZ	get_rfileZ
_file_namemake_previewrh   r   )
r   r   Z
jira_issuer   attachmentsattachment_info
attachmentr   ZrdiskZrfiler   r   r   _process_attachmentsH  s*    
z"JiraAPIImport._process_attachmentsuB   Обработка упоминаний пользователейrZ   r<   c                 C   s(  |sdS t |d}|jddidD ]}z|jdrF| |jd }nF|jdr| |jd }|jd |jd	< |jd |jd
< ntd|jd |jd< |j|jd< d|jd< |jj|jd< |j	j|jd< W q" tk
r } z,|  j
d7  _
| jjd| d|  W 5 d}~X Y q"X q"t|S )u]   
        Упоминания пользователей
        confluence-userlink
        Nhtml.parserclassz
user-hover)attrszdata-account-idzdata-usernamezdata-linked-resource-idzdata-linked-resource-id_origzdata-username_origu]   Не найдены аттрибуты для определения пользователяhref	href_origTcmf_convertedr)   uZ   Не удалось преобразовать ссылку на пользователя : )r   find_allr   rH   r   r/   r   r   r   loginr0   r*   r-   errorr'   )r   rZ   Zdoc_souptagr   er   r   r   _process_mentions`  s*    

.zJiraAPIImport._process_mentionsu#   Конвертация ссылок)rZ   r   c                 C   sD  |s|S t |}|dd D ]}|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j|}tjj|dg|d}|r|d	rv|jd	 |jd< |j|jd	< d|jd< t|jd	 }	|	rv|	d rv|	d drvd|_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   url)r   r   r   Zsrc_origTZvideoZcontrolsz100%widthZheightr   u   Заменили на z/people/rc   )r   r   r   rH   r*   r-   r.   r   
startswithurllibparseunquoterx   rF   CmfDocument_get_filenamer   sgetr   	mimetypes
guess_typer   r   r   r'   )r   rZ   r   r   Z	text_soupr   r   r   Z
attach_obj	mime_type
account_idr   r   r   r   _process_links}  sV    

 
 





zJiraAPIImport._process_linksu-   Обработка пользователейc              	   C   s  t  }| dD ]z}| j r8d| j_| j   d S z"| jjd|  | jj	j
r|d dkr| jjd|d   W q| || jtjj d }d|| j  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}t|dkrP|  jd7  _| jjd|d  dt|  |r^|d }|s~d}tj||d | jd}|D ]}t||||  q|jr|jr|  |ddg |jr||jkr|j || j  d|_n||_tj }	tj }
|j |	 |j |
 d|_!|d d D ]}| jj	j
rTd|d  d}nd|d  d}tjjddd| dgdgd}|stjjdd|d gdgd}|stj|| jd|d |d}|jr|d |_"||jkr|j | |_|#  |j | q2|jdd | j j$d7  _$|j%rZ|j&sZ|j%'d sZ|rZ|(|j%j) W q   |  jd7  _| jj*d!|  Y qX q|rt+tjj,|gd" d S )#Nr   import-cancelingu0   Импортируем пользователя ZaccountTypeZ	atlassianu   Неизвестный тип r   ::Fr   r   rk   r   r   r   r   LIKE%r   r   r)   u+   Пользователей с именем z > r   T)r   r   r*   rg_member_ofgroupsrg   groupId)r   r*   import_originalr   import_raw_jsonZ	only_dataz.evateam.ruu@   Не удалось загрузить пользователя )r3   )-set_simple_getr*   	is_cancelr\   r   r-   r.   r;   rD   rE   warningr   r   rF   r   r   rC   rH   r   ry   r0   r   setattrr   r  load_fieldsr   CmfPersonGroup
jira_group
user_groupr  rh   Z
user_localr   Zsave_importimported_object_countrk   rm   endswithaddr   r1   Zcmf_deferred_taskZregister_persons)r   Znew_user_emailsuserZ	user_dictr   Z
is_createdr   Zpersonsr   r  r  Z
group_infogroupr   r   r   _process_users  s    

 "

   
zJiraAPIImport._process_usersu#   Обработка статусовc                 C   s   |  dD ]}| j r0d| j_| j   dS | jjjrD|d }n|d d }tj	j
|d d}|sdd|d gd	ddgg}tj	j
|d
}|stj	|d | jd}|d |_t||_|d |_|  | jj  | j jd7  _q
dS )uc   
        Грузим статусы из Jira и сопостовляем с нашими
        statusesr   NstatusCategoryr   r   r   r   r   r   )r   r*   r)   )r  r*   r  r\   r   r;   rD   rE   rF   CmfStatusCoderH   r   r   get_status_typestatus_typer   r+   r,   r  )r   r\   r  Zcmf_status_coder   r   r   r   _process_statuses  s,    






zJiraAPIImport._process_statusesc                 C   s  t  }d}d}| |d D ]}d|d  d|d  }d|d  d|d  }tjjdd	|gd
}|d dkrxd}	n|d dkrd}	nd}	|stjj|	d}
tj||
| jd}||_|  |s|d dkr|}|s|d dkr|}|||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 q^qd|d  }d|d  }tjj|d}|stjjdd}
tj||
| jd}||_||_||_|  tjj|d D ]}|  q| D ]p\}}| j r^d!| j_| j   qtjjdd"d#| d$gd
}||d%|| jd&}tjf |}|  q2|S )'u)  
        У простого проекта воркфлоу привязан к issue type 1 к 1
        Поэтому надо получит все типы привязанные к проекту, на каждый тип создать WF и замапить через схему
        Nr   SIMPLE::r  (   Simple-схема для проекта r       и типа r   =r   hierarchyLevelr)   task.epic:defaultr   task.agile:defaultdefault.system:defaultr?   r   templater*   r   
project_idZusagesZ
issueTypesworkflowr   r  r  !=Tforcer  softdev:default	scheme_wfr   r  %::::%r   
logic_typetarget_workflowcmf_model_namer3  r*   )r   _get_issue_types_for_projectrF   CmfWorkflowrH   r*   r   r   _get_statuses_for_project_create_status	CmfStatusr   r  deleteCmfSchemeWfdefault_task_workflowZ!default_subtask_workflow_workflowCmfSchemeWfRulerg   r  r\   CmfLogicType)r   Zjira_project_info	issue_mapZdefault_task_wfZdefault_subtask_wf
issue_typeworkflow_ext_idworkflow_namer-  r@   r*  jira_statusr\   Zscheme_ext_idZscheme_nameschemerulelogic_type_ext_idr7  	rule_dictr   r   r   #_create_schemewf_for_simple_project   sz    $
 

 z1JiraAPIImport._create_schemewf_for_simple_projectc                 C   s  |j  d|d  }tjj|d d}t|d }|sNtj|d |d d}||_|  tjjdd|gd	}|stjjddd gd
d|gdd|ggd	}|stjjddd g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   r   r   r-  r$  status_code)r-  r*   rN  r_   r
  )r   rF   r  rH   r   r  r  r   r>  r*   r   r   rZ   rN  r   )r   Zjira_status_datar-  Zstatus_ext_idrN  r  r\   r   r   r   r=  f  s8    

zJiraAPIImport._create_statusc                 C   s  t jjt|d d d}|d d }|spt jjdd}t j|d t|d d |dd	|| j|d
}|  t }| j|d dD ]}d|d krd|d  d|d  }d|d  d|d  }t jjdd|gd}	|	sHt j	jddd|d  dgd}
t jj|
j
dd  dd}|s6t jjdd}t j||| jd}	||	_|	  |	||d < |d D ]"}|d d |d< | ||	 qjqt jj|d D ]}|  q| D ]L\}}	t j	jddd| dgd}
|
|	d!|| jd"}t jf |}|  q|S )#Njira_workflow_schemer   r  r.   r1  r?   r   r_   rc   )r   r   rZ   r	  r*   r*  r+  	issuetyper   r!  r  r"  r#  r   r$  r   r  r4  r5  :r   z:defaultr(  r)  r  r  r   r2  r   r6  )rF   r@  rH   r'   r*   r   r   r<  r;  rC  r@   rx   r   r=  rB  r   r?  rg   )r   project_infoZ	wf_schemeZwf_scheme_infor*  rD  rE  rF  rG  r-  r7  rH  rJ  rK  rL  r   r   r   _process_wf_scheme  sV    

   z JiraAPIImport._process_wf_schemec              	   C   sD   t dd0 | j rq6| }|dkr*q6| | qW 5 Q R X d S )NFZinit_views_and_dsDONE)r   r*   r  rH   _process_issue)r   issue_queuer   r   r   r   _process_issue_fork  s    
z!JiraAPIImport._process_issue_forku   Обработка теговc           
      C   s,  ddl m} t }| |d D ]F}| j rFd| j_| j   d S |d dr |	|d d  q |D ]}|
dd
d	d
}||ddd}zXdddd| dgdd|gddd| dgg}tjj|d}|stj|d}|  W ql tk
r$ }	 ztd| d|	  W 5 d }	~	X Y qlX qld S )Nr   )translitr   r   r   labels _r   rc   ruT)Zlanguage_codereversedORaliasILIKE""%r   r   r7   u*   Не удалось создать тег r   )ZtransliteraterY  r  _get_project_tasksr*   r  r\   r   rH   unionreplacerF   ZCmfTagr/   rO   r  )
r   rR  rY  tagsr   Ztag_nameZ
name_aliasr   Ztag_objr   r   r   r   _process_tags  s0    

zJiraAPIImport._process_tags)project_structrR  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 |_|
  t jj|d | d
}|st j| j|d |d d}|D ]}t||||  q|drd|_|
  | |d D ]}t|d }t jj|d}|sZt jjddd gdd|d ggd}|svt j|d | jdd}||_|d |_	|d|_|
  t jj||d}|st j||| jd}g |_|
  |dg D ] }	|	d dkr^| jjjr"t jjddd|	d d  dgd}
nt jj|	d d}
|
rH|j|
 n| jjd |	  n|	d d!kr| jjjrd"|	d# d$  d"}nd"|	d  d"}t jjddd%| d%gd}|r|j| n$| jjd&| d' |  jd(7  _ntd)q|
  q|   | | |   | j|d* |  ||_!|
  g }| j"# }| jj$d+ t%| j&D ]J}| j'j(| j)d,| d-|id.}|| |*  | jj$d/|  ql| +|d D ]"}| j, r q|-| q|D ]}|-d0 q| jj$d1 |D ]}|.  q| jj$d2 t j/|d3d4}|
  d|_0|j
dd5 | j, rzd6| j_1| j
  d S t2  | 3| |   | 4| | j j5d(7  _5|   |S )7Nr   r   r7  r   r  z ()u   Проект с именем u8    уже существует! Переименуем в r   r   )r*   r   r   	isPrivateZprivater   r  r   T)r   r*   r  r_   )r   project_role)r   rm  r*   actorstypeatlassian-user-role-actorr  r4  	user_infor=   r5  rj   r7   uR   Не удалось привязать пользователя к проекту zatlassian-group-role-actorr  Z
actorGroupr  r  u<   Не найдена группа пользователей u#    для проектной ролиr)   u&   Неизвестный тип роли)rR  u>   Грузим задачи в несколько потоковrX  rW  targetr   r4   u.   Параллельный обработчик rU  u&   Ждем обработки задачu0   Закончили обработку задачdelmer   r   r
  r   )6rF   r   rH   r7  r   r   r*   r-   r  r   r   keysr  Zperm_policy_get_project_rolesr'   CmfProjectRolerZ   ZCmfProjectRoleAssignmembersr;   rD   rE   r   rh   r  r   r0   r/   _calc_progress_process_versionsrh  _process_permissionsproject_perm_schemerX   Queuer.   rangerY   rW   ThreadrX  startrd  r  putr   r   cmf_deletedr\   r   _process_boards_process_sprintsr  )r   ri  rR  project_objr   	role_infor   roleZrole_assignactorr  Z	sub_groupZissue_processrW  iprocr   tr   r   r   _process_project  s    "

"






zJiraAPIImport._process_projectu#   Обработка проектовc              
   C   s  t jjddjj}|  D ]}zhd }| j r~d| j_| j	  |rpt 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}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 }	|	r^| |}
|
|d< nt jjt|d d d|d< | ||}W q tk
r   |rt j
|dd}|	  d|_|j	dd t  |  jd7  _| jjd|  Y qX qd S ) Nr>   r?   r   rt  ru  Tr
  leaddefault_import_jira@evateam.comdefault_import_jirark   r   projectTypeKeybusinessproject.base:defaultsoftwareproject.agile:defaultservice_deskproject.servicedesk:defaultu$   ERROR! Проекты с типом 3    временно не поддерживаютсяr   r_   r   r   r   r7  rZ   activityZtask_code_prefixr   r   r	  
simplifiedr3  rO  r  r)   <   Не удалось импортировать проект )rF   rG   rH   r   r   _get_projectsr*   r  r\   r   r   r  r   r   rC   rC  r/   rM  r@  r'   r  r0   r-   r1   )r   r  rR  r  r  project_leadr   r7  ri  Zproject_simplifiedrI  r   r   r   _process_projectsZ  sn    




zJiraAPIImport._process_projectsc           	   
   C   s  d }t jjddjj}|  D ]}z.| j rzd| j_| j	  t 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}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   |rt j
|dd}|	  d|_|j	dd t  |  jd7  _| jjd|  Y qX qd S )Nr>   r?   r   rt  ru  Tr
  r  r  r  r  r  r  r  r  r  r  r  u$   ERROR! Поректы с типом r  r   r_   r   r   r  r3  r)   r  )rF   rG   rH   r   r   r  r*   r  r\   r   r   r  r   r   rC   rC  r/   rS  r  r0   r-   r1   )	r   r  r  rR  r  r  r   r7  ri  r   r   r   _process_projects_box  s`    

z#JiraAPIImport._process_projects_boxu   Обработка досокc           	      C   sZ  |  |d D ]D}| j r6d| j_| j   dS tjj|d d}t|d |d< tj	j|d dddd	gd
}|stj	|d | jd}|d |_
|d |_||_||_|  |jr>|jD ]}|  q|d d d D ]\}tj|d || jd}|  |d D ](}tjjt|d d}|j| q
|  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   r   Nr  r   kanban_board_columnsr	  r   r   rk  r   r*   r   r.   ZcolumnConfigcolumns)r   r   r*   r  r)   )_get_project_boardsr*   r  r\   r   rF   r   rH   r'   ZCmfKanbanBoardr   r	  r   r   r  r  r?  ZCmfKanbanBoardColumnr  Zmapped_status_codesrh   r  r   )	r   rR  boardr   Z	board_objcolZ	board_colr\   Zstatus_globalr   r   r   r    sB    

 




zJiraAPIImport._process_boardsu#   Обработка спринтовc           	   	   C   s  |  |d D ]}| j r6d| j_| j   d S tjj|d d}| ||}|j	
  t  | jjd|j dt|d   |d D ]}tjj|ddd	gd
}|rh|drZd|j }tjj|dddgd
}|stj|| jd}d|_d|j d|j d|_||_|jr0|j|j d |jdkrft|jdkrf|j	| n|j	| q|  jd7  _| jjd| d|d   q|  t  | j jd7  _qd S )Nr   r   r  u0   Добавляем задачи в спринт r   issueslistsr   cache_status_typerk  r   zcomment-sprint:	log_levelrZ   r   r     uB   Задача была в архивном спринте <a href="" target="_blank"></a>r
  CLOSEDr)   u-   Неизвестная задача issue_id=u    в спринте r   )_get_all_sprintsr*   r  r\   r   rF   r   rH   r   ry  loadr   r-   r.   r   ry   r   r   r   r  r   rZ   r   r   r   r  r  rh   r0   r   r  )	r   rR  r   r   Z
sprint_objZissue_idtaskcomment_ext_idcommentr   r   r   r     s>    


$ zJiraAPIImport._process_sprintsc                 C   s$   |sd}|sd}| d| d| S )Nu   Не указаноr   u    ➔ r   )r   r   	old_valueZ	new_valuer   r   r   _simple_html_diff&  s
    zJiraAPIImport._simple_html_diffc                 C   sT   |dkrd S t jjddd| dgd}|sP| jjd| d |  jd	7  _|S )
Nunknownr   r  r4  r5  r   u;   Не найден пользователь ext_id LIKE "%::z::%"r)   )rF   r   rH   r*   r-   r   r0   )r   r   r   r   r   r   r   -  s    zJiraAPIImport._get_person)r   c                 C   s   |  |D ]}tjj|d d}|r,|js,q
|sBtj||d d}| |d | j |_|j|_| |d | j |_	|d |_
|d |_| |d |_| |jj||_||_|  q
d S )	Nr   r  )r   r   rq   ZupdateAuthorr`   ra   rr   )_get_issue_commentsrF   r   rH   r  r   rC   rp   r   Zcmf_modified_byr]   r^   r   rZ   r   r   r	  r   )r   r  r   r  Zcmf_commentr   r   r   _process_issue_comments7  s    


z%JiraAPIImport._process_issue_commentsu   Обработка задачиc                 C   s  t jj|d d d d}|s8t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 ]j}	|	d }
||	d }|r|d rd}
| |
|	d |	d }d|kr||d< q|d  d| |d< q|| qd| || jt jj d }t jjddd|d d d  gdgd|d< |d j|d< | j|d < d!|d"< |d |d< |d d#r| |d d#| j|d$< |d$ s|  jd7  _| j	j
d%|d d#  |d d&rz| |d d&| j|d'< |d' sz|  jd7  _| j	j
d(|d d&  |d d)r| |d d)| j|d*< |d* s|  jd7  _| j	j
d+|d d)  ||d,< |d r|d- d. |d< |d d/g }|D ]X}d0|krDd|d i|d1< || j|d < n(d1|krd|d i|d0< || j|d < q||d,< |pg }|d d,}|r| j|d g }||d  || j|d < |d d2 d }t jjd3dd4|gddd| d5ggd6|d7< | j	j
d8|  tj| j	t j|dd9|d gd:\}}| || | |jj|_| |jj||_|d d; d< r|  || |D ]}|j!| q|d d=g |d d>g  D ]X}d?|d  }t j"j|d}|s| j	j
d@|  |  jd7  _n|j!| q||_#|j$r4|j%|j& dA t'  |d dB dC rX| (|| |d dDg }|rzt)| j	|| W n   | j	j
*dE Y nX dF|d  }t j+j|d}|st j+|| j	dG}||_,| j-j. dH|d  }dI| dJ| dK|_dL|_/|%  |j01  dS )Mu   
        Общая логика обработки которая потом разделяется на задачи и эпики
        r   projectr   r  u$   Не проекта с ключем r   c                 S   s   i | ]}|d  |qS )r   r   )r   fieldr   r   r   
<dictcomp>V  s      z0JiraAPIImport._process_issue.<locals>.<dictcomp>Z	changelogZ	historiesNrq   u   Аудит без автора ra   r)   )r^   rp   r  rg   r  re   rc   Z
fromStringZtoStringrZ   z<br>r   r  r4  r\   r  r  r  r  TZapprovedreporterrp   u*   Не найден автор задачи Zcreatorr   u?   Не найден ответственный по задаче assigneer   u6   Не найден исполнитель задачи r   renderedFieldsr_   Z
issuelinksr|   r}   rP  r_  r$  r5  r   r7  u2   Пытаемся создать задачу из r   r   r  totalZfixVersionsZversionsversion:u!   Не найдена версия r
  rb   Z
isWatchingrZ  u/   Не удалось привязать тегиzcomment:r  zbrowse/u<   Задача импортирована из Jira: <a href="r  r  r  )2rF   r   rH   r   r   r   r   r   r   r*   r-   r  r  rh   r>  r  rI   r   rC   r0   r   rJ   rK   rC  r.   r   r   r   r   rZ   r   r   r  r  r   r	  r   r   r   r   r   Zprocess_tagsZexcepionr   r   r;   r   r  r+   r,   )r   r   sprintsr  commentsZjira_map_fieldshistoryrp   r  itemr   r  ZdiffZnormalized_issueZissue_linksZ
issue_linkZissue_parentZ	sub_tasksrK  r   r\  r   versionr   Zversion_objrg  r  r   r   r   r   rV  J  s    





 
 
 






$zJiraAPIImport._process_issueu&   Обработка всех задачc                 C   sD   | j  }|D ]0}| j r4d| j_| j   d S | | qd S )Nr   )r;   r   r*   r  r\   r   rV  )r   r  r   r   r   r   _process_issues  s    


zJiraAPIImport._process_issuesu3   Обработка связей всех задачc                 C   s  | j jdt| j  | jD ]~}| j  rFd| j _| j    dS tj	j
|d}| j| D ]>}tj	j
|dgd}|s| j jd|  q^||_|  q^q | j j  dd	d
d}| j jdt| j   | j D ]\}}| j  rd| j _| j    dS z|
|d d }|r:tjj
|d}	ntjj
|d d d}	|	srtjj
dd|d d gd}	|	stj|d d | j |d d d}	|d d |	_|d d |	_|	  tjj
|d d}
|
stj|d | j d}
tj	j
|d d d|
_tj	j
|d d d|
_|	|
_|
  W q   |  jd7  _| j jd|d  d|d  d|d   Y qX q| j j  dS )uD   
        Постобработка связей задач
        u   Подзадачи: r   Nr  parent_taskrk  uq   Не удалось связать задачи, возможно задача не попала в импорт zsystem.finish:finishzsystem.duplicatezsystem.link)ZBlocksZ	DuplicateZRelatesu   Связи: ro  r   r?   r   r   r   )r   r*   r   ZinwardZoutwardr  r|   r}   r)   u.   Не удалось создать связь z out=z in )r*   r-   r.   ry   rK   r  r\   r   rF   r   rH   r  r  r+   r,   rJ   rv  rg   ZCmfRelationTypeZin_type_nameZout_type_nameZCmfRelationOptionZin_linkZout_linkrelation_typer0   r1   )r   Zparent_ext_idr  Zchild_ext_idZ
child_taskZ	map_namesZrelation_ext_idZissue_relationZrelation_coder  Zrelation_optionr   r   r   _process_relations  sj    




4z JiraAPIImport._process_relationsu   Обработка версийc                 C   s  t jj|d dgd}t jjd|d}t jjd|d}| j|d dD ]N}z| j rtd| j_| j  W  d S 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|  |d r||_n||_|jr<|d s&|d r2|d n
|d |jrT|jrT|  | j jd7  _W qF   |  jd7  _| jjd|  Y qFX qFd S )Nr   z"scheme_wf.default_release_workflowrk  release)r   r   r   r+  r   r  r  T)r   r*   r  zlist.release:defaultr?   r   r_   rc   ZarchivedZreleasedr  ZOPENr)   u+   Ошибка загрузки версии )rF   r   rH   r   _get_project_versionsr*   r  r\   r   r   rC  r7  r   r   rZ   r3  Zdefault_release_workflowr-  r  r   r   Zset_default_statusr  r0   r-   r1   )r   r  r  Zrelease_folderZarchive_folderr  r   Zversion_listr   r   r   r{    sB    





zJiraAPIImport._process_versionsu   Обработка аудитаc                 C   s&   dS ]}|d d dkrt| qdS )u)   
        Грузим аудит
        Nc                 S   s   g | ]}|d  qS r  r   )r   r  r   r   r   r   K  s     z0JiraAPIImport._process_audit.<locals>.<listcomp>Z
objectItemZtypeNameZISSUE)r;   Zget_audit_recordsrM   print)r   recordr   r   r   _process_auditD  s    zJiraAPIImport._process_auditu2   Обработка логических типовc                 C   s  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 rd| j_| j   dS tjj	ddd|d  dgd}|rqp|	|d }|rBtjj	dd|d gdgd}|j
r"d|d  |j
 |_
nd|d  d|_
|jdd qp| jjd|d  d tjj	dd |d  gdgd}|r|j
rd|d  |j
 |_
nd|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'|d(}t| jtj| t  | j jd$7  _qpdS ))u$   Маппим issueType в logic_type   Подзадачаztask.sub:default)r   r@   Z	UserStoryztask.userstory:defaultz
Task Agiler'  Bugztask.bug:defaultEpicr&  )zSub-taskZSubtaskr  ZStoryu   ИсторияZTasku   Задачаr  u   Багu   Ошибкаu   Эпикr  issue_typesu-   Обрабатываем тип задачи r   Nr   r  r4  r   r5  r   r   r@   r   r  r  Tr
  u   Ищем по имени "rb  ra  u*   Не нашли, создаем новыйr%  r   r)   Zsubtaskr_   r   )r   r   rZ   r9  r*  )r  r*   r-   r.   r  r\   r   rF   rC  rH   r   stripr;   rD   rE   r   r   r   r   r  )r   Z	name2coderE  r7  Zlogic_type_dictZtemplate_coder*  r   r   r   _process_issue_typeO  s|    

 

z!JiraAPIImport._process_issue_typeu2   Обработка бизнес-процессовc                    sP  i }|  dD ]}|||d < q|  dD ]}| j rRd| j_| j   dS |d d  d|d d  }tjj|d	  stjjd
d}tj||d |d  _|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s4q|jdd q|d D ]}| j rvd| j_| j    dS  j d|d  }tjj| d}	|	stj| d}	|d |	_	|d |	_ fdd|d D }
tjjdd|
gd|	_t|	jt|
ks
td j d|d  }tjj|d	|	_|	  qL| j jd7  _q*dS ) u   Импортируем workflowr  r   	workflowsr   Nr   r  ZentityIdr  r'  r?   )r   r*  r_   r-  r   r   r  r  r.  r   Tr/  Ztransitions)r   r-  c                    s   g | ]} j  d | qS )r  r   )r   str-  r   r   r     s     z3JiraAPIImport._process_workflow.<locals>.<listcomp>fromINuN   DEV: Fatal Вероятно, сломали создание статусов!tor)   )r  r*   r  r\   r   rF   r;  rH   rZ   r   r=  r>  r   r  r?  r   ZCmfTransZstatus_fromry   AssertionErrorZ	status_tor  )r   Zjira_statusesrH  Zjira_workflowZworkflow_idZtemplate_workflowr\   Zjira_transitionZtransition_ext_idZ
transitionZstatus_from_ext_id_listZstatus_to_ext_idr   r  r   _process_workflow  sb    



 





zJiraAPIImport._process_workflowu    Обработка схем БПc              
   C   s|  | j  D ]j}| j r2d| j_| j   d S tjjdd|d  dgd}|sft	d|d  |d |d	d
t
|d ddi||d}t| jtj|dd|d g\}}|stjj|dD ]}|  q|d  D ]\}}| j rd| j_| j    d S tjjddd| dgd}	tjjdd| dgd}
|	|
d|d}tjf |}|  q| j jd7  _q
d S )Nr   r   r  ZdefaultWorkflowr5  r   u+   Не импортировался workflow r   r_   rc   r   r@   r1  )r   rZ   r   r*  rA  Zdefault_subtask_workflowr   r2  ZissueTypeMappingsr4  r   )r7  r8  r9  r3  r)   )r;   get_workflow_schemer*   r  r\   r   rF   r;  rH   r  r'   r   r   r@  rB  r   r?  rg   rC  r  )r   workflow_schemerA  Zscheme_dictZworkflow_scheme_objr   rJ  rK  rG  r7  r-  rL  r   r   r   _process_workflow_scheme  sV    



 


z&JiraAPIImport._process_workflow_schemer7   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)   
Tr
  )r*   get_download_pathjoinpathexistsopenjson_object_countwritejsondumpsr   mover   r   )r   Zapi_funcr   r   Zfile_path_tmpfrowr   r   r   _simple_dump  s    
 zJiraAPIImport._simple_dumpc              	   c   sF   | j  | d}t|d}|D ]}t|V  q&W 5 Q R X d S )Nr  r+r*   r  r  r  r  loads)r   r   r   r  r  r   r   r   r  	  s    zJiraAPIImport._simple_getc              
   c   st   | j  d}t|D ]T}|dr*q|dd | jD kr@qt| d| dd}t	|V  W 5 Q R X qd S )Nprojects.dirtyc                 S   s   g | ]}|d  qS r  r   r   r   r   r   r     s     z/JiraAPIImport._get_projects.<locals>.<listcomp>r   
/info.jsonr  )
r*   r  r  oslistdirr  rM   r  r  r  )r   project_dirr,  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.jsonr  r  r   r,  r  r  r  r   r   r   r:    s    z*JiraAPIImport._get_issue_types_for_projectc              	   c   sH   | j  d|}t| dd}|D ]}t|V  q(W 5 Q R X d S )Nr  /statuses.jsonr  r  r  r   r   r   r<    s    z'JiraAPIImport._get_statuses_for_projectc              	   c   sH   | j  d|}t| dd}|D ]}t|V  q(W 5 Q R X d S )Nr  /roles.jsonr  r  r  r   r   r   rw  %  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  rL   r   r  r  r*   r  r  r  r  r  r  r  )r   r,  	board_dirZboard_idr  r   r   r   r  +  s    z!JiraAPIImport._get_project_boardsc              
   c   sV   | j  d|d}t|D ]2}t| d| dd}t|V  W 5 Q R X qd S )Nr  r  r   r  r  r  )r   r,  sprints_dirZ	sprint_idr  r   r   r   r  1  s    zJiraAPIImport._get_all_sprintsc              	   c   sH   | j  d|}t| dd}|D ]}t|V  q(W 5 Q R X d S )Nr  /versions.jsonr  r  r  r   r   r   r  7  s    z#JiraAPIImport._get_project_versionsc              
   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tasksr  r   r  r  )	r*   r  r  r  r  r  r  r  r  )r   r,  	tasks_dirZtask_idr  r   r   r   rd  =  s    
z JiraAPIImport._get_project_tasksc                 c   s8   |d  d}t |D ]}|| d| dV  qd S )N
issue_pathz/attachmentsr   )r   r   )r  r  )r   r   Zattachments_pathr   r   r   r   r   E  s    z$JiraAPIImport._get_issue_attachmentsc              	   c   s>   |d  d}t |d}|D ]}t|V  qW 5 Q R X d S )Nr  z/comments.jsonr  )r  r  r  )r   r   Zcomments_file_pathr  r  r   r   r   r  J  s    z!JiraAPIImport._get_issue_comments)rZ   attachments_dirr   c                 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	s| j	j
 | }|| j	j
s| j jd
|  W q*t|\}}|s| j jd|  W q*tj|dd dd }	tj|	}	||	}
tjj||d | j jjjd}|sVtj| j ||d | j jjjd}|
|_|	|_d|_|  |j  W q* tk
r } 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   U  r   z+JiraAPIImport._dump_links.<locals>.<lambda>r   r   zmailto:u   Это почта: httpuH   Это внешняя ссылка, оставляем как есть: u   Это не файл: r   r   r   r   r   r   
obj_ext_idsource_hashr*   r   r  r  Fu0   Не удалось скачать ссылку r   )!r*   r-   r.   r   r   r   r   r   r  r;   r   r   r   r   r   r   rx   rF   r   r   r  CmfImportDownloadrH   pluginr  pathr   
downloadedr   r+   r,   r/   Zrollback)r   rZ   r  r   r   r   r   r   encodingr   r   download_jobr   r   r   r   _dump_linksP  sT    



 


zJiraAPIImport._dump_linksc                 C   s  t dd || _d}| jjd| d|  | j|d ||D ]V}z@z| j rd| j_	| j
  W W  W 5 Q R  dS | jjd	|d
  d |t|d }	|	 rW W qF|t|d d }
|
jdd |	d}|d d rR| jjdt|d d   |d d D ]"}|d }tj|}d|kr|dD ]*}t|d rZ|dd } qqZ||}|d drtjj|d |d | jjjjd}|stj| j|d |d | jjjjd}||_||_d|_|
  |j  n<| jjd|d   t|d}| |d  W 5 Q R X q,| !|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 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,d'|  Y nX W 5 | jj  X qF|-| W 5 Q R X d S )(NFrT  r   u   Задачи с u    до r   r   r)   u   Задача 'r   'r  Texist_okr   r   r   u%   Обработка вложений: filename&r$  Zcontentr  r  r	  u   Это не ссылка wb+r  r_   zcomments.jsonu#   Дампим комментарииr  r  rr   	info.jsonrc   r  w+u0   Не удалось скачать задачу ).r   r;   r*   r-   r.   Zget_all_project_issuesr+   r,   r  r\   r   r  r'   r  mkdirry   rF   r   r   rx   r   r   r   r
  rH   r  r  r  r   r  r  r  r  r  r  removeZget_commentsr  r  r  r   r  rf  dumpr1   r  )r   r  maxr  rR  r;   tasks_that_are_doneerrorsr   Ztask_dirZtask_dir_tmpr  r   r   ZparamZattach_file_pathr  r  Zcomments_file_namer  Z	info_pathr   r   r   _dump_task_part|  s    



 







 
zJiraAPIImport._dump_task_partrR  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 ]}	|	  q| jjd | s&|| 7 }q| jjd|  |S )Nr  z/tasksTr  r   r)   r   Z
dump_tasks)r   r   tokenpassword
verify_sslrE   )r  r  r  rR  r;   r  rr  u$   Форкаем _dump_task_part proc=uI   Закончили паралельное скачивание задачu   Ошибок: )r   r  rX   r~  intrY   rW   r  r  r   r;   r   r   r"  r#  r$  rD   rE   rh   r  r*   r-   r.   r   emptyrH   )
r   rR  r!  r  r  r  stepr  Zprocessr  r   r   r   _dump_tasks  sF    
 	



zJiraAPIImport._dump_tasksc                  C   sF	  | j d d d }|d s"tddd |d D | _| j d	}|jd
d t| j}td| }| jD ]}zd| j	 rd| j_
| j  W  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}	|	 r`t|	 t|	d"}
| j|d }t||
 W 5 Q R X | jjjrR|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'}| rt| 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)}| rt| t|d}
| jjj%|d d*& D ]}| j	 rd| j_
| j   W 5 Q R  W  d S | j jd7  _| j!| }| jjjr\|#d+g D ]>}|d, d-kr| jjj'|d. #d|d. #d/d0|d1< q|
t |d   qW 5 Q R X | jjd2 t|d  d3}| rt()| |  t|d  d4}| rt()| |  | jj*|d d*D ]l}| j	 r(d| j_
| j   W  d S | j jd7  _| jjd5|d   | jj+|d |d#< | j!|d# d6 d%  |d# d6< | jjjrd7d | j,|d D |d# d8< |d |d9< |t|d }|jd
d |d}t|d:}
t||
 W 5 Q R X |d, d;kr| jjd< | j-|d D ](}| j	 rjd| j_
| j    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 ]D}| j	 r*d| j_
| j     W  d S |d? /|d  qt|d:}
t||
 W 5 Q R X q:q| jjd@ |d  dA}t|dt}
| j0|d D ]\}| j	 rd| j_
| j   W 5 Q R  W  d S | j jd7  _|
t |d   qW 5 Q R X | j j1|7  _1| jjd
dB t2  t(3|d | t||d< |d  dC}t|d:}
t||
 W 5 Q R X n t|dD}
t4|
}W 5 Q R X | j5|d }| jjdE|  |  j6| j7||dF7  _6W qn   |  j6d7  _6|#dG	r| jj8dH|d  dI n| jj8dJ|  Y qnX qn| jjdK d S )LNr   r   r   	isCheckedu5   Не выбрали ни одного проекта!c                 S   s$   g | ]}|d  r|d r|d  qS )r2   r)  r   )r   valr   r   r   r     s       z0JiraAPIImport._dump_projects.<locals>.<listcomp>Zchildrenr  Tr  P   r   r)   u   Дампим "r   rb  r   r  r   r  r  u   Дампим права/permissions.jsonr  r  ZworkflowSchemerO  u/   Дампим типы задач проектаr  r+  r  z$rest/projectconfig/1/workflowscheme/zrest/api/2/workflowscheme/r.   r  r   u*   Дампим статусы проектаr  u$   Дампим роли проектаr  )r   rn  ro  rp  Z	actorUserr=   )Zusernamer   rq  u&   Дампим доски проектаz/boards/z	/sprints/u   Доска r   c                 S   s   g | ]}|qS r   r   r   r   r   r   r   S  s     Zquick_filtersr,  r  Zscrumu&   Дампим спринты доскиu   Спринт u    уже скачанr  u(   Дампим версии проектаr  r
  r  ru*   Дампим задачи проекта: r   rl  u   Проект "u   " является приватным и не может быть импортирован, отключите приватность в Jira или предоставьте пользователю праваu2   Не удалось получить проект u0   Закончили дампить проекты)9r   r/   rM   r*   r  r  r  ry   r%  r  r\   r   r  r-   r.   r'   r  r;   rD   Zget_projectr  makedirsr   r  r  Zget_project_permission_schemer  r  rE   Zget_project_schemeZget_issue_for_projectr  r  jira_requestr   rH   get_statusesZget_project_rolesvaluesr  r   rmtreeZget_all_agile_boardsZget_agile_board_configurationZget_board_quick_filtersZget_sprintsZget_sprint_issuesrh   Zget_project_versions_paginatedprogressr   r  r  Zget_project_issues_countr0   r(  r1   ) r   rootZprojects_dirr!  r'  r  r  Z	data_filerR  permission_filer  Zperm_schZ
types_filerE  r  Zstatuses_filer  Z	role_fileZrole_urir  r  Z
boards_dirr   r  r  Zboard_info_filer   Zsprint_pathZsprint_file_pathr   Zversion_list_filenamer  r   r   r   _dump_projects  sB   









$


"


"





$





"zJiraAPIImport._dump_projectsc                 C   s  | j  }t|\}}}|| d }| j 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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   Свободно места: r  u$   Скачаем данные из APIu'   Дампим пользователейr   u   Дампим статусыr  u    Дампим типы задачr  u*   Дампим бизнес процессыr  u7   Дампим схемы бизнес процессовr     u   Дампим проектыN)r*   r  r   
disk_usager-   r.   r  r;   r   r0  Zget_issue_typesrD   rE   Zget_workflowsr  r3  r   r   r6  )r   Zdownload_pathr  usedfreeZfree_percentr   r   r   download_data  s*    


zJiraAPIImport.download_datac                 C   s0   t | jj| jj d | j_| j  t  d S )Nr7  )r%  r*   r  r  r3  r   r   r   r   r   r   rz    s    
zJiraAPIImport._calc_progressc              	      s  t t d fdd}dddgddd	gg}d
D ]R}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 ]}	zt	|	dr||	j
j|	_|	jr|	  |	  n"||	j
j|	_
|	jr
|	jd	d |	jD ]8}
|
jdkr$q||
j
j|
_
|
jr|
jd	d qW q    jj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tjj|d	d
d  dgd}|sֈ j
jd|d	d
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rL|} q|qL|s j
jd|d	d
d    qnq|d}|j|jd< ||jj  d|d< || qt|S )Nr   ar   r   rc   z/wiki/z\/\d+u:   Не удалось найти ид документа в r   r)   rk  u:   Не удалось найти документ по ид z/browse/z	\/\w+-\d+u4   Не удалось найти ид задачи в r	  r  z%"key":"rc  r  r   u:   Не удалось найти задачу по коду T)r   r   r   rH   r   r;   rD   r   researchr*   r-   r  rF   r   r  r   r   r	  new_tagr   rh   r@   r   Zreplace_withr'   )	rZ   Zsoupr   r2   r   Zext_coder   r  r@  r   r   r   check_links  sP    
 "
"
z7JiraAPIImport._process_cross_links.<locals>.check_linksr*   r.  Nr  r   T)r   r   r   r   r   u)   Конвертируем ссылки в u=    на локальные задачи и документы: i  r   rZ   zcomments.log_levelzcomments.text
text_draft)r   r   slicer)   r
  r  uZ   Не удалось конвертировать перекрестные ссылки в )r'   varsrF   countr*   r-   r.   r   r   hasattrrZ   r   rB  r   r   Z
do_approver  r  r1   r0   )r   rA  r   Z	mode_namerS   r!  r'  r  r   r2   r  r   r   r   _process_cross_links  sF    +



z"JiraAPIImport._process_cross_linksc              	   C   s  ddl m} t|d  d}tjjt|d dgd}| }dd	 |d
 D }t|d}t	|}W 5 Q R X t|d }	tj
j|	d}
|
stj
|	d| jd}
|d |
_|
  |d D ]$}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}|sttjj||
|d}|jrn|j |	 |_n|	|_|s| jjd|  |  jd7  _q|d d  d!krtjjt|d d! d d}|j| |  q|d d  d"krd|_|  q|d d  d#kr(d|_|  q|d d  d$krJd|_|  q|d d  d%krld|_|  q|d d  d&kr| jjjrtjjddd'|d d(  d)gd*}ntjjdd+|d d,  gd*}|r|j | |  n"| jjd-|  |  jd7  _q|d d  d.kr| jjjrBd|d d(  d}	nd|d d. d  d}	tj!jddd|	 dgd*}|r|j | |  n"| jjd/|  |  jd7  _q| jjd0|d d    |  jd7  _q|
S )1Nr   )get_datar  r,  r   r}  rk  c                 S   s   i | ]}|d  |d qS )Z	jira_coder@   r   r   r   r   r   r    s      z6JiraAPIImport._process_permissions.<locals>.<dictcomp>Zproject_perm_permissionr-  r  T)r   r  r*   r   Zpermissionsr  Z
permission)r@   Zinclude_deletedu4   Не нашли соответствия права r   r  r  r   access_membersaccess_project_roler  )permr   r   u*   Не найдено правило для r)   Zholderro  ZprojectRoleZapplicationRoleZprojectLeadr  r  r  r4  r   r5  r   r   Z	parameteru9   Не нашли пользователя для прав r  u-   Не нашли группу для прав u'   Неизвестный тип прав )"Zcmf.system_datarH  r   rF   r   rH   r'   r  r  r  ZCmfProjectPermSchemer*   r   r   ZCmfProjectPermPermissionr-   r  ZCmfProjectPermSchemeRuler   r   r0   rx  rJ  rh   Zaccess_local_userZaccess_ownerZaccess_responsibleZaccess_authorr;   rD   rE   r   rI  r  )r   rR  rH  r5  r  Zsystem_dataZmap_permr  Zperm_scheme_dictr   Zperm_schemeZ	perm_dictrK  r   r   Zscheme_ruler  r   r  r   r   r   r|  	  s    





&

z"JiraAPIImport._process_permissionsc                 C   s   t dd
 | }|dkr"q| j r0q| jjd|d   | jj|d dd}zd|  t	|d 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 )NFrT  rU  u    Пытаемся скачать r   T)streamr  r  i    )Z
chunk_sizeu   Сохранили в u+   Неудалось скачать файл r   )r   rH   r*   r  r-   r.   r;   r/  Zraise_for_statusr  Ziter_contentr  r  r/   r1   )r   download_queue
done_queuer  rU   r  chunkr   r   r   r   _download_file_workerX  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  r^d| j _| j   d S | j jd | std | }tj	j|d d}d|_|  qld S )Nu=   Скачиваем все найденные вложенияzplugin.plugin.source_hashr  r   r  Fr   u   Вложений нетrP  )rM  rN  rr  u    Запустили задачу r   r  r  )r   r   r  rU  r   u%   Закончили скачиватьrw   r   r  T)r*   r-   r.   rX   r~  r  r  r  rF   r
  rE  r  rY   rW   r  rP  rh   r  Zslistr  r  r   r   r  r&  r   r\   r   r  rH   r  )	r   rM  rN  r   Zprocsr  r  r  Zdownload_idr   r   r   download_filesn  sH    






zJiraAPIImport.download_filesc                 C   s2  d| j _d| j _| j   t  |   |   |   |   |   | 	  |   | 
  |   | jjjr|   |   |   |   |   n|   |   |   |   d| j _| j   t  |  D ]}| j jd|d  d q| j jd| j  | j jd| j j  | j S )Nr   r7  u'   Импортирован проект 'r   r  u#   Ошибок обнаружено: u-   Импортировано объектов: )r*   r  r3  r   r   r<  rQ  rz  r  r   r  r;   rD   rE   r  r  r  r  rG  r  r  r  r-   r.   r0   )r   r  r   r   r   process_import  s>    



zJiraAPIImport.process_import)T)r   r   )T)N)Ur#   r$   r%   r&   r%  r(   r   rB   r   r   r'   r   rR   staticmethodr   r   r   rV   rN   ri   ro   rs   r{   r   r   r   r   r9   r   r   r   r   r   r   r   r  r   rF   r@  rM  r=  rS  rX  rh  r  r  r  r  r  r  r   r  rV  r  r  r{  r  r  r  r  r  r  r  r:  r<  rw  r  r  r  rd  r   r  r   r  r  r(  r6  r<  rz  rG  r|  rP  rQ  rR  __classcell__r   r   rP   r   r:   7   s   


	,%  


0
T
F'-

{
I
5
%
%
 
	
=
&


I
;
&
,L" /RO%r:   )+Zcmf.appr   Zcmf.includeZdataclassesr   pathlibr   r   Ztempfiler   r   typingr   r   r   r	   r
   r   r   Zbs4r   r   Zcmf.data_providers.baser   r   r   Z
cmf.modelsr   Z%common.models.cmf_plugin_import_mixinr   Zmodules.jira.apir   Zmodules.jira.base_importr   rF   r   r   r   r   Z	dataclassr   r9   r:   r   r   r   r   <module>   s(   $ 