U
    cNR                    @   s   d dl Z d dl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 d dl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 )    N)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                    sr   z^z*| j jd   | f||W W 4S  tk
rZ   d| _| j jd  Y nX W 5 | j j  X d S )Nz================== Tu   Ошибка )
cmf_importdpcommitloggerinfo	Exception
has_errors	exception)objargskwargs)funcr   r   r   wrapper#   s    z3catch_exception.<locals>.decorator.<locals>.wrapperr   )r.   r/   r   )r.   r   	decorator"   s    	z"catch_exception.<locals>.decoratorr   )r   r1   r   r0   r   catch_exception!   s    r2   c                       sz  e Zd ZdZ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djd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dkd$d%Zed&d'd( Zed)d*d+ Zed,edd-d.Zed/dleed0d1d2Zed3d4d5 Z ed6d7d8 Z!e"j#dd9d:Z$d;d< Z%d=d> Z&e	d?d@dAZ'edBdCdD Z(edBdEdF Z)edGdHdI Z*dJdK Z+dLdM Z,dNdO Z-edPdmdQdRZ.edSdTdU Z/edVdWdX Z0edYdZd[ Z1ed\d]d^ Z2ed_d`da Z3edbdcdd Z4ededfdg Z5dhdi Z6  Z7S )nJiraAPIImportu;   Класс загрузки объектов через APIN)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codeF)super__init__r4   user_keyconncloudmodelsCmfActivitygetdefault_activityZepicsissue_relationssubtasksboardsselected_projectsr)   )r   r4   r,   r-   	__class__r   r   r;   3   s    
zJiraAPIImport.__init__)r5   c                 C   s
   | j  S r   )r4   Z
get_fieldsr   r   r   r   jira_fieldsB   s    zJiraAPIImport.jira_fields)model
field_namer5   c                 C   s&   |sd S | j |gd}|r"|d S d S )N)Zfields_namer   )Zimport_shop_fields)rJ   rK   resr   r   r   _get_field_nameF   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assigneerR   rS   projectZcustomfield_10015Zduedateupdatedcreatedz.namez.watchCountz.votes)rR   watchesZvoteszfields. Nmodel_field	json_path)rI   itemsrA   append)r   Zissue_settingsZdefault_local_attrs_mappingZadditional_json_pathZcustom_field_keyZcustom_fieldr_   r   r   r   _get_issue_import_settingsM   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_settingsl   s
    z'JiraAPIImport._get_user_import_settingsc                  C   s    dddddddddg} | S )NrV   rZ   r]   rO   authorrN   renderedBodyr   )Zcomment_settingsr   r   r   _get_comment_import_settingsu   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   Ключ)rc   re   rg   rZ   ri   bodyr   .   r\   r   )splitlenrI   rA   )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 )Nro   r   rc   r   r\   re   rd   inwardIssueoutwardIssue,)rq   
isinstancedictrA   listra   r!   join)	r+   r_   to_strrK   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_funcrJ   r5   c                    sz   | D ]p}| }|D ]H} ||d |d< ||d |d< |d |d< |j|d< q |j|d |  S d S )Nr_   Zfile_valr^   titleicon)r   fields)r~   rM   rt   r   ra   verbose_name)r   r   rJ   r+   Zobj_settingssettingr}   r   r   r   _get_settings   s    z:JiraAPIImport.tmplt_import_settings.<locals>._get_settingsrp   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+0300rl   u!   Электронная почта)rc   re   rm   )rZ   ri   rn   selectedObjects)r   value)r   r   r   r   r   	TypeModelr4   
get_issuesrb   r?   CmfTask	get_usersrh   	CmfPersonrk   
CmfCommentra   )r   r   issueZ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^   r_   rK   r   r   captionr   )Z_normalize_settingsr#   Zjson_settingsr4   r   	enumerater?   r   r   r~   _normalize_jira_valuera   )r   settingsr}   r   Znumr   r   r   r   r   preview   s    zJiraAPIImport.preview)r   r5   c                 C   sT   i }|D ]F}|d sq| j ||d dd}| |d d |}|||d d < q|S )uC    Преобразование настроек для модели r^   r_   F)r|   rK   )r~   r   )r   r+   r   Znormalized_objr   r   r   r   r   _normalize_obj   s    zJiraAPIImport._normalize_obju:   Обработка исполнителей проекта)settings_usersr5   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_emailr0   )rd   )leftright)
r4   Zget_project_membersr?   
CmfProjectrA   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   rT   tree_parent	list_typeZplan_start_dateZplan_end_dater   Z
filter_obj)r   rA   ra   r?   	CmfFolderr   r   r#   CmfListr   save)
r   rT   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   r6   r   uI   _process_watchers: Не найден наблюдатель задачи N)r4   Zget_watchersr=   r>   _get_personCmfErrorrQ   rO   rP   Z
spectatorsra   commit_with_event)r   	issue_objr   Zwatcherpersonr   r   r   _process_watchers%  s    
zJiraAPIImport._process_watchersu#   Обработка вложенийc                 C   s  g }|d d D ]X}|d }d|krV| dD ]$}t|d r0| dd } qVq0tjj||d}|s|tj| j||d	}|jr|  |j	s| jj
d
|d   |d dr"| jj|d ddddJ}|  |  t|jd"}	|jddD ]}
|	|
 qW 5 Q R X W 5 Q R X n>| jj
