U
    Ӏc                    @   s   d dl Z d dlZd dlmZ d dlZd dlmZ d dlZd dlm	Z	m
Z
mZmZmZmZmZ d dlmZ d dlmZ d dlmZ d dlmZ d d	lmZ d d
lmZ d dlT 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 )    N)Path)TemporaryDirectory)DictOptionalListCallableUnionTypeIterator)BeautifulSoup)cached_property)	BaseModel)CmfPluginImportMixin)JiraApi)JiraBaseImport)*c                   @   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   )r1   r2   r   )r1   r   	decorator%   s    	z"catch_exception.<locals>.decoratorr   )r   r4   r   r3   r   catch_exception$   s    r5   c                       sF  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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
d.d/d0Zed1de
e d2d3d4Z!ed5d6d7 Z"ed8d9d: Z#e$j%dd;d<Z&d=d> Z'd?d@ Z(eedAdBdCZ)edDdEdF Z*edDdGdH Z+edIdJdK Z,edLdMdN Z-dOdP Z.dQdR Z/edSdTdUZ0edVddWdXZ1edYdZd[ Z2ed\d]d^ Z3ed_d`da Z4edbdcdd Z5ededfdg Z6edhdidj Z7edkdldm Z8e
dndodpZ9e
dndqdrZ:dsdt Z;dudv Z<dwdx Z=dydz Z>d{d| Z?d}d~ Z@dd ZAdd ZBedSddZCedSddZDe
eEdddZFdd ZGdd ZHdd ZIdd ZJdd ZK  ZLS )JiraAPIImportu;   Класс загрузки объектов через APIr,   N)jirareturnc                    sb   t  j|| || _d| _| jjjr*d| _tjjdd| _	i | _
i | _i | _g | _g | _d| _d S )Nr   	accountIdsoftdevcoder   )super__init__r7   user_keyconncloudmodelsCmfActivitygetdefault_activityZepicsissue_relationssubtasksZboardsselected_projectsr,   )r   r7   r/   r0   	__class__r   r   r>   7   s    
zJiraAPIImport.__init__)r8   c                 C   s
   | j  S r   )r7   Z
get_fieldsr   r   r   r   jira_fieldsF   s    zJiraAPIImport.jira_fields)model
field_namer8   c                 C   s&   |sd S | j |gd}|r"|d S d S )N)Zfields_namer   )Zimport_shop_fields)rL   rM   resr   r   r   _get_field_nameJ   s    zJiraAPIImport._get_field_namec                 C   st   g }ddddddddd	d
ddd}dddd}| j  D ]6\}}d| ||d }|||d|d q8|S )uO    Сопоставление настроек для модели models.CmfTaskr   text
cmf_author	cmf_ownerresponsibleprioritystatusparentZ
alarm_dateZdeadlinecmf_modified_atcmf_created_at)ZsummarydescriptionZreporterZcreatorZassigneerT   rU   projectZcustomfield_10015Zduedateupdatedcreatedz.namez.watchCountz.votes)rT   watchesZvoteszfields. Nmodel_field	json_path)rK   itemsrD   append)r   Zissue_settingsZdefault_local_attrs_mappingZadditional_json_pathZcustom_field_keyZcustom_fieldra   r   r   r   _get_issue_import_settingsQ   s2    

z(JiraAPIImport._get_issue_import_settingsc                  C   s    dddddddddg} | S )Nr   displayNamer_   emailemailAddressdoes_not_workactiver   )Zuser_settingsr   r   r   _get_user_import_settingsp   s
    z'JiraAPIImport._get_user_import_settingsc                  C   s    dddddddddg} | S )NrX   r\   r_   rQ   authorrP   renderedBodyr   )Zcomment_settingsr   r   r   _get_comment_import_settingsy   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   Ключ)re   rg   ri   r\   rk   bodyr   .r%   r^   r   )splitlenrK   rD   )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 )Nrq   r   re   r   r^   rg   rf   inwardIssueoutwardIssue,)rr   
isinstancedictrD   listrc   r#   join)	r.   ra   to_strrM   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_funcrL   r8   c                    sz   | D ]p}| }|D ]H} ||d |d< ||d |d< |d |d< |j|d< q |j|d |  S d S )Nra   Zfile_valr`   titleicon)r   fields)r   rO   ru   r   rc   verbose_name)r   r   rL   r.   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   .0r.   r   r   r   
<listcomp>   s     z7JiraAPIImport.tmplt_import_settings.<locals>.<listcomp>Nz2022-05-22T15:22:22.593+0300rn   u!   Электронная почта)re   rg   ro   )r\   rk   rp   selectedObjects)r   value)r   r   r
   r   r   	TypeModelr7   
