U
    [d[                    @   s  d dl mZ d dlT d dlZd dlZd dlmZ d dlZd dlm	Z	 d dl
Z
d dlmZmZmZmZmZmZmZ d dlmZ d dlmZ d d	lmZmZmZ d d
lmZ d dlmZ d dlmZ d dl m!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 )    )cmf_context)*N)Path)TemporaryDirectory)DictOptionalListCallableUnionTypeIterator)BeautifulSoup)cached_property)close_all_dscommit_all_dsinit_ds)	BaseModel)CmfPluginImportMixin)JiraApi)JiraBaseImportc                   @   s:   e Zd ZU dZeed< eed< eed< dd Zdd Zd	S )
EpicDatauD    Данные используемые при создании epic namekeyproject_keyc                 C   s
   t | jS N)hashr   self r   ./modules/jira/api_import.py__hash__   s    zEpicData.__hash__c                 C   s   | j |j kS r   )r   )r   otherr   r   r   __eq__"   s    zEpicData.__eq__N)__name__
__module____qualname____doc__str__annotations__r    r"   r   r   r   r   r      s   
r   c                    s    fdd}|S )Nc                    s    fdd}|S )Nc                    sz   zfz*| j jd   | f||W W <S  tk
rb   |  jd7  _| j jd  Y nX W 5 | j j  X d S )Nz==================    u   Ошибка )
cmf_importdpcommitloggerinfo	Exception
has_errors	exception)objargskwargs)funcr   r   r   wrapper(   s    z3catch_exception.<locals>.decorator.<locals>.wrapperr   )r5   r6   r   )r5   r   	decorator'   s    
z"catch_exception.<locals>.decoratorr   )r   r8   r   r7   r   catch_exception&   s    r9   c                       s  e Zd ZU dZeed< eeef ed< e	dd fddZ
eeeef dd	d
Zeeeeee  dddZdd Zeeeef  dddZedd Zedd Zdd ZedddZee dddZee dddZee edd d!Zed"eeef dd#d$d%Zdd(d)Zed*d+d, Zed-d.d/ Zed0eed1d2d3Z d4d5 Z!ed6dee"d7d8d9Z#ed:d;d< Z$ed=d>d? Z%e&j'dd@dAZ(dBdC Z)dDdE Z*dFdG Z+edHdIdJ Z,eedKdLdMZ-edNdOdP Z.edNdQdR Z/edSdTdU Z0edVdWdX Z1dYdZ Z2d[d\ Z3ed]ed^d_d`Z4ed^dadbZ5edcddde Z6edfddgdhZ7edidjdk Z8edldmdn Z9edodpdq Z:edrdsdt Z;edudvdw Z<edxdydz Z=ed{d|d} Z>ed~ddZ?ed~ddZ@dd ZAdd ZBdd ZCdd ZDdd ZEdd ZFdd ZGdd ZHed^ddZIed^ddZJed^ddZKed^ddZLeeMedddZNdd ZOeedddZPdd ZQdd ZRdd ZSdd ZTdd ZUdd ZVdd ZWdd ZX  ZYS )JiraAPIImportu;   Класс загрузки объектов через APIr0   _JiraAPIImport__jira_fieldsN)jirareturnc                    s   t  j|| || _d| _| jjjr*d| _tjjdd| _	i | _
i | _i | _g | _g | _d| _|   td}| jjj|_d | _d S )Nr   	accountIdsoftdevcoder   zatlassian.rest_client)super__init__r<   user_keyconncloudmodelsCmfActivitygetdefault_activityZepicsissue_relationssubtasksboardsselected_projectsr0   _prepare_multiprocessingloggingZ	getLoggerr*   r-   Zhandlersr;   )r   r<   r3   r4   r-   	__class__r   r   rC   <   s     

zJiraAPIImport.__init__)r=   c              	   C   s|   | j r| j S | j d}| rFt|}t|| _ W 5 Q R X n0| j	 | _ t|d}t
| j | W 5 Q R X | j S )Nzfields.jsonw+)r;   r*   get_download_pathjoinpathexistsopenjsonloadr<   Z
get_fieldsdump)r   	file_pathfr   r   r   jira_fieldsP   s    
zJiraAPIImport.jira_fields)model
field_namer=   c                 C   s&   |sd S | j |gd}|r"|d S d S )N)Zfields_namer   )Zimport_shop_fields)r^   r_   resr   r   r   _get_field_name_   s    zJiraAPIImport._get_field_namec                 C   s(   dd l }dd l}|| _ || _tj| _d S )Nr   )	threadingqueueZconfigZIMPORT_THREADSthreading_max_forks)r   rb   rc   r   r   r   rO   g   s    z&JiraAPIImport._prepare_multiprocessingc              	   C   sl   g }ddddddddd	}d
ddd}| j  D ]6\}}d| ||d }|||d|d q0|S )uO    Сопоставление настроек для модели models.CmfTaskr   textprioritystatusZ
alarm_dateZdeadlinecmf_modified_atcmf_created_at)Zsummarydescriptionrf   rg   Zcustomfield_10015Zduedateupdatedcreatedz.namez.watchCountz.votes)rf   watchesZvoteszfields. Nmodel_field	json_path)r]   itemsrI   append)r   Zissue_settingsZdefault_local_attrs_mappingZadditional_json_pathZcustom_field_keyZcustom_fieldrq   r   r   r   _get_issue_import_settingsn   s*    

z(JiraAPIImport._get_issue_import_settingsc                  C   s    dddddddddg} | S )Nr   displayNamero   emailemailAddressdoes_not_workactiver   )Zuser_settingsr   r   r   _get_user_import_settings   s
    z'JiraAPIImport._get_user_import_settingsc                  C   s    dddddddddg} | S )Nri   rl   ro   
cmf_authorauthorre   renderedBodyr   )Zcomment_settingsr   r   r   _get_comment_import_settings   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   Ключ)ru   rw   ry   rl   r|   bodyr   .r)   rn   r   )splitlenr]   rI   )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 )Nr   r   ru   r   rn   rw   rv   inwardIssueoutwardIssue,)r   
isinstancedictrI   listrs   r'   join)	r2   rq   to_strr_   Z
str_fieldsZ	str_fieldZnew_objresultZrelated_objr   r   r   _get_file_val   sH    






zJiraAPIImport._get_file_valc                    sF  g  t ttt f tg tt f ttd fdd}jdg j 	d}|
 r D ]$}|d D ]} qqv|rd qqddD ]} qqn6dd	 jjd
dD d }dd	 jd
D d }|std||jtj |std||jtj ddddddg}||jtj  dg d  S )u-    Инициализация настроек )objssettings_funcr^   r=   c                    sz   | D ]p}| }|D ]H} ||d |d< ||d |d< |d |d< |j|d< q |j|d |  S d S )Nrq   Zfile_valrp   titleicon)r   fields)r   ra   r   r   rs   verbose_name)r   r   r^   r2   Zobj_settingssettingr   r   r   r   _get_settings   s    z:JiraAPIImport.tmplt_import_settings.<locals>._get_settingszplugin.plugin.*projectsidusersc                 S   s   g | ]}|qS r   r   .0r2   r   r   r   
<listcomp>   s     z7JiraAPIImport.tmplt_import_settings.<locals>.<listcomp>r)   limitr   c                 S   s   g | ]}|qS r   r   r   r   r   r   r      s     uS   Не найдено ни одной задачи, импорт невозможенua   Не найдено ни одного пользователя, импорт невозможенz2022-05-22T15:22:22.593+0300r   u!   Электронная почта)ru   rw   r   )rl   r|   r   selectedObjects)r   value)r
   r   r   r   r	   	TypeModelr*   load_fieldsrT   rU   rV   _get_projects_get_project_tasks_simple_getr<   