d|d   t|jd}	|	|d  W 5 Q R X || qt  | jj
d|j dt|  |S )Nr   
attachmentfilename&r   =rp   r   rT   )r#   rT   r       Пытаемся скачать ZcontenthttpTr   )attachtimeoutstreamwb+    Z
chunk_sizeu   Это не ссылка u   У задачи u    скачали )rq   	mimetypes
guess_typer?   CmfAttachmentrA   r#   
is_changedr   file_existsr&   r'   
startswithr4   jira_requestraise_for_status
upload_diropenfull_path_fileiter_contentwritewarningra   r   r9   rr   )r   r   Z
jira_issueattachmentsZattachment_info	file_nameZparamr   rL   fchunkr   r   r   _process_attachments5  s@    " z"JiraAPIImport._process_attachmentsuB   Обработка упоминаний пользователейc                 C   s  t |d}|jdtdidD ]}z|jdrD| |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jd| d|  W 5 d}~X Y q X q t|S )u]   
        Упоминания пользователей
        confluence-userlink
        html.parserclasszconfluence-userlink)attrszdata-account-idzdata-usernamezdata-linked-resource-idzdata-linked-resource-id_origzdata-username_origu]   Не найдены аттрибуты для определения пользователяhref	href_origTcmf_converteduZ   Не удалось преобразовать ссылку на пользователя : N)r	   find_allrecompiler   rA   r   r(   r   r   r   loginr#   r&   errorr!   )r   rN   Zdoc_souptagr   er   r   r   _process_mentions[  s$    

.zJiraAPIImport._process_mentionsu#   Конвертация ссылок)rN   rT   c                 C   s,  |s|S t |d}|dd D ] }|jdrH| jjd|  q |drx|jd drx| jjd|  q | jjd	|  d
}|j	
 D ]}|jj}|drR|tj|jd krR|jd |jd< |jj|jd< d|jd< t|jd }	|	rH|	d rH|	d drHd|_d|jd< d|jd< d|jd< d} q|dr|tj|jd kr|jd |jd< |jj|jd< d|jd< d} qq|rq d|jddkr|jd dd dd }
| |
}|r |jd |jd< |j|jd< d|jd< q d}|dr*d}|j| }z|dsT| jj | }| jjd|  | jj|dddV}|  d|jd kr|jd rtjd!|jd  tjd"d  d#}n tj|dd dd }tj | jt!j"||d$d%d&|gd'd&|ggd(\}}|#  |j$sbt%|j&d)$}|j'd*d+D ]}|(| qFW 5 Q R X |j)*  |j| |j| d,< d|jd< |+d-g |jj|j|< | jjd.| d/|  W 5 Q R  W q W 5 Q R X t,d0W q  t,k
r  } z| jj-d1| d/|  W 5 d }~X Y q X q t.|S )2Nr   c                 S   s   |  dp|  dS )Nr   src)has_attr)r   r   r   r   <lambda>z      z.JiraAPIImport._process_links.<locals>.<lambda>r   u   Уже обработали r   #u   Это якорь u&   Обрабатываем ссылку Fr   Zsrc_origTr   ZvideoZcontrolsz100%widthZheightr   z/people/r\   /?r   r   r   )r   r   z	text/htmlzContent-TypezContent-Dispositionzfilename\*?=([^;]+))flags"r   rT   r   r   r   r   r   r   Z_origurlu3   Скачали вложение документа r   u#   Неизвестная ссылкаu0   Не удалось скачать ссылку )/r	   r   r   rA   r#   r&   r'   r   r   r   loadr   r   urllibparseZunquote_plusr   r   r   rq   r   r   r4   r   r   Zheadersr   findall
IGNORECASEstripZunquoter   r   r?   r   r   r   r   r   r   r   r$   r%   load_fieldsr(   r   r!   )r   rN   rT   Zmake_previewZ	text_soupr   r   Z
attach_objr   Z	mime_type
account_idr   r   r   rL   r   _r   r   r   r   r   r   _process_linksu  s    
$
 


 



 


