U
    ڃrc                     @   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                       sD  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d`d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dad$d%Zed&d'd( Zed)d*d+ Zed,edd-d.Zed/dbeed0d1d2Zed3d4d5 Z ed6d7d8 Z!e"j#dd9d:Z$d;d< Z%ed=d>d? Z&ed@dAdB Z'dCdD Z(dEdF Z)dGdH Z*edIdcdJdKZ+edLdMdN Z,edOdPdQ Z-edRdSdT Z.edUdVdW Z/edXdYdZ Z0ed[d\d] Z1d^d_ Z2  Z3S )dJiraAPIImportu;   Класс загрузки объектов через APIN)jirareturnc                    sR   t  j|| || _tjjdd| _i | _i | _i | _	i | _
g | _g | _d| _d S )NZsoftdevcodeF)super__init__r4   modelsZCmfActivitygetdefault_activityZepicsblocked_tasksdepended_taskssubtasksboardsselected_projectsr)   )r   r4   r,   r-   	__class__r   r   r9   3   s    zJiraAPIImport.__init__)r5   c                 C   s
   | j  S r   )r4   Z
get_fieldsr   r   r   r   jira_fields@   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)rE   rF   resr   r   r   _get_field_nameD   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assigneerM   rN   projectZcustomfield_10015Zduedateupdatedcreatedz.namez.watchCountz.votes)rM   ZwatchesZvoteszfields. Nmodel_field	json_path)rD   itemsr;   append)r   Zissue_settingsZdefault_local_attrs_mappingZadditional_json_pathZcustom_field_keyZcustom_fieldrY   r   r   r   _get_issue_import_settingsK   s2    

z(JiraAPIImport._get_issue_import_settingsc                  C   s    dddddddddg} | S )Nr   displayNamerW   emailemailAddressdoes_not_workactiver   )Zuser_settingsr   r   r   _get_user_import_settingsj   s
    z'JiraAPIImport._get_user_import_settingsc                  C   s    dddddddddg} | S )NrQ   rU   rW   rJ   authorrI   renderedBodyr   )Zcomment_settingsr   r   r   _get_comment_import_settingss   s
    z*JiraAPIImport._get_comment_import_settingsc                 C   sX   dddddddd}||kr$|| S | d	}t|d
kr>dS | j|d
 i ddS )N   ИмяZEmailu   Активныйu   Созданоu
   Автор
   Текстu   Ключ)r]   r_   ra   rU   rc   bodyr   .   rV   r   )splitlenrD   r;   )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 )Nri   r   r]   r   rV   r_   r^   inwardIssueoutwardIssue,)rk   
isinstancedictr;   listr[   r!   join)	r+   rY   to_strrF   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_funcrE   r5   c                    sz   | D ]p}| }|D ]H} ||d |d< ||d |d< |d |d< |j|d< q |j|d |  S d S )NrY   Zfile_valrX   titleicon)r   fields)rx   rH   rn   r|   r[   verbose_name)ry   rz   rE   r+   Zobj_settingssettingrw   r   r   r   _get_settings   s    z:JiraAPIImport.tmplt_import_settings.<locals>._get_settingsrj   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+0300rf   u!   Электронная почта)r]   r_   rg   )rU   rc   rh   selectedObjects)r   value)r   r   r   r   r   	TypeModelr4   
get_issuesr\   r:   CmfTask	get_usersrb   	CmfPersonre   
CmfCommentr[   )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}   rX   rY   rF   r   r   captionr   )Z_normalize_settingsr#   Zjson_settingsr4   r   	enumerater:   r   r~   rx   _normalize_jira_valuer[   )r   settingsrw   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    Преобразование настроек для модели rX   rY   F)rv   rF   )rx   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   )r^   )leftright)
r4   Zget_project_membersr:   
CmfProjectr;   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==ZcompleteDateZsys_typearchivefilterext_ididr   Z	startDateZendDate)r   rO   tree_parent	list_typeZplan_start_dateZplan_end_dater   Z
filter_obj)r   r;   r[   r:   Z	CmfFolderr   r   r#   ZCmfListr   save)
r   rO   r   Zparent_sys_typer   _filterr   r   Zlist_objnewr   r   r   _process_list
  s*    


zJiraAPIImport._process_listu8   Обработка наблюдателей задачиc                 C   sl   | j |d D ]P}| |d }|s4td| ||jks||jks||jkrTq|j| qt	  dS )u;   Добавляем наблюдателей в задачуr   	accountIduI   _process_watchers: Не найден наблюдатель задачи N)
r4   Zget_watchers_get_personCmfErrorrL   rJ   rK   Z
spectatorsr[   commit_with_event)r   	issue_objr   Zwatcherpersonr   r   r   _process_watchers#  s    zJiraAPIImport._process_watchersu#   Обработка вложенийc           
      C   s.  g }| j |jjD ]}|d }d|krX|dD ]$}t|d r2|dd } qXq2tjj	||d}|s~tj| j
||d}|jr|  |js| j j|d d	d
dJ}|  |  t|jd"}|jddD ]}	||	 qW 5 Q R X W 5 Q R X || qt  | j
jd|j dt|  |S )Nfilename&r   =rj   r   rO   )r#   rO   r   Zcontentr   Ttimeoutstreamwb+    Z
chunk_sizeu   У задачи u    скачали )r4   Zget_attachmentsr   r   rk   	mimetypes
guess_typer:   CmfAttachmentr;   r#   Z
is_changedr   file_existsjira_requestraise_for_status
upload_diropenfull_path_fileiter_contentwriter[   r   r&   r'   r7   rl   )
r   r   attachmentsZattachment_info	file_nameZparamZ
attachmentrG   fchunkr   r   r   _process_attachments0  s6      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   r;   r   r(   r   r   r   loginr#   r&   errorr!   )r   rI   Zdoc_souptagr   er   r   r   _process_mentionsP  s$    

.zJiraAPIImport._process_mentionsu#   Конвертация ссылок)rI   rO   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rN|tj|jd krN|jd |jd< |jj|jd< d|jd< t|jd }	|	rD|	d rD|	d drDd|_
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sP| 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#s^t$|j%d)$}|j&d*d+D ]}|'| qBW 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>o      z.JiraAPIImport._process_links.<locals>.<lambda>r   u   Уже обработали r   #u   Это якорь u&   Обрабатываем ссылку Fr   Zsrc_origTr   ZvideoZcontrolsz100%widthZheightr   z/people/rV   /?Zhttpu    Пытаемся скачать r   r   z	text/htmlzContent-TypezContent-Dispositionzfilename\*?=([^;]+))flags"r   rO   r   r   r   r   r   r   Z_origurlu3   Скачали вложение документа r   u#   Неизвестная ссылкаu0   Не удалось скачать ссылку ).r	   r   r   r;   r#   r&   r'   r   
startswithr   r   r   urllibparseZunquote_plusr   r   r   rk   r   r   r4   r   r   Zheadersr   findall
IGNORECASEstripZunquoter   r   r:   r   r   r   r   r   r   r   r$   r%   load_fieldsr(   warningr!   )r   rI   rO   Zmake_previewZ	text_soupr   r   Z
attach_objr   Z	mime_type
account_idr   r   r   rG   Zattach_r   r   r   r   r   r   _process_linksj  s    
$
 


 



 


.zJiraAPIImport._process_linksu-   Обработка пользователейc           	      C   sj  t  }| j D ]:}| j r8d| j_| j   d S | jjd|  | 	|| j
tjj d }d|d  d}tj| jtj|dddd	| d	gd
d|d ggd\}}|ddg |jr||jkr|j |d  d|_n||_tj }tj }|j| |j| |jdd |jr|js|jds|r||jj q|rfttjj|gd d S )Nimport-cancelingu0   Импортируем пользователя r}   ::r   ORr   LIKE%r   r   r^   r   rg_member_ofTZ	only_dataz.evateam.ru)r,   )setr4   r   r#   	is_cancelrN   r   r&   r'   r   r   r:   r   r~   r   r   r   r   CmfPersonGroup
jira_group
user_groupr   r[   r^   r`   endswithaddr   Zcmf_deferred_taskZregister_persons)	r   Znew_user_emailsuserZ	user_normr   Zuser_objZ
is_createdr   r  r   r   r   _process_users  s>    