get_issuesrd   rB   CmfTask	get_usersrj   	CmfPersonrm   
CmfCommentrc   )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   r`   ra   rM   r   r   captionr   )Z_normalize_settingsr&   Zjson_settingsr7   r   	enumeraterB   r   r   r   _normalize_jira_valuerc   )r   settingsr~   r   Znumr   r   r   r   r   preview   s    zJiraAPIImport.preview)r   r8   c                 C   sT   i }|D ]F}|d sq| j ||d dd}| |d d |}|||d d < q|S )uC    Преобразование настроек для модели r`   ra   F)r}   rM   )r   r   )r   r.   r   Znormalized_objr   r   r   r   r   _normalize_obj   s    zJiraAPIImport._normalize_obju:   Обработка исполнителей проекта)settings_usersr8   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_emailr3   )rf   )leftright)
r7   Zget_project_membersrB   
CmfProjectrD   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   rV   tree_parent	list_typeZplan_start_dateZplan_end_dater   Z
filter_obj)r   rD   rc   rB   	CmfFolderr   r   r&   CmfListr   save)
r   rV   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   r9   r   uI   _process_watchers: Не найден наблюдатель задачи N)r7   Zget_watchersr@   rA   _get_personCmfErrorrS   rQ   rR   Z
spectatorsrc   commit_with_event)r   	issue_objr   Zwatcherpersonr   r   r   _process_watchers)  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   rV   )r&   rV   r   	file_path)Zrdisk.rdiskr   _get_issue_attachmentsrB   CmfAttachmentrD   r&   is_new
is_changedr   Z
upload_dirshutilcopyZfull_path_fileZCmfRFiler'   Zdata_driverZget_rdZ	get_rfileZ
_file_namemake_previewrc   r   )
r   r   Z
jira_issuer   attachmentsattachment_info
attachmentr   ZrdiskZrfiler   r   r   _process_attachments9  s*    
z"JiraAPIImport._process_attachmentsuB   Обработка упоминаний пользователей)rP   r8   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
        Nz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   rD   r   r+   r   r   r   loginr,   r&   r)   errorr#   )r   rP   Zdoc_souptagr   er   r   r   _process_mentionsQ  s*    

.zJiraAPIImport._process_mentionsu#   Конвертация ссылок)rP   rV   c                 C   s8  |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j|dg|d}|r|d	rj|jd	 |jd< |j|jd	< d|jd< t|jd	 }	|	rj|	d rj|	d drjd|_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>s      z.JiraAPIImport._process_links.<locals>.<lambda>r   u   Уже обработали r   #u   Это якорь u&   Обрабатываем ссылку r   /?r   url)r   r   rV   Zsrc_origTZvideoZcontrolsz100%widthZheightr   u   Заменили на z/people/r^   )r   r   r   rD   r&   r)   r*   r   
startswithurllibparseunquoterr   rB   r   sgetr   	mimetypes
guess_typer   r   r   r#   )r   rP   rV   r   Z	text_soupr   r   r   Z
attach_obj	mime_type
account_idr   r   r   r   _process_linksn  sT    

 
 





zJiraAPIImport._process_linksu-   Обработка пользователейc                 C   s~  t  }| dD ]N}| j r8d| j_| j   d S | jjd|  | jj	j
r||d dkr|| jjd|d   q| || jtjj d }d|| j  d}d	}tjjd
d|d gdgd}|sXtjjddd| dgdgd}|sXtjjdd|d gd}t|dkrJ|  jd7  _| jjd|d  dt|  |rX|d }|sxd}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 |
 |jdd | j j!d7  _!|j"r|j#s|j"$ds|r|%|j"j& q|rzt'tjj(|gd d S )Nr   import-cancelingu0   Импортируем пользователя ZaccountTypeZ	atlassianu   Неизвестный тип r   ::Fr   r   rf   r   r   r   r   LIKE%r   r   r%   u+   Пользователей с именем z > r   T)r   r   r&   rg_member_ofZ	only_dataz.evateam.ru)r/   ))set_simple_getr&   	is_cancelrU   r   r)   r*   r7   r@   rA   warningr   r   rB   r   r   r?   rD   r{   rs   r,   r   setattrr   import_originalload_fieldsr   CmfPersonGroup