get_issues	get_usersr/   rt   rG   CmfTaskrz   	CmfPersonr~   
CmfCommentrs   )r   r   Zdump_dirprojecttaskuserZcomment_exampler   r   r   tmplt_import_settings   sB      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   rp   rq   r_   r   r   captionr   )Z_normalize_settingsr*   Zjson_settingsr<   r   	enumeraterG   r   r   r   _normalize_jira_valuers   )r   settingsr   issueZnumr   r   r   r   r   preview  s    zJiraAPIImport.preview)r   r=   c                 C   sT   i }|D ]F}|d sq| j ||d dd}| |d d |}|||d d < q|S )uC    Преобразование настроек для модели rp   rq   F)r   r_   )r   r   )r   r2   r   Znormalized_objr   r   r   r   r   _normalize_obj  s    zJiraAPIImport._normalize_obju:   Обработка исполнителей проекта)settings_usersr=   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_emailr7   )rv   )leftright)
r<   Zget_project_membersrG   
CmfProjectrI   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}| jjjj d|d  }tj	| jtj
|d	 ||||d
|d|ddd|gd\}}	|	r|d	 |_|jdd |S )NZtree_parent_id==completeDatesys_typearchivefilter::r   r   Z	startDateZendDate)r   parenttree_parent	list_typeZplan_start_dateZplan_end_dateext_idr   Z
filter_objTZsave_import)r   rI   rs   rG   	CmfFolderr*   pluginsource_hashr   r   CmfListr   save)
r   r   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   r>   r   uI   _process_watchers: Не найден наблюдатель задачи N)r<   Zget_watchersrE   rF   _get_personCmfErrorresponsibler{   	cmf_owner
spectatorsrs   commit_with_event)r   	issue_objr   Zwatcherpersonr   r   r   _process_watchersS  s    
zJiraAPIImport._process_watchersu#   Обработка вложенийc           
      C   s   ddl m} g }| |D ]}tjj|d |d}|sLtj| j||d d}|j}|jrd|j	dd |
  t|d |j |rtjjj }||j}	|	  || t  q|S )	Nr   )RDisk	file_name)r   r   )r*   r   r   Tr   r[   )Zrdisk.rdiskr   _get_issue_attachmentsrG   CmfAttachmentrI   r*   is_new
is_changedr   Z
upload_dirshutilcopyZfull_path_fileZCmfRFiler+   Zdata_driverZget_rdZ	get_rfileZ
_file_namemake_previewrs   r   )
r   r   Z
jira_issuer   attachmentsattachment_info
attachmentr   ZrdiskZrfiler   r   r   _process_attachmentsc  s*    
z"JiraAPIImport._process_attachmentsuB   Обработка упоминаний пользователейre   r=   c                 C   sl  ddl m}m} |sdS t|d}|jddidD ].}z|jdrX| |jd }nx|jd	r| |jd	 }|jd
 |jd< |jd	 |jd< n:||jd }||j}| 	|d d }	| |	| j
 }|jd |jd< |j|jd< d|jd< |jj|jd
< |jj|jd	< W q2 tk
r` }
 z,|  jd7  _| jjd| d|
  W 5 d}
~
X Y q2X q2t|S )u]   
        Упоминания пользователей
        confluence-userlink
        r   )urlparseparse_qsNhtml.parserclassz
user-hoverattrszdata-account-idzdata-usernamezdata-linked-resource-idzdata-linked-resource-id_origzdata-username_orighrefr   	href_origTcmf_convertedr)   uZ   Не удалось преобразовать ссылку на пользователя : )Zurllib.parser   r   r   find_allr   rI   r   query_get_user_info_from_dumprD   r   r   r   loginr/   r0   r*   r-   errorr'   )r   re   r   r   Zdoc_souptagr   Z
parsed_urlr   	user_infoer   r   r   _process_mentions{  s2    


.zJiraAPIImport._process_mentionsc                 C   sX   |  dD ]H}|d|kr$|  S |d|kr:|  S || j|kr
|  S q
d S )Nr   r   username)r   rI   rD   )r   Zuser_idr  r   r   r   r     s    z&JiraAPIImport._get_user_info_from_dumpu#   Конвертация ссылок)re   r   c                 C   sD  |s|S t |}|dd D ]}|jdrF| jjd|  q|drv|jd drv| jjd|  q| jjd|  |dr|jd }n
|jd	 }t	j
|d
d dd }tj|}tjj|dg|d}|r|d	rv|jd	 |jd< |j|jd	< d|jd< t|jd	 }	|	rv|	d rv|	d drvd|_d|jd< d|jd< d|jd< |dr|jd |jd< |j|jd< d|jd< | jjd|j  qd|jddkr|jd d
d dd }
| |
}|r|jd |jd< |j|jd< d|jd< | jjd|j  qt|S )Nc                 S   s   |  dp|  dS Nr   srchas_attrr   r   r   r   <lambda>      z.JiraAPIImport._process_links.<locals>.<lambda>r   u   Уже обработали r   #u   Это якорь u&   Обрабатываем ссылку r  /?r   url)r   r   r   Zsrc_origTZvideoZcontrolsz100%widthZheightr   u   Заменили на z/people/rn   )r   r   r   rI   r*   r-   r.   r  
startswithurllibparseunquoter   rG   CmfDocument_get_filenamer   sgetr  	mimetypes
guess_typer   r   r   r'   )r   re   r   r   Z	text_soupr   r  r   Z
attach_obj	mime_type
account_idr   r   r   r   _process_links  sV    

 
 





zJiraAPIImport._process_linksu-   Обработка пользователейc              	   C   s  t  }| dD ]}| j r8d| j_| j   d S zL| jjd|  | jj	j
r~|d dkr~| jjd|d   | || jtjj d }d| jjjj d|| j  d}d	}tjjd
d|d gdgd}|shtjjddd| dgdgd}|shtjjdd|d gd}t|dkrZ|  jd7  _| jjd|d  dt|  |rh|d }|sd}tj||d | jdd}|jr|D ]}t||||  q|jr|jr|jdd |ddg |jr||jkr|j | |_n||_tj }	tj  }
|j!"|	 |j!"|
 d|_#|d d D ]}| jj	j
rdd|d  d}nd|d  d}d| jjjj | }tjjddd| dgdgd}|stjjdd|d gdgd}|stj|| jd|d |d}|jr|d |_$||jkr|j | |_|jdd |j!"| qB|jdd  | j j%d7  _%|j&r|j's|j&(d!s|r|)|j&j* W q   |  jd7  _| jj+d"|  Y qX q|rt,tjj-|gd# d S )$Nr   import-cancelingu0   Импортируем пользователя ZaccountTypeZ	atlassianu   Неизвестный тип r   r   Fr   r   rv   r   r   r   r   LIKE%r   r   r)   u+   Пользователей с именем z > r   T)r   r   r*   import_originalr   rg_member_ofgroupsrr   groupId)r   r*   r"  r   import_raw_jsonZ	only_dataz.evateam.ruu@   Не удалось загрузить пользователя )r3   ).setr   r*   	is_cancelrg   r   r-   r.   r<   rE   rF   warningr   r   rG   r   r   r   r   rD   rI   r   r   r0   r   r"  setattrr   r   r   CmfPersonGroup
jira_group
user_groupr#  rs   Z
user_localr   imported_object_countrv   rx   endswithaddr   r1   Zcmf_deferred_taskZregister_persons)r   Znew_user_emailsr   Z	user_dictr   Z
is_createdr   Zpersonsr   r-  r.  Z
group_infogroupr   r   r   _process_users  s    

  " 

   
zJiraAPIImport._process_usersu#   Обработка статусовc                 C   s  |  dD ]}| j r0d| j_| j   dS | jjjrD|d }n|d d }| jjjj	 d|d  }t
jj|d}|sdd	|d gd
d	dgg}t
jj|d}|st
j|d | jd}||_t||_|d |_|jdd | jj  | j jd7  _q
dS )uc   
        Грузим статусы из Jira и сопостовляем с нашими
        statusesr  NstatusCategoryr   r   r   r   r   r   r   )r   r*   Tr   r)   )r   r*   r)  rg   r   r<   rE   rF   r   r   rG   CmfStatusCoderI   r   r   get_status_typestatus_typer   r+   r,   r/  )r   rg   r9  r   Zcmf_status_coder   r   r   r   _process_statuses0  s.    





zJiraAPIImport._process_statusesc                 C   s  t  }d}d}| |d D ]}| jjjj d|d  d|d  }d|d  d|d  }tjjdd	|gd
}|d dkrd}	n|d dkrd}	nd}	|stjj|	d}
tj||
| jd}||_|j	dd |s|d dkr|}|s|d dkr|}d| jjjj d|d  d}|||< | j
|d dD ]6}|d r.|d |d d d kr.| || q.tjjdd|gdddggdgdD ]@}tjjdd|jgdd|gdddggd
sq|jdd qq| jjjj d|d  }d|d  }tjj|d}|s(tjjd d}
tj||
| jd}||_||_||_|j	dd tjj|d!D ]}|  qT| D ]t\}}| j rd"| j_| j	   qtjjdd#d$| d$gd
}||d%|| jd&}tjf |}|j	dd ql|S )'u)  
        У простого проекта воркфлоу привязан к issue type 1 к 1
        Поэтому надо получит все типы привязанные к проекту, на каждый тип создать WF и замапить через схему
        Nr   
::SIMPLE::r   (   Simple-схема для проекта r       и типа r   =r   hierarchyLevelr)   task.epic:defaultr   task.agile:defaultdefault.system:defaultr@   r   templater*   Tr   r  
project_idZusagesZ
issueTypesworkflowr   r9  r  !=forcer6  softdev:default	scheme_wfr  r   r!  r   
logic_typeZtarget_workflowcmf_model_namerM  r*   )r   _get_issue_types_for_projectr*   r   r   rG   CmfWorkflowrI   r   r   _get_statuses_for_project_create_status	CmfStatusr   r9  deleteCmfSchemeWfdefault_task_workflowZ!default_subtask_workflow_workflowCmfSchemeWfRulerr   r)  rg   CmfLogicType)r   Zjira_project_info	issue_mapZdefault_task_wfZdefault_subtask_wf
issue_typeworkflow_ext_idworkflow_namerG  rA   rD  issue_type_ext_idjira_statusrg   Zscheme_ext_idZscheme_nameschemerulelogic_type_ext_idrO  	rule_dictr   r   r   #_create_schemewf_for_simple_projectN  s|    $$
 

 z1JiraAPIImport._create_schemewf_for_simple_projectc                 C   s0  | j jjj d|j d|d  }| j jjj d|d  }tjj|d}t|d }|srtj||d | j d}||_	|j
dd tjjd	d
|gd}|stjjdd|gdd|ggd}|stjjdd
|d gdd
|ggd}|stj|| j |d}||_|d |_|d |_||_||_	|j
|j d |S )Nr   r   r6  r5  r   )r   r   r*   Tr   r   r   r   rG  r>  status_code)rG  r*   rf  rj   r'  )r*   r   r   r   rG   r7  rI   r   r8  r9  r   rU  r   r   re   rf  r   )r   Zjira_status_datarG  status_ext_idr   rf  r9  rg   r   r   r   rT    s6    "

zJiraAPIImport._create_statusc                 C   s<  | j jjj d|d d  }tjj|d}|d d }|sztjjdd}tj|d ||d	d
|| j |d}|jdd t }| j|d dD ],}d|d kr| j jjj d|d  d|d  }d|d  d|d  }	tj	jdd|gd}
d| j jjj d|d  d}|
sxtj
jddd| dgd}tj	j|jdd  dd}|sftj	jdd}tj	||| j d}
|	|
_|
jdd |
||< |d D ]"}|d d  |d< | ||
 qqtjj|d!D ]}|  q| D ]P\}}
tj
jddd| dgd}||
d"|| j d#}tjf |}|jdd q|S )$Nr   jira_workflow_schemer   r6  r.   rK  r@   r   rj   rn   )r   r   re   r&  r*   rD  Tr   rE  	issuetyper   r;  r<  r=  r   r>  r   r   r!  :r   z:defaultrB  rC  r4  r5  r   rL  r   rN  )r*   r   r   rG   rW  rI   r   r   rS  rR  rZ  rA   r   r   rT  rY  r   rV  rr   )r   project_infor   Z	wf_schemeZwf_scheme_inforD  r[  r\  r]  r^  rG  r_  rO  r`  rb  rc  rd  r   r   r   _process_wf_scheme  sZ    

