U
    @c:                    @   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                       s\  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ddd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ded$d%Zed&d'd( Zed)d*d+ Zed,edd-d.Zed/dfe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d?dBdC Z(edDdEdF Z)dGdH Z*dIdJ Z+dKdL Z,edMdgdNdOZ-edPdQdR Z.edSdTdU Z/edVdWdX Z0edYdZd[ Z1ed\d]d^ Z2ed_d`da Z3dbdc Z4  Z5S )hJiraAPIImportu;   Класс загрузки объектов через APIN)jirareturnc                    sh   t  j|| || _d| _| jjjr*d| _tjjdd| _	i | _
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blocked_tasksdepended_tasks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_fieldsC   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)rK   rL   resr   r   r   _get_field_nameG   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assigneerS   rT   projectZcustomfield_10015Zduedateupdatedcreatedz.namez.watchCountz.votes)rS   watchesZvoteszfields. Nmodel_field	json_path)rJ   itemsrA   append)r   Zissue_settingsZdefault_local_attrs_mappingZadditional_json_pathZcustom_field_keyZcustom_fieldr`   r   r   r   _get_issue_import_settingsN   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_settingsm   s
    z'JiraAPIImport._get_user_import_settingsc                  C   s    dddddddddg} | S )NrW   r[   r^   rP   authorrO   renderedBodyr   )Zcomment_settingsr   r   r   _get_comment_import_settingsv   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   Ключ)rd   rf   rh   r[   rj   bodyr   .   r]   r   )splitlenrJ   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 )Nrp   r   rd   r   r]   rf   re   inwardIssueoutwardIssue,)rr   
isinstancedictrA   listrb   r!   join)	r+   r`   to_strrL   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_funcrK   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   rN   ru   r   rb   verbose_name)r   r   rK   r+   Zobj_settingssettingr~   r   r   r   _get_settings   s    z:JiraAPIImport.tmplt_import_settings.<locals>._get_settingsrq   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+0300rm   u!   Электронная почта)rd   rf   rn   )r[   rj   ro   selectedObjects)r   value)r   r   r   r   r   	TypeModelr4   
get_issuesrc   r?   CmfTask	get_usersri   	CmfPersonrl   
CmfCommentrb   )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`   rL   r   r   captionr   )Z_normalize_settingsr#   Zjson_settingsr4   r   	enumerater?   r   r   r   _normalize_jira_valuerb   )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}   rL   )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   )re   )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==ZcompleteDateZsys_typearchivefilterext_ididr   Z	startDateZendDate)r   rU   tree_parent	list_typeZplan_start_dateZplan_end_dater   
filter_obj)r   rA   rb   r?   Z	CmfFolderr   r   r#   ZCmfListr   save)
r   rU   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CmfErrorrR   rP   rQ   Z
spectatorsrb   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 ]}|d }d|krT| dD ]$}t|d r.| dd } qTq.tjj||d}|szt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 )Nr   
attachmentfilename&r   =rq   r   rU   )r#   rU   r   Zcontentr   Ttimeoutstreamwb+    Z
chunk_sizeu   У задачи u    скачали )rr   	mimetypes
guess_typer?   CmfAttachmentrA   r#   
is_changedr   file_existsr4   jira_requestraise_for_status
upload_diropenfull_path_fileiter_contentwriterb   r   r&   r'   r9   rs   )r   r   Z
jira_issueattachmentsZattachment_info	file_nameZparamr   rM   fchunkr   r   r   _process_attachments6  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   rA   r   r(   r   r   r   loginr#   r&   errorr!   )r   rO   Zdoc_souptagr   er   r   r   _process_mentionsV  s$    

.zJiraAPIImport._process_mentionsu#   Конвертация ссылок)rO   rU   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>u      z.JiraAPIImport._process_links.<locals>.<lambda>r   u   Уже обработали r   #u   Это якорь u&   Обрабатываем ссылку Fr   Zsrc_origTr   ZvideoZcontrolsz100%widthZheightr   z/people/r]   /?Zhttpu    Пытаемся скачать r   r   z	text/htmlzContent-TypezContent-Dispositionzfilename\*?=([^;]+))flags"r   rU   r   r   r   r   r   r   Z_origurlu3   Скачали вложение документа r   u#   Неизвестная ссылкаu0   Не удалось скачать ссылку ).r	   r   r   rA   r#   r&   r'   r   
startswithr   r   r   urllibparseZunquote_plusr   r   r   rr   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   rO   rU   Zmake_previewZ	text_soupr   r   Z
attach_objr   Z	mime_type
account_idr   r   r   rM   Zattach_r   r   r   r   r   r   _process_linksp  s    
$
 


 



 


.zJiraAPIImport._process_linksu-   Обработка пользователейc                 C   s6  t  }| j D ]}| j r8d| j_| j   d S | jjd|  | 	|| j
tjj d }d|| j  d}d}tjjdd|d gd	gd
}|s tjjddd| dgd	gd
}|s tjjdd|d gd}t|dkrd| _| jjd|d  dt|  |r |d }|s@d}tj||d | jd}|D ]}t||||  qD|jrt|jrt|  |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|r2t#tjj$|gd d S )Nimport-cancelingu0   Импортируем пользователя r   ::Fr   r   re   r   r   r   r   LIKE%r   r   rq   Tu+   Пользователей с именем z > r   )r   r   r#   rg_member_ofZ	only_dataz.evateam.ru)r,   )%setr4   r   r#   	is_cancelrT   r   r&   r'   r   r   r?   r   r   r<   rA   r{   rs   r)   r   setattrr   import_originalr   r   CmfPersonGroup
jira_group
user_groupr  rb   re   rg   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  sV    

 "

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   	colorName)status_typer   r  colorr#   r   )r4   r=   Zget_all_statusesr#   r  rT   r   r   get_status_typeZdefault_workflowr?   	CmfStatusrA   r   r$   r%   )r   jira_statusesrT   r  r   Z
cmf_statusr   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   hierarchyLevelrq   task.epic:defaultr   task.agile:defaultdefault.system:defaultr8   r   templater#   r   Z
project_idZusagesZ
issueTypesr  r   r  r  r   closed!=Tforcer   softdev:default	scheme_wfr   r  %::::%r   
logic_typetarget_workflowcmf_model_namer-  r#   )rz   r4   Zget_issue_for_projectr?   CmfWorkflowrA   r#   r   r   get_statuses_create_statusr  r{   r  deleteCmfSchemeWfdefault_task_workflowZ!default_subtask_workflow_workflowCmfSchemeWfRulera   r  rT   CmfLogicType)r   Zjira_project_info	issue_mapZdefault_task_wfZdefault_subtask_wf
issue_typeworkflow_ext_idworkflow_namer  r9   r#  jira_statusrT   Zscheme_ext_idZscheme_nameschemerulelogic_type_ext_idr1  	rule_dictr   r   r   #_create_schemewf_for_simple_project/  s|    $
 

 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doner&  u/   ERROR! Неизвестный statusCategory = u   , взяли in_progressr  r   r   r   r  r  r#   r   rX   )r   lowerprintr?   r  rA   r#   r  r   r   rO   r   )r   Zjira_status_datar  status_ext_ideva_status_categoryrT   r   r   r   r6  v  s0    

zJiraAPIImport._create_statusc                 C   s  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 ]}|	j d|d  }t|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}|st j|	| jd"}||_||_|d |_|d |_|d d# |_|	  qqt jj|d$D ]}|  qV| D ]p\}}	| j rd%| j_| j	   qt jjddd| dgd}
|
|	d&|| jd'}t jf |}|	  qnd S )(Njira_workflow_schemer   r*  zrest/api/2/workflowscheme/r+  r8   r   rX   )r   r   rO   import_raw_jsonr#   r#  r$  	issuetyper   r  r   r  r  r   r   r   r  r.  r/  :r   z:defaultr!  r"  statusesr  r   r  r   r  rF  r  r,  r   r   r0  )r?   r8  rA   r!   r4   r   r   jsonr#   r   rz   r5  r4  r;  r9   rr   r   r   r   r  r  r  r   rO   r  r:  r{   r7  ra   r  rT   )r   project_infoZ	wf_schemeZwf_scheme_infor#  r<  r=  r>  r?  r  r1  r@  rI  rJ  rT   rB  rC  rD  r   r   r   _process_wf_scheme  s~    &
  


 z JiraAPIImport._process_wf_schemeu#   Обработка проектов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 |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r t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"< d
d&|g}tj| jtj|
|d'\}}| jj|
d(  D ]V}| 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 |d0 
d
|d0 
d1d2}tj!j
d#d3d4|d1  d5gd6}|j"#| nV|d. d7krFtj| jtj|d8 |d
 d+d#d&|d
 gd'\}}|j"#| ntd9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 ]}| ,| qtj-|d?d@}|  d=|_.|jd=dA t/  W q< tk
rh   | jj)*dB|  Y q<X q<d S )CNr   r   r   	isChecked5   Не выбрали ни одного проекта!c                 S   s$   g | ]}|d  r|d r|d  qS r+   rS  r   r   valr   r   r   r     s       z3JiraAPIImport._process_projects.<locals>.<listcomp>childrenr   r   r   leadr   default_import_jira@evateam.comdefault_import_jirare   r   projectTypeKeybusinessproject.base:defaultr8   softwareproject.agile:defaultservice_deskproject.servicedesk:default$   ERROR! Поректы с типом 3    временно не поддерживаютсяz%/rest/projectconfig/1/workflowscheme/rK  rX   r7   r   r   r1  rO   activitytask_code_prefixrQ   r   Z
simplifiedr-  r   ZworkflowSchemer*  r   r   rh  role:r   r   r   
rg_membersactorstypeatlassian-user-role-actor	actorUserr6   Zusernamer   r  r.  r/  r   atlassian-group-role-actorrd   &   Неизвестный тип ролиr   r'   rY   T:   Не удалось импортировать доску delmerU   r   r  <   Не удалось импортировать проект )0r   r(   rG   r#   r  rT   r   r4   r=   get_projectrA   r   rP  r   r<   r?   r;  r   r   r   r@   rE  Zget_project_schemer8  r!   r   r   r   get_project_rolesvaluesr
  r   r  r   rk  rb   	executorsget_all_agile_boardsget_agile_board_configurationrF   r)   r&   r*   get_all_project_issues_process_issuer   cmf_deletedr   )r   rootrY   r   r   rQ  project_lead	jira_userrQ   r1  project_structZproject_simplifiedrA  r   project_objr   role_uri	role_infor   groupis_newactor	user_infor  	sub_groupboardr   tr   r   r   _process_projects  s    




 

 

zJiraAPIImport._process_projectsc                 C   sb  | j d d d }|d s"tddd |d D | _| jD ]}z| j rjd	| 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r t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
d!|g}| ||d"< tj| jtj|
|d#\}}||_|  | jj|
d$  D ]}| j| }d%|d  }tj| jtj|
d
  d&|d
  |d'd(d!|gd#\}}|sL|d)g |
d*g D ]}|d+ d,kr| jjjr| jjj|d- 
d
|d- 
d.d/}| || j }ntj j
|d0 d1}|r|j!"| n| jj#$d2|  nV|d+ d3kr8tj| jtj|d0 |d
 d'd(d!|d
 gd#\}}|j!"| ntd4qX|  |j%"| |  q| jj&|
d( d5D ]f}z.| jj'|d |d6< |
|d7< | j("| W n0 tk
r   d8| _)| jj#*d9|  Y nX qv| j+|
d( D ]}| ,| qtj-|d:d;}d8|_.|jd8d< |  t/  W q< tk
rZ   | jj#*d=|  Y q<X q<d S )>Nr   r   r   rS  rT  c                 S   s$   g | ]}|d  r|d r|d  qS rU  r   rV  r   r   r   r   Y  s       z7JiraAPIImport._process_projects_box.<locals>.<listcomp>rX  r   r   r   rY  r   rZ  r[  r\  r]  r^  r_  r8   r`  ra  rb  rc  rd  re  z$rest/projectconfig/1/workflowscheme/rK  rX   r7   r   rf  r   r-  r   rh  ri  r   rj  r   rk  rl  rm  rn  ro  r6   rp  rd   r0   uA   Не удалось найти участника проекта rq  rr  rs  r'   rY   Trt  ru  rv  r  rw  )0r   r(   rG   r#   r  rT   r   r4   r=   rx  rA   r   rP  r   r<   r?   r;  r   r   r   r@   rR  r   r   r   rL  ry  rz  r
  r   r>   r  r   rk  rb   r&   r   r{  r|  r}  rF   r)   r*   r~  r  r   r  r   )r   r  rY   r   r   rQ  r  r  rQ   r1  r  r   r  r   r  r  r   r  r  r  r  r  r  r  r   r  r   r   r   _process_projects_boxT  s    


 