jira_group
user_groupr   rc   imported_object_countrf   rh   endswithaddr   Zcmf_deferred_taskZregister_persons)r   Znew_user_emailsuserZ	user_dictr   Z
is_createdr   Zpersonsr   r  r  r   r   r   _process_users  s^    

 "

zJiraAPIImport._process_usersu#   Обработка статусовc                 C   s   |  dD ]}| j r0d| j_| j   dS tjj|d d}|sldd|d gdddgg}tjj|d	}|stj|d | jt	|d
 d}|d |_
|  | jj  | j jd7  _q
dS )uc   
        Грузим статусы из Jira и сопостовляем с нашими
        statusesr   Nr   r   r   r   r   r   statusCategory)r   r&   status_typer%   )r   r&   r   rU   r   rB   CmfStatusCoderD   r   get_status_typer   r'   r(   r  )r   rU   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_namer"  r&   )rz   _get_issue_types_for_projectrB   CmfWorkflowrD   r&   r   r   _get_statuses_for_project_create_status	CmfStatusr{   r  deleteCmfSchemeWfdefault_task_workflowZ!default_subtask_workflow_workflowCmfSchemeWfRulerb   r   rU   CmfLogicType)r   Zjira_project_info	issue_mapZdefault_task_wfZdefault_subtask_wf
issue_typeworkflow_ext_idworkflow_namer  r<   r  jira_statusrU   Zscheme_ext_idZscheme_nameschemerulelogic_type_ext_idr&  	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}|sTtj|d |d t|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  r  status_code)r  r&   r=  rY   r   )r   rB   r  rD   r   r  r   r-  r&   r   r   rP   r=  r   )r   Zjira_status_datar  Zstatus_ext_idr=  rU   r   r   r   r,  H  s6    

zJiraAPIImport._create_statusc                 C   s  t jjt|d d d}|d d }|slt jjdd}t j|d t|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}	|	sDt j	jddd|d  dgd}
t jj|
j
dd  dd}|s2t jjdd}t j||| jd}	||	_|	  |	||d < |d D ]"}|d d |d< | ||	 qfqt jj|dD ]}|  q| D ]L\}}	t j	jddd| dgd}
|
|	d || jd!}t jf |}|  qd S )"Njira_workflow_schemer   r
  r*   r   r;   r   rY   )r   r   rP   import_raw_jsonr&   r  r  	issuetyper   r  r   r  r  r   r  r   r   r#  r$  :r   z:defaultr  r  r	  r  r   r!  r   r%  )rB   r/  rD   r#   r&   r   rz   r+  r*  r2  r<   rr   r   r,  r1  r{   r.  rb   )r   project_infoZ	wf_schemeZwf_scheme_infor  r3  r4  r5  r6  r  r&  r7  r9  r:  r;  r   r   r   _process_wf_schemem  sT    
   z JiraAPIImport._process_wf_scheme)project_structrB  c              
   C   sB  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 D ]`}d|d  }tj| jt j|d  d|d  |ddd|gd\}}|s`|dg |dg 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}
|
r|j|
 n| jjd|	  nV|	d dkr:tj| jt j|	d |	d ddd|	d gd\}}|j| ntdql|
  |j| |
  q|   | | |   | |d D ]L}| j rd | j_| j
   d S | | | j j d!7  _ |   qt j!|d"d#}|
  d$|_"|j
d$d% t#  | $| |   | %| | j j d!7  _ |   |S )&Nr   r   r&  r   r   z ()u   Проект с именем u8    уже существует! Переименуем в r   r   )r&   r   r   r   zrole:r   )r   r   r   
rg_membersactorstypeatlassian-user-role-actorr   r#  	user_infor9   r$  r   re   r3   uR   Не удалось привязать пользователя к проекту zatlassian-group-role-actoru&   Неизвестный тип ролиr   r%   delmerV   r   Tr   )&rB   r   rD   r&  r   r   r&   r)   r   r   r   keysr   _get_project_rolesr   r   r  r   r7   r@   rA   r   rG  rc   r+   Z	executors_calc_progress_process_versions_get_project_tasksr   rU   _process_issuer  r   cmf_deletedr   _process_boards_process_sprints)r   rD  rB  project_objr   	role_infor   groupr   actorr  Z	sub_groupr   tr   r   r   _process_project  s    "