$  z JiraAPIImport._process_wf_schemec              	   C   sD   t dd0 | j rq6| }|dkr*q6| | qW 5 Q R X d S )NFZinit_views_and_dsDONE)r   r*   r)  rI   _process_issue)r   issue_queuer   r   r   r   _process_issue_fork  s    
z!JiraAPIImport._process_issue_forku   Обработка теговc           
      C   s0  ddl m} t }| |d D ]F}| j rFd| j_| j   d S |d dr |	|d d  q |D ]}|
dd
d	d
}||ddd}z\dddd| dgdd|gddd| dgg}tjj|d}|stj|d}|jdd W ql tk
r( }	 ztd| d|	  W 5 d }	~	X Y qlX qld S )Nr   )translitr   r  r   labels _r  rn   ruT)Zlanguage_codereversedORaliasILIKE""%r   r   r7   r   u*   Не удалось создать тег r   )Ztransliteraterr  r(  r   r*   r)  rg   r   rI   unionreplacerG   ZCmfTagr/   rP   r*  )
r   rk  rr  tagsr   Ztag_nameZ
name_aliasr   Ztag_objr  r   r   r   _process_tags  s0    

zJiraAPIImport._process_tags)project_structrk  c                 C   s
  t jjdd|d gddgd}|r|jj|d ksF|jr|j|d kr|d  d|d  d|d< | jjd|j	 d	|d   n|js|d |_|
  t jj|d | d
}|st j| j|d |d d}|D ]}t||||  q|drd|_|
  | |d D ]@}| jjjj d|d  }t jj|d}|sht jjddd gdd|d ggd}|st j|d | jdd}||_|d |_	|d|_|j
dd t jj||d}|st j||| jd}g |_|j
dd |dg D ]P}	|	d dkr| jjjrRd| jjjj d|	d d  d}t jjddd| dgd}
nt jj|	d d }
|
rx|j|
 n| jjd!|	  n|	d d"kr:| jjjrd|	d# d$  d}nd|	d  d}d| jjjj | }t jjddd| dgd}|r|j| n$| jjd%| d& |  jd'7  _ntd(q|j
dd q|   | | |   | j |d) | !||_"|j
dd g }| j#$ }| jj%d* t&| j'D ]J}| j(j)| j*d+| d,|id-}|| |+  | jj%d.|  q| ,|d D ]"}| j- r* q8|.| q|D ]}|.d/ q<| jj%d0 |D ]}|/  q`| jj%d1 t j0|d2d3}|j
dd d|_1|j
dd4 | j- rd5| j_2| j
  d S t3  | 4| |   | 5| | j j6d'7  _6|   |S )6Nr   r   rO  r   r  z ()u   Проект с именем u8    уже существует! Переименуем в r   r   )r*   r   r   	isPrivateprivater   r   r6  r   T)r   r*   r"  rj   r   )r   project_role)r   r  r*   actorstypeatlassian-user-role-actorr  r>   r   r!  ru   r7   uR   Не удалось привязать пользователя к проекту zatlassian-group-role-actorZ
actorGroupr%  u<   Не найдена группа пользователей u#    для проектной ролиr)   u&   Неизвестный тип роли)rk  u>   Грузим задачи в несколько потоковrq  rp  targetr   r4   u.   Параллельный обработчик rn  u&   Ждем обработки задачu0   Закончили обработку задачdelmer   r   r'  r  )7rG   r   rI   rO  r   r   r*   r-   r*  r   r   keysr+  Zperm_policy_get_project_rolesr   r   CmfProjectRolere   ZCmfProjectRoleAssignmembersr<   rE   rF   r   rs   r,  r   r0   r/   _calc_progress_process_versionsr  _process_permissionsZproject_perm_schemerc   Queuer.   rangerd   rb   Threadrq  startr   r)  putr   r   cmf_deletedrg   r   _process_boards_process_sprintsr/  )r   r  rk  project_objr   	role_infor   roleZrole_assignactorr   Z	sub_groupZissue_processrp  iprocr   tr   r   r   _process_project  s    "

"
"





zJiraAPIImport._process_projectu#   Обработка проектовc              
   C   sV  t jjddjj}|  D ]4}z|d dd | jD kr@W qd }| j rd| j_	| j
  |rt j|dd}|j
d	d
 d	|_|j
d	d t  W  d S |di }|r| || j }n
ddd}|d dkrt jjdd}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j d|d  |d< |d |jj|d ||d ||d |d}|d }	|	r| |}
|
|d < n0| jjjj d|d! d  }t jj|d"|d < | ||}W q tk
rN   |r"t j|dd}|j
d	d
 d	|_|j
d	d t  |  jd#7  _| jjd$|  Y qX qd S )%Nr?   r@   r   c                 S   s   g | ]}|d  qS r   r   r   r   r   r   r     s     z3JiraAPIImport._process_projects.<locals>.<listcomp>r  r  r  Tr   r'  leaddefault_import_jira@evateam.comdefault_import_jirarv   r   projectTypeKeybusinessproject.base:defaultsoftwareproject.agile:defaultservice_deskproject.servicedesk:defaultu$   ERROR! Проекты с типом 3    временно не поддерживаютсяr   r   r   rj   r   r   rO  re   activityZtask_code_prefixr   r   r&  
simplifiedrM  rh  r6  r)   <   Не удалось импортировать проект )rG   rH   rI   r   r   r   rN   r*   r)  rg   r   r   r  r   r   rD   rZ  r/   r   r   re  rW  r  r0   r-   r1   )r   r  rk  r  r  project_leadr   rO  r  Zproject_simplifiedra  r   r   r   r   _process_projects  sr    



