U
    zecW                     @   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_activity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)rF   rG   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)summarydescriptionZreporterZcreatorZassigneerN   rO   projectZcustomfield_10015Zduedateupdatedcreatedz.namez.watchCountz.votes)rN   ZwatchesZvoteszfields. Nmodel_field	json_path)rE   itemsr;   append)r   Zissue_settingsZdefault_local_attrs_mappingZadditional_json_pathZcustom_field_keyZcustom_fieldr[   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   displayNamerY   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 )NrR   rW   rY   rK   authorrJ   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_   ra   rc   rW   re   bodyr   .   rX   r   )splitlenrE   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 )Nrk   r   r_   r   rX   ra   r`   inwardIssueoutwardIssue,)rm   
isinstancedictr;   listr]   r!   join)	r+   r[   to_strrG   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_funcrF   r5   c                    sz   | D ]p}| }|D ]H} ||d |d< ||d |d< |d |d< |j|d< q |j|d |  S d S )Nr[   Zfile_valrZ   titleicon)r   fields)rz   rI   rp   r~   r]   verbose_name)r{   r|   rF   r+   Zobj_settingssettingry   r   r   r   _get_settings   s    z:JiraAPIImport.tmplt_import_settings.<locals>._get_settingsrl   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+0300rh   u!   Электронная почта)r_   ra   ri   )rW   re   rj   selectedObjects)r   value)r   r   r   r   r   	TypeModelr4   
get_issuesr^   r:   CmfTask	get_usersrd   	CmfPersonrg   
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   rZ   r[   rG   r   r   captionr   )Z_normalize_settingsr#   Zjson_settingsr4   r   	enumerater:   r   r   rz   _normalize_jira_valuer]   )r   settingsry   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    Преобразование настроек для модели rZ   r[   F)rx   rG   )rz   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   rP   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   rP   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 ]|}d|kr(d|d in
d|d i}tjjf |}|sTtd| ||jks||jks||jkrtqt	
| jtj||d qt  dS )	u;   Добавляем наблюдателей в задачуr   ra   r`   r   r_   uW   _process_watchers: Не найден наблюдатель задачи person_filter=r   N)r4   Zget_watchersr:   r   r;   CmfErrorrM   rK   rL   r   r   r#   ZCmfTaskSpectatorscommit_with_event)r   	issue_objr   ZwatcherZperson_filterpersonr   r   r   _process_watchers#  s     zJiraAPIImport._process_watchersu#   Обработка вложенийc                 C   s   g }| j |jjD ]`}| j |d }tjj|d d}|sTtj| j||d d}|j	|dd |
  || qt  | jjd|j dt|  |S )	Ncontentfilenamer0   )r#   rP   r   T)Z	overwriteu   У задачи u    скачали )r4   Zget_attachmentsr   r   Zget_attachment_contentr:   CmfAttachmentr;   r#   Zupload_filer   r]   r   r&   r'   r7   rn   )r   r   attachmentsZattachment_infor   Z
attachmentr   r   r   _process_attachments2  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   r;   _get_personr(   r   r   r   loginr#   r&   errorr!   )r   rJ   Zdoc_souptagr   er   r   r   _process_mentionsC  s$    

.zJiraAPIImport._process_mentionsu#   Конвертация ссылок)rJ   rP   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>b      z.JiraAPIImport._process_links.<locals>.<lambda>r   u   Уже обработали r   #u   Это якорь u&   Обрабатываем ссылку Fr   Zsrc_origTr   ZvideoZcontrolsz100%widthZheightr   z/people/rX   /?Zhttpu    Пытаемся скачать r   )timeoutstreamz	text/htmlzContent-TypezContent-Dispositionzfilename\*?=([^;]+))flags")r   rP   rP   r   r   r   zwb+i    )Z
chunk_sizeZ_origurlu3   Скачали вложение документа r   u#   Неизвестная ссылкаu0   Не удалось скачать ссылку ).r	   r   r   r;   r#   r&   r'   r   
startswithr   r   r   urllibparseZunquote_plusr   	mimetypesZ
guess_typerm   r   r   r4   jira_requestZraise_for_statusZheadersr   findall
IGNORECASEstripZunquoter   r   r:   r   Z
upload_dirZfile_existsopenZfull_path_fileZiter_contentwriter$   r%   load_fieldsr(   warningr!   )r   rJ   rP   Zmake_previewZ	text_soupr   r   Z
attach_obj	file_nameZ	mime_type
account_idr   r   r   rH   Zattach_fchunkr   r   r   r   _process_links]  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   ::	accountIdORr   LIKE%r   r   r`   r   rg_member_ofTZ	only_dataz.evateam.ru)r,   )setr4   r   r#   	is_cancelrO   r   r&   r'   r   r   r:   r   r   r   r   r   r   CmfPersonGroup
jira_group
user_groupr   r]   r`   rb   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   rO   r   r   get_status_typeZdefault_workflowr:   	CmfStatusr;   r   r$   r%   )r   jira_statusesrO   r   r   Z
cmf_statusr   r   r   _process_statuses  s(    


 


zJiraAPIImport._process_statusesc                 C   sj  t  }d}d}| j|d D ]B}|d dkr2qd|d  d|d  }d|d  d	|d  }tjjd
d|gd}d}	|d dkrd}	|stjj|	d}
tj||
| jd}||_|  |s|d dkr|}|s|d dkr|}|||d < | jj	|d dD ],}|d |d d d kr| 
|| qtjjdd|gd
ddggdD ]}|jdd qNq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   qftjjd
dd| d gd}||d!|| jd"}tjf |}|  q|S )#u)  
        У простого проекта воркфлоу привязан к issue type 1 к 1
        Поэтому надо получит все типы привязанные к проекту, на каждый тип создать WF и замапить через схему
        Nr   hierarchyLevelrl   zSIMPLE::r   u(   Simple-схема для проекта r   u    и типа r   =r   task.agile:defaultr   z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#   )ru   r4   Zget_issue_for_projectr:   CmfWorkflowr;   r#   r   r   get_statuses_create_statusr  rv   deleteCmfSchemeWfdefault_task_workflowZ!default_subtask_workflow_workflowCmfSchemeWfRuler\   r   rO   CmfLogicType)r   Zjira_project_infoZ	issue_mapZdefault_task_wfZdefault_subtask_wf
issue_typeZworkflow_ext_idworkflow_namer   r7   r	  jira_statusrO   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   doneclosedu/   ERROR! Неизвестный statusCategory = u   , взяли in_progressr   r   r   r   r   )r   r#   r   rT   )r   lowerprintr:   r  r;   r#   r   r   r   rJ   r   )r   Zjira_status_datar   Zstatus_ext_idZeva_status_categoryrO   r   r   r   r  K  s0    