z#JiraAPIImport._process_projects_boxu   Обработка досок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classicrm  r   rY   r   r*  zboard:r   )r   r   Nlistsr   r   Zscrum)rF   r?   r   rA   r   r   r4   Zget_issues_for_boardr#   r  rT   r   r   r  rb   Zget_sprintsZget_sprint_issues)	r   r  r   rU   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   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*  )rU   r   rj   ZupdateAuthorrZ   r[   rk   )r4   Zget_commentsr   r   r?   r   rA   r	  r   r<   rP   rQ   Zcmf_modified_byrV   rW   rL  r   rO   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*< | jjd+|  tj| jt j|dd,|d gd-\}}| || |jr6| |jj|_| |jj||_|d d. d/ rR| | |D ]}|j
| qV||_|  t  |d d0 d1 r|  || |d d2g }t!| j|| t  d3S )4u   
        Общая логика обработки которая потом разделяется на задачи и эпики
        r   rY   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	historiesrj   r[   rq   )rW   rP   Z	log_levelra   r  r_   r]   Z
fromStringZtoStringrO   z<br>r   r  r.  rT   r   rg  TZapprovedZrenderedFieldsrX   Z
issuelinksrv   rw   commentsrU   rM  ORr   r/  r1  u2   Пытаемся создать задачу из r   r   r  totalr\   Z
isWatchinglabelsN)"r?   r   rA   r   r   r   r   r   r   r  rb   r  rB   rC   rD   rE   r;  r#   r&   r'   r   r   r   rO   r   r   r   r  r  rL  r   r   r   Zprocess_tags)r   r   ZsprintsrY   r  Zjira_map_fieldshistoryrP   r  itemr   r  ZdiffZnormalized_issueZissue_linksZ
issue_linkZlinked_issue_keyZtasksZissue_parentZ	sub_tasksrC  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  rT   r   r  )r   Zissuesr   r   r   r   _process_issuesl  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_tasksrD   N)rE   r?   r   rA   r#   r&   r   r  r   r$   r%   rC   r  rb   rD   )r   Zparent_ext_idr  Zchild_ext_idZ
child_taskr   r   r   _process_relationsv  s<    