zJiraAPIImport._process_projectsc           	   
   C   s  d }t jjddjj}|  D ]}zr| j r~d| j_| j	  t j
|dd}|j	dd d|_|j	dd t  W  d S |d	 d
d | jD krW q| jjjj d|d	  |d< |di }|r| || j }n
ddd}|d dkrt 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|d |jj|d ||d ||d |d}| ||d< | ||}W q tk
r   |rt j
|dd}|j	dd d|_|j	dd t  |  jd 7  _| jjd!|  Y qX qd S )"Nr?   r@   r  r  r  Tr   r'  r   c                 S   s   g | ]}|d  qS r  r   r   r   r   r   r     s     z7JiraAPIImport._process_projects_box.<locals>.<listcomp>r   r   r  r  r  r  r  r  r  r  r  r  r  u$   ERROR! Поректы с типом r  r   rj   r   r  rM  r)   r  )rG   rH   rI   r   r   r   r*   r)  rg   r   r   r  r   rN   r   r   r   rD   rZ  r/   rl  r  r0   r-   r1   )	r   r  r  rk  r  r  r   rO  r  r   r   r   _process_projects_box  sf    

z#JiraAPIImport._process_projects_boxu   Обработка досокc           
      C   s  |  |d D ]|}| j r6d| j_| j   dS tjj|d d}| jjjj	 d|d  |d< tj
j|d ddd	d
gd}|stj
|d | jd}|d |_|d |_||_||_|jdd |jrv|jD ]}|  q|d d d D ]}tj|d || jdd}|jdd |d D ]D}| jjjj	 d|d  }tjj|d}	|	sXt|j|	 q"|jdd q| j jd7  _t  qdS )z
        https://bcrm.carbonsoft.ru/desk/favorites/Document/DOC-007367#spec-006348-b
        https://developer.atlassian.com/cloud/jira/software/rest/api-group-board/#api-rest-agile-1-0-board-boardid-quickfilter-get
        r   r  Nr   r6  r   kanban_board_columnsr&  r   r   r  r   r*   r   r.   Tr   ZcolumnConfigcolumns)r   r   r*   r"  r4  r)   )_get_project_boardsr*   r)  rg   r   rG   r   rI   r   r   ZCmfKanbanBoardr   r&  r   r   r"  r  rV  ZCmfKanbanBoardColumnr7  AssertionErrorZmapped_status_codesrs   r/  r   )
r   rk  boardr   Z	board_objcolZ	board_colrg   rg  Zstatus_globalr   r   r   r    sH    

 



 
zJiraAPIImport._process_boardsu#   Обработка спринтовc           
   	   C   s  |  |d D ]}| j r6d| j_| j   d S tjj|d d}| ||}|j	
  t  | jjd|j dt|d   |d D ]&}| jjjj d| }tjj|d	dd
gd}|r|dr~| jjjj d|j }tjj|dddgd}	|	stj|| jd}	d|	_d|j d|j d|	_||	_|	jrT|	j|	j d |jdkrt|jdkr|j	| n|j	| q|  jd7  _| jjd| d|d   q|jdd t  | j j d7  _ qd S )Nr   r  r   r6  u0   Добавляем задачи в спринт r   issuesr   listscache_status_typer  r   z::comment-sprint:	log_levelre   r   r     uB   Задача была в архивном спринте <a href="" target="_blank"></a>r'  CLOSEDr)   u-   Неизвестная задача issue_id=u    в спринте r   Tr   )!_get_all_sprintsr*   r)  rg   r   rG   r   rI   r   r  rY   r   r-   r.   r   r   r   r   r   r   r   r  r   re   r   r   r   r  r  rs   r0   r   r/  )
r   rk  r   r   Z
sprint_objZissue_idZissue_ext_idr   comment_ext_idcommentr   r   r   r  8  s@    


$ zJiraAPIImport._process_sprintsc                 C   s$   |sd}|sd}| d| d| S )Nu   Не указаноr   u    ➔ r   )r   r   	old_valueZ	new_valuer   r   r   _simple_html_diff_  s
    zJiraAPIImport._simple_html_diffc                 C   sn   |dkrd S d| j jjj d| d}tjjddd| dgd}|sj| j jd| d |  jd	7  _|S )
Nunknownr   r   r   r!  r   u9   Не найден пользователь ext_id LIKE "%z%"r)   )	r*   r   r   rG   r   rI   r-   r   r0   )r   r   r   r   r   r   r   f  s    zJiraAPIImport._get_personu,   Обработка журнала работ)r   c                 C   s&  dd l }| jjd | |D  ]}t }d|d< | j|d< | |d | j |d< |d |d< | |d	 | j |d
< ||d< |d |d< |d d |d< |d |d< | jjjj	 d|d  |d< ||d< d|d< t
jj|d d}|s t
jf |}|jj|j|jjd |_|jdd q d S )Nr   u*   Загружаем журнал работclosedrg   r*   r|   r{   r   updateAuthorcmf_modified_byr   started
start_dateZtimeSpentSeconds<   
time_spentr  re   r   r   r   r&  Zremaining_estimater6  )ZminutesTr   )datetimer*   r-   r.   _get_issue_worklogsr   r   rD   r   r   rG   ZCmfTimeTrackerHistoryrI   r  r   Z	timedeltar  Zend_dater   )r   r   r   r  worklogZtimetracker_historyhistoryr   r   r   _process_issue_worklogq  s.    


z$JiraAPIImport._process_issue_worklogc                 C   sH  |  |D ]6}| jjjj d|d  }tjj|d}|rD|jsDq
|sVtj||d}| |d | j	 |_
|j
|_| |d | j	 |_|d |_|d |_| |d	 |_| |jj||_||_|d
r6|d
 d dkrtjj|d
 d d}|j| d|_n(| jjd|d
   |  jd7  _q
|jdd q
d S )Nr   r   r6  )r   r   r|   r  rk   rl   r}   Z
visibilityr  r  r   r7   TuL   Ошибка обработки приватного комментария r)   r   )_get_issue_commentsr*   r   r   rG   r   rI   r"  r   rD   r{   r   r  rh   ri   r  re   r  r   r&  r  r   rs   r  r-   r   r0   r   )r   r   r   r  r   Zcmf_commentr  r   r   r   _process_issue_comments  s0    


z%JiraAPIImport._process_issue_commentsu0   Обработка плагинов задачиc           	      C   s   |j jp
d}| |D ]}|d dkr|d rt|d}|jdddid	}|d d
D ]N}|sbqX|drx|d}n|jdddid	}||dd   || qX|| t||j _q|j	r|j
dd d S )Nrn   r   z&com.railsware.SmartChecklist.checklistr   r   Zulr   ztox-checklistr   
-liztox-checklist--checkedr)   Tr   )re   r   _get_issue_propertiesr   Znew_tagr   r  rs   r'   r   r   )	r   r   r   re   Zissue_propertysoupZ	checklistvalr  r   r   r   _process_properties  s"    


z!JiraAPIImport._process_propertiesu   Обработка задачиc                 C   s"  | j jjj d|d d d  }tjj|d}|sNtd|d d d  g }dd	 | jtjj	 d D }|d
 d D ]}d}|dr| 