&





zJiraAPIImport._process_projectu#   Обработка проектовc              
   C   s  t jjddjj}|  D ]}z`| j rvd| 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 }	|	rV| |}
|
|d< nt jjt|d d d|d< | ||}W q tk
r   t j
|dd}|	  d|_|j	dd t  | jjd|  Y qX qd S )Nr:   r;   r   rL  rM  Tr   leaddefault_import_jira@evateam.comdefault_import_jirarf   r   projectTypeKeybusinessproject.base:defaultsoftwareproject.agile:defaultservice_deskproject.servicedesk:defaultu$   ERROR! Проекты с типом 3    временно не поддерживаютсяr   rY   r   r   r   r&  rP   activityZtask_code_prefixrR   r   r?  
simplifiedr"  r>  r
  <   Не удалось импортировать проект )rB   rC   rD   r   r   _get_projectsr&   r   rU   r   r   rT  r   r   r?   r2  r+   r<  r/  r#   r\  r)   r-   )r   rj  rB  rW  r[  project_leadrR   r&  rD  Zproject_simplifiedr8  r   r   r   _process_projects  sb    



zJiraAPIImport._process_projectsc           	   
   C   s  t jjddjj}|  D ]`}z.| j rvd| 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
rz   | jjd|  Y qX qd S )Nr:   r;   r   rL  rM  Tr   r]  r^  r_  r`  ra  rb  rc  rd  re  rf  rg  u$   ERROR! Поректы с типом rh  r   rY   r   r   ri  r"  rl  )rB   rC   rD   r   r   rm  r&   r   rU   r   r   rT  r   r   r?   r2  r+   rC  r\  r)   r-   )	r   rj  rB  rW  r[  rn  rR   r&  rD  r   r   r   _process_projects_box;  sP    

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?  rV   r   rF  r   r&   r   r*   ZcolumnConfigcolumns)r   rV   r&   r	  r%   )_get_project_boardsr&   r   rU   r   rB   r   rD   r#   ZCmfKanbanBoardr   r?  rV   r   r   rq  r.  ZCmfKanbanBoardColumnr  Zmapped_status_codesrc   r  r   )	r   rB  boardrV   Z	board_objcolZ	board_colrU   Zstatus_globalr   r   r   rU  i  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_typerF  r   zcomment-sprint:	log_levelrP   rV   rr     uB   Задача была в архивном спринте <a href="" target="_blank"></a>r   CLOSEDr%   u-   Неизвестная задача issue_id=u    в спринте r   )_get_all_sprintsr&   r   rU   r   rB   r   rD   r   membersloadr   r)   r*   r   rs   r   r   r   rz  r   rP   rV   r   r   ry  rx  rc   r,   r   r  )	r   rB  r   rV   Z
sprint_objZissue_idtaskcomment_ext_idcommentr   r   r   rV    s>    


$ zJiraAPIImport._process_sprintsc                 C   s$   |sd}|sd}| d| d| S )Nu   Не указаноr   u    ➔ r   )r   r   	old_valueZ	new_valuer   r   r   _simple_html_diff  s
    zJiraAPIImport._simple_html_diffc                 C   s(   |dkrd S t jjddd| dgdS )Nunknownr   r   r#  r$  r   )rB   r   rD   )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
  )rV   r   rk   ZupdateAuthorr[   r\   rl   )_get_issue_commentsrB   r   rD   r   r   r?   rQ   rR   Zcmf_modified_byrW   rX   r   rP   r   r   r?  r   )r   r  r   r  Zcmf_commentr   r   r   _process_issue_comments  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|d< | j|d< d|d < |d |d< |d r|d! d" |d< d#D ]0}||r||d$d%d%kr||= q|d d& }|D ]X}d'|kr*d|d i|d(< || j|d < n(d(|krd|d i|d'< || j|d < q||d)< |pfg }|d d)}|r| j|d g }||d  || j|d < |d d* d }t jjd+dd,|gddd| d-ggd|d.< | j	j
d/|  tj| j	t j|dd0|d gd1\}}| || | |jj|_| |jj||_|d d2 d3 rj| || |D ]}|j| qn|d d4g |d d5g  D ]X}d6|d  }t jj|d}|s| j	j
d7|  |  jd7  _n|j| q||_ |j!r|j"|j# d8 t$  |d d9 d: r>| %|| |d d;g }t&| j	|| d<|d  }t j'j|d}|st j'|| j	d=}||_(| j)j* d>|d  }d?| d@| dA|_dB|_+|"  t$  dS )Cu   
        Общая логика обработки которая потом разделяется на задачи и эпики
        r   rZ   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	historiesNrk   u   Аудит без автора r\   r%   )rX   rQ   rz  rb   r  r`   r^   Z