.zJiraAPIImport._process_linksu-   Обработка пользователейc                 C   s\  t  }| j D ],}| j r8d| j_| j   d S | jjd|  |d dkrr| jj	d|d   q| 
|| jtjj d }d|| j  d}d}tjjd	d
|d gdgd}|sFtjjddd| dgdgd}|sFtjjdd
|d gd}t|dkr8d| _| jjd|d  dt|  |rF|d }|sfd}tj||d | jd}|D ]}t||||  qj|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r|j s|j!ds|r|"|jj# q|rXt$tjj%|gd d S )Nimport-cancelingu0   Импортируем пользователя ZaccountTypeZ	atlassianu   Неизвестный тип r   ::Fr   r   rd   r   r   r   r   LIKE%r   r   rp   Tu+   Пользователей с именем z > r   )r   r   r#   rg_member_ofZ	only_dataz.evateam.ru)r,   )&setr4   r   r#   	is_cancelrS   r   r&   r'   r   r   r   r?   r   r   r<   rA   rz   rr   r)   r   setattrr   import_originalr   r   CmfPersonGroup
jira_group
user_groupr	  ra   rd   rf   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   | j  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  q
dS )uc   
        Грузим статусы из Jira и сопостовляем с нашими
        r  Nr   r   r   r   r   r   statusCategory)r   r#   status_type)r4   get_statusesr#   r  rS   r   r?   CmfStatusCoderA   r   get_status_typer   r$   r%   )r   rS   Zcmf_status_coder   r   r   r   _process_statuses  s"    



zJiraAPIImport._process_statusesc                 C   s  t  }d}d}| j|d D ]}d|d  d|d  }d|d  d|d  }tjjdd	|gd
}|d dkrzd}	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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 ]L}|jdkrtjjdd|jgdd|gdddggd
sqb|jdd qbqd|d  }d|d  }tjj|d}|stjjd d}
tj||
| jd}||_||_||_|  tjj|d!D ]}|  q*| D ]p\}}| j rnd"| j_| j   qtjjdd#d$| d%gd
}||d&|| jd'}tjf |}|  qB|S )(u)  
        У простого проекта воркфлоу привязан к issue type 1 к 1
        Поэтому надо получит все типы привязанные к проекту, на каждый тип создать WF и замапить через схему
        Nr   SIMPLE::r  (   Simple-схема для проекта r       и типа r   r   r   hierarchyLevelrp   task.epic:defaultr   task.agile:defaultdefault.system:defaultr8   r   templater#   r   Z
project_idZusagesZ
issueTypesworkflowr   r  r  OPENCLOSED!=Tforcer  softdev:default	scheme_wfr  r  %::::%r   
logic_typetarget_workflowcmf_model_namer0  r#   )ry   r4   Zget_issue_for_projectr?   CmfWorkflowrA   r#   r   r   r  _create_status	CmfStatusrz   r  deleteCmfSchemeWfdefault_task_workflowZ!default_subtask_workflow_workflowCmfSchemeWfRuler`   r  rS   CmfLogicType)r   Zjira_project_info	issue_mapZdefault_task_wfZdefault_subtask_wf
issue_typeworkflow_ext_idworkflow_namer'  r9   r%  jira_statusrS   Zscheme_ext_idZscheme_nameschemerulelogic_type_ext_idr4  	rule_dictr   r   r   #_create_schemewf_for_simple_project6  s|    $
 

 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	}|s~tj|| j|d
}||_	|d |_
|d |_|  |S )Nr  r   r  r   r  )r   r   r  r   r   r   )r'  r#   status_coderW   )r   r?   r  rA   r   r  r   r9  r#   r   r   rN   )r   Zjira_status_datar'  Zstatus_ext_idrI  rS   r   r   r   r8  }  s    