|d | jtjj	 d }n| j jd|  |d |dd}	|d D ]n}
|
d }||
d }|r|d rd}| ||
d |
d }d|	kr0||	d< q|	d  d| |	d< q||	 qz| 
|| jtjj	 d }tjjdd| j jjj d|d d d  gdgd|d< |d j|d < | j|d!< d"|d#< | j jjj d|d  |d< |d d$rL| |d d$| j|d%< |d% sL|  jd7  _| j jd&|d d$  |d d'r| |d d'| j|d(< |d( s|  jd7  _| j jd)|d d'  |d d*r| |d d*| j|d+< |d+ s|  jd7  _| j jd,|d d*  ||d-< |d r:|d. d/ |d< |d d0g }|D ]}| j jjj d|d  }d1|krd|d i|d2< | j jjj d|d1 d  |d1 d< || j|< nJd2|krNd|d i|d1< | j jjj d|d2 d  |d2 d< || j|< qN||d-< |pg }|d d-}|r~| j jjj d|d  }| j|g }|| j jjj d|d   || j|< d| j jjj d|d d3 d  d}tjjddd4| d4gd5|d6< | j jd7|  tj| j tj|dd8|d gd9\}}| || | |jj |_| !|jj ||_|d d: d; rH| "|| |d d< d; rf| #|| |D ]}|j$| qj|d d=g |d d>g  D ]d}| j jjj d?|d  }tj%j|d}|s| j jd@|  |  jd7  _n|j$| q||_&|j'r|j(d"dA t)  |d dB dC rB| *|| |d dDg }|rzt+| j || W n   | j j,dE Y nX | -|| | j jjj dF|d  }tj.j|d}	|	stj.|| j dG}	||	_/| j0j1 dH|d  }dI| dJ| dK|	_dL|	_2|	j(d"dA |	j34  dS )Mu   
        Общая логика обработки которая потом разделяется на задачи и эпики
        r   r   r   r   r6  u$   Не проекта с ключем r   c                 S   s   i | ]}|d  |qS )r   r   )r   fieldr   r   r   
<dictcomp>  s      z0JiraAPIImport._process_issue.<locals>.<dictcomp>Z	changelogZ	historiesNr|   u   Аудит без автора rl   r)   )ri   r{   r  rr   r  rp   rn   Z
fromStringZtoStringre   z<br>r   r   %::rg   r9  r  r  r  TZapprovedreporterr{   u*   Не найден автор задачи Zcreatorr   u?   Не найден ответственный по задаче assigneer   u6   Не найден исполнитель задачи r   renderedFieldsrj   Z
issuelinksr   r   ri  r!  r   rO  u2   Пытаемся создать задачу из r   r   r  totalr  ZfixVersionsZversions
::version:u!   Не найдена версия r   rm   Z
isWatchingrs  u/   Не удалось привязать тегиz
::comment:r  zbrowse/u<   Задача импортирована из Jira: <a href="r  r  r  )5r*   r   r   rG   r   rI   r   r   r   r   r   r   r-   r*  r  rs   rU  r9  rJ   r   rD   r0   r   rK   rL   rZ  r.   r   r   r   r  re   r   r  r  r  r  r   r&  r   r   r   r   Zprocess_tagsZexcepionr  r   r   r<   r  r  r+   r,   )r   r   sprintsZproject_ext_idr   commentsZjira_map_fieldsr  r{   r  itemr   r  ZdiffZnormalized_issueZissue_linksZ
issue_linkZlink_ext_idZissue_parentparent_ext_idZ	sub_tasksrc  r   ru  r   versionr   Zversion_objr  r  r   r   r   r   ro    s    "



,

 
 
 


&
&
 
& 
$zJiraAPIImport._process_issueu&   Обработка всех задачc                 C   sD   | j  }|D ]0}| j r4d| j_| j   d S | | qd S )Nr  )r<   r   r*   r)  rg   r   ro  )r   r  r   r   r   r   _process_issuesM  s    


zJiraAPIImport._process_issuesu3   Обработка связей всех задачc                 C   s  | j jdt| j  | jD ]}| j  rFd| j _| j    dS tj	j
|d}| j| D ]B}tj	j
|dgd}|s| j jd|  q^||_|jdd	 q^q | j j  d
ddd}| j jdt| j   | j D ]\}}| j  rd| j _| j    dS zB| j jjj d|d d  }|
|d d }	|	r\tjj
|	d}
ntjj
|d}
|
stjj
dd|d d gd}
|
stj|| j |d d d}
|d d |
_|d d |
_|
jdd	 | j jjj d|d  }tjj
|d}|stj|| j d}tj	j
|d d d|_tj	j
|d d d|_|
|_|jdd	 W q   |  jd7  _| j jd|d  d|d  d |d   Y qX q| j j  dS )!uD   
        Постобработка связей задач
        u   Подзадачи: r  Nr6  parent_taskr  uq   Не удалось связать задачи, возможно задача не попала в импорт Tr   zsystem.finish:finishzsystem.duplicatezsystem.link)ZBlocksZ	DuplicateZRelatesu   Связи: r   r  r   r   r@   r   r   )r   r*   r   ZinwardZoutwardr  r   r   r   r)   u.   Не удалось создать связь z out=z in=)r*   r-   r.   r   rL   r)  rg   r   rG   r   rI   r*  r  r+   r,   rK   r  rr   r   r   ZCmfRelationTypeZin_type_nameZout_type_nameZCmfRelationOptionZin_linkZout_linkrelation_typer0   r1   )r   r  r  Zchild_ext_idZ
child_taskZ	map_namesZrelation_ext_idZissue_relationr   Zrelation_coder  Z
rel_ext_idZrelation_optionr   r   r   _process_relationsW  sl    





4z JiraAPIImport._process_relationsu   Обработка версийc                 C   s  t jj|d dgd}t jjd|d}t jjd|d}| j|d dD ]f}z0| j rtd	| j_| j  W  d S | jj	j	j
 d
|d  }t jj|d}|st j|| jdd}t jjdd|_||_|d |_|dd|_|jj|_|jr|jr|jdd |d r||_n||_|jrP|d s:|d rF|d n
|d |jrl|jrl|jdd | j jd7  _W qF   |  jd7  _| jjd|  Y qFX qFd S )Nr   z"scheme_wf.default_release_workflowr  release)r   r   r   r   rE  r  r  r6  T)r   r*   r"  zlist.release:defaultr@   r   rj   rn   r   ZarchivedZreleasedr  ZOPENr)   u+   Ошибка загрузки версии )rG   r   rI   r   _get_project_versionsr*   r)  rg   r   r   r   r   rZ  rO  r   r   re   rM  Zdefault_release_workflowrG  r"  r   r   Zset_default_statusr/  r0   r-   r1   )r   rk  r  Zrelease_folderZarchive_folderr  r   Zversion_listr   r   r   r    sB    





zJiraAPIImport._process_versionsu   Обработка аудитаc                 C   s   dS )u)   
        Грузим аудит
        Nr   r   r   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d	dd
ddd
ddd}|  dD ]}| jjd|  | j rd| j_| j   dS | jjjj d|d  }t	j
jddd| dgd}|rqp||d }|rPt	j
jdd|d gdgd}|jr4d| |j |_nd| d|_|jdd qp| jjd|d  d t	j
jdd |d  gdgd}|r|jrd| |j |_nd| d|_|jdd qp| 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(}t| jt	j
| t  | j jd$7  _qpdS ))u$   Маппим issueType в logic_type   Подзадачаztask.sub:default)r   rA   Z	UserStoryztask.userstory:defaultz
Task AgilerA  Bugztask.bug:defaultEpicr@  )zSub-taskZSubtaskr  ZStoryu   ИсторияZTasku   Задачаr  u   Багu   Ошибкаu   Эпикr  issue_typesu-   Обрабатываем тип задачи r  Nr   r   r   r   r  ::%r   r   rA   r   r  Tr'  u   Ищем по имени "r{  rz  u*   Не нашли, создаем новыйr?  r  r)   Zsubtaskrj   r   )r   r   re   rP  rD  )r   r*   r-   r.   r)  rg   r   r   r   rG   rZ  rI   r   stripr<   rE   rF   r   r   r   r   r/  )r   Z	name2coder\  rc  rO  Zlogic_type_dictZtemplate_coderD  r   r   r   _process_issue_type  s~    