z JiraAPIImport._process_relationsu   Обработка аудита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   rY   r   r   r   r     s     z0JiraAPIImport._process_audit.<locals>.<listcomp>Z
objectItemZtypeNameZISSUE)r4   Zget_audit_recordsrG   rH  )r   recordr   r   r   _process_audit  s    zJiraAPIImport._process_auditu2   Обработка логических типовc                 C   sf  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}| 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  r.  r/  r   u   Ищем по имени "r   r  u*   Не нашли, создаем новыйr  r   rq   ZsubtaskrX   r   )r   r   rO   r3  r#  )r4   Zget_issue_typesr#   r&   r'   r  rT   r   rA   r?   r;  r   r   r=   r>   rz   r   r   r   )r   Z	name2coder=  Zlogic_type_dictr1  Ztemplate_coder#  r   r   r   _process_issue_type  st    

 

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#  rX   rO  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   r5  Zget_workflowsr#   r  rT   r   r?   r4  rA   rO   r   r6  r  r{   r  r7  r   ZCmfTransZstatus_fromrs   AssertionErrorZ	status_to)r   r  r@  Zjira_workflowZworkflow_idZtemplate_workflowrT   Zjira_transitionZtransition_ext_idZ
transitionZstatus_from_ext_id_listZstatus_to_ext_idr   r  r   _process_workflow  sV    