fromStringZtoStringrP   z<br>r   r   r#  rU   r   rj  TZapprovedrenderedFieldsrY   )rS   rQ   rR   rf   r   Z
issuelinksrv   rw   rV   r@  ORr  r$  r&  u2   Пытаемся создать задачу из r   r   r  totalZfixVersionsZversionsversion:u!   Не найдена версия r   r]   Z
isWatchinglabelszcomment:rr  zbrowse/u<   Задача импортирована из Jira: <a href="r|  r}  r{  ),rB   r   rD   r   r   r   r   r   r   r&   r)   r   r  rc   r-  rE   rF   rG   r2  r*   r   r   r   r   rP   r   r   r  rx  r   r   r,   r?  r   r   r   r   r   Zprocess_tagsr   rV   r7   r   rz  )r   r   ZsprintsrZ   ZcommentsZjira_map_fieldshistoryrQ   r  itemr   r  ZdiffZnormalized_issuer?   Zissue_linksZ
issue_linkZissue_parentZ	sub_tasksr:  r   _r   versionr   Ztagsr  r   r   r   r   rS    s    
 

*

$




$zJiraAPIImport._process_issueu&   Обработка всех задачc                 C   sD   | j  }|D ]0}| j r4d| j_| j   d S | | qd S )Nr   )r7   r   r&   r   rU   r   rS  )r   rw  r   r   r   r   _process_issuesF  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_taskrF  uq   Не удалось связать задачи, возможно задача не попала в импорт zsystem.finish:finishzsystem.duplicatezsystem.link)ZBlocksZ	DuplicateZRelatesu   Связи: rI  r   r;   r   r   r   )r   r&   r   ZinwardZoutwardrr  rv   rw   r%   u.   Не удалось создать связь z out=z in )r&   r)   r*   rs   rG   r   rU   r   rB   r   rD   r   r  r'   r(   rF   rN  rb   ZCmfRelationTypeZin_type_nameZout_type_nameZCmfRelationOptionZin_linkZout_linkrelation_typer,   r-   )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_relationsP  sd    




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 ]}d|d  }t jj|d	}|s|t j|| jd
d}t jjdd|_||_	|d |_
|dd|_|jj|_|d r||_n||_|d s|d r|d n
|d |jr|jr|  | j jd7  _qFd S )Nr   z"scheme_wf.default_release_workflowrF  release)r   r   r   r  r  r
  T)r   r&   r   zlist.release:defaultr;   r   rY   r^   ZarchivedZreleasedr~  ZOPENr%   )rB   r   rD   r   _get_project_versionsr   r&   r2  r&  rV   r   rP   r"  Zdefault_release_workflowr  r   Zset_default_statusr   r   r   r  )r   rZ   rW  Zrelease_folderZarchive_folderr  r   Zversion_listr   r   r   rQ    s,    


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   rZ   r   r   r   r     s     z0JiraAPIImport._process_audit.<locals>.<listcomp>Z
objectItemZtypeNameZISSUE)r7   Zget_audit_recordsrH   print)r   recordr   r   r   _process_audit  s    zJiraAPIImport._process_auditu2   Обработка логических типовc                 C   sz  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 ||d }|rtj	jdd|d gdgd}|j
rd|d  |j
 |_
nd|d  d|_
|jdd qhtj	jddd|d  dgd}|r:qh| 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 qh| 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  _qhd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   Эпикr  issue_typesu-   Обрабатываем тип задачи r   Nr   r<   r   r   r   r   r   Tr   r   r#  r$  r   u   Ищем по имени ""ZILIKEu*   Не нашли, создаем новыйr  r   r%   ZsubtaskrY   r   )r   r   rP   r(  r  )r   r&   r)   r*   r   rU   r   rD   rB   r2  r   stripr7   r@   rA   rz   r   r   r   r  )r   Z	name2coder4  Zlogic_type_dictr&  Ztemplate_coder  r   r   r   _process_issue_type  sz    

 

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  rY   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   rU   r   rB   r*  rD   rP   r   r,  r-  r{   r  r.  r   ZCmfTransZstatus_fromrs   AssertionErrorZ	status_tor  )r   Zjira_statusesr7  Zjira_workflowZworkflow_idZtemplate_workflowrU   Zjira_transitionZtransition_ext_idZ
transitionZstatus_from_ext_id_listZstatus_to_ext_idr   r  r   _process_workflow  sV    