zJiraAPIImport._process_usersu#   Обработка статусовc                 C   s   | j j }|D ]}| j r6d| j_| j   dS t|d d }dd|d d gdd| j	gg}t
jj|d	}|st
j||d d | j	|d d
 | jd}|d |_|  q| jj  dS )uc   
        Грузим статусы из Jira и сопостовляем с нашими
        r   NstatusCategoryr   r   ILIKEworkflowr   r   Z	colorName)status_typer   r  Zcolorr#   r   )r4   connZget_all_statusesr#   r   rN   r   r   Zget_status_typeZdefault_workflowr:   	CmfStatusr;   r   r$   r%   )r   jira_statusesrN   r	  r   Z
cmf_statusr   r   r   _process_statuses  s(    


 


zJiraAPIImport._process_statusesc                 C   sz  t  }d}d}| j|d D ]R}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
D ]}|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 r0d| j_| j   qvtjjddd | d!gd
}||d"|| jd#}tjf |}|  q|S )$u)  
        У простого проекта воркфлоу привязан к issue type 1 к 1
        Поэтому надо получит все типы привязанные к проекту, на каждый тип создать WF и замапить через схему
        Nr   zSIMPLE::r   u(   Simple-схема для проекта r   u    и типа r   r   r   hierarchyLevelrj   task.epic:defaultr   task.agile:defaultzdefault.system:defaultr6   )r   templater#   r   )Z