z!JiraAPIImport._process_issue_typeu2   Обработка бизнес-процессовc                    s  i }  dD ]}|||d < q  dD ]t} j rRd j_ j   dS  jj|d d    jjjj d|d d  d|d d  }t	j
j|d	st	j
jd
d}t	j
|| jd|d _|d d _jdd |d D ]} ||d   qt	jjddgdddggdgdD ]@}t	jjdd|jgddgdddggdsbq0|jdd q0|d D ]} j rd j_ j    dS  jjjj dj d|d  }t	jj|d}	|	st	j| jd}	|d |	_|d |	_ fdd|d D }
t	jjdd|
gd|	_t|	jt|
ksNtd jjjj dj d|d   }t	jj|d	|	_|	jdd qz j jd!7  _q*dS )"u   Импортируем workflowr4  r   	workflowsr  Nr   r   ZentityIdr6  rA  r@   rC  rj   Tr   rG  r   r   r9  r  rH  r   rI  Ztransitions)r   rG  )r   rG  r*   c                    s*   g | ]"} j jjj d j d | qS )r   )r*   r   r   r   )r   str   rG  r   r   r   D  s     z3JiraAPIImport._process_workflow.<locals>.<listcomp>fromINuN   DEV: Fatal Вероятно, сломали создание статусов!tor)   )r   r*   r)  rg   r   r-   r.   r   r   rG   rR  rI   re   r   rT  rU  r   r9  rV  r   ZCmfTransZstatus_fromr   r  Z	status_tor/  )r   Zjira_statusesr`  Zjira_workflowZworkflow_idZtemplate_workflowrg   Zjira_transitionZtransition_ext_idZ
transitionZstatus_from_ext_id_listZstatus_to_ext_idr   r   r   _process_workflow  s\    

,

 

"

"zJiraAPIImport._process_workflowu    Обработка схем БПc              
   C   s  |  dD ]}| j r2d| j_| j   d S | jjjj d|d  }tjj	dd| dgd}|s|t
d	|d  |d
 |	dd| jjjj d|d  ddi||d}t| jtj|dd|d g\}}|stjj|dD ]}|  q|d  D ]\}}	| j r0d| j_| j    d S | jjjj d| }tjj	ddd| dgd}
tjj	dd| jjjj d|	 dgd}|
|d|| jd}tjf |}|jdd q| j jd7  _q
d S )Nworkflow_schemer  r   ZdefaultWorkflowr   r   r  r   u+   Не импортировался workflow r   rj   rn   r   rA   rK  )r   re   r   rD  rX  Zdefault_subtask_workflowr   rL  ZissueTypeMappingsr  r   rN  Tr   r)   )r   r*   r)  rg   r   r   r   rG   rR  rI   r  r   r   rW  rY  r   rV  rr   rZ  r/  )r   r  Zdefault_task_workflow_ext_idrX  Zscheme_dictZworkflow_scheme_objr   rb  rc  r^  rO  rG  rd  r   r   r   _process_workflow_schemeL  sX    


 

(z&JiraAPIImport._process_workflow_schemer7   c              	   C   s   | j  | d}| j  | d}| r8d S t|d6}| D ](}| j  jd7  _|t|d  qJW 5 Q R X t	
|| | j jdd t  d S )N.jsonz.json.dirtya+r)   r  Tr'  )r*   rT   rU   rV   rW   json_object_countwriterX   dumpsr   mover   r   )r   Zapi_funcr   r[   Zfile_path_tmpr\   rowr   r   r   _simple_dumpu  s    
 zJiraAPIImport._simple_dumpc              	   c   sN   | j  | d}| rJt|d}|D ]}t|V  q.W 5 Q R X d S )Nr  r+)r*   rT   rU   rV   rW   rX   loads)r   r   r[   r\   r  r   r   r   r     s    zJiraAPIImport._simple_getc              
   c   sf   | j  d}| rbt|D ]>}|dr2q"t| d| dd}t	|V  W 5 Q R X q"d S )Nr   .dirtyr  
/info.jsonr  )
r*   rT   rU   rV   oslistdirr0  rW   rX   rY   )r   project_dirrF  r\   r   r   r   r     s    
zJiraAPIImport._get_projectsc              	   c   sH   | j  d|}t| dd}|D ]}t|V  q(W 5 Q R X d S )Nr   /issue_types.jsonr  r*   rT   rU   rW   rX   r  r   rF  r  r\   r  r   r   r   rQ    s    z*JiraAPIImport._get_issue_types_for_projectc              	   c   sH   | j  d|}t| dd}|D ]}t|V  q(W 5 Q R X d S )Nr   /statuses.jsonr  r  r  r   r   r   rS    s    z'JiraAPIImport._get_statuses_for_projectc              	   c   sH   | j  d|}t| dd}|D ]}t|V  q(W 5 Q R X d S )Nr   /roles.jsonr  r  r  r   r   r   r    s    z JiraAPIImport._get_project_rolesc              
   c   sV   | j  d|d}t|D ]2}t| d| dd}t|V  W 5 Q R X qd S )Nr   rM   r  r  r  r*   rT   rU   r  r  rW   rX   rY   )r   rF  	board_dirZboard_idr\   r   r   r   r    s    z!JiraAPIImport._get_project_boardsc              
   c   sV   | j  d|d}t|D ]2}t| d| dd}t|V  W 5 Q R X qd S )Nr   r  r  r  r  r  )r   rF  sprints_dirZ	sprint_idr\   r   r   r   r    s    zJiraAPIImport._get_all_sprintsc              	   c   sH   | j  d|}t| dd}|D ]}t|V  q(W 5 Q R X d S )Nr   /versions.jsonr  r  r  r   r   r   r    s    z#JiraAPIImport._get_project_versionsc              
   c   sb   | j  d|d}t|D ]>}|dr.qt| d| dd}t|V  W 5 Q R X qd S )Nr   Ztasksr  r  r  r  )	r*   rT   rU   r  r  r0  rW   rX   rY   )r   rF  	tasks_dirZtask_idr\   r   r   r   r     s    
z JiraAPIImport._get_project_tasksc                 c   s8   |d  d}t |D ]}|| d| dV  qd S )N
issue_pathz/attachmentsr  )r   r[   )r  r  )r   r   Zattachments_pathr   r   r   r   r     s    z$JiraAPIImport._get_issue_attachmentsc              	   c   s>   |d  d}t |d}|D ]}t|V  qW 5 Q R X d S )Nr   z/comments.jsonr  )rW   rX   r  )r   r   comments_file_pathr\   r  r   r   r   r    s    z!JiraAPIImport._get_issue_commentsc              	   C   s6   |d  d}t |d}t|}W 5 Q R X |p4g S )Nr   z/worklog.jsonr  rW   rX   rY   )r   r   r!  r\   r`   r   r   r   r    s    z!JiraAPIImport._get_issue_worklogsc              
   C   s:   |d  d}t |d}t|W  5 Q R  S Q R X d S )Nr   z/properties.jsonr  r"  )r   r   Zproperties_file_pathr\   r   r   r   r    s    z#JiraAPIImport._get_issue_properties)re   attachments_dirr   c                 C   s  |sd S | j jd t|ddd D ]}d}|drBd}|j| }z.|drr| j jd|  W q*|d	s| j	j
 | }|| j	j
s| j jd
|  W q*t|\}}|s| j jd|  W q*tj|dd dd }	tj|	}	||	}
tjj||d | j jjjd}|sVtj| j ||d | j jjjd}|
|_|	|_d|_|  |j  W q* tk
r } z*| j j   | j jd| d|  W 5 d }~X Y q*X q*d S )Nu/   Обработка ссылок в текстеZlxmlc                 S   s   |  dp|  dS r  r  r	  r   r   r   r
    r  z+JiraAPIImport._dump_links.<locals>.<lambda>r  r   zmailto:u   Это почта: httpuH   Это внешняя ссылка, оставляем как есть: u   Это не файл: r  r  r  r   r   r   
obj_ext_idr   r*   r   r&  r   Fu0   Не удалось скачать ссылку r   )!r*   r-   r.   r   r   r  r   r  r*  r<   r  r  r  r  r  r  r   rG   r  r  rU   CmfImportDownloadrI   r   r   pathr   
downloadedr   r+   r,   r/   Zrollback)r   re   r#  r   r   r   r  r  encodingr   r[   download_jobr  r   r   r   _dump_links  sT    



 


zJiraAPIImport._dump_linksc                 C   s@  t dd* || _d}| jjd| d|  | j|d ||D ]}zȐz| j rd| j_	| j
  W W  W 5 Q R  dS | jjd	|d
  d |t|d }	|	 rW W TqF|t|d d }
|
jdd |	d}|d d rR| jjdt|d d   |d d D ]"}|d }tj|}d|kr|dD ]*}t|d rZ|dd } qqZ||}|d drtjj|d |d | jjjjd}|stj| j|d |d | jjjjd}||_||_d|_|
  |j  n<| jjd|d   t|d}| |d  W 5 Q R X q,|