zJiraAPIImport._create_statusu#   Обработка проектовc                 C   s  | j d d d }|d s"tddd |d D | _| jD ]}| j rdd	| j_| j   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\}}|sr|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r2tj| jtj|d# |d dd
d|d gd\}}|j| ntd$q~|  |j| |  q| jj|d
 d%D ]z}z.| jj|d |d&< ||d'< | j | W nD tk
r } z$d(| _!| jj"#d)| d|  W 5 d }~X Y nX qp| j$|d
 D ]}| %| qq<d S )*Nr   r   r   	isCheckedu5   Не выбрали ни одного проекта!c                 S   s$   g | ]}|d  r|d r|d  qS )r+   r)  r   )r   valr   r   r   r   q  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'   rU   Tu:   Не удалось импортировать доску )&r   r(   rB   r#   r   rO   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   r+  r]   Z	executorsZget_all_agile_boardsZget_agile_board_configurationrA   r)   r&   r*   Zget_all_project_issues_process_issue)r   rootrU   Zproject_infoZproject_simplifiedr   Zproject_objr   Zrole_uriZ	role_infor   groupis_newZactorZ	user_infor   Z	sub_groupboardr   r   r   r   r   _process_projectsl  s    



 

 
0zJiraAPIImport._process_projectsu   Обработка досокc           
      C   sp  | j D ]b}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j|dd}d|_|  t  |d dkr| j|d D ]`}| ||}	t  | j|d D ]6}tjj|d dgd}|r.|j|	 |  q.qqdS )u   
        У нас пока нет таких сущностей, так что просто в каждом проекте дублируем доску в виде листа задач
        Zclassicr,  r   rU   r   r  zboard:r   )r   r   Nlistsr   r   Zdelme)rP   r   TZscrum)rA   r:   r   r;   r   r   r4   Zget_issues_for_boardr#   r   rO   r   r   r4  r]   Zcmf_deletedZget_sprintsZget_sprint_issues)
r   r2  r   rP   Z	board_objr   tasktr   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  )rP   r   re   r   ZupdateAuthorrV   rW   rf   )r4   Zget_commentsr   r   r:   r   r;   Zimport_originalr   rK   rL   Zcmf_modified_byrQ   rR   import_raw_jsonr   rJ   r   r   )r   r6  commentZcmf_commentr   r   r   _process_issue_comments  s    


z%JiraAPIImport._process_issue_commentsu   Обработка задачиc                 C   s|  |d d }t jj|d d d d}|sDtd|d d d  |d d	kr|d d
 |d |d t|d d d d d|d  d}| ||d| j|d < dS g }dd | jt j	j
 d D }|d d D ]}| |d | jt jj
 d }	|d |	dd}
|d D ]p}|d }||d }|r@|d r@d}| ||d |d }d|
krj||
d< n|
d  d | |
d< q||
 q| || 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rb|d+ d }| j|d g }|| || j|d < n@d,|kr|d, d }| j|d g }|| || j|d < q|r||d-< ||d.< |pg }|d d.}|r|d d d d	krn| j|d sZ|d d
 |d |d t|d d d d d|d  d}| ||d| j|d < || j|d   |d/r| j|d g }||d  || j|d < |d dr|| j|d d d s`d0}|d d d1 rd2}|d d d
 |d d d |d d d |d|d d d  d}| ||d | j|d < | j|d d d < || j|d d d   |d d d }t jjd3d!d4|gd!d"d#| d5ggd$|d6< tj| jt j	|d!d7|d gd8\}}| | |jr| |jj|_| |jj||_| | |D ]}|j| q||_|  t   | !|| |d d9g }t"| j|| t   dS ):u   
        Общая логика обработки которая потом разделяется на задачи и эпики
        r   Z	issuetyperU   r   r  u$   Не проекта с ключем r   r   ZEpicrS   rO   r   zepic:)r   r   r7   stater   epicNc                 S   s   i | ]}|d  |qS )r}   r   )r   fieldr   r   r   