& 



zJiraAPIImport._process_workflowu    Обработка схем БПc              
   C   sz  | j  D ]h}| 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defaultWorkflowr$  r   u+   Не импортировался workflow r   rY   r^   r   r<   r   )r   rP   r   r  r0  r   r!  ZissueTypeMappingsr#  r   )r&  r'  r(  r"  r%   )r7   get_workflow_schemer&   r   rU   r   rB   r*  rD   r  r#   r   r   r/  r1  r{   r.  rb   r2  r  )r   workflow_schemer0  Zscheme_dictZworkflow_scheme_objr   r9  r:  r6  r&  r  r;  r   r   r   _process_workflow_scheme2  sL    



 


z&JiraAPIImport._process_workflow_schemer3   c              	   C   s   t | jjdd d| d}t | jjdd d| d}| rHd S t|d6}| D ](}| j jd7  _|t|d  qZW 5 Q R X t	
|| | jjdd	 t  d S )
NTZabsoluter   .jsonz.json.dirtya+r%   
r   )r   r&   get_files_direxistsopenjson_object_countwritejsondumpsr   mover   r   )r   Zapi_funcr   r   Zfile_path_tmpfrowr   r   r   _simple_dumpW  s    
 zJiraAPIImport._simple_dumpc              	   c   sJ   | j jdd d| d}t|d}|D ]}t|V  q*W 5 Q R X d S )NTr  r   r  r+r&   r  r  r  loads)r   r   r   r  r  r   r   r   r   d  s    zJiraAPIImport._simple_getc              
   c   sb   | j jdd d}t|D ]>}|dr.qt| d| dd}t|V  W 5 Q R X qd S )NTr  projects.dirtyr   
/info.jsonr  )r&   r  oslistdirr  r  r  r  )r   project_dirr  r  r   r   r   rm  j  s    
zJiraAPIImport._get_projectsc              	   c   sN   | j jdd d| }t| dd}|D ]}t|V  q.W 5 Q R X d S )NTr  	projects//issue_types.jsonr  r  r   r  r  r  r  r   r   r   r)  r  s    z*JiraAPIImport._get_issue_types_for_projectc              	   c   sN   | j jdd d| }t| dd}|D ]}t|V  q.W 5 Q R X d S )NTr  r  /statuses.jsonr  r  r  r   r   r   r+  x  s    z'JiraAPIImport._get_statuses_for_projectc              	   c   sN   | j jdd d| }t| dd}|D ]}t|V  q.W 5 Q R X d S )NTr  r  /roles.jsonr  r  r  r   r   r   rO  ~  s    z JiraAPIImport._get_project_rolesc              
   c   s\   | j jdd d| d}t|D ]2}t| d| dd}t|V  W 5 Q R X q$d S )NTr  r  z/boardsr   r  r  r&   r  r  r  r  r  r  )r   r  	board_dirZboard_idr  r   r   r   rt    s    z!JiraAPIImport._get_project_boardsc              
   c   s\   | j jdd d| d}t|D ]2}t| d| dd}t|V  W 5 Q R X q$d S )NTr  r  z/sprintsr   r  r  r  )r   r  sprints_dirZ	sprint_idr  r   r   r   r    s    zJiraAPIImport._get_all_sprintsc              	   c   sN   | j jdd d| }t| dd}|D ]}t|V  q.W 5 Q R X d S )NTr  r  /versions.jsonr  r  r  r   r   r   r    s    z#JiraAPIImport._get_project_versionsc              
   c   sl   t | jjdd d| d}t|D ]>}|dr8q(t| d| dd}t|V  W 5 Q R X q(d S )	NTr  r  /tasksr  r   r  r  )	r   r&   r  r  r  r  r  r  r  )r   r  	tasks_dirZtask_idr  r   r   r   rR    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     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    s    z!JiraAPIImport._get_issue_comments)rP   attachments_dirc                 C   s  |sd S | j jd t|ddd D ]}d}|drBd}|j| }z.|dsj| jj	 | }|| jj	s| j j