& 



zJiraAPIImport._process_workflowu    Обработка схем БПc              
   C   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   rX   r   r9   r+  )r   rO   r   r#  r9  r   r,  ZissueTypeMappingsr.  r   )r1  r2  r3  r-  )r4   Zget_workflow_schemer#   r  rT   r   r?   r4  rA   r  r!   r   r   r8  r:  r{   r7  ra   r;  )r   Zworkflow_schemer9  Zscheme_dictZworkflow_scheme_objr  rB  rC  r?  r1  r  rD  r   r   r   _process_workflow_scheme#  sJ    


 

z&JiraAPIImport._process_workflow_schemec                 C   sZ  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 )Nrq   
         (   2   <   F   P   d   )r#   Zprogressr   r   r  r  r4   r=   r>   r  r  r  r  r  r  r  r)   r   r   r   r   process_importF  sT    













zJiraAPIImport.process_import)T)r   r   )T)N)6r   r   r   r    r   r;   r
   r   r!   rz   rJ   staticmethodr   r   r   rN   rc   ri   rl   ru   r   r   r   r   r2   r   r   r   r   r   r   r   r  r  r?   r8  rE  r6  rR  r  r  r  r  r   r  r  r  r  r  r  r  r  r  __classcell__r   r   rH   r   r3   0   sz   

	,%  


^
G
G!>
~
y
)X
	
#


C
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    $ 