zJiraAPIImport._create_statusc                 C   sL  t jjt|d d d}| j| jj d|d d   }|st jjdd}t j|d t|d d |d || j|d	}|	  t
 }| jj|d d
D ]}d|d krd|d  d|d  }d|d  d|d  }t jjdd|gd}	|	s`t jjddd|d  dgd}
t jj|
jdd  dd}|sNt jjdd}t j||| jd}	||	_|		  |	||d < |d D ]*}|d d |d< | ||	}|	  qqt jj|dD ]}|  q| D ]p\}}	| j rd | j_| j	   qHt jjddd| dgd}
|
|	d!|| jd"}t jf |}|	  qd S )#Njira_workflow_schemer   r  zrest/api/2/workflowscheme/r.  r8   r   rW   )r   r   rN   import_raw_jsonr#   r%  r&  	issuetyper   r  r  r  r  r   r   r   r  r1  r2  :r   z:defaultr#  r$  statusesr  r   r/  r  r   r3  )r?   r;  rA   r!   r4   r   r   jsonr#   r   ry   r  r7  r>  r9   rq   r   r8  r=  rz   r:  r`   r  rS   )r   project_infoZ	wf_schemeZwf_scheme_infor%  r?  r@  rA  rB  r'  r4  rC  rS   rE  rF  rG  r   r   r   _process_wf_scheme  s^    &
  
 z JiraAPIImport._process_wf_scheme)project_structc                 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|
  |S )Nr   r   r4  r   r  z ()u   Проект с именем u8    уже существует! Переименуем в r   r   )r#   r   r   )r?   r   rA   r4  r   r   r#   r&   r   r   r   keysr  )r   rR  project_objr   r   r   r   _process_project  s.    "