d|  W q*t|\}}|s| j j
d	|  W q*| j jd
|  | jj|ddd}|  d|jd krptj|dd dd }	||	}
|
 r<W 5 Q R  W q*t|
d$}|jddD ]}|| qTW 5 Q R X W 5 Q R X W q* tk
r } z| 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   httpuH   Это внешняя ссылка, оставляем как есть: u   Это не файл:     Пытаемся скачать r   T)timeoutstreamz	text/htmlzContent-Typer   r   r   r   wb+    Z
chunk_sizeu0   Не удалось скачать ссылку r   )r&   r)   r*   r   r   r   r   r   r7   r   r   r   r   jira_requestraise_for_statusZheadersr   r   r   rr   joinpathr  r  iter_contentr  r+   )r   rP   r  r   r   r   r   encodingrN   r   r   r  chunkr   r   r   r   _dump_links  s>    


 

&zJiraAPIImport._dump_linksc                 C   st  t |d  d}|  d}| j|d D ]>}z | j r\d| j_| j  W  dS | jj	d|d  d	 |
t|d }| rW q.|
t|d d
 }|jdd |
d}|jdd |d d r6| jj	dt|d d   |d d D ],}|d }	d|	krT|	dD ]*}
t|
d r(|
dd }	 qTq(|
|	}| rlq| jj	d|d   |d dr| jj|d ddddB}|  t|d$}|jddD ]}|| qW 5 Q R X W 5 Q R X n<| jjd|d   t|d}||d  W 5 Q R X q| |d d | |
d}| rht| | jj	d  t|d!R}| j|d D ]:}|t|d"  | j jd7  _| |d# | qW 5 Q R X t || |
d$}t|!d
d%|d&< t|d'"}t"|| | j jd7  _W 5 Q R X W q.   |d7 }|  j#d7  _#| jj$d(|  Y q.X q.|S ))Nr  r  r   r   r   r%   u   Задача 'r   'r  Texist_okr   r   r   u%   Обработка вложений: filename&r  r  Zcontentr  r   )Zattachr  r  r  r  r  u   Это не ссылка r  rY   zcomments.jsonu#   Дампим комментарииr  r  rl   	info.jsonr^   r  w+u0   Не удалось скачать задачу )%r   mkdirr7   Zget_all_project_issuesr&   r   rU   r   r)   r*   r  r#   r  rs   rr   r   r   r   r  r  r  r  r  r   r  r  removeZget_commentsr  r  r  r   r  replacedumpr,   r-   )r   rB  r  errorsr   Ztask_dirZtask_dir_tmpr  r   r   ZparamZattach_file_pathrN   r  r  Zcomments_file_namer  Z	info_pathr   r   r   _dump_tasks  sx    


 



$



zJiraAPIImport._dump_tasksc                 C   s  | j d d d }|d s"tddd |d D | _t| jjd	d
 d}|jd	d t| j}td| }| jD ]0}z| j	 rd| j_