project_idZusagesZ
issueTypesr  r   Tforcer   softdev:default	scheme_wfr   r   %::::%r   )
logic_typetarget_workflowcmf_model_namer  r#   )rs   r4   Zget_issue_for_projectr:   CmfWorkflowr;   r#   r   r   get_statuses_create_statusr  rt   deleteCmfSchemeWfdefault_task_workflowZ!default_subtask_workflow_workflowCmfSchemeWfRulerZ   r   rN   CmfLogicType)r   Zjira_project_infoZ	issue_mapZdefault_task_wfZdefault_subtask_wf
issue_typeZworkflow_ext_idworkflow_namer  r7   r  jira_statusrN   Zscheme_ext_idZscheme_nameschemerulelogic_type_ext_idr  	rule_dictr   r   r   #_create_schemewf_for_simple_project  sl    $"
 z1JiraAPIImport._create_schemewf_for_simple_projectc                 C   s   |j  d|d  }d}|d  dkr.d}n@|d  dkrDd}n*|d  dkrZd}ntd	|d  d
 tjjdd|gdd|ggd}|stjjdd|gddd gdd|ggd}|stj|| jd}||_||_|d |_	|d |_
|  |S )Nr   r   Zin_progressr  Ztodor   Zdoneclosedu/   ERROR! Неизвестный statusCategory = u   , взяли in_progressr  r   r   r   r	  )r  r#   r   rR   )r   lowerprintr:   r  r;   r#   r	  r   r   rI   r   )r   Zjira_status_datar  Zstatus_ext_idZeva_status_categoryrN   r   r   r   r  X  s0    

zJiraAPIImport._create_statusu#   Обработка проектовc                 C   sP  | j d d d }|d s"tddd |d D | _| jD ]}z| j rjd	| j_| j  W  d S | jj	|d
 }|d }|r| 
|}||d< n4| j|d
 gd d }tjjt|d d|d< tj| jtj|d
d|d
 gd\}}| jj|d  D ]V}| j| }	d|	d  }
tj| jtj|d  d|	d  |
dd
d|
gd\}}|sx|dg |	dg D ]}|d dkr| jjj|d d|d dd}tjjd
dd|d  d gd!}|j| nV|d d"kr8t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 qv| j$|d
 D ]}| %| qtj&|d*d+}|  t'  W q< tk