zJiraAPIImport._process_projectu#   Обработка проектовc                 C   s  | j d d d }|d s"tddd |d D | _| jjd	| j  | jD ]:}z| j rd
| j_| j  W  d S |d }|d }| j	j
|}|di }|r| j	|d  }| || j }n
ddd}|d dkrtjjdd}	nP|d dkrtjjdd}	n2|d dkr6tjjdd}	ntd|d  d| j	| j	j d|d   |d< ||	jj|d tjjddjj|||d  |d!}
|d" }|r| |}||
d#< n4| j	|
d$ gd d% }tjjt|d  d&|
d#< | |
}| j	j
|
d'  D ]r}| j	| }d(|d   }tj| jtj |
d  d)|d  |d*d$d+|gd,\}}|s|!d-g |d.g D ]}|d/ d0kr| j	j
j"|d1 d|d1 d2d3}tj#jd$d4d5|d2  d6gd7}|r|j$%| n| jj&d8|  nV|d/ d9kr`tj| jtj |d: |d d*d$d+|d gd,\}}|j$%| ntd;q|  |j'%| |  q| j	j(|
d$ d<D ]f}z.| j	j
)|d  |d=< |
|d>< | j*%| W n0 tk
r    d?| _+| jj,d@|  Y nX q| -| | j	.|
d$ D ]}| /| q tj0|dAdB}|  d?|_1|jd?dC t2  W qR tk
r   | jj,dD|  Y qRX qRd S )ENr   r   r   	isChecked5   Не выбрали ни одного проекта!c                 S   s$   g | ]}|d  r|d r|d  qS r+   rX  r   r   valr   r   r   r     s       z3JiraAPIImport._process_projects.<locals>.<listcomp>children&   Импортируем проекты r  r   r   leadr   default_import_jira@evateam.comdefault_import_jirard   r   projectTypeKeybusinessproject.base:defaultr8   softwareproject.agile:defaultservice_deskproject.servicedesk:default$   ERROR! Поректы с типом 3    временно не поддерживаютсяz%/rest/projectconfig/1/workflowscheme/rJ  rW   r7   r   r   r4  rN   activitytask_code_prefixrP   r   rK  Z
simplifiedr0  r   ZworkflowSchemer  rn  role:r   r   r   r   r   
rg_membersactorstypeatlassian-user-role-actor	actorUserr6   Zusernamer  r  r1  r2  r   uR   Не удалось привязать пользователя к проекту atlassian-group-role-actorrc   &   Неизвестный тип ролиr   r'   rX   T:   Не удалось импортировать доску delmerT   r   r
  <   Не удалось импортировать проект )3r   r(   rF   r#   r&   r'   r  rS   r   r4   r=   get_projectrA   r   rO  r   r<   r?   r>  r   r   r   r@   rH  Zget_project_schemer;  r!   rW  get_project_rolesvaluesr   r   r  r   r  r   rq  ra   r   	executorsget_all_agile_boardsget_agile_board_configurationrE   r)   r*   process_versionsget_all_project_issues_process_issuer   cmf_deletedr   )r   rootrX   r   r   rP  project_lead	jira_userrP   r4  rR  Zproject_simplifiedrD  rV  role_uri	role_infor   groupis_newactor	user_infor  	sub_groupboardr   tr   r   r   _process_projects  s    





 


zJiraAPIImport._process_projectsc                 C   sR  | j d d d }|d s"tddd |d D | _| jjd	| j  | jD ]}z| j rd
| j_| j  W  d S |d }|d }| j	j
|}|di }|r| j	|d  }| || j }n
ddd}|d dkrtjjdd}	nP|d dkrtjjdd}	n2|d dkr6tjjdd}	ntd|d  d| j	| j	j d|d   |d< ||	jj|d tjjddjj|||d  |d!}
| ||
d"< | |
}| j	j
|
d#  D ]}| j	| }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r| j	j
j |d. d|d. d/d0}| || j }ntj!j|d1 d2}|r|j"#| n| jj$d3|  nV|d, d4kr(tj| jtj|d1 |d d&d'd(|d gd)\}}|j"#| ntd5qH|  |j%#| |  q| j	j&|
d' d6D ]f}z.| j	j
'|d  |d7< |
|d8< | j(#| W n0 tk
r   d9| _)| jj*d:|  Y nX qf| j	+|
d' D ]}| ,| qtj-|d;d<}d9|_.|jd9d= |  t/  W qR tk
rJ   | jj*d>|  Y qRX qRd S )?Nr   r   r   rX  rY  c                 S   s$   g | ]}|d  r|d r|d  qS rZ  r   r[  r   r   r   r   k  s       z7JiraAPIImport._process_projects_box.<locals>.<listcomp>r]  r^  r  r   r   r_  r   r`  ra  rb  rc  rd  re  r8   rf  rg  rh  ri  rj  rk  z$rest/projectconfig/1/workflowscheme/rJ  rW   r7   r   rl  r0  rn  ro  r   rp  r   r   r   rq  rr  rs  rt  ru  r6   rv  rc   r0   uA   Не удалось найти участника проекта rw  rx  ry  r'   rX   Trz  r{  r|  r
  r}  )0r   r(   rF   r#   r&   r'   r  rS   r   r4   r=   r~  rA   r   rO  r   r<   r?   r>  r   r   r   r@   rQ  rW  r  r  r   r   r  r   r>   r  r   rq  ra   r   r  r  r  rE   r)   r*   r  r  r   r  r   )r   r  rX   r   r   rP  r  r  rP   r4  rR  rV  r  r  r   r  r  r  r  r  r  r  r   r  r   r   r   _process_projects_boxf  s    





z#JiraAPIImport._process_projects_boxu   Обработка досокc                 C   s  | j D ]}d}|d dkr$|d }tjj|d d d}d|d  |d< | j|||d	}t  | j|d D ]V}| j	 rd
| j_
| j    dS tjj|d dgd}|rr|j| |  qrt  |d dkr| j|d D ]}| ||}t  | j|d D ]}tjj|d dddgd}|r|drd|j }	tjj|	dddgd}
|
s|tj|	| jd}
d|
_d|j d|j d|
_||
_|
  |jdkrt|jdkr|j| |  n|j| |  qqqdS )u   
        У нас пока нет таких сущностей, так что просто в каждом проекте дублируем доску в виде листа задач
        Zclassicrs  r   rX   r   r  zboard:r   )r   r  NlistsrT  Zscrumcache_status_typer   zcomment-sprint:	log_levelrN   rT   )r   Zfielsr   r#      uB   Задача была в архивном спринте <a href="" target="_blank"></a>r*  rp   )rE   r?   r   rA   r   r   r4   Zget_issues_for_boardr#   r  rS   r   r   r  ra   Zget_sprintsZget_sprint_issuesr   r   r  r   r   rN   rT   r  rr   )r   r  r   rT   Z	board_objr   taskr   Z
sprint_objcomment_ext_idcommentr   r   r   _process_boards  sR    



zJiraAPIImport._process_boardsc                 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  r1  r2  r   )r?   r   rA   )r   r   r   r   r   r     s    zJiraAPIImport._get_personc                 C   s   | j |jjD ]}tjj|d d}|r2|js2q|sHtj||d d}| |d | j	 |_
|j
|_| |d | j	 |_|d |_|d |_||_| |d |_| |jj||_|  qd S )	Nr   r  )rT   r   ri   ZupdateAuthorrY   rZ   rj   )r4   Zget_commentsr   r   r?   r   rA   r  r   r<   rO   rP   Zcmf_modified_byrU   rV   rK  r   rN   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rT| |jj|_| |jj||_|d d2 d3 rp| | |D ]}|j| qt|d d4g D ]*}d5|d  }|jt jj|d q|d d6g D ]*}d5|d  }|jt jj|d q||_|  t   |d d7 d8 r2| !|| |d d9g }t"| j	|| d:|d  }t j#j|d}|st j#|| j	d;}||_$| j%j& d<|d  }d=| d>| d?|_d@|_'|  t   dS )Au   
        Общая логика обработки которая потом разделяется на задачи и эпики
        r   rX   r   r  u$   Не проекта с ключем r   c                 S   s   i | ]}|d  |qS )r   r   )r   fieldr   r   r   
<dictcomp>A  s      z0JiraAPIImport._process_issue.<locals>.<dictcomp>Z	changelogZ	historiesNri   u   Аудит без автора rZ   rp   )rV   rO   r  r`   r  r^   r\   Z
fromStringZtoStringrN   z<br>r   r  r1  rS   r   rm  TZapprovedZrenderedFieldsrW   )rQ   rO   rP   rd   r   Z
issuelinksru   rv   rT   rL  ORr   r2  r4  u2   Пытаемся создать задачу из r   r   r  totalZversionsversion:ZfixVersionsr[   Z
isWatchinglabelszcomment:r  zbrowse/u<   Задача импортирована из Jira: <a href="r  r  r  )(r?   r   rA   r   r   r   r   r   r   r#   r&   r   r  ra   r9  rB   rC   rD   r>  r'   r   r   r   rN   r   r   r  r  r  r   rK  r   r   r   Zprocess_tagsr   rT   r4   r   r  )r   r   ZsprintsrX   ZcommentsZjira_map_fieldshistoryrO   r  itemr   r  ZdiffZnormalized_issuer<   Zissue_linksZ
issue_linkZissue_parentZ	sub_tasksrF  r   r  r   versionr   Ztagsr  r   r   r   r   r  5  s    
 

*

$





zJiraAPIImport._process_issueu&   Обработка всех задачc                 C   sD   | j  }|D ]0}| j r4d| j_| j   d S | | qd S )Nr  )r4   r   r#   r  rS   r   r  )r   Zissuesr   r   r   r   _process_issues  s    