d}| rpt!"| t|d}t#$| j%|d | W 5 Q R X | &|d d || |
d }| rt!"| | jjd! t|d"T}| j'|d D ]<}| t#(|d#  | j j)d7  _)| &|d$ || qW 5 Q R X | j*|d }|
d%}t|d}t#$|| W 5 Q R X t+,|
|	 |jdd |	d&}t|	-dd'|d(< t|d"}t#$|| | j j)d7  _)W 5 Q R X W n(   |d7 }| jj.d)|  Y nX W 5 | jj  X qF|/| W 5 Q R X d S )*NFrm  r   u   Задачи с u    до r   r  r)   u   Задача 'r   'r  Texist_okr   r   r   u%   Обработка вложений: filename&r>  Zcontentr$  r%  r'  u   Это не ссылка wb+zworklog.jsonrS   r  rj   zcomments.jsonu#   Дампим комментарииr  r  r}   zproperties.json	info.jsonrn   r   u0   Не удалось скачать задачу )0r   r<   r*   r-   r.   Zget_all_project_issuesr+   r,   r)  rg   r   rU   r'   rV   mkdirr   rG   r  r  r   r  r  r  r(  rI   r   r   r)  r   r*  r*  rW   r
  r  removerX   rZ   Zissue_get_worklogr-  Zget_commentsr  r	  Zget_issue_propertiesr   r  r~  r1   r  )r   r  maxr  rk  r<   tasks_that_are_doneerrorsr   Ztask_dirZtask_dir_tmpr#  r   r   ZparamZattach_file_pathr,  r\   Zworklog_file_nameZcomments_file_namer  Z
propertiesZproperties_fileZ	info_pathr   r   r   _dump_task_part  s    



 







"


 

zJiraAPIImport._dump_task_partrk  cntc           
      C   s>  t |d  d}|jdd | j }d}t|| j d }|sFd}d}g }|dkr| jj| jd| || || | ||t	| j
j| j
j| j
j| j
j| j
j| j
jjd	|d
d}	||	 |	  | jjd|	  |d7 }||8 }qN|D ]}	|	  q| jjd | s&|| 7 }q| jjd|  |S )Nr  z/tasksTr/  r   r)   r   Z
dump_tasks)r  r   tokenpassword
verify_sslrF   )r  r7  r  rk  r<   r8  r  u$   Форкаем _dump_task_part proc=uI   Закончили паралельное скачивание задачu   Ошибок: )r   r5  rc   r  intrd   rb   r  r:  r   r<   r  r   r=  r>  r?  rE   rF   rs   r  r*   r-   r.   r   emptyrI   )
r   rk  r<  r  r8  r9  stepr  Zprocessr  r   r   r   _dump_tasksY  sF    
 	