rH   | jj"#d,|  Y q<X q<d S )-Nr   r   r   	isCheckedu5   Не выбрали ни одного проекта!c                 S   s$   g | ]}|d  r|d r|d  qS )r+   r0  r   )r   valr   r   r   r   ~  s       z3JiraAPIImport._process_projects.<locals>.<listcomp>Zchildrenr   r   Z
simplifiedr  ZworkflowSchemer   r  r   r   Ztask_code_prefixzrole:r   r   )r   r   
rg_membersZactorstypezatlassian-user-role-actorZ	actorUserr   )Zusernamer   r   r  r  r   zatlassian-group-role-actorr]   u&   Неизвестный тип роли)r   r'   rS   Tu:   Не удалось импортировать доску Zdelme)rO   r   u<   Не удалось импортировать проект )(r   r(   rA   r#   r   rN   r   r4   r
  Zget_projectr,  Zget_project_schemer:   r!  r;   r!   r   r   r   Zget_project_rolesvaluesr   Zjsonr   r   r  r   r2  r[   Z	executorsZget_all_agile_boardsZget_agile_board_configurationr@   r)   r&   r*   Zget_all_project_issues_process_issuer   r   )r   rootrS   Zproject_infoZproject_simplifiedr(  Zproject_objr   Zrole_uriZ	role_infor   groupis_newZactorZ	user_infor  Z	sub_groupboardr   tr   r   r   _process_projectsy  s    



 

 

zJiraAPIImport._process_projectsu   Обработка досокc           	      C   sR  | j D ]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 ]6}tjj|d dgd}|r|j| |  qqqdS )u   
        У нас пока нет таких сущностей, так что просто в каждом проекте дублируем доску в виде листа задач
        Zclassicr3  r   rS   r   r  zboard:r   )r   r   Nlistsr   r}   Zscrum)r@   r:   r   r;   r   r   r4   Zget_issues_for_boardr#   r   rN   r   r   r<  r[   Zget_sprintsZget_sprint_issues)	r   r9  r   rO   Z	board_objr   taskr   Z
sprint_objr   r   r   _process_boards  s:    


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   t jjddd| dgdS )Nr   r   r  r  r   )r:   r   r;   )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 d |_	|j	|_
| |d d |_|d |_|d |_||_| |d	 |_| |jj||_|  qd S )
Nr   r  )rO   r   rc   r   ZupdateAuthorrT   rU   rd   )r4   Zget_commentsr   r   r:   r   r;   Zimport_originalr   rJ   rK   Zcmf_modified_byrP   rQ   import_raw_jsonr   rI   r   r   )r   r>  commentZ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 | jt jj d }|d |dd}|d D ]h}	|	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! }|D ]}d"|kr|d" d }| j|d g }|
| || j|d < n@d#|kr|d# d }| j|d g }|
| || j|d < q|r8||d$< ||d%< |pHg }|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*< tj| jt j|dd+|d gd,\}}| | |jr | |jj|_| |jj||_| | |D ]}|j
| q.||_|  t  | || |d d-g }t| j|| t  d.S )/u   
        Общая логика обработки которая потом разделяется на задачи и эпики
        r}   rS   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	historiesrc   rU   rj   )rQ   rJ   Z	log_levelrZ   rE  rX   rV   Z
fromStringZtoStringrI   z<br>r   r   r  rN   r   ZactivityTZapprovedZrenderedFieldsrR   Z
issuelinksro   rp   commentsrO   Z	issuetyper   r   r  r  r   r   labelsN) r:   r   r;   r   r   r   r~   r   r   rA  r[   r  r<   r=   r>   r?   r$  r   r   r#   r   rI   r   r   r   rD  r<  rB  r   r   r   Zprocess_tags)r   r   ZsprintsrS   rG  Zjira_map_fieldshistoryrJ   rC  itemr   rE  ZdiffZnormalized_issueZissue_linksZ
issue_linkZlinked_issue_keyZtasksZissue_parentZ	sub_tasksr*  r   r   r   Ztagsr   r   r   r5    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   rN   r   r5  )r   Zissuesr   r   r   r   _process_issuest  s    


zJiraAPIImport._process_issuesu3   Обработка связей всех задачc                 C   sf  | j D ]\}tjj|d}| j | D ]>}tjj|dgd}|sR| jjd|  q"||_|  q"q| jj	
  | jD ]b}tjj|dgd}| j| D ]8}tjj|d}|s| jjd|  q|j| q|  qv| jj	
  | jD ]h}tjj|dgd}| j| D ]>}tjj|d}|s<| jjd|  q|j| q|  q| jj	
  dS )uD   
        Постобработка связей задач
        r  parent_taskr=  uq   Не удалось связать задачи, возможно задача не попала в импорт affected_tasksr>   N)r?   r:   r   r;   r#   r&   r   rL  r   r$   r%   r=   rM  r[   r>   )r   Zparent_ext_idrL  Zchild_ext_idZ
child_taskr   r   r   _process_relations~  s<    