zJiraAPIImport._process_issuesu3   Обработка связей всех задачc                 C   s  | j D ]\}tjj|d}| j | D ]>}tjj|dgd}|sR| jjd|  q"||_|  q"q| jj	
  dddd}| j D ]`\}}z||d	 d
 }|rtjj|d}	ntjj|d	 d d}	|	stjjd
d|d	 d
 gd}	|	s<tj|d	 d | j|d	 d
 d}	|d	 d |	_|d	 d |	_|	  tjj|d d}
|
shtj|d | jd}
tjj|d d d|
_tjj|d d d|
_|	|
_|
  W q   d| _| jjd|d	  d|d  d|d   Y qX q| jj	
  dS )uD   
        Постобработка связей задач
        r  parent_taskrT  uq   Не удалось связать задачи, возможно задача не попала в импорт zsystem.finish:finishzsystem.duplicatezsystem.link)ZBlocksZ	DuplicateZRelatesrs  r   r8   r   r   r   )r   r#   r   ZinwardZoutwardr  ru   rv   Tu.   Не удалось создать связь z out=z in N)rD   r?   r   rA   r#   r&   r   r  r   r$   r%   rC   r`   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_relations  sP    

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  }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rF|jrF|  qFd S )Nr   z"scheme_wf.default_release_workflowrT  release)r   r   r   r   r  r  T)r   r#   r  zlist.release:defaultr8   r   rW   r\   ZarchivedZreleasedr*  r)  )r?   r   rA   r   r4   Zget_project_versions_paginatedr   r#   r>  r4  rT   r   rN   r0  Zdefault_release_workflowr'  r   Zset_default_statusr  r   r   )r   rX   rV  Zrelease_folderZarchive_folderr  r   Zversion_listr   r   r   r    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   rX   r   r   r   r     s     z0JiraAPIImport._process_audit.<locals>.<listcomp>Z
objectItemZtypeNameZISSUE)r4   Zget_audit_recordsrF   print)r   recordr   r   r   _process_audit  s    zJiraAPIImport._process_auditu2   Обработка логических типовc                 C   sj  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  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  qhdS )(u$   Маппим issueType в logic_type   Подзадачаztask.sub:default)r   r9   Z	UserStoryztask.userstory:defaultz
Task Agiler"  Bugztask.bug:defaultEpicr!  )zSub-taskZSubtaskr  ZStoryu   ИсторияZTasku   Задачаr  u   Багu   Эпикr  u-   Обрабатываем тип задачи r  Nr   r9   r   r   r  r  r   Tr
  r  r1  r2  r   u   Ищем по имени "r   ZILIKEu*   Не нашли, создаем новыйr   r   rp   ZsubtaskrW   r   )r   r   rN   r6  r%  )r4   Zget_issue_typesr#   r&   r'   r  rS   r   rA   r?   r>  r   r   r=   r>   ry   r   r   r   )r   Z	name2coder@  Zlogic_type_dictr4  Ztemplate_coder%  r   r   r   _process_issue_type  sx    

 