| j  W  d S |dr| jjd|d  d |  jd7  _W qv| j jd7  _| jjd|d  d |t|d }| sv| jj|d }t||d  d|d< t|d  | 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!  qW 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!  qW 5 Q R X | jjd) t|d  d*}| rTt| 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/ d0d1|d2< q|	t !|d!  qxW 5 Q R X | jjd3 t|d  d4}| r|t()| |  t|d  d5}| rt()| |  | jj*|d d+D ]l}| j	 rd| j_
| j   W  d S | j jd7  _| jjd6|d   | jj+|d |d$< | j"|d$ d7 d&   |d$ d7< | jjjrd8d | j,|d D |d$ d9< |d |d:< |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	 r4d| j_
| j    W  d S | j jd7  _|t|d }|jd	d |d;}| r| jjd?|d  d@ qg |dA< | jjd?|d   | j/|d D ]D}| j	 rd| j_
| j     W  d S |dA 0|d  qt|d<}	t -||	 W 5 Q R X qq| jjdB |d  dC}t|dt}	| j1|d D ]\}| j	 rd| j_
| j   W 5 Q R  W  d S | j jd7  _|	t !|d!  qlW 5 Q R X | jjdD| j2|d   | j3|dE}| j j4|7  _4| jjd	dF t5  |svt(6|d | t||d< |d  dG}t|d<}	t -||	 W 5 Q R X W qv   |  jd7  _| jj7dH|  Y qvX qvd S )INr   r   r   	isCheckedu5   Не выбрали ни одного проекта!c                 S   s$   g | ]}|d  r|d r|d  qS )r.   r  r   )r   valr   r   r   r     s       z0JiraAPIImport._dump_projects.<locals>.<listcomp>ZchildrenTr  r  r  P   r   Z	isPrivateu   Проект "r   u   " является приватным и не может быть импортирован, отключите приватность в Jirar%   u   Дампим "r  r   r   r  r  rk  ZworkflowSchemer>  u/   Дампим типы задач проектаr  r  r  r  z$rest/projectconfig/1/workflowscheme/zrest/api/2/workflowscheme/r*   r]  r   u*   Дампим статусы проектаr  u$   Дампим роли проектаr  )r   rH  rI  rJ  Z	actorUserr9   )Zusernamer   rK  u&   Дампим доски проектаz/boards/z	/sprints/u   Доска r   c                 S   s   g | ]}|qS r   r   r   r   r   r   r   p  s     Zquick_filtersr  r  r  Zscrumu&   Дампим спринты доскиu   Спринт u    уже скачанrw  u(   Дампим версии проектаr  u*   Дампим задачи проекта: )rB  r   r  u2   Не удалось получить проект )8r   r+   rH   r   r&   r  r  rs   intr   rU   r   rD   r)   r   r,   r  r*   r  r#   r  r7   r@   Zget_projectr  makedirsrA   Zget_project_schemer  r  Zget_issue_for_projectr  r  r  r  r   get_statusesZget_project_rolesvaluesr  r   rmtreeZget_all_agile_boardsZget_agile_board_configurationZget_board_quick_filtersr  Zget_sprintsZget_sprint_issuesrc   Zget_project_versions_paginatedZget_project_issues_countr  progressr   r  r-   )r   rootZprojects_dirZcntsteprZ   r  rB  Z
types_filer  r4  rn  Zstatuses_filer  Z	role_fileZrole_urirX  rZ  Z
boards_dirr  r  ru  Zboard_info_filer   Zsprint_pathZsprint_file_pathr   Zversion_list_filenamer  r  Z	data_filer   r   r   _dump_projects  s    





 

$.


"


"





$"





" zJiraAPIImport._dump_projectsc                 C   s   t j| jjdd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 )uD   
        Загружаем все данные из апи
        Tr  r  u$   Скачаем данные из APIu'   Дампим пользователейr   u   Дампим статусыr	  u    Дампим типы задачr  u*   Дампим бизнес процессыr  u7   Дампим схемы бизнес процессовr     u   Дампим проектыN)r  r  r&   r  r)   r*   r  r7   r   r  Zget_issue_typesr@   rA   Zget_workflowsr  r  r   r   r  r   r   r   r   _download_data  s$    

zJiraAPIImport._download_datac                 C   s0   t | jj| jj d | j_| j  t  d S )Nd   )r  r&   r  r  r  r   r   r   r   r   r   rP    s    
zJiraAPIImport._calc_progressc                 C   s"  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   r  u'   Импортирован проект 'r   r  u#   Ошибок обнаружено: u-   Импортировано объектов: )r&   r  r  r   r   r  rP  r  r  r  r7   r@   rA   r  r  ro  rp  r  r  rm  r)   r*   r,   )r   rZ   r   r   r   process_import  s:    



zJiraAPIImport.process_import)T)r   r   )T)N)Mr   r    r!   r"   r  r$   r   r>   r   r   r#   rz   rK   staticmethodr   r   r   rO   rd   rj   rm   ru   r   r   r   r   r5   r   r   r   r   r   r   r   r  r  rB   r/  r<  r,  rC  r\  ro  rp  rU  rV  r  r   r  rS  r  r  rQ  r  r  r  r  r  r   rm  r)  r+  rO  rt  r  r  rR  r   r  r   r  r  r  r  rP  r  __classcell__r   r   rI   r   r6   3   s   


	,%  


/
K
F%,^
C
-
%
%p
	
;



E
9
$#E  r6   )%Zdataclassesr   pathlibr   r   Ztempfiler   r   typingr   r   r   r   r   r	   r
   Zbs4r   r   Z
cmf.modelsr   Z%common.models.cmf_plugin_import_mixinr   Zmodules.jira.apir   Zmodules.jira.base_importr   Zcmf.includerB   r   r   r   r   Z	dataclassr   r5   r6   r   r   r   r   <module>   s$   $ 