zJiraAPIImport._dump_tasksc                  C   sF	  | j d d d }|d s"tddd |d D | _| j d	}|jd
d t| j}td| }| jD ]}zd| j	 rd| j_
| j  W  d S | j jd7  _| jjd|d  d |t|d }|d}| s|| jj|d }t||d  d|d< tj|d d
d | jjd t|d  d}	|	 r`t|	 t|	d"}
| j|d }t||
 W 5 Q R X | jjjrR|d s| j|d gd d |d< n| jjd t|d  d}| rt| t|dD}
| jj|d dD ]*}| j jd7  _|
t |d   qW 5 Q R X nT| j!| jj" d!|d   |d< | j!| jj" d"|d d   |d d#< |#d$}|r| j!|d%  |d$< | jjd& t|d  d'}| rt| t|dD}
| jj$|d dD ]*}| j jd7  _|
t |d   q W 5 Q R X | jjd( t|d  d)}| rt| t|d}
| jjj%|d d*& D ]}| j	 rd| j_
| j   W 5 Q R  W  d S | j jd7  _| j!| }| jjjr\|#d+g D ]>}|d, d-kr| jjj'|d. #d|d. #d/d0|d1< q|
t |d   qW 5 Q R X | jjd2 t|d  d3}| rt()| |  t|d  d4}| rt()| |  | jj*|d d*D ]l}| j	 r(d| j_
| j   W  d S | j jd7  _| jjd5|d   | jj+|d |d#< | j!|d# d6 d%  |d# d6< | jjjrd7d | j,|d D |d# d8< |d |d9< |t|d }|jd
d |d}t|d:}
t||
 W 5 Q R X |d, d;kr| jjd< | j-|d D ](}| j	 rjd| j_
| j    W  d S | j jd7  _|t|d }|jd
d |d}| r| jjd=|d  d> q:g |d?< | jjd=|d   | j.|d D ]D}| j	 r*d| j_
| j     W  d S |d? /|d  qt|d:}
t||
 W 5 Q R X q:q| jjd@ |d  dA}t|dt}
| j0|d D ]\}| j	 rd| j_
| j   W 5 Q R  W  d S | j jd7  _|
t |d   qW 5 Q R X | j j1|7  _1| jjd
dB t2  t(3|d | t||d< |d  dC}t|d:}
t||
 W 5 Q R X n t|dD}
t4|
}W 5 Q R X | j5|d }| jjdE|  |  j6| j7||dF7  _6W qn   |  j6d7  _6|#dG	r| jj8dH|d  dI n| jj8dJ|  Y qnX qn| jjdK d S )LNr   r   r   	isCheckedu5   Не выбрали ни одного проекта!c                 S   s$   g | ]}|d  r|d r|d  qS )r2   rD  r   )r   r  r   r   r   r     s       z0JiraAPIImport._dump_projects.<locals>.<listcomp>Zchildrenr   Tr/  P   r  r)   u   Дампим "r   r{  r   r4  r   r  r  u   Дампим права/permissions.jsonr  r  ZworkflowSchemerh  u/   Дампим типы задач проектаr  rE  r  z$rest/projectconfig/1/workflowscheme/zrest/api/2/workflowscheme/r.   r  r   u*   Дампим статусы проектаr  u$   Дампим роли проектаr  )r   r  r  r  Z	actorUserr>   )r  r  r  u&   Дампим доски проектаz/boards/z	/sprints/u   Доска r   c                 S   s   g | ]}|qS r   r   r   r   r   r   r     s     Zquick_filtersrF  rS   Zscrumu&   Дампим спринты доскиu   Спринт u    уже скачанr  u(   Дампим версии проектаr  r'  r  ru*   Дампим задачи проекта: r;  r  u   Проект "u   " является приватным и не может быть импортирован, отключите приватность в Jira или предоставьте пользователю праваu2   Не удалось получить проект u0   Закончили дампить проекты)9r   r/   rN   r*   rT   rU   r5  r   r@  r)  rg   r   r	  r-   r.   r'   rV   r<   rE   Zget_projectr  makedirsr   r6  rW   Zget_project_permission_schemerX   rZ   rF   Zget_project_schemeZget_issue_for_projectr
  r  jira_requestr  rI   get_statusesZget_project_rolesvaluesr   r   rmtreeZget_all_agile_boardsZget_agile_board_configurationZget_board_quick_filtersZget_sprintsZget_sprint_issuesrs   Zget_project_versions_paginatedprogressr   r  rY   Zget_project_issues_countr0   rC  r1   ) r   rootZprojects_dirr<  rB  r   r  Z	data_filerk  permission_filer\   Zperm_schZ
types_filer\  r  Zstatuses_filer  Z	role_fileZrole_urir  r  Z
boards_dirr  r  r  Zboard_info_filer   Zsprint_pathZsprint_file_pathr   Zversion_list_filenamer  r   r   r   _dump_projects{  sB   









$


"


"





$





"zJiraAPIImport._dump_projectsc                 C   s  | j  }t|\}}}|| d }| j jd| d | j jd | j jd | | jjd | j jd | | jj	d | j jd	 | | jj
d
 | jjjr| j jd | | jjd | j jd | | jjd d| j _| j   t  | j jd |   dS )u_   
        Загружаем все данные из апи, кроме аттачей
        d   u   Свободно места: r!  u$   Скачаем данные из APIu'   Дампим пользователейr   u   Дампим статусыr4  u    Дампим типы задачr  u*   Дампим бизнес процессыr  u7   Дампим схемы бизнес процессовr     u   Дампим проектыN)r*   rT   r   
disk_usager-   r.   r  r<   r   rJ  Zget_issue_typesrE   rF   Zget_workflowsZget_workflow_schemerM  r   r   rP  )r   Zdownload_pathr  usedfreeZfree_percentr   r   r   download_data*  s*    


zJiraAPIImport.download_datac                 C   s0   t | jj| jj d | j_| j  t  d S )NrQ  )r@  r*   r/  r	  rM  r   r   r   r   r   r   r  D  s    
zJiraAPIImport._calc_progressc              	      s  t t d fdd}dddgddd	gg}d
D ]R}tt| }|j|d} jjd|j d|  d}d}|dkr,|j|ddddg|| || | gd}|d7 }||8 }|D ]}	zt	|	dr||	j
j|	_|	jr|	  |	  n"||	j
j|	_
|	jr
|	jd	d |	jD ]8}
|
jdkr$q||
j
j|
_
|
jr|
jd	d qW q    jjd|	    jd7  _Y qX qqnq,dS )uU   
        Заменим ссылки на задачи и документы
        r   c                    s  | s| S t | d}|dD ]}|jdr0q|jdd jjjrd }d|jd krt	d|jd }|s j
jd|jd   q j
jjj d	|d
dd   }tjj|dgd}|sވ j
jd|  qnd|jd krt	d|jd }|s" j
jd|jd   qtjjddd|d
dd   dgdgd}|D ].}|jd |d
dd  krT|} qqT|s j
jd|d
dd    qnq|tj| qt|S )Nr   ar   r   rn   z/wiki/z\/\d+u:   Не удалось найти ид документа в r   r   r)   r  u:   Не удалось найти документ по ид z/browse/z	\/\w+-\d+u4   Не удалось найти ид задачи в r&  r   z%"key":"r|  r  r   u:   Не удалось найти задачу по коду )r   r   r   rI   r  r<   rE   r  researchr*   r-   r*  r   r   r2  rG   r  r   r   r&  Zreplace_withZCmfPluginCsvZcreate_tag_linkr'   )re   r  r   r2   r   Zext_coder   r  r   r   r   check_linksN  sJ    
$
"z7JiraAPIImport._process_cross_links.<locals>.check_linksr*   rH  Nr"  r   T)r  r   r   r   r   u)   Конвертируем ссылки в u=    на локальные задачи и документы: i  r   re   zcomments.log_levelzcomments.text
text_draft)r   r   slicer)   r'  r  uZ   Не удалось конвертировать перекрестные ссылки в )r'   varsrG   countr*   r-   r.   r   r   hasattrre   r   r[  r   r   Z
do_approver  r  r1   r0   )r   rZ  r   Z	mode_namer^   r<  rB  r  r   r2   r  r   r   r   _process_cross_linksI  sF    (



z"JiraAPIImport._process_cross_linksc              	   C   s$  ddl m} t|d  d}| }dd |d D }t|d}t|}W 5 Q R X | jjjj d	|d
  }t	j
j|d}	|	st	j
|d| jd}	|d |	_|	jdd |d D ]j}
d	| jjjj d	|
d
  d	}||
d rt	jj||
d  dd}n| jjd|
  qddd| dg}ddddg}t	jj||d}|st	jj||	|d}|s| jjd|
  |  jd7  _q|jr|j | |_n||_|
d d d kr | jjjj d	|
d d  d
  }t	jj|d}|j| |jdd q|
d d d!kr&d|_|jdd q|
d d d"krLd|_|jdd q|
d d d#krrd|_|jdd q|
d d d$krd|_|jdd q|
d d d%kr,| jjjr| |
d d& }nt	j jdd'|
d d(  gd)}|r|j!| |jdd n"| jjd*|
  |  jd7  _q|
d d d+kr| jjjrnd	| jjjj d	|
d d&  d	}n&d	| jjjj d	|
d d+ d  d	}t	j"jddd| dgd)}|r|j!| |jdd n"| jjd,|
  |  jd7  _q| jjd-|
d d   |  jd7  _q|	S ).Nr   )get_datar  rF  c                 S   s   i | ]}|d  |d qS )Z	jira_coderA   r   r   r   r   r   r    s      z6JiraAPIImport._process_permissions.<locals>.<dictcomp>Zproject_perm_permissionrG  r   r   r6  T)r   r"  r*   r   r   ZpermissionsZ
permission)rA   Zinclude_deletedu4   Не нашли соответствия права r   r   r!  r   access_membersaccess_project_roler  )permr   r   u*   Не найдено правило для r)   Zholderr  ZprojectRoleZapplicationRoleZprojectLeadr  r  r   r   r   Z	parameterr   u9   Не нашли пользователя для прав r2  u-   Не нашли группу для прав u'   Неизвестный тип прав )#Zcmf.system_datara  r   rW   rX   rY   r*   r   r   rG   ZCmfProjectPermSchemerI   r   r   ZCmfProjectPermPermissionr-   r*  ZCmfProjectPermSchemeRuler   r0   r   r  rc  rs   Zaccess_local_userZaccess_ownerZaccess_responsibleZaccess_authorr<   rE   rF   r   r   rb  r,  )r   rk  ra  rO  Zsystem_dataZmap_permr\   Zperm_scheme_dictr   Zperm_schemeZ	perm_dictrd  r   r   Zscheme_ruleZrole_ext_idr  r   r2  r   r   r   r    s    
"$&z"JiraAPIImport._process_permissionsc                 C   s   t dd
 | }|dkr"q| j r0q| jjd|d   | jj|d dd}zd|  t	|d d	"}|j
d
dD ]}|| qW 5 Q R X | jjd|d   || W nB tk
r } z"| jjd|d  d|  W 5 d }~X Y nX W 5 Q R X qW 5 Q R X d S )NFrm  rn  u    Пытаемся скачать r   T)streamr)  r3  i    )Z
chunk_sizeu   Сохранили в u+   Неудалось скачать файл r   )r   rI   r*   r)  r-   r.   r<   rI  Zraise_for_statusrW   Ziter_contentr
  r  r/   r1   )r   download_queue
done_queuer,  r`   r\   chunkr  r   r   r   _download_file_worker  s"    
z#JiraAPIImport._download_file_workerc           	      C   s  | j jd | j }| j }| j dg dd| j jjjgdddgg}tj	j
|dsl| j jd d S g }t| jD ]J}| jj| jd	| ||d
d}|| |  | j jd|  qztj	j|ddgdD ],}| j  r q||j|j|jd q|D ]}|d q| s<|D ]}|  q,| j  r^d| j _| j   d S | j jd | std | }tj	j|d d}d|_|  qld S )Nu=   Скачиваем все найденные вложенияzplugin.plugin.source_hashr   r   r*  Fr   u   Вложений нетri  )rf  rg  r  u    Запустили задачу r   r)  r  )r   r   r)  rn  r  u%   Закончили скачиватьr   r   r  T)r*   r-   r.   rc   r  r   r   r   rG   r(  r^  r  rd   rb   r  ri  rs   r  Zslistr)  r  r   r   r)  rA  r   rg   r   printrI   r*  )	r   rf  rg  r   Zprocsr  r  r,  Zdownload_idr   r   r   download_files  sH    






zJiraAPIImport.download_filesc                 C   sL  d| j _d| j _| j   t  |   |   |   |   |   | 	  |   | 
  |   | jjjr|   |   |   |   |   n|   |   |   |   d| j _| j   t  |  D ]8}|d dd | jD krq| j jd|d  d q| j jd	| j  | j jd
| j j  | j S )Nr   rQ  r   c                 S   s   g | ]}|d  qS r  r   r   r   r   r   r   ?	  s     z0JiraAPIImport.process_import.<locals>.<listcomp>u'   Импортирован проект 'r   r.  u#   Ошибок обнаружено: u-   Импортировано объектов: )r*   r/  rM  r   r   rV  rk  r  r3  r:  r  r<   rE   rF   r  r  r  r  r`  r  r  r   rN   r-   r.   r0   )r   r   r   r   r   process_import"	  sB    



zJiraAPIImport.process_import)T)r   r   )T)N)Zr#   r$   r%   r&   r@  r(   r   r'   r   r   rC   propertyr]   staticmethodr   r   r   ra   rO   rt   rz   r~   r   r   r   r   r   r9   r   r   r   r   r  r   r   r  r3  r:  rG   rW  re  rT  rl  rq  r  r  r  r  r  r  r  r   r  r  r  ro  r  r  r  r  r  r  r  r  r   r   rQ  rS  r  r  r  r  r   r   r  r  r  r   r-  r:  rC  rP  rV  r  r`  r  ri  rk  rl  __classcell__r   r   rQ   r   r:   7   s   


	,2  


 	0
Y
G'.

|
K
8
'
&
 
	
>
&

J
;
(	,W" 0OO%r:   )+Zcmf.appr   Zcmf.includeZdataclassesr  pathlibr   r   Ztempfiler   r  typingr   r   r   r	   r
   r   r   Zbs4r   r   Zcmf.data_providers.baser   r   r   Z
cmf.modelsr   Z%common.models.cmf_plugin_import_mixinr   Zmodules.jira.apir   Zmodules.jira.base_importr   rG   r   r   r   r   Z	dataclassr   r9   r:   r   r   r   r   <module>   s(   $ 