z!JiraAPIImport._process_issue_typeu2   Обработка бизнес-процессовc                    sL  i }| j  D ]}|||d < q| j  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 ]L}|jdkr@tjj	dd|jgdd gdddggds@q|jdd q|d D ]}| j rd| 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|	_|	  qXq*dS )u   Импортируем workflowr   r  Nr   r  ZentityIdr  r"  r8   )r   r%  rW   rN  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 Вероятно, сломали создание статусов!to)r4   r  Zget_workflowsr#   r  rS   r   r?   r7  rA   rN   r   r8  r9  rz   r  r:  r   ZCmfTransZstatus_fromrr   AssertionErrorZ	status_to)r   Zjira_statusesrC  Zjira_workflowZworkflow_idZtemplate_workflowrS   Zjira_transitionZtransition_ext_idZ
transitionZstatus_from_ext_id_listZstatus_to_ext_idr   r  r   _process_workflowH  sV    


& 



zJiraAPIImport._process_workflowu    Обработка схем БПc              
   C   sj  | j  D ]X}| 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 |}|  qq
d S )Nr  r   r  ZdefaultWorkflowr2  r   u+   Не импортировался workflow r   rW   r\   r   r9   r.  )r   rN   r   r%  r<  r   r/  ZissueTypeMappingsr1  r   )r4  r5  r6  r0  )r4   Zget_workflow_schemer#   r  rS   r   r?   r7  rA   r  r!   r   r   r;  r=  rz   r:  r`   r>  )r   Zworkflow_schemer<  Zscheme_dictZworkflow_scheme_objr  rE  rF  rB  r4  r'  rG  r   r   r   _process_workflow_scheme  sJ    



 

z&JiraAPIImport._process_workflow_schemec                 C   sb  d| j _| j   t  d| j _| j   t  |   d| j _| j   |   t  |   d| j _| j   t  | jjj	r| 
  d| j _| j   t  | jjj	r|   d| j _| j   t  | jjj	r|   n|   d| j _| j   t  |   d| j _| j   t  |   d	| j _| j   t  |   d
| j _| j   | j S )Nrp   
         (   2   <   F   P   d   )r#   Zprogressr   r   r  r  r  r4   r=   r>   r  r  r  r  r  r  r  r)   r   r   r   r   process_import  sV    













zJiraAPIImport.process_import)T)r   r   )T)N)8r   r   r   r    r   r;   r
   r   r!   ry   rI   staticmethodr   r   r   rM   rb   rh   rk   rt   r~   r   r   r   r2   r   r   r   r   r   r   r  r  r  r?   r;  rH  r8  rQ  rW  r  r  r  r  r   r  r  r  r  r  r  r  r  r  r  __classcell__r   r   rG   r   r3   0   s   

	,%  


%^
J
G1
 
w
8l
	
1



D
9
"r3   )!Zdataclassesr   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.includeZmarkdownr?   r   r   r   r   Z	dataclassr   r2   r3   r   r   r   r   <module>   s    $ 