<dictcomp>$  s      z0JiraAPIImport._process_issue.<locals>.<dictcomp>Z	changelogZ	historiesre   rW   rl   )rR   rK   Z	log_levelr\   r@  rZ   rX   Z
fromStringZtoStringrJ   z<br>r   r   r  r   ZactivityTZapprovedZrenderedFieldsrT   Z
issuelinksrq   rr   commentsrP   Zsubtaskr   r%  r&  r   r  r  r  r   r   labels)#r:   r   r;   r   r   r  r   r=   r   r   r   r   r   r:  r]   r  r<   r>   r?   r@   r  r   r#   r   rJ   r   r   r   r=  r4  r;  r   r   r   Zprocess_tags)r   r   Zsprintsr  rU   r?  rB  Zjira_map_fieldshistoryrK   r<  itemr   r@  ZdiffZnormalized_issueZissue_linksZ
issue_linkZlinked_issue_keyZtasksZissue_parentr>  r"  r   r   r   Ztagsr   r   r   r.    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   rO   r   r.  )r   Zissuesr   r   r   r   _process_issues  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  rP   r5  uq   Не удалось связать задачи, возможно задача не попала в импорт affected_tasksr?   N)r@   r:   r   r;   r#   r&   r   rP   r   r$   r%   r>   rG  r]   r?   )r   Zparent_ext_idZparent_taskZ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   rU   r   r   r   r     s     z0JiraAPIImport._process_audit.<locals>.<listcomp>Z
objectItemZtypeNameZISSUEN)r4   Zget_audit_recordsrB   r(  )r   recordr   r   r   _process_audit  s    zJiraAPIImport._process_auditu2   Обработка логических типовc                 C   s:  ddddddddddddddddddddddd	ddd	dd
	}| j  D ]}| jjd|  | j rd| j_| j   dS |d dkrqX||d }|rt	j
jdd|d gdgd}|jrd|d  |j |_nd|d  d|_|jdd qXt	j
jddd|d  dgd}|r8qX| 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 qX| jjd  d}|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  qXdS )&u$   Маппим issueType в logic_type   Подзадачаztask.sub:default)r   r7   Z	UserStoryztask.userstory:defaultz
Task Agiler  Bugztask.bug:default)	zSub-taskZSubtaskrK  ZStoryu   ИсторияZTasku   ЗадачаrL  u   Багu-   Обрабатываем тип задачи r   Nr  rl   r   r7   r   r   )r   r   r   r   Tr   r   r  r  r   u   Ищем по имени "r   r   u*   Не нашли, создаем новыйr   rT   r   )r   r   rJ   r  r	  r   )r4   Zget_issue_typesr#   r&   r'   r   rO   r   r;   r:   r  r   r   ru   r   r   r   )r   Z	name2coder  Zlogic_type_dictr  Ztemplate_coder	  r   r   r   _process_issue_type  sp    


 
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	  rT   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   1  s     z3JiraAPIImport._process_workflow.<locals>.<listcomp>fromINuN   DEV: Fatal Вероятно, сломали создание статусов!to)r4   r  Zget_workflowsr#   r   rO   r   r:   r  r;   rJ   r   r  r  rv   r  r   ZCmfTransZstatus_fromrn   AssertionErrorZ	status_to)r   r  r  Zjira_workflowZworkflow_idZtemplate_workflowrO   Zjira_transitionZtransition_ext_idZ
transitionZstatus_from_ext_id_listZstatus_to_ext_idr   rO  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   rT   r   r7   r  )r   rJ   r   r	  r  r   r  ZissueTypeMappingsr  r   )r  r  r  r  )r4   Zget_workflow_schemer#   r   rO   r   r:   r  r;   rS  r!   r   r   r  r  rv   r  r\   r  )r   Zworkflow_schemer  Zscheme_dictZworkflow_scheme_objr1  r!  r"  r  r  r   r#  r   r   r   _process_workflow_scheme8  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 )Nrl   
         (   2   <   F   P   d   )r#   Zprogressr   r   r   rM  rT  rU  r3  r8  rH  rJ  r)   r   r   r   r   process_import[  sL    









zJiraAPIImport.process_import)T)r   r   )T)N)4r   r   r   r    r   r9   r
   r   r!   ru   rE   staticmethodr   r   r   rI   r^   rd   rg   rp   rz   r   r   r   r2   r   r   r   r   r   r   r   r   r  r:   r  r$  r  r3  r8  r:  r   r=  r.  rF  rH  rJ  rM  rT  rU  r_  __classcell__r   r   rC   r   r3   0   st   

	,%  


^
5
A!
W
,}
	
#

@
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    $ 