z JiraAPIImport._process_relationsu   Обработка аудитаc                 C   s:   | j dd | jD D ]}|d d dkrt| qdS )u)   
        Грузим аудит
        c                 S   s   g | ]}|d  qS r  r   )r   rS   r   r   r   r     s     z0JiraAPIImport._process_audit.<locals>.<listcomp>Z
objectItemZtypeNameZISSUEN)r4   Zget_audit_recordsrA   r/  )r   recordr   r   r   _process_audit  s    zJiraAPIImport._process_auditu2   Обработка логических типовc                 C   sP  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}|r|jrd|d  |j |_nd|d  d|_|jdd qh| jjd  d}|d! d"krd}n|d! d#krd}t	j
jdd|gd}t|d |d  |d$ d%|d&}tj| jt	j
|dd|d gd' t  qhdS )(u$   Маппим issueType в logic_type   Подзадачаztask.sub:default)r   r7   Z	UserStoryztask.userstory:defaultz
Task Agiler  Bugztask.bug:defaultEpicr  )zSub-taskZSubtaskrQ  ZStoryu   ИсторияZTasku   ЗадачаrR  u   Багu   ЭпикrS  u-   Обрабатываем тип задачи r   Nr   r7   r   r   )r   r}   r   r   Tr   r   r  r  r   u   Ищем по имени "r   r  u*   Не нашли, создаем новыйr  r   rj   rR   r   )r   r   rI   r  r  r   )r4   Zget_issue_typesr#   r&   r'   r   rN   r   r;   r:   r$  r   r   rs   r   r   r   )r   Z	name2coder%  Zlogic_type_dictr  Ztemplate_coder  r   r   r   _process_issue_type  st    

 
z!JiraAPIImport._process_issue_typeu2   Обработка бизнес-процессовc                    s  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D ]}|jdd q|d D ]}| j rBd| j_| j    dS  j d|d  }tjj	| d}	|	sztj| d}	|d |	_|d |	_
 fdd|d D }
tjjdd|
gd|	_t|	jt|
kstd j d|d  }tjj	|d|	_|	  qq*dS )u   Импортируем workflowr   r   Nr   r   ZentityIdr  r  r6   )r   r  rR   Zstatusesr  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   rN   r   r:   r  r;   rI   r   r  r  rt   r   r   ZCmfTransZstatus_fromrl   AssertionErrorZ	status_to)r   r  r'  Zjira_workflowZworkflow_idZtemplate_workflowrN   Zjira_transitionZtransition_ext_idZ
transitionZstatus_from_ext_id_listZstatus_to_ext_idr   rV  r   _process_workflow  sJ    


"


zJiraAPIImport._process_workflowu    Обработка схем БПc              
   C   sf  | j  D ]T}| j r2d| j_| j   d S tjjdd|d  dgd}|sft	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defaultWorkflowr  r   u+   Не импортировался workflow r   rR   r   r7   r  )r   rI   r   r  r"  r   r  ZissueTypeMappingsr  r   )r  r  r  r  )r4   Zget_workflow_schemer#   r   rN   r   r:   r  r;   rZ  r!   r   r   r!  r#  rt   r   rZ   r$  )r   Zworkflow_schemer"  Zscheme_dictZworkflow_scheme_objr8  r)  r*  r&  r  r  r+  r   r   r   _process_workflow_scheme#  sJ    


 

z&JiraAPIImport._process_workflow_schemec                 C   s2  d| j _| j   t  d| j _| j   t  |   d| j _| j   t  |   d| j _| j   t  |   d| j _| j   t  |   d| j _| j   t  |   d| j _| j   t  | 	  d| j _| j   t  | 
  d	| j _| j   t  |   d
| j _| j   | j S )Nrj   
         (   2   <   F   P   d   )r#   Zprogressr   r   r  rT  r[  r\  r;  r?  rN  rP  r)   r   r   r   r   process_importF  sL    









zJiraAPIImport.process_import)T)r   r   )T)N)4r   r   r   r    r   r9   r
   r   r!   rs   rD   staticmethodr   r   r   rH   r\   rb   re   rn   rx   r   r   r   r2   r   r   r   r   r   r   r   r  r  r:   r!  r,  r  r;  r?  rA  r   rD  r5  rK  rN  rP  rT  r[  r\  rf  __classcell__r   r   rB   r   r3   0   st   

	,%  


^
5
A!
^
)V
	
#

A
5
"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    $ 