U
    Įwh                    @   sT  d dl mZ d dlT d dlmZ d dlZd dlZd dlZd dlZd dl	Z	d dl
Z
d dlZd dlZd dlm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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) eee*j+ ee*j, ee*j- f Z.ej/G dd dZ0dd Z1G dd de'Z2dS )    )cmf_context)*)cmf_hashlibN)Path)DictOptionalListCallableUnionTypeIterator)BeautifulSoup)permutations)dedentindent)	BaseModel)CmfPluginImportMixin)JiraApi)JiraBaseImport)JQLNormalizerc                   @   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                    s   z>| j d  | j  r$W dS  | f||}t  |W S  tk
rz   t  |  jd7  _| j d  Y dS X d S )Nz================== r      u   Ошибка )
cmf_importlog	is_cancel
cmf_commit	Exceptioncmf_rollback
has_errors	log_error)objargskwargsres)funcr   r   r   wrapper.   s    
z3catch_exception.<locals>.decorator.<locals>.wrapperr   )r6   r7   r   )r6   r   	decorator-   s    z"catch_exception.<locals>.decoratorr   )r   r9   r   r8   r   catch_exception,   s    r:   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dd Zdd Z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d.dd Zee dd!d"Zee dd#d$Zee ed%d&d'Zd/d*d+Zed,d-d. Z ed/d0d1 Z!ed2eed3d4d5Z"d6d7 Z#ed8ee$d9d:d;Z%d0d<d=Z&ed>d?d@ Z'edAdBdC Z(edDdEdF Z)e*j+ddGdHZ,dIdJ Z-d1dKdLZ.d2dMdNZ/dOdP Z0dQdR Z1dSdT Z2edUdVdW Z3edXdYdZ Z4ed[d\d] Z5ed^d3e6d_d`daZ7eedbdcddZ8dedf Z9dgdh Z:edidjdk Z;edldmdn Z<edodpdq Z=drds Z>d4dtduZ?e@dvdwdxZAe@dvdydzZBed{ed|d}d~ZCdd ZDdd ZEeded|ddZFdd ZGeddd ZHdd ZIdd ZJdd ZKeddd ZLeddd ZMdd ZNdd ZOedd5ddZPeddd ZQedd6e6d_ddZRededddZSeddd ZTeddd ZUeddd ZVeddd ZWeddd ZXeddd ZYdd ZZededddZ[edddZ\ddÄ Z]ddń Z^ddǄ Z_ddɄ Z`dd˄ Zadd̈́ Zbddτ Zcddф Zdddӄ ZeddՄ Zfd7dd؄Zgd8dd܄Zhddބ Zidd Zjdd Zkdd Zled|ddZmed|ddZned|ddZoed|ddZped|ddZqdd Zrdd Zsdd Ztedee@edddZudd Zvdd ZweexdddZyd9eed ddZzd:eeeedddZ{d;ddZ|dd	 Z}ed<eeeedddZ~dd Zdd Zdd Zdd Zdd Zdd Zdd ZedddZd d! Zd"d# Zed$d%d& Zd'd( Zed)d*d+ Zd,d- Z  ZS (=  JiraAPIImportu;   Класс загрузки объектов через APIr0   _JiraAPIImport__jira_fieldsN)jirareturnc                    s   t  j|| || _d| _| jjr(d| _tjjdd| _d | _	| 
 | _i | _i | _i | _g | _g | _d| _td}| jjj|_|| jjj |   d | _d| _d S )Nr   	accountIdsoftdevcoder   zatlassian.rest_clientF)super__init__r=   user_keycloudmodelsCmfActivitygetdefault_activitycloud_id_get_jira_global_settingsjira_global_settingsZepicsissue_relationssubtasksboardsselected_projectsr0   loggingZ	getLoggerr*   loggerZhandlersZsetLevellevel_prepare_multiprocessingr<   update_fields)r   r=   r3   r4   rS   	__class__r   r   rD   F   s(    

zJiraAPIImport.__init__)r>   c              	   C   s   | j r| j S | j d}| rL| jsLt|}t|| _ W 5 Q R X n6| j	
 | _ t|d}t| j | W 5 Q R X d| _| j S )Nfields.jsonw+F)r<   r*   get_download_pathjoinpathexistsrV   openjsonloadr=   Z
get_fieldsdump)r   	file_pathfr   r   r   jira_fields^   s    
zJiraAPIImport.jira_fieldsc              	   C   sl   dd l }|| _| j d}| j dt  }t|d}t	| j| W 5 Q R X |
|| d S )Nr   rY   zfields.json.rZ   )shutilr<   r*   r[   r\   osgetpidr^   r_   ra   move)r   fieldsre   rb   file_path_tmprc   r   r   r   update_jira_fieldsn   s    z JiraAPIImport.update_jira_fieldsc                 C   s(   | j  D ]}|d |kr
|  S q
d S )Nr   )rd   values)r   r   fieldr   r   r   _get_field_by_namew   s    z JiraAPIImport._get_field_by_namec                    s"   t t fdd| j d }|S )Nc                    s   |  di  d kS )NschemacustomrI   rc   
field_typer   r   <lambda>       z2JiraAPIImport._get_field_by_type.<locals>.<lambda>)nextfilterrd   rl   )r   rt   rm   r   rs   r   _get_field_by_type|   s    
z JiraAPIImport._get_field_by_type)model
field_namer>   c                 C   s&   |sd S | j |gd}|r"|d S d S )N)Zfields_namer   )import_shop_fields)rz   r{   r5   r   r   r   _get_field_name   s    zJiraAPIImport._get_field_namec                 C   s<   dd l }dd l}|| _ || _tj| _tj| _| j | _	d S )Nr   )
	threadingqueueconfigZIMPORT_THREADSZthreading_max_forksZIMPORT_DOWNLOAD_THREADSdownload_threading_max_forksr*   Zget_max_processesmax_processes)r   r~   r   r   r   r   rU      s    z&JiraAPIImport._prepare_multiprocessingc              
   C   sp   g }ddddddddd	d
	}dddd}| j  D ]8\}}d| ||d }|||d||d q2|S )uO    Сопоставление настроек для модели models.CmfTaskr   textprioritystatusZ
alarm_dateZdeadlinecmf_modified_atcmf_created_atstatus_closed_at)	summarydescriptionr   r   Zcustomfield_10015Zduedateupdatedcreatedresolutiondatez.namez.watchCountz.votes)r   ZwatchesZvoteszfields. N)model_field	json_path	ext_field)rd   itemsrI   append)r   Zissue_settingsZdefault_local_attrs_mappingZadditional_json_pathZcustom_field_keyZcustom_fieldr   r   r   r   _get_issue_import_settings   s.    

z(JiraAPIImport._get_issue_import_settingsc                  C   s    dddddddddg} | S )Nr   displayNamer   r   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 )Nr   r   r   
cmf_authorauthorr   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   Ключ)r   r   r   r   r   bodyr   .r)   r   r   )splitlenrd   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 |rt| trg }| D ]f}d|kr||d d  qd|kr||d d  qd|kr||d  q|r|t| qd|S | S )	Nr   r   r   r   r   inwardIssueoutwardIssue,)r   
isinstancedictrI   listr   r'   join)r2   r   to_strr{   Z
str_fieldsZ	str_fieldresultZrelated_objr   r   r   _get_file_val   s6    



zJiraAPIImport._get_file_valc           	         sv  g  t ttt f tg tt f ttd fdd}jdg j 	d}d}d}|
 r D ]$}|d D ]} qq~|rl qqldD ]} qq|sd	d
 jjddD }|r|d }|sdd
 jjjjddD }|r|d }|s
tdd_||jtj |s.td||jtj ddddddg}||jtj  dg d  S )u-    Инициализация настроек )objssettings_funcrz   r>   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   ri   )r   r}   r   r   r   verbose_name)r   r   rz   r2   Zobj_settingssettingr   r   r   r   _get_settings  s    z:JiraAPIImport.tmplt_import_settings.<locals>._get_settingszplugin.plugin.*projectsN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     )usernameZ	limit_enduS   Не найдено ни одной задачи, импорт невозможенTua   Не найдено ни одного пользователя, импорт невозможенz2022-05-22T15:22:22.593+0300r   u!   Электронная почта)r   r   r   )r   r   r   selectedObjects)r   value)r
   r   r   r   r	   	TypeModelr*   load_fieldsr[   r\   r]   _get_projectsget_project_tasks_simple_getr=   
get_issues	get_usersr   r.   rV   r   rG   CmfTaskr   	CmfPersonr   
CmfCommentr   )	r   r   Zdump_dirtaskuserprojecttasksr   Zcomment_exampler   r   r   tmplt_import_settings   sT      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 )Nimport_settingsu   Задачиzcalendar-today)r   r   titlesrows   r   ri   r   r   r{   r   r   captionr   )Z_normalize_settingsr*   json_settingsr=   r   	enumeraterG   r   r   r   _normalize_jira_valuer   )r   settingsr   issuenumr   r   r   r   r   preview=  s    zJiraAPIImport.preview)r   r>   c                 C   s\   i }|D ]N}|d sq| j ||d dd}| |d d ||d}|||d d < q|S )uC    Преобразование настроек для модели r   r   F)r   r{   r   )r   r   rI   )r   r2   r   Znormalized_objr   r   r   r   r   _normalize_objL  s    zJiraAPIImport._normalize_obj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rx   ::r   r   	startDateendDate)r   parenttree_parent	list_typeplan_start_dateplan_end_dateext_idr   Z
filter_objTZsave_import)r   rI   r   rG   	CmfFolderr*   pluginsource_hashr   process_any_table_fieldsCmfListr   save)
r   r   r   Zparent_sys_typer   _filterr   r   Zlist_objnewr   r   r   _process_listX  s*    


zJiraAPIImport._process_listu8   Обработка наблюдателей задачиc                 C   s   d|d  d|d d  d}g }|  |D ]n}| jjrL| j|d |d}n| j|d |d}|sptd	| ||jks,||jks,||jkrq,|| q,||_	d
S )u;   Добавляем наблюдателей в задачуu$   Наблюдатели задачи r   : "ri   r   "r?   r2   uI   _process_watchers: Не найден наблюдатель задачи N)
_get_issue_watchersr=   rF   _get_personZCmfErrorresponsibler   	cmf_ownerr   
spectators)r   	issue_objr   r2   r  watcherpersonr   r   r   _process_watchersq  s    zJiraAPIImport._process_watchersu#   Обработка вложенийc                 C   s
  ddl m} dd l}d|d  d|d d  d}t|d	  d
}d}| r||}| D ]}	zz|		drW W zqh|d d D ]}
|
d |	kr qqt
jj|	|ddddgd}|st
j| j|d|	d}|jr|
r|
dr| j|
d | j |d|_|
d |_||	Z}|jdd || |jdd |
r||j|
d ks|td|j d|
d  dW 5 Q R X t  W nn tk
r   | jjd|	 dd |d t  |d!7 }Y n2   t  | jjd"|	 d#|d |d!7 }Y nX W 5 | jdd X qhW 5 Q R X | |D ]}zz|d$ }	t
jj|	|d%}|sbt
j| j|d|	d}|jr|jdd |  t|d& |j t
jj j!" }|#|j$}|%  t  W n2   t  | jjd"|	 d#|d |d!7 }Y nX W 5 | jdd X q(|S )'Nr   )RDisku   Вложения задачи r   r   ri   r   r   
issue_pathz /attachments/all_attachments.zip
attachment	processed/filenameimport_originalurlZurl_preview_imgZurl_previewr   r   ri   T)r*   r   r  r   r   r   r   r   sizeu   Текущий размер z != u    из метыu7   Обранужена проблема вложения uI   , размер файла не совпадает с метой из JIRAzERR-0034r)   :   Не удалось обработать вложение zERR-0035	file_namer   r   rb   )&Zrdisk.rdiskr  zipfiler   r]   ZipFileZnamelistr*   inc_statendswithrG   CmfAttachmentrI   r  r   rE   r   r   r^   r   Zupload_stream_filest_sizeAssertionErrorr-   r1   r/   _get_issue_attachmentsZ
upload_dirre   copyZfull_path_fileZCmfRFileZdpZdata_driverZget_rdZ	get_rfileZ
_file_nameZmake_preview)r   r  
jira_issuer  r  r2   Zall_attach_zip_patherrorsZmyzipZattach_nameattach_infor
  Zattach_fattachment_infordiskZrfiler   r   r   _process_attachments  s    






6
   
 z"JiraAPIImport._process_attachmentsuB   Обработка упоминаний пользователей)	text_soupr>   c                 C   s`  ddl m}m} |jdkr d}nd}|jddidD ]$}z|jd	rZ| |jd	 }np|jd
rx| |jd
 }nR||jd }||j}	|	dr| 	|	d d 
 }
| |
| j }ntdt|jt|jt|jt|jt|jdd}||j W q4 tk
rX } z0|  jd7  _| jjd| d| d|d W 5 d}~X Y q4X q4dS )u]   
        Упоминания пользователей
        confluence-userlink
        r   )urlparseparse_qsr   a  
                <a
                    class="external"
                    href="{person_href}"
                    rel="noopener"
                    target="_blank"
                    data-macros="mentions"
                    data-mention-type="person"
                    data-object-id="{person_id}"
                    data-title="{person_login}"
                    cmf_converted="true"
                >
                    @{person_name}
                </a>
            u	  
                <span class="macros-panel mentions-macros" contenteditable="false" data-id>
                    <span class="extension-container" data-layout="default" data-id>
                        <span class="extension-title" data-id>
                            @Упоминания <span class="excerpt-title" data-id>| {person_login}</span>
                        </span>
                        <span class="macros-actions" data-id>
                            <span class="macros-delete" data-id>
                                <svg viewbox="0 0 18 18" class="ng-star-inserted" style="width: 14px; height: 14px; color: #222222;">
                                    <path fill="#222" d="M16.5 3H12.75V1.5C12.75 1.10218 12.592 0.720644 12.3107 0.43934C12.0294 0.158035 11.6478 0 11.25 0L6.75 0C6.35218 0 5.97064 0.158035 5.68934 0.43934C5.40804 0.720644 5.25 1.10218 5.25 1.5V3H1.5V4.5H3V15.75C3 16.3467 3.23705 16.919 3.65901 17.341C4.08097 17.7629 4.65326 18 5.25 18H12.75C13.3467 18 13.919 17.7629 14.341 17.341C14.7629 16.919 15 16.3467 15 15.75V4.5H16.5V3ZM6.75 1.5H11.25V3H6.75V1.5ZM13.5 15.75C13.5 15.9489 13.421 16.1397 13.2803 16.2803C13.1397 16.421 12.9489 16.5 12.75 16.5H5.25C5.05109 16.5 4.86032 16.421 4.71967 16.2803C4.57902 16.1397 4.5 15.9489 4.5 15.75V4.5H13.5V15.75Z" stroke="none" stroke-width="1" class="ng-star-inserted"></path>
                                    <path fill="#222" d="M8.25 7.5H6.75V13.5H8.25V7.5Z" stroke="none" stroke-width="1" class="ng-star-inserted"></path>
                                    <path fill="#222" d="M11.25 7.5H9.75V13.5H11.25V7.5Z" stroke="none" stroke-width="1" class="ng-star-inserted"></path>
                                </svg>
                            </span>
                        </span>
                    </span>
                    <span class="ak-renderer-wrapper" data-id>
                        <a class="external" data-macros="mentions" data-mention-type="person" data-object-id="{person_id}" data-title="{person_login}" rel="noopener" data-id cmf_converted="true">
                            <span class="lds-ring" data-id>
                                <span data-id></span>
                                <span data-id></span>
                                <span data-id></span>
                                <span data-id></span>
                            </span>
                        </a>
                    </span>
                </span>
            class
user-hoverattrsdata-account-iddata-usernamehrefr   u[   Не найдены атрибуты для определения пользователя)Z	person_idZperson_loginZperson_hrefZperson_namehtml.parserr)   uR   Ошибка конвертации упоминания пользователя : zERR-0036r   N)urllib.parser%  r&  
class_namefind_allr*  rI   r   query_get_user_info_from_dumplowerrE   r.   r   formatr'   r   loginr-  r   Zreplace_withZ
currentTagr0   r*   r1   )r   r$  r2   r%  r&  ZTMPLtagr  
parsed_urlr3  	user_infonew_tager   r   r   _process_mentions  sB    


	zJiraAPIImport._process_mentionsc                 C   s   t jj}|| jj d| }|d k	r2t|S | dD ]}|| j	|krX|  S |dd
 |
 krx|  S |dd
 |
 kr|  S |dd
 |
 kr|  S |dd
 |
 kr<|  S q<td| d S )	N:user:r   r   r   r   r   r   uQ   Не нашли информацию по пользователю в дампе )APPREDIS_DBredisrI   r*   r   pickleloadsr   rE   r5  r.   )r   user_idredis_dbr:  r   r   r   r4  %  s     

z&JiraAPIImport._get_user_info_from_dumpu#   Конвертация ссылок)r$  r   c                    s  | dd D ]l}|jdr6| jjd|  q|drf|jd drf| jjd|  q| jjd|  |dr|jd }n
|jd	 }tj	
|d
d dd }tdtj	
|dd }|r|d  |d d }tt fdd|d }	|	r|	d }tjj|dg|d}
|
r|d	r|jd	 |jd< |
j|jd	< d|jd< t|jd	 }|r|d r|d drd|_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d S )!Nc                 S   s   |  dp|  dS Nr-  srchas_attrr8  r   r   r   ru   :  rv   z.JiraAPIImport._process_links.<locals>.<lambda>Zcmf_convertedu   Уже обработали r-  #u   Это якорь u&   Обрабатываем ссылку rG  r  ?r   (/attachment(?:/content)?/(\d+)(?:/)?(.*)r)   ri   r
  c                    s   |  d kS Nr   rq   itemZ	attach_idr   r   ru   M  rv   r  r  )r   ri   r   Zsrc_origTZvideoZcontrolsz100%widthZheightZ	href_origu   Заменили на z/people/r   )r2  r*  rI   r*   rS   inforI  
startswithurllibparseunquoter   researchrw   rx   rG   r  sgetr  	mimetypes
guess_typer   r   r-  )r   r$  r   r  r8  r  r  	url_matchattachmentsattachZ
attach_obj	mime_type
account_idr  r   rR  r   _process_links8  sZ    

 
 





zJiraAPIImport._process_linksc              	      s  |rd| dnd}|s|r0| j jd|  | jjr\|d dkr\| j jd|d   | || jtj	j
 d }| jjs"|d	  td
|d }dd |D }t|dkr" fdd|D } fdd|D }	|r|d |d< n|	r|	d |d< n|d |d< ||d  |d |d< d| j jjj d|| j  d}
|d	 dd}d}|D ]}t||krZt|}qZttj	jjtj	jjtj	jj}||kr0t|dkr|d |d< d|d< d|d< nbt|dkr|d |d< |d |d< d|d< n2t|dkrb|d |d< |d |d< |d |d< n2|  jd7  _| j jd|d	  d| dddd d d!g}tj	jd"d#d$|
 d$g|d%}|r:|jjd| j jjj ddkr:|r
| j jd&| d'|j  td| j jjj d(d|jj|_|jd)d* d }n0|  jd7  _| j jd+| d,|j d-d.d/d0 |sd1d"d2d3| j jjj d4gd"d5d gg}tj	jd6d7|d g|g|d%}|stj	jdd7|d g|g|d%}t|dkr| j jd8|d  d9t| d| d:dd |  jd7  _g }|s | j jd;|d  d|  d	d7|d	 g|g}tj	j||d%}|s d1g}t |t|D ]}t|dkrvdd7|d g}nnt|dkr|!dd7|d gdd7|d gg n<t|dkrT|!dd7|d gdd7|d gdd7|d gg qT||g}tj	j||d%}t|dkrR|  jd7  _| j jd<|d	  d=|d  d>t| d| d:dd |rb|d }n*| j "d?|d	  d=|d  d@| t#j$ dA}|s0|r(d)}d}|d }tj	jd6d7|% g|d%r| j "dB| dCt#j& |d dD\}}| dE| dD| }|d7 }qtj	|
|| j d)dF}nd |fS |rtd
t'|j(}dGd |D }t|dkrp|d |d6< |j)r|D ]}t*||||  q||jr|
|jkr|j |
 |_n|
|_tj+, }tj+- }|j.!| |j.!| d)|_/|dH dI D ] }| jjr d|dJ  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	d5|d	 gd gd%}|stj+|
| j d)|d	 |dK}|j)r|d	 |_0|js|
|_n|
|jkr|j |
 |_|jd)d* |j.!| q|j1r|jd)d* ||fS )LN()r   u0   Импортируем пользователя ZaccountTypeZ	atlassianu   Неизвестный тип ri   r   z[,;\s]+r   c                 S   s   g | ]}|  r|  qS r   stripr   r   r   r   r   r   ~  s      z1JiraAPIImport._process_person.<locals>.<listcomp>r)   c                    s"   g | ]} | d d kr|qS @r   r   rh  Z
user_loginr   r   r     s      c                    s"   g | ]}| d d  kr|qS ri  rk  rh  rl  r   r   r     s      r   Zemail_2r       	last_name
first_namesecond_name   u?   Часть полного имени пользователя "u   " длиннее u_    символов. Фамилия, Имя и Отчество не были заполнены.zERR-0110r   obj_typer   rg_member_ofr   LIKE%rx   ri   u    ext_id пользователя N    содержит несколько ID из одного источника: z::.+?::Tr   uP   Возможно найден некорректный пользователь ud   ,так как ext_id содержит несколько ID из одного источника: 'uq   '.Необходимо повторно импортировать локальных пользователей.zERR-0004r   
error_codert  ORzNOT LIKE%::::%r   r7  ILIKEu+   Пользователей с почтой z > zERR-0037uH   Не удалось найти пользователя с почтой u+   Пользователей с именем  (z) > uM   Не нашли пользователя среди существующих ) FuQ   Обнаружена учетная запись с дублирующим email u   , добавляем цифруrj  +)r   r7  r*   r  c                 S   s   g | ]}|  r|  qS r   rf  rh  r   r   r   r   3  s      groupsr   groupId)r   r*   r  r   import_raw_json)2r*   rS   rT  r=   rF   warningr   r   rG   r   r   rY  r   r   remover   r   rE   minrp  Z
max_lengthro  rq  r0   r1   rI   r   r   countsubr   r   r   r   r+   rR   INFOr5  WARNINGr'   r7  r  setattrCmfPersonGroup
jira_group
user_groupru  Z
user_localr   
is_changed)r   r   createupdater2   Zobj_msgZ	user_dictZemailsZemails_by_loginZemails_by_namer   Z	full_nameZcurrent_length_namer   Zmax_length_nameri   r  Znot_source_hash_filterZpersonsr   Z
name_combo
is_creatednr7  Zprefix_emaildomainr   r  r  Z
group_infogroupr   rl  r   _process_personm  s   
 


*" 
&
 


   
zJiraAPIImport._process_personu   Обработка группc              	   C   s<  |  dD ]*}z| j r$W  d S d| jjjj d|d  d}tjjddd| dgdgd}|stjjdd	|d gdgd}|stj|d || jd
|d}|jr|d |_	|j
s||_
n||j
kr|j
 | |_
|jd
d t  | j jd7  _W q
   t  |  jd7  _| jjd| ddd Y q
X q
d S )Nr  r   r   r   rv  rw  r   rx  r  T)r   r   r*   r  r  r   r)   u4   Не удалось загрузить группу ERR-0038r  rs  )r   r*   r,   r   r   rG   r  rI   r  r   r   r   r-   imported_object_countr/   r0   r1   )r   Z
group_datar   r  r   r   r   _process_groupsa  s@    
 

 zJiraAPIImport._process_groupsu-   Обработка пользователейc              	   C   s  | j jjdds(| j jdtjd d S t }| dD ]}zd| j 	 rPW  d S | 
|\}}t  | j  jd7  _|jr|js|jds|r||jj W q8   t  |  jd7  _| j jd| d	d
d Y q8X q8|r| j jjddrttjjt|gd d S )N
load_usersTuA   Не грузим пользователей из-за опцийrT   r   r)   z.evateam.ruu@   Не удалось загрузить пользователя r  r   rs  Zsend_invites)r3   )r*   r   r   rI   r+   rR   r  setr   r,   r  r-   r  r   r   r  addr/   r0   r1   Zschedule_deferred_jobrG   r   Zregister_personsr   )r   Znew_user_emailsr   r  r  r   r   r   _process_users  s0    
 zJiraAPIImport._process_usersu#   Обработка статусовc                 C   s   |  dD ]}| j r dS | jjr0|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 t  | j jd7  _q
dS )uc   
        Грузим статусы из Jira и сопостовляем с нашими
        statusesNstatusCategoryr   r   r   r   r   r   r   )r   r*   Tr   r)   )r   r*   r,   r=   rF   r   r   rG   CmfStatusCoderI   r   r   get_status_typestatus_typer   r   r-   r  )r   r   r  r   Zcmf_status_coder   r   r   r   _process_statuses  s*    



zJiraAPIImport._process_statusesc               	      s  i }d }d }|d }dd |  |D }tjjdd}| |}|D ]}	| jjjj d|	d  }
tjjdd|
gd	}|stj||
| jd
d}|jr|d  d|	d  |_	|	dd|_
|	|_|jd
d |	d d d }|D ]f}||}|s|d dkr|}|s |d dkr |}d| jjjj d| d| d}|||< q|	d D ]}| || qRt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 q| jjjj d|j  |	d D ]}  d|d  }|d   }tjj||d!}|s4tj||| jd"}|d |_	|d |_
 fd#d$|d% D }tjjdd&|gd	|_  d|d'  }tjj|d(}|d)kr|rd
|_|jd
d* ||_|jd
d qqD|d+ }| jjjj d,|d  }tjj|d(}|s$tjjd-d}tj||| jd.}|d |_	||_||_|jd
d tjj|d/D ]}|jd
d0 qT| D ]b\}}| j r qtjjdd1d2| d2gd	}|||| jd3d4}tjf |}|jd
d qp|S )5Nr   c                 S   s   i | ]}|d  |qS r   r   r   
issue_typer   r   r   
<dictcomp>  s    zEJiraAPIImport._create_schemewf_for_simple_project.<locals>.<dictcomp>default.system:defaultrA   r   r   =r   Ttemplater   r*   r  r   r/  r   r   r   r   associatedWithr   
issueTypeshierarchyLevelrL  :r  workflowr   r  rx  !=forcetransitionstype)r  r   )r  r   r*   c                    s(   g | ] }| d r  d|d   qS )ZfromStatusReferencer   rq   r   sworkflow_hash_idr   r   r     s   
zEJiraAPIImport._create_schemewf_for_simple_project.<locals>.<listcomp>ZlinksINZtoStatusReferencer  globalZ	only_dataworkflow_scheme
::SIMPLE::softdev:default)r  r   r*   )	scheme_wfZTEXKOM_db_deleterv  rw  r   )r  
logic_typetarget_workflowr*   cmf_model_name)_get_issue_types_for_projectrG   CmfWorkflowrI   !_get_simplified_project_workflowsr*   r   r   r  r   r   r  r   _create_status	CmfStatusr   r  deleter   r5  CmfTransstatus_fromallow_empty_transition	status_toCmfSchemeWfdefault_task_workflowdefault_subtask_workflowCmfSchemeWfRuler   r,   CmfLogicType) r   Zjira_project_info	issue_mapZdefault_workflow_for_taskZdefault_workflow_for_subtask
project_idissue_typeswf_templateworkflows_dataworkflow_dataworkflow_ext_idr  issue_type_idsissue_type_idr  issue_type_ext_idr   Zworkflow_transitiontransition_ext_idtransition_type
transitionstatus_from_ext_id_liststatus_to_ext_idr  workflow_scheme_datascheme_wf_ext_idr  Ztemplate_wfrulelogic_type_ext_idr  	rule_dictr   r  r   #_create_schemewf_for_simple_project  s    




 






z1JiraAPIImport._create_schemewf_for_simple_projectc           	      C   sZ  | 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d	d
d ggd}|stjjdd
|d gdd
|gd	d
d ggd}|stj|| j |d}||_|d |_|d |_d|_||_ddddd}||d|_|j
dd |S )Nr   r   r  r  r   )r   r   r*   Tr   r   r   r   r  status_code)r  r*   r  r   F#a0a0a0z#3f82d8z#e36b51z#23a055)OPENIN_PROGRESSZ	IN_REVIEWCLOSED)r*   r   r   r   rG   r  rI   r   r  r  r   r  r   r   r   r  r  color)	r   Zjira_status_datar  status_ext_idr   r  r  r   Zstatus_type_colorr   r   r   r  K  sH    "

zJiraAPIImport._create_statusc                    s  d8 fdd	}d9 fdd	}d:dd}dd	 }d
d }d|dd|dd|dd|dd|dd}	d|j  d}
g }t|D ]\}}|d }|	|}|r>zFt|d f |}|j d| }tjj|ddgd}| stjdd|d|| jd|d	}|jr* jj	
d| d|
 d | d! np|jsV jj	
d| d|
 d"| d! nDd#|j_|  t   jj	d| d|
 d$|j d%|d&  d	 |t|j  jj	d'|d&  d(|   jj	d'|d&  d)|  W nR tk
r: } z2 jjd| d|
 d*|d&  d+| d,d-d. W 5 d}~X Y nX q~ jj	d'| d/ q~tjjd0d1|gd2d3|gd4d5dggdd6}|D ]}|jdd7 qt  dS );uv   
        Обработка условий перехода
        Конвертация в bzPython код
        Nc                    sp   d j jjj d|  d}tjjdddd| dgdd| ggd}|sVtd|  d	d
|j d|j d}|S )Nr   r|  r   r  rw  r   r   u   Группа '   ' не найденаu8               # Пользователь в Группе 'zU'
            try:
                return g.current_user.in_person_group(group_code='@')
            except:
                return False
            )	r*   r   r   rG   r  rI   r.   r   rB   )r  r4   group_ext_idZperson_group	eval_coder   r   r   user_in_group_condition  s    zMJiraAPIImport._process_transition_conditions.<locals>.user_in_group_conditionc                    sR    j jjj d|  }tjj|d}|s8td|  dd|j d|j d}|S )Nr   r  u
   Роль 'r  uG               # Пользователь в проектной роли 'zb'
            try:
                return g.current_user.in_project_role(self.project, role_code='r  )	r*   r   r   rG   CmfProjectRolerI   r.   r   rB   )Zjira_projectrole_idr4   role_ext_idroler  r   r   r   in_project_role_condition  s    zOJiraAPIImport._process_transition_conditions.<locals>.in_project_role_conditionc           	         s   ddl m} | }i }r8ttfdd|d i }n  rXtt fdd|d i }|d}|d}|std	pz  d
d| d| d}|S )u   
            Условие прав
            Args:
                permission_key (str): ключ права
                permission (str): название или ключ права
            r   get_datac                    s   |  d kS )N	jira_coderq   perm)permission_keyr   r   ru     rv   z\JiraAPIImport._process_transition_conditions.<locals>.permission_condition.<locals>.<lambda>project_perm_permissionc                    s&   |  dd   kp$|  d kS )N	jira_namer   r  )rI   r5  r   )
permissionr   r   ru     s    r   rB   u   Право 'u   ' не найденоu.               # Только с правами 'zR'
            try:
                return self.project.check_project_role_access('zJ', obj=self)
            except:
                return False
            )cmf.system_datar  rw   rx   rI   r.   )	r  r  r4   r  system_dataZpermission_datapermission_nameZpermission_coder  r   )r  r  r   permission_condition  s:    



zJJiraAPIImport._process_transition_conditions.<locals>.permission_conditionc                  [   s   d}|S )Nut               # Только Исполнитель
            return self.responsible == g.current_user
            r   r4   r  r   r   r   allow_only_assignee  s    zIJiraAPIImport._process_transition_conditions.<locals>.allow_only_assigneec                  [   s   d}|S )Nur               # Только Постановщик
            return self.cmf_owner == g.current_user
            r   r
  r   r   r   allow_only_reporter  s    zIJiraAPIImport._process_transition_conditions.<locals>.allow_only_reporteru(   Пользователь в Группе)r  r  u3   Пользователь в Роли Проектаu   Условие Правu2   Условие Только Исполнителяu(   Условие Только Автора)z:com.atlassian.jira.workflow.condition.UserInGroupConditionz<com.atlassian.jira.workflow.condition.InProjectRoleConditionz9com.atlassian.jira.workflow.condition.PermissionConditionz7com.atlassian.jira.workflow.condition.AllowOnlyAssigneez7com.atlassian.jira.workflow.condition.AllowOnlyReporter   переход ''r1  r  r   Tcmf_deletedr   include_deletedri   r   z6 eval)	r  r  r  eval_unsafer  r  r*   r  r      Бизнес-процесс , u7   . Пользователь удалил условие K   . Изменения из импорта не будут примененыu9   . Пользователь изменил условие Fu$   . Добавлено условие : 'r  u   Условие '' Jira: ' bzPython: u5   . Не удалось создать условие ''. zERR-0127CmfTransFilterrs  #   ' не поддерживаетсяr  r  rB   NOT INr*   r  rx   r  r  )N)N)NN)r   r   rI   r   r   rG   r  r*   r  rS   r  r  r  r  r   r-   rT  rB   r   r'   r.   r1   debugr   r  )r   
conditionsr  r  r  r  r	  r  r  Zcondition_maptransition_nameZfilter_codesr   condition_dataZcondition_name	conditionr  filter_ext_idZtrans_filterexcZtrans_filtersr   r   r   _process_transition_conditions}  s    
/

	"
z,JiraAPIImport._process_transition_conditionsc                    s  dI fdd	}dd }dJ fdd	}d|d	d
|d	d|d	d}|dkr*d}t jj }	|j d}
t jj|
ddgd}|st jd|j dd|j d|j dddd jd|
d	}|j	r jj
d| d| d|	 d| d	 dS |js jj
d| d| d |	 d| d	 dS t }g }n,t|t jrVd!|j d}t jj }	g }t|d"d#D ] \}}|d$ }||}|rlz|d% f |\}}t|}|dkr|| || nt|t jr|j d&| }t jj|ddgd}|st jdd'd|| jd|d(}|j	rJ jj
d| d| d|	 d| d	 n|js| jj
d| d| d |	 d| d	 nPd)|j_||_|  t   jj
d| d| d*|	 d|j d+|d,  d |t|j  jj
d-|d,  d.|   jj
d-|d,  d/|  W nN tk
rh } z. jd| d| d0|d,  d1| d2 W 5 d}~X Y nX n jj
d3| d4 qb|dkrz|s|js|j dd5 t   jj
d| d| d6|	 d7|j d8	 dS t|j!dd9}d:|j d;}d<d"| d=| d>}|d? t#d?"|d@ d? t#|d@ |_d)|j_|   jj
d| d| dA|	 d7|j d	 nNt|t jrt jj$dBdC|gdDdE|gdFdGdggddH}|D ]}|j dd5 qt  dS )Ku  
        Обработка пост-функций (действий) перехода
        Конвертация в bzPython код

        Действия для начального перехода создаются при помощи
        триггера автоматизации crud (CmfAutomationCrudTrigger),
        так как на текущий момент в бизнес-процессах нет возможности
        настраивать начальный переход.
        Nc                    s  ddddddddddd	dd
ddd}| | }|sLtd|  d|d }|d } d| }d}| dkr r~ dkr|d7 }d}nT }j|ddd\}	}
|	std  d| |d|	j 7 }d|	j d}n| dkr s|d7 }d}ntt fdddd}|s6td  d |d }t	j
jd!d"jggd#}t	jjdd$| gd%d"|ggd&gd'}|D ]6}d(d) |jj D }| |}|dk	r| qސq||}|dkrtd| d*  d+|d| 7 }n| d	krp r dkr|d7 }d}nXjjjj d,  }t	jj |d-}|sPtd.  d/|d|j 7 }d|j d}nd  d}d0| d1|  d2| d3}||fS )4uZ   
            Пост-функция "Обновить Поле Задачи"
               Исполнительr  )r   r   u   Описаниеr      Приоритетr   u   Решение
resolutionu   Темаr   )assigneer   r   r(  r   
   Поле 'r  r   u   # Поле Nz-1u    будет очищеноFr  r     Пользователь '   ' не найден: u    в r  u    в Обычныйr   c                    s   t | dt  kS rO  r'   rI   )r   field_valuer   r   ru     rv   z^JiraAPIImport._process_transition_post_functions.<locals>.update_issue_field.<locals>.<lambda>
prioritiesu   Приоритет 'u!   ' не найден в дампеZcache_schemesr  r   r  r   choicesrx  c                 S   s   i | ]\}}||qS r   r   )r   kvr   r   r   r    s      z`JiraAPIImport._process_transition_post_functions.<locals>.update_issue_field.<locals>.<dictcomp>' (u   ) не найденr   r  u   Резолюция 'r  z            z
            self.z = z
            )rI   r.   r4  r  r   rB   rw   rx   r   rG   CmfCustFieldConfr   cust_field_conf_schemeCmfCustFieldConfFieldr2  r   r   _get_priorityr*   r   r   CmfResolution)r{   r0  r4   Z	field_mapZ
field_datafield_titleZcode_commentr   	user_datar  _Zpriority_datapriority_namecust_field_confsZpriority_field_configsZpriority_field_configZpriority_choicesresolution_ext_idr(  r  r   r/  r   update_issue_field]  s    










zLJiraAPIImport._process_transition_post_functions.<locals>.update_issue_fieldc                  [   s   d}d}||fS )Nr&  uh               # Назначить автора
            self.responsible = self.cmf_owner
            r   )r4   r;  r  r   r   r   assign_to_reporter  s    zLJiraAPIImport._process_transition_post_functions.<locals>.assign_to_reporterc                    sX     | } j|ddd\}}|s6td|  d| d}d|j d|j d}||fS )	NFr+  r,  r-  u   НаблюдателиuR               # Добавить в наблюдатели пользователя z1
            person = models.CmfPerson.get(code='z:')
            self.spectators.append(person)
            )r4  r  r.   r   rB   )r   r4   r<  r  r=  r;  r  r   r   r   add_to_watchers  s    
zIJiraAPIImport._process_transition_post_functions.<locals>.add_to_watchersu&   Обновить Поле Задачи)r   r  u   Назначить автораuC   Добавить в наблюдатели пользователя)zCcom.atlassian.jira.workflow.function.issue.UpdateIssueFieldFunctionzCcom.atlassian.jira.workflow.function.issue.AssignToReporterFunctionzGcom.aeroflot.jira.agreement.workflow.function.AddToWatchersPostFunctioninitialu!   начальный переходz	::initialTr  r  uA   Начальный переход бизнес-процесса 'r  uX   Действия начального перехода в бизнес-процессе r/  r   r  Z
after_save)	r   r   r  Zcrud_actionZ	eval_typer  r*   r  r   r  r  u(   . Пользователь удалил rm  r  u*   . Пользователь изменил r  r)   )startr1  r  r   eval)r  r  r  r  r  r*   r  r   Fu   . Добавлено r  r   u   Действие 'r  r  u7   . Не удалось создать действие 'r  zERR-0126u   Пост-функция 'r  r  u   . Удален  'uY   ', так как начальный переход не содержит действийz\'zif self.workflow.code == 'z':u3   cmf_alert(f'В задаче "{self.code}" поля uC    заполнены автоматически триггером "z"')
z    u   . Добавлен r  r  rB   r  r*   r  r  )NN)N)%rG   ZCmfAutomationCrudTriggerr   r5  r   rI   r   rB   r*   r  rS   r  r  r  r   r  ZCmfTransActionr   r   r  r   r  r  r  r   r-   rT  r'   r.   r1   r  is_newr  replacer   r   r   )r   post_functionsr  r  rA  rB  rC  Zpost_function_mapr   Zaction_verbose_nameZtrigger_ext_idZtriggerZfield_titlesZaction_eval_codesZaction_codesr   Zpost_function_dataZpost_function_nameactionr  r;  Zaction_ext_idZtrans_actionr$  Ztrigger_nameZtrigger_condition_codeZtrigger_alert_codeZtrans_actionsr   r   r   "_process_transition_post_functionsS  s*   
[




	(

z0JiraAPIImport._process_transition_post_functionsc                    sD  | j jjj d|j }| d|d  }tjj||dgd}|sVtj||| j dd}|js~| j j	d|j
 d|j
 d	 n|d
 |_
|d |_fdd|d D |_|d  |_|dr4|d  tt fdd| dd}z| ||_W n8   | j jd  d|j
 d|j
 ddd|d Y nX |jdd |S )uS   
        Обработка перехода бизнес-процесса
        r   r   r  )r   r  ri   Tr  r   r*   r     Переход '$   ' в бизнес-процессе ';   ' был изменен и не будет обновленr   r   c                    s   g | ]} | qS r   r   )r   r  )stepsr   r   r     s   z5JiraAPIImport._process_transition.<locals>.<listcomp>fromtofieldscreenc                    s   t | dt  kS rO  r.  screen	screen_idr   r   ru     rv   z3JiraAPIImport._process_transition.<locals>.<lambda>screensN7   Не удалось установить экран ID     для перехода '!   ' бизнес-процесса 'r  ERR-0122	CmfUiFormrt  r2   r   )r*   r   r   r   rG   r  rI   r  rS   r  r   r   r  r  rw   rx   r   _process_screencmf_ui_formr1   r   )r   transition_datarR  r  r  r  r  screen_datar   )rY  rR  r   _process_transition  sX    



z!JiraAPIImport._process_transitionc           5         s  dd   fdd} fdd}i }d }d }d }i }t |d d}	tjjd	d
}
|d d }|D ]x}t|d }| jjjj	 d| }tjjdd|gdgd}|stj||
| jd}|d |_
|dd|_|jdd |dr|}|}|}n6|d }|D ](}d| jjjj	 d| d}|||< q|d }| j|d dD ]L}|d |kr\qF|d D ]*}|d d |d< | ||||d < qdqFt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$ qz|	d%|j
 d&}| s,td'|j
 d(t|d)}| }W 5 Q R X t|d*}|sbtd+t }i }|d,D ]2}|jdd-id.jdd/}|| ||d < |d0D ]}|d } d1}!|j
d2krd3}!|jd4| d5}|s| jjd6|j
 d7|  d8|d9 q|jdd:id.}"|| | |d |"r6|"jdd/ndg |d;d< d= |!d>}#|#d? |d  |jdd@id.}$|$r|$jdd/|#dA< |||#dB< |||#dC< qqv|stdDt | dEt | dF|dGD ]}|d;d< d= }%||%}&|&rd|&_!|&jddH |d } |jdd:id.}"| |d |"rD|"jdd/ndg |%dId>}#|jdd@id.}$|$rx|$jdd/|#dA< |||#dB< |||#dC< |#|| < q|dJD ]x}|d;d< d= }%|d } |jdd:id.}"| |d |"r|"jdd/ndg |%dKd>}#|||#dB< |||#dC< |#|| < q| j"dLt | dMt#j$ |% D ]P}'|'dN dKkr\dK}(n"| &|'||}(| j'|'dB |(|dO | j(|'dC |(|dO qDW qd tk
r }) z$| jjdP|j
 dQ|) dR|d9 W 5 d })~)X Y qdX qd|d d }*| jjjj	 d|d d  }+tj)jdd|*gdSd"d gddT| jjjj	 dUggd#},|,sRtj)j|+dV},|d dW }-|,stj)jdXd
}.tj)|.| jddY},|,j*rR|*|,_
|-dd|,_||,_+||,_,||,_-g }/|d d }|D ]j}d| jjjj	 d|d  d}tj.jddTdZ| dZgd#}0|/|0 |d[ r|0|,_/|d\ r|0|,_0q|/|,_1|+|,_2|-|,_3|,jdd n| jj45d]|,j
 d^ g }1|6 D ]0\}2}tj.jddTdZ|2 dZgd#}0tj7jd_d|0gd`d|,ggd#}3|3r |3j*s | jj45da|,j
 db|3j8 dc|0j
 dd |1|3j8 qv|3stj7jd_d|0gd`d|,gdeddgdSd"d ggddf}3|3rt| jj45da|,j
 db|3j8 dc|0j
 dg |1|3j8 qvtj7dh|0|,| jdi}3||3_9|3jdd |1|3j8 qvtj7jdjdk|1gd`d|,gdSd"d ggddf}4|4D ]}3|3jddl qt:  |,S )mNc                 S   s2   t dd| } t dd| } t dd| } |  S )ul   
            Преобразует строку в snake_case из любого формата
            z[\.\-\s]r=  z([a-z0-9])([A-Z])z\1_\2z([A-Z])([A-Z][a-z]))rY  r  r5  )arg_namer   r   r   to_snake_case  s    z7JiraAPIImport._process_wf_scheme.<locals>.to_snake_casec                    sN   g }|  dD ]:}i }|dD ]} |d }| ||< q || q|S )Nz$restrict-to > conditions > conditionargr   selectr2  get_textr   )rL  r  r"  r!  rh  rf  rg  r   r   _get_action_conditions  s    z@JiraAPIImport._process_wf_scheme.<locals>._get_action_conditionsc                    sN   g }|  dD ]:}i }|dD ]} |d }| ||< q || q|S )Nz:results > unconditional-result > post-functions > functionrh  r   ri  )rL  rK  functionZfunction_datarh  rf  rl  r   r   _get_action_post_functions  s    zDJiraAPIImport._process_wf_scheme.<locals>._get_action_post_functionsproject_dir	workflowsr  rA   jira_workflow_schememappingsr   r  r   r  rx  r   r  r*   r   r   Tr   defaultr  r   r   r  r  r  r   r  r   r  r  r   r  	workflow_.xmlu,   XML файл бизнес-процесса 'u   ' не найденrxmlur   Не удалось получить список переходов между статусами в виде XMLzsteps > stepzjira.status.idr)  rf  z)actions > action, actions > common-actionZordinaryzcommon-actioncommonrL  r  u7   В XML разметке бизнес-процесса 'u%   ' не найден common-action ID zERR-0121r   zjira.descriptionzresults > unconditional-resultr   step)r   r   r   rS  rT  r  rS  zjira.fieldscreen.idrU  r  rK  u   Из XML получено u    статусов и u'    переходов между нимиzglobal-actions > actionr  r  zinitial-actions > actionrD  u   Настраиваем u1    переходов между статусамиr  )r  r  u   Не удалось импортировать переходы между статусами для бизнес-процесса «u   »: ERR-0067r*   rv  r~  r  rT  r  )r  r*   r  rw  ZdefaultIssueTypeZsubTask*   Схема бизнес-процесса '[   ' была изменена после импорта и не будет обновленаr  r  -   В схеме бизнес-процесса '   ' правило )    для логического типа 'j   ' было изменено или добавлено вручную и не будет обновленоr  r  V   ' было удалено вручную и не будет восстановленоr   r  r  r  r*   rB   r  r  );r   r\   rG   r  rI   r   short_str_encr*   r   r   r   r   r   _get_statuses_for_projectr  r  r   r  r  r]   FileNotFoundErrorr^   readr   r.   r   rj  findrk  r1   
setdefaultr   r   r  r+   rR   r  rl   re  r%  rM  r  r  r  r  Zdefault_epic_workflowr  Zdefault_task_logic_typeZdefault_subtask_logic_typestrict_task_logic_typer   r  rS   r  r   r  rB   r  r-   )5r   project_inform  ro  r  Zdefault_wf_for_taskZdefault_wf_for_subtaskZdefault_wf_for_epicZall_statusesworkflows_dirr  r  r  workflow_name_hashr  r  r  r  r  r  r  jira_statusr   workflow_filerc   workflow_xmlrz  Z
jira_stepsZjira_transitionsr|  Zjira_status_idrL  Z	action_idZaction_typeZaction_descriptionrc  Zaction_screen_idZaction_stepr  jira_transitionr  r<  Zwf_scheme_namewf_scheme_ext_id	wf_schemeZwf_scheme_infor  r  r  current_rulesr  r  rules_for_deletionr   rl  r   _process_wf_scheme  s   	



 



 



	z JiraAPIImport._process_wf_schemec              	   C   sX   d}t dd6 | j rq@| }|dkr.q@|| ||7 }qW 5 Q R X || d S )Nr   FZinit_views_and_dsDONE)r   r*   r,   rI   _process_issueput)r   Zissue_queueZissue_queue_errorsr   r  r   r   r   r   _process_issue_thread
  s    
z#JiraAPIImport._process_issue_threadu   Обработка теговc           
      C   s@  ddl m} t }| j|d | |d dD ]4}| j rB d S |d dr.||d d }q.|D ]}|	dd	d	d
}||ddd}zbdddd| dgdd|gddd| dgg}t
jj|d}|st
j|d}|jdd t  W qh tk
r8 }	 z(t  | jjd| d|	 ddd W 5 d }	~	X Y qhX qhd S )Nr   translitr   r   ri   labelsrm  r=  rK  r   ruTZlanguage_codereversedr|  aliasr  r   "%r   r   r8   r   u*   Не удалось создать тег r/  zERR-0134CmfTagrz  )transliterater  r  r   _count_project_tasksr*   r,   rI   unionrJ  rG   r  r   r-   r.   r/   r1   )
r   r  r  tagsr   Ztag_nameZ
name_aliasr   Ztag_objr<  r   r   r   _process_tags  s8     

zJiraAPIImport._process_tagsu)   Обработка приоритетовc                 C   s   | j jjj d|d  }tjjdd| dgd}i }| dD ]R}|d |d	 krXqB|d
 D ].}|d }| |}|d kr|d }|||< q` qqB|D ]@}	tjj	d|	d}
|
stjddd|	| j d}
||
_
|
jdd qd S )Nr   r   r   r  rw  r   priority_schemesr   ZprojectKeysr1  r   r   r  r'  )r   r   Zorig_captionr   r*   Tr   )r*   r   r   rG   r6  r   r   r9  r8  rI   r2  r   )r   r  cust_field_conf_ext_idr?  r2  Zpriority_schemer   r>  Zpriority_keycust_field_confcust_field_conf_fieldr   r   r   _process_priorities5  s2    

z!JiraAPIImport._process_prioritiesu5   Обработка решений(резолюций)c              
   C   s   |  dD ]}| j r d S |d }|dp6|d }| jjjj d| }tjj|d}|sttj|| j|dd}|jr||_	|d	 |_
||_|jdd
 n"| jjd| d| d| d | j jd7  _q
d S )Nresolutionsr   untranslatedNamer   r   r  T)r   r*   r  r  r   r   u   Резолюция 
 (Jira ID r  ug   ') была изменена. Изменения из импорта не будут примененыr)   )r   r*   r,   rI   r   r   rG   r:  r  r   r   r  r   rS   r  r  )r   r(  Zresolution_idZresolution_namer@  Zresolution_objr   r   r   _process_resolutionsT  s.    

z"JiraAPIImport._process_resolutionsu   Импорт фильтров
is_processc                    s  |s j jd d S  fdd}t }d} dD ]V} j  rN d S |d }|d } j jjj d| }t	j
j|dd	d
gd}	|	st	j
 j |dd}	|	jrfz\||	_|d|	_|di  jr j|d  j |	d|	_d}
d}t }t }|d D ]p}|||	}|s q|dkr6d}
d}q jjrL|| n*|d rb|| n|d r|| q|dg D ] }|||	}|r|| qt||	_t||	_tdd ||B D }|rd}
d}|
|	_||	_||	_|	jdd t  W n\ tk
rb } z<t     j!d7  _! j j"d| d| d | d!d"d# W 5 d }~X Y nX n" j jd$|	 d%| d&| d' |d7 }q8t | }|| } j j#d(|d)d*| d+|d,d-t$|d.  d/	 d S )0Nu.   Импорт фильтров отключенc              
      s*  d}z| d }|dkr~| d d }d j jjj d| d}tjjdddd	| d	gdd|ggd
}|sztd| dnR|dkr| d d }| d d }| d d } j jjj d| }	tjjddd|	 dgd
}|s j j	d| d| d n|dkr| di  j
r| d  j
 }
| d d}| d d}z |
}W n2 tk
r } zt| dW 5 d}~X Y nX  j|ddd\}}|std|p| d|
 dn|dkrd}W nR tk
r$ } z2  jd7  _ j jd |j d!| d"|d# W 5 d}~X Y nX |S )$u  
            Получает объект (группу, проект, пользователь), которому
            необходимо предоставить доступ к фильтру

            Args:
                share_permission (dict): данные объекта прав
                task_filter (obj): объект фильтра

            Returns:
                _type_: _description_
            Nr  r  r   r   r|  r   r  rw  r   u"   Не найдена группа 'r  r   r   r   rv  r}  r~  u~   Не удалось добавить разрешение на доступ к фильтру. Не найден проект r  u=   '. Возможно он еще не импортированr   r   H   . Возможно пользователь был удален в Jira.Fr+  u,   Не найден пользователь 'r5  re  loggedinr)   u_   Не удалось добавить разрешение на доступ к фильтру 'r  zERR-0129r{  r2   )r*   r   r   rG   r  rI   r.   
CmfProjectrS   r  rE   r4  r  r0   r1   r   )share_permissiontask_filtershareeZshare_permission_type
group_namer  r  r   project_nameZproject_ext_idrE   Z	user_nameZuser_display_namer:  r$  r=  r   r   r   _get_shareez  sx    


z3JiraAPIImport._process_filters.<locals>._get_shareer   filtersr   r   r   r  r  r   ri   Tr*   r   r  r   ownerr   privateZsharePermissionsr  readonlyr{  editviewZeditPermissionsc                 s   s   | ]}t |tjV  qd S r   )r   rG   r  r   r   r   r   	<genexpr>	  s   z1JiraAPIImport._process_filters.<locals>.<genexpr>fullr   r)   u0   Ошибка обработки фильтра 'z' (ID: z). zERR-0130CmfTaskFilterrz     Фильтр r  r  uc   ') был изменен. Изменения из импорта не будут примененыu4   Импорт фильтров выполнен за .3fu
    сек.: r  z.2fu   /с | ~<   u   /мин))%r*   rS   r  time	monotonicr   r,   r   r   rG   r  rI   r  r   r   rE   r   r  r  r=   rF   r  r   r  	executorsanyperm_policy
view_scoper  r   r-   r.   r/   r0   r1   rT  int)r   r  r  t1Zfilter_countZfilter_dataZ	filter_idZfilter_namer#  r  r  r  r  r  r  r  Zedit_permissionZhas_projectr$  t2Z
proc_speedr   r   r   _process_filterst  s    Q










(zJiraAPIImport._process_filters)project_structr  c                 C   s  t jjdd|d gddgd}|r|jj|d ksF|jr|d |jkr|d  d|d  d|d< | jjd|j	 d	|d   n|js|d |_|
  d
|d< d|d< d|d< d|d< | ||d< t jjddd|d  dg| d}|st j| j|d |d d
d}|j}|jrf|D ]$}|dkr6q$t||||  q$|dr\d|_|
  n| jjd| d |rt jj|dD ]}|jd
d q| |d D ]}| jjjj d|d  }t jj|d}	|	st jjddd gdd|d ggd}	|	s$t j|d | jd
d}	||	_|d |	_	|d|	_|	j
d
d  t jj||	d!}
|
stt j||	| jd"}
g |
_|
j
d
d  |d#g D ]}|d$ d%krB| jjr| |d& d' }nRz| |d }W n>   | jjd(|	 d)|d  d|d*  dd+|d, d }Y nX |r*|
j| n| jjd-|  q|d$ d.krN| jjrpd|d/ d0  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d1|d gdgd}|r$|js||_n||jkr
|j | |_|j
d
d  |
j| n(| jjd2| d3d4|d, |  j!d57  _!nt"d6q|
j
d
d  q| #  | $| | %| | #  | j&|d7 | '||_(| )||_*| +||_,| -| | jjr|d8 }|r| .||_/n.| jjjj d|d9 d  }t j0j|d|_/n| 1||_/|jr\d|_2d|_3d|_4d|_5d|_6|j
d
d  t j7j|d:d
d;}|st j7d<|d:d
d=}|j
d
d  t8  | 9| | j: rd S t8  | ;| | #  | <| | j j=d57  _=| #  |S )>Nr   r   r  r   rx  r  re  u   Проект с именем u8    уже существует! Переименуем в TZtask_allow_multiple_sprintsFZsl_only_owner_approveZsl_deny_no_approveZsl_task_only_owner_closeui_form_schemerv  rw  )r*   r   r   r  	isPrivater  u"   Настройки проекта u    были изменены пользователем. Изменения из импорта не будут примененыr   r  r   r   r  r   )r   r*   r  r   r   )r   project_role)r   r  r*   actorsr  atlassian-user-role-actorr:  r?   uX   Не удалось найти и добавить пользователя в роль u    проекта: r   zERR-0039r   uR   Не удалось привязать пользователя к проекту zatlassian-group-role-actorZ
actorGroupr  r  u<   Не найдена группа пользователей u#    для проектной ролиzERR-0040r)   u&   Неизвестный тип ролиr  
simplifiedrr  epic)r   r   include_systemZEpics)r   r   r   system)>rG   r  rI   r  r   r   r*   rS   r  r   r   _process_screen_schemekeysrI  r  r  r  r   r   r  _get_project_rolesr   r   r  r   ZCmfProjectRoleAssignmembersr=   rF   r   r1   r   r  r0   r.   _calc_progress_process_versions_process_componentsr  _process_permissionsZproject_perm_scheme_process_security_levelssecurity_level_scheme_process_field_conf_schemer7  r  r  r  r  r  Z
show_listsZ	show_blogZ
show_pfeedZ	show_diskZ	show_chatr   r-   _process_tasksr,   _process_boards_process_sprintsr  )r   r  r  project_objrI  r   r   	role_infor   r  Zrole_assignactorr   Z	sub_groupZproject_simplifiedr  epics_folderr   r   r   _process_project5	  s"   "
 


"



  






zJiraAPIImport._process_projectc                 C   s   dd l }|jdddd| jjj d| jj d|d  d	| d
| dgddtddtddd}| jd|j d| d| d | j  |S )Nr   z/usr/bin/python3z	manage.pyshellz&plugin = models.CmfPluginJira.get(id='z(');retcode = plugin.process_issue_fork('z', 'r   z', r  z);Tz"/var/log/eva-import-subprocess.loga+z&/var/log/eva-import-subprocess.err.log)Z	close_fdsZstart_new_sessionstdoutstderru"   Запущен процесс PID z (start=z, limit=re  )	
subprocessPopenr*   r   r   r^   r+   pidZ
log_detail)r   r  rE  r   r  procr   r   r   _execute_task	  s      0"
zJiraAPIImport._execute_taskc                    s  d|d  d|d  d|d  d}t j}|r<| jjd | j|d |d	}|sj| jj| d
 d S | jj| d| d| j   fdd d} || j}g }t| jD ]0}| 	|||}	||7 }|
|	 ||kr qq||k rVtd t|D ]P}	|	 }
|
d k	r|  j|
7  _||	 | 	|||}||7 }|
| qqt|D ]&}	|	  |	jr^|  j|	j7  _q^| jj| d d S )Nu   Проект 'r   r5  r   r  r   re  u   Будет выполнена обработка только новых или обновленных задач. Для обработки всех задач измените значение параметра 'IMPORT_ONLY_NEW_OR_UPDATED')only_processinguO   . Нет новых/обновленных задач для обработкиuJ   . Обработка задач в несколько процессов: r  c                    s.   t | | }|tjkr& | |d S |S d S )Nr)   )mathZceilr   ZIMPORT_OBJ_CNT)Z
task_countr   Z
chunk_sizecalc_obj_limitr   r   r  $
  s    
z4JiraAPIImport._process_tasks.<locals>.calc_obj_limitr   r)   u2   . Закончили обработку задач)r   ZIMPORT_ONLY_NEW_OR_UPDATEDr*   rS   r  r  rT  r   ranger   r   r  sleepr   Zpollr0   r  Zcommunicate
returncode)r   r  Zproject_msgZonly_new_or_updatedZtask_cntrE  r   processr=  r  r  Znew_procr   r  r   r  

  sR    $




zJiraAPIImport._process_tasksu#   Обработка проектовc              
   C   s  t jjddjj}|  D ]h}z|d dd | jD kr@W q| j rRW  d S |di }|rt| 	|| j
 }n
ddd	}|d
 dkrt jjdd}nL|d
 dkrt jjdd}n0|d
 dkrt jjdd}ntd|d
  dd| jjjj d|d  d|d< |d |jj|d ||d ||d |d}| || W q tk
r   t  |  jd7  _| jjd| ddd Y qX qd S )Nr@   rA   r   c                 S   s   g | ]}|d  qS r  r   r   r   r   r   r   O
  s     z3JiraAPIImport._process_projects.<locals>.<listcomp>leadzdefault_import_jira@evateam.comZdefault_import_jira)r   r   ZprojectTypeKeyZbusinesszproject.base:defaultZsoftwarezproject.agile:defaultZservice_deskzproject.servicedesk:defaultu$   ERROR! Проекты с типом u3    временно не поддерживаютсяr   r   r   r   r   )r   r  r   activityZtask_code_prefixr  r   r  r)   u<   Не удалось импортировать проект zERR-0041r  rs  )rG   rH   rI   r   r   r   rQ   r*   r,   r   rE   r  r.   r   r   r  r/   r0   r1   )r   r
  r  project_leadr  r  r  r   r   r   _process_projectsJ
  sP    
" zJiraAPIImport._process_projectsu   Обработка досокc           0      C   s(  ddd}dddddd	d
}ddddd}t jjddd|d  dgd}t jjd|dgd}|sxt jd||d| jd}|jsd|_|  | |d D ]}zT| j rW  dS |d }|d }	| jj	
d| d|	  |d d }
d}|d d  }|r|d }|d }| jjjj d!| }t jj|dd"d#d$gd%}|sXt j| j|dd&}|jr||_d'|_d(|_|j| ||_|jdd) n"| jj	d*| d+| d| d, g }|
d- }|d. ddd/ D ]}|d }|d }| jjjj d!| }t jj|dd#d$gd%}|s*t j| j|dd&}|jrR||_d0|_||_|jdd) n"| jj	d1| d+| d| d2 || qg }|
d3 d4 ddd/ D ]}|d }|d }| jjjj d!| }t jj|dd#d$gd%}|st j| j|dd&}|jr |d |_d0|_||_|jdd) n"| jj	d5| d+| d| d, || q| jjjj d!| |d< t jj|d d6d7d8d9d:d;d<d$gd%}|st j|d | jdd=}|jr,|d |_||_||_||d> |_||_||_||_||d? d	|_||
d@ d|_|d |_|jdd) t  n"| jj	dA| d+| d|	 d2 t t!dBdC |
dD dE d}t t!dFdC |
dD dE ddd/ d}|rdG|dH< |rdI|dH< d} t j"j#|dJd$dKgdL}!|!D ]X}"|"jj$pi }#|#dK}$|"jr |$r|$|"j%kr| jj	dM| dN dO}  q$qg }%dP}$|
dD dE D ]H}&z|&d }'|&d }(| jjjj d!|' })t j"jddQ|)ggd$dRgddS}"|"st j"||)| jddT}"|"jdd) |%|"j& |"j'r| jj	dU|" d+|' d|( dV W q8|"jj$pi }#|"jr|(|"_|&dW |"_(|&dX |"_)g }*|&dY D ]l}+| jjjj d!|+d  },t j*j|,dZ}-|-s| jj+d[|" d+|' d|( d\|+ d]|d^ q$|*|- q$|*|"_,|&d_ rd`|"_-n |&dY sda|"_-n|&dHdb|"_-|#.|& n"| jj	dU|" d+|' d|( d2 | r|$|"_%|"j%|#dK< |#|"_|"jdd) t  |$dP7 }$W nN t/k
r~ }. z.t0  | jj+dc|' d|( d|. dd|d^ W 5 d}.~.X Y nX q8t j"j#dedf|%gd6dQ|gdJdgdggddh}/|/D ]}&|&j1ddi q|/r| jj	dj|/  t  | j j2dk7  _2W q   t0  | jj+dl| dm|d^ Y qX qdS )nz
        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
        zboard.scrum:defaultzboard.kanban:default)scrumr   z	1 queriesz2 userstoryz
3 assigneez4 epicz	5 projectz7 none)rp   ZparentChildr)  r  r   Znonez1 -1wz2 -2wz3 -4wz6 none)z-1wz-2wz-4wZNONEr   rv  rw  r   u
   Доскиtree_node_is_branchr  N)r   r   r   r   r*   Tr   r   u!   Обработка доски ID r/  rT  r   rx   r   r  r  r  r  r  r  r{  r   u   Основной фильтр z (ID u;   ) был изменен и не будет обновленZswimlanesConfigZ	swimlanesrL  Zembeddedu   Дорожка uA   ) была изменена и не будет обновленаquickFilterConfigquickFiltersu   Быстрый фильтр r   r   kanban_filterswimlane_filtersquick_filters
limit_daysZkanban_board_columnsr   r*   r  r  ZswimlaneStrategyZoldDoneIssuesCutoff   Доска c                 S   s   | d o| d  S NmappedStatusesisKanPlanColumnr   columnr   r   r   ru   G  rv   z/JiraAPIImport._process_boards.<locals>.<lambda>ZrapidListConfigZmappedColumnsc                 S   s   | d o| d  S r  r   r  r   r   r   ru   N  rv   z#00875ar  z#42526er*   ordernor   ri   u.   Порядок колонок на доске up    был изменен и не будет обновлен. Упорядочите колонки вручнуюF  r  r  )rx   ri   r  r   r   r*   r  u   Колонка uG   ) была удалена и не будет восстановленаr  maxr  r  u   Для колонки u!   ) не найден статус zERR-0124r   r  r  z#6b778cz#0052ccu5   Не удалось создать колонку ID zERR-0042rB   r  r  r  r  uC   Удалены колонки, отсутствующие в Jira: r)   u:   Не удалось импортировать доску zERR-0043)3rG   r  rI   r   r*   r  r   _get_project_boardsr,   rS   rT  r   r   r  r  r   r  r  r  r   r  r  ZCmfKanbanBoardr   r   r  r  r  r  Zswimlane_typer  r-   rw   rx   ZCmfKanbanBoardColumnr   r   r  rB   r  Zmin_sizeZmax_sizer  r1   mapped_status_codesr  r  r.   r/   r  r  )0r   r  Z
board_typeZswimlane_type_mappingZlimit_days_mappingr   Zboard_folderboardboard_idZ
board_nameZboard_configr  Zboard_filterZboard_filter_idZboard_filter_nameZkanban_filter_ext_idr  Zswimlanes_configZswimlaneZswimlane_idZswimlane_nameZswimlane_ext_idZswimlane_filterr  ZquickfilterZquickfilter_idZquickfilter_nameZquick_filter_ext_idZquick_filterZ	board_objZfirst_column_with_statusesZlast_column_with_statusesZupdate_column_orderZboard_columnsZboard_columnZcolumn_dataZcolumn_ordernoZcurrent_columnsr  Z	column_idZcolumn_nameZcolumn_ext_idr"  r   r  Zstatus_globalr$  Zcolumns_for_deletionr   r   r   r  y
  sH   
 
 
	


	









 zJiraAPIImport._process_boardsu#   Обработка спринтовc                 C   sR  t jjddd|d  dgd}t jjdd|gdddggd	gd
}t jjdd|gdddggd	gd
}t jjdd}| |d D ]}| j r d S | jjjj	 d|d  }t j
j|ddddddddddg
d}|st j
|d| j|d}|jr||_|d |_|d|_|d|_|jr0|jdd |d dkrT||_|jd |_n"||_|d d!krv|jd"|_|jjsd|j_|jjdd |jr|jdd t  d#}	| jjd$|j d%t|d&   |d&  D ]\}
}|d' }|d( }| jjjj	 d|
 }t jj|d)dd*d+d,d-d.gd}|r|d/r| jjjj	 d0|j }t jj|d1d2d3gd}|st j|| jd4}d5|_d6|j  d7|j d8|_!||_"|jr|j|j# d9 |j$d krt|j%d:kr|j&'| n|j&'| n|d |d krV| jj(d;|d  d<| d=|
 d>|d  d=|d'  d?t)j*d@ |	d:7 }	n8|  j+d:7  _+| jj,d;|d  d<| d=|
 dAdB|dC q|	r| jj,d;|d  dD|	 dEdF|dC |jdd |d d!kr(|j#st j-j.|dGs(|jdH|_|jdd | jjdI|j dJ |/  t  | j j0d:7  _0| j1ddK qd S )LNr   rv  rw  r   r   r   r   r   r  rx  r   zlist.agile_sprint:defaultrA   r   r   r   r  r  r  r  r   r   r   r  T)r   r  r*   r  r   r   r   stateclosedr  r   r  r   u0   Добавляем задачи в спринт r/  issuesr   r   listscache_status_typeagile_story_pointszop_gantt_task.sched_durationzop_gantt_task.sched_workzop_gantt_task.actual_workr   z::comment-sprint:	log_levelr   r   )r   r*   rn  uB   Задача была в архивном спринте <a href="" target="_blank"></a>r  r)   u   В спринт 'u5   ' не удалось добавить задачу 'r5  u   ) проекта 'u\   ). Возможно проект или задача еще не импортированы.r  u$   ). Задача не найдена.zERR-0044r  uX   ' не удалось добавить задачи из других проектов: u]   . Возможно проекты или задачи еще не импортированы.zERR-0133)Z	task_listr  u   Запуск спринта "r   r  )2rG   r  rI   r   r  _get_all_sprintsr*   r,   r   r   r   r  r  r   r   r   r  r   r   r  Zget_default_statusr   r  r-   rS   rT  r   r   r   r   r   r+  r-  r   r   rI  r)  r(  r  r   r+   rR   r  r0   r1   ZCmfListHistoryOTRr  Zdo_startr  r  )r   r  r   Zsprint_folderarchive_folderZsprint_logic_typer   r   Z
sprint_objZexternal_tasks_countissue_id
issue_data	issue_keyZissue_projectZissue_ext_idr   comment_ext_idcommentr   r   r   r    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_diffc  s
    zJiraAPIImport._simple_html_diffc                 C   s   |dkrd S z|  |}W n,   | jjd| dddd tj Y S X | j|dd|d\}}|s| jjjd	rt	j
j| jjd	 d
}| jjd| d| tjd n.| jjd| dddd tj}|  jd7  _|S )Nunknownu6   Не найден пользователь user_id = "u9   ", в дампе, указываем системногоzERR-0045ZCmfUserrs  Fr   Zdefault_user_idr  uA   ", ставим пользователя по умолчанию r  uc   ", указываем системного , в дампе, указываем системногоr)   )r4  r*   r1   gZsystem_userr  r   r   rI   rG   r   r+   rR   r  r0   )r   rD  r2   r   r  r=  r   r   r   r   j  s,       zJiraAPIImport._get_person)	dump_pathc              
   C   s   | d}| r`t|d>}|D ]2}t|}|d |d kr"|  W  5 Q R  S q"W 5 Q R X t|d}|t|d  W 5 Q R X |S )Ngroups.jsonry  r   r  rH  )r\   r]   r^   r_   rC  writedumps)r   r  r9  Zgroups_pathrc   rowr2   r   r   r   _dump_groups  s    

 zJiraAPIImport._dump_groupsc                 C   s   z|  |W S  tk
r   z|d}| rt|dB}|D ]6}t|}||| j kr@|  W  5 Q R  W  Y S q@W 5 Q R X | j	|}|rt|d}|
t|d  W 5 Q R X |W  Y S W n$   | jjd| tjd Y nX Y nX d S )N
users.jsonry  r  rH  uM   Неудалось сдампить пользователя по ключу r  )r4  r.   r\   r]   r^   r_   rC  rE   r=   Zget_user_infor;  r<  r*   r+   rR   r  )r   rD  r9  Z
users_pathrc   r=  r2   r:  r   r   r   _get_user_info  s$    

&zJiraAPIImport._get_user_infou,   Обработка журнала работ)r   c                 C   sp  | j jd d|d  d|d d  d}| |D ]2}t }d|d	< | j |d
< |di | jr| j|d | j |d|d< |d |d< |di | jr| j|d | j |d|d< ||d< |d |d< |d d |d< |dd|d< | j jjj	 d|d  |d< ||d< d|d< t
jj|d d }|s6t
jf |}|jjtj|jjd! |_|jd"d# q6d S )$Nu*   Загружаем журнал работu%   Журнал работ задачи r   r   ri   r   r   r&  r   r*   r   r   r   r  updateAuthorcmf_modified_byr   started
start_dateZtimeSpentSecondsr  
time_spentr4  r   r   r   r   r   r  r   Zremaining_estimater  )ZminutesTr   )r*   rS   rT  _get_issue_worklogsr   rI   rE   r   r   r   rG   ZCmfTimeTrackerHistoryrD  r   datetimeZ	timedeltarE  end_dater   )r   r   r   r2   worklogZtimetracker_historyhistoryr   r   r   _process_issue_worklog  s2    


z$JiraAPIImport._process_issue_worklogc                 C   s   | dD ]}|d}||j |  || |dg }dd |D }|sd|dg |d< q
|d dd	d	 }|d
| g |d< q
dS )uF   
        Конвертирует "Фрагмент кода"
        ZprerB   r'  c                 S   s   g | ]}| d r|qS )zcode-)rU  )r   class_r   r   r   r     s     
 z/JiraAPIImport._convert_code.<locals>.<listcomp>zlanguage-noner   -r)   z	language-N)r2  r;  extendcontentsclearr   rI   r   )r   r$  r8  Zcode_tagZ	class_tagZ
code_classrB   r   r   r   _convert_code  s    

zJiraAPIImport._convert_codec                 C   sR   |s|S t |d}| || | ||| | | ddd |jjD }|S )Nlxmlr   c                 S   s   g | ]}t |qS r   r'   )r   cr   r   r   r     s     z/JiraAPIImport._convert_text.<locals>.<listcomp>)r   r=  rc  rQ  r   r   children)r   r   r2   datar$  r   r   r   _convert_text  s    

zJiraAPIImport._convert_textu8   Обработка комментариев задачиc                 C   s@  d|d  d|d d  d}d}d}|  |D ]}|d7 }| jjjj d	|d
  }tjj|d}|r|js| jjd| d|d q0|stj||| jdd}n|	dg |di | j
r| j|d | j
 |d|_|j|_|di | j
r| j|d | j
 |d|_|d |_|d |_||_| |d |||_||_|dr|d7 }|d d dkrtjj|d d d}	|j|	 d|_n,| jjd|d  d|d |  jd7  _q0|dr ttdd  |d i }
|
di d!d"|_|jr|jdd# | jd$d% q0| jd&| d'|  d S )(Nu$   Комментарий задачи r   r   ri   r   r   r   r)   r   r   r  uN   Комментарий уже есть, и правился в системе zERR-0046r   Tr  z**r   rA  r   r   r   Z
visibilityr  r  r   r8   uL   Ошибка обработки приватного комментария zERR-0047
propertiesc                 S   s   |  ddkS )Nr   zsd.public.commentrq   )pr   r   r   ru   
  rv   z7JiraAPIImport._process_issue_comments.<locals>.<lambda>ZinternalFr   r4  r  u   Обработано u:    комментариев, из них приватных ) _get_issue_commentsr*   r   r   rG   r   rI   r  r1   r   rE   r   r   r  rB  r   r   r   rW  r   r  r  r  r   r  r0   rw   rx   r  r   r  r+   )r   r   r   r2   cntZprivate_cntr4  r   Zcmf_commentr  Zsd_public_commentr   r   r   _process_issue_comments  sf    
 

 z%JiraAPIImport._process_issue_commentsc                 C   sf  t jjdd|gddd ggddgd}|rh|jr4|jrh|jr>dnd	}| jjd
| d| d| d d S |st j|| jdd}|jdd t j	j
dd|gddddgdddgggdd}|r| jjd
| d| d d S t j	j|dD ]}|jdd q|d }ddddd}d}	d}
tdtj}||D ]}| \}}}}}| }|rdd d! |d"D  }|dd#}n|}|t||||d$}|	d%7 }	|d&kr|
d%7 }
t j	||||||d| jd|d'}|jdd q0td(tj}||}|rD| \}}| |_|r>d#d)d! |d"D  }||_|	|_|
|_||_|jdd d S )*Nr   r  r*   r  Tr  )rx   r  ri   u   Удаленu   Изменен   Задача u   . Чек-лист . uf    пользователем. Изменения из импорта не будут применены)r   r*   r  r   r|  r  Fr  u   . Пункты изменены пользователем. Изменения из импорта не будут примененыr  r  r   r  r  r  ZCANCEL)rM  ~r  xr   z{(?P<status>[x~+-])(?P<mandatory>!)?\s*(?:\[(?P<custom_status>[^\]]+)\]\s*)?(?P<name>[^\n]*)(?P<description>(?:\n>[^\n]*)+)?rH  c                 s   s   | ]}|r|  V  qd S r   rf  r   liner   r   r   r  \  s   z3JiraAPIImport._process_checklist.<locals>.<genexpr>z
>rm  )r   	mandatorycustom_statusr   r   r)   r  )Z
cache_taskr   r   r   r   r*   r  r  z6#\s*(?P<header>[^\n]*)(?P<description>(?:\n>[^\n]*)+)?c                 s   s   | ]}|r|  V  qd S r   rf  ra  r   r   r   r    s   )rG   ZCmfChecklistrI   r  r  r*   rS   r  r   ZCmfChecklistItemr[  r   r  rY  compileMfinditerr  rg  r   r   rJ  boolrZ  r   r   Zchecklist_items_countZchecklist_items_done_countr  )r   Zchecklist_datar  Z	checklistZ
action_msgZmodified_itemrQ  Z	items_strZstatus_mappingZitems_countZitems_done_countZitems_patternmatchr   rc  rd  r   r   r   Z	item_dataZheader_patternheaderr   r   r   _process_checklist  s    	






z JiraAPIImport._process_checklistu0   Обработка плагинов задачиc                 C   s4   |  |D ]$}|d dkr
|d r
| || q
d S )Nr   z&com.railsware.SmartChecklist.checklistr   )_get_issue_propertiesrk  )r   r   r  Zissue_propertyr   r   r   _process_properties  s    z!JiraAPIImport._process_propertiesc                 C   s   g }|d  dg |d  dg  }|D ]`}| jjjj d|d  }tjj |d}|s~| jjd| dd	d
 |  jd7  _|| q(||_	d S )Nri   ZfixVersionsversions
::version:r   r  u!   Не найдена версия zERR-0050r   rs  r)   )
rI   r*   r   r   rG   r   r1   r0   r   fix_versions)r   r   r  rp  rn  versionr   Zversion_objr   r   r   _process_issue_versions  s     z%JiraAPIImport._process_issue_versionsc                 C   s   g }|d  dg }|D ]`}| jjjj d|d  }tjj |d}|sn| jjd| ddd	 |  jd
7  _|| q||_	d S )Nri   
componentsr   r   r  u%   Не найден компонент zERR-0051CmfComponentrs  r)   )
rI   r*   r   r   rG   rt  r1   r0   r   rs  )r   r   r  Zissue_componentsrs  	componentr   Zcomp_objr   r   r   _process_issue_components  s    z'JiraAPIImport._process_issue_componentsc                 C   s   ddl m} g }|d dg }|D ]}|dddd}||d	d
d}zbdddd| dgdd|gddd| dgg}tjj|d}	|	stj|d}	|	  ||	 W q$ tk
r }
 z"| j	j
d| d|
 d|d W 5 d }
~
X Y q$X q$||_d S )Nr   r  ri   r  rm  r=  rK  r   r  Tr  r|  r  r  r   r  r   r   r8   u+   Не удалось создать тег 'r  zERR-0125r  )r  r  rI   rJ  rG   r  r   r   r.   r*   r1   r  )r   r   r  r  r  r  Zlabelr  filter_r8  r$  r   r   r   _process_issue_tags  s0    z!JiraAPIImport._process_issue_tagsu.   Обработка истории задачиc                 C   s  d|d  d|d d  d}dd | j tjj d D }|d	 d
 D ]@}| jjjj d|d  }d }|dr| j|d | j	 |d}n| jj
d|  |d |d|d}|d D ]j}	|	d }
||	d }|r|d rd}
| |
|	d |	d }d|kr||d< q|d  d| |d< qtjj|dddddgd}|sZtj| jd |d!}|D ]}t||||  q^|jrF|jd d" qFd S )#Nu   История задачи r   r   ri   r   r   c                 S   s   i | ]}|d  |qS )r   r   )r   rm   r   r   r   r    s      z2JiraAPIImport._process_history.<locals>.<dictcomp>	changelog	historiesz	::historyr   r   r   u   Аудит без автора r   r)   )r   r   r+  r   r   rm   r   r   Z
fromStringZtoStringr   z<br>r   r   r+  r   r  T)r*   r  r   r   )r   rG   r   r   r*   r   r   rI   r   rE   rS   r  r6  r   r  r  r   )r   r   r  r2   Zjira_map_fieldsrJ  r   r   r4  rQ  r   rm   ZdiffZhistory_commentr   r   r   r   _process_history  sB    



zJiraAPIImport._process_historyu]   Обработка связей с документами Wiki и веб-страницамиc                 C   s  g }| dg D ]}| jjjj d|d  }|d }|d }|stjj |d}|shtj||| jdd}|jr|d	 |_|d
 |_||_	|j
dd q|d dkr| ddkrtd|d
 }	|	r|	d}
tjj ddd|
 gd}|sq|| d|d< q||_d S )Nremotelinksr   r   objectZapplicationr  Tr  r   r  r   r  zcom.atlassian.confluenceZrelationshipz	Wiki Pagez$/pages/viewpage.action\?pageId=(\d+)r)   r   rv  r}  r   r  )rI   r*   r   r   rG   ZCmfLinkr  r   r  r  r   rY  rZ  r  CmfDocumentr   local_links)r   r   r  r  Z
remotelinkZremotelink_ext_idZremotelink_objZremotelink_applinkri  Zpage_iddocr   r   r   _process_remotelinks  s@    





z"JiraAPIImport._process_remotelinksc              	   C   s  i }|  d}|r:|d |d r:|d |d |d< |  d}|rp|d |d rp|d |d |d< |sxd S zN|dd |D  |D ]}t|jj|||  q|jjjr|jjd	d
 W nD tk
r
   | j	j
d| d| dddd |  jd7  _Y nX d S )Nz1com.atlassian.jpo:jpo-custom-field-baseline-startri   r   Zsched_start_datez/com.atlassian.jpo:jpo-custom-field-baseline-endZsched_finish_datec                 S   s   g | ]}d | qS )zop_gantt_task.r   r   rc   r   r   r   r   ;  s     z0JiraAPIImport._process_gantt.<locals>.<listcomp>Tr   u8   Не удалось импортировать Гант u    для задачи 'r  zERR-0112ZCmfGanttTaskrs  r)   )ry   rI   r   r  Zop_gantt_taskr   r  r   r.   r*   r1   r0   )r   r   r  ZganttZbaseline_start_fieldZbaseline_end_fieldrm   r   r   r   _process_gantt&  s4    
zJiraAPIImport._process_ganttc                 C   s   | j jjj d|d  }tjj|dgd}|sFtj|d|| j dd}| j| jjd|d	  }d
| d| d|_	|j
r|jdd d S )Nz
::comment:r   r   r  rn  T)r   r+  r   r*   r  z/browse/r   u<   Задача импортирована из Jira: <a href="r,  r-  r   )r*   r   r   rG   r   rI   r=   Z
url_joinerr  r   r  r   )r   r  r   r3  r4  r-  r   r   r   _add_comment_link_to_issueI  s$    z(JiraAPIImport._add_comment_link_to_issueu   Обработка задачиc                    s  d}|d }d| d|d d  d}|  || jtjj d }||d< | j|d	< d
|d< | jjjj d|d  |d< ||d< |d 	dr| jjjj d|d 	dd  }tj
j	|d|d< |d s| jjd|d 	d ddd |  jd7  _| d}	|	r"|d 	|	d |d< |d 	dr| j|d 	d	| j|d|d< |d s|  jd7  _| jjd|d 	d ddd | jjd|d 	d	| j tjd
d
d |d 	d rZ| j|d 	d 	| j|d|d!< |d! sZ|  jd7  _| jjd"|d 	d  ddd | jjd"|d 	d 	| j tjd
d
d |d 	d#r| j|d 	d#	| j|d|d$< |d$ s |  jd7  _| jjd%|d 	d# ddd | jjd%|d 	d#	| j tjd
d
d nd&|d$< |d d' d  |d d( 	d)}
|
rD|d d( d  d*  }n }d| jjjj d| d}tjj	dd+d,| d,gd-|d.< |jj	d/}| jjrN|
r |jj	d}| |}tt fd0d1|d&}| jjjj d|d  }tjj	dd2|gd-}nL|d3 }|d4 }|	 |}| jjjj d| }tjj	dd+| d5gd-}nltt fd6d1|d7 d&}|rz|d8 }n|d9 d3 }t|}| jjjj d:| }tjj	dd2|gd-}||d;< | jjjj d|j d|d d< d  }tjj	dd2|gd=gd>|d<< |d< j |d?< |d 	d@r| jjjj d|d d@ d  }tj!j	|d|d@< |d@ s| jjdA|d 	d@ dBdd |  jd7  _|"dCd&}|r|dD dE }| jj#$dF| dG|  t%j&| jtj|ddH|d gdI\}}|| '||7 }|j(r*|)dCdJdKdLdMdNdOdPdQdRg
 | *||||_+|p>g }|D ]}|j,-| qD| .|| | /|| | 0|| | 1|| | 2|| |j3dSkrtj4j	|dTd
dUgdV}||_5|j6sd
|_6|j7d
dW |d dX |_8| 9|| ||_|j:r
|j7d
dW t;  | <|| | =|| n| jj#>d| dY | ?|| |d dZ d[ rj| @|| | jA	d\r| B|| t;  | jCd]d^ tD|d_ Ed`}|F r|G  |S )au   
        Общая логика обработки которая потом разделяется на задачи и эпики
        r   r   r]  r  ri   r   r  r   r
  TZapprovedr   r   r   rB   securityr  Zperm_security_levelu:   Не найден уровень безопасности zERR-0048r   rs  r)   zStory Pointsr*  reporterr   r  uB   Не найден автор(постановщик) задачи zERR-0049)Z	anonymousexc_infocreatorr   u>   Не найден создатель(автор) задачи r)  r  u6   Не найден исполнитель задачи NZ	issuetyper   r  r  rv  rw  r   r  rr  c                    s    | d d d kS )Nr  r   r  r   ZwfZissuetype_idr   r   ru     rv   z.JiraAPIImport._process_issue.<locals>.<lambda>r  defaultWorkflowissueTypeMappingsr~  c                    s    | d kS )Nr  r   r  r  r   r   ru     rv   rs  r   rT  r  r  r   r  rx  r)  r(  u'   Не найдена резолюция zERR-0116r   renderedFieldsr   u4   Создание/обновление задачи 'z': r   r   rp  rs  r  r  logic_prefixr   r   r  r  z	task.epicr  r  r   r   r  ri   r   r   u[    была изменена пользователем и не будет обновленаr4  totaltimeTrackingEnabledr   r  r	  .processing)Hr   r   rG   r   r   rJ   r*   r   r   rI   CmfSecurityLevelr1   r0   rn   r   rE   r+   rR   ZERRORr  r  r   r=   rF   r  rw   rx   r  r   r  r   r  r  r:  poprS   rT  r   r   r#  r  r   rW  r   r(  r   rr  rv  rx  r  r  r  r   r   r  r   r   r  r  r-   r{  r  r  rm  r\  rM   rK  r  r   r\   r]   unlink)r   r   r   sprintsr  r2  r2   Znormalized_issuer   Zstory_p_fieldZsimplified_projectZissuetype_ext_idr  r  r  r  r  r  r  Zdefault_workflowZissue_type_mappingsworkflow_namer  r  r@  Z
issue_textr  r=  r   r  	flag_filer   r  r   r  _  sZ   
$ 
$
 .$
 .$
 0






*
"
 



zJiraAPIImport._process_issueu&   Обработка всех задачc                 C   s2   | j  }|D ]}| j r" d S | | qd S r   )r=   r   r*   r,   r  )r   r'  r   r   r   r   _process_issuesK  s
    

zJiraAPIImport._process_issuesu3   Обработка связей всех задачc           $      C   s  |s| j jd dS ttdd | j d}t }| 	 D ]}| j
|d | |d dD ]}| j  rz  dS |d d}|r|d |d nd}| j jjj d	|d  }|r| j jjj d	|d  }	| j|	g }
|
| |
| j|	< n(|r&| j|g }
|
| |
| j|< |d d
g }|D ]}| j jjj d	|d  }d|kr||d d|d< | j jjj d	|d d  |d d< || j|< nLd|kr:||d d|d< | j jjj d	|d d  |d d< || j|< q:qbq@t | }| j jd|dd | j dt| j  t }tjjdd}tjjdd}| jD ]}	| j  rx dS tjjddd|	gdd|	ggddgd}|s| j jd|	 d q`| j|	 D ]}tjj|ddgd}|s| j jd| d qȐz |j|jkrtjjd d!d"gdd#d!|gd$d!|ggd#d!|gd$d!|ggggd%}|D ]4}||_|jd&d' | j jd(| d)| d* qV||_|jd&d' nb| j jd+| d,| d- |j d.| }tjj|d/}|stj||||| j d0}|jd&d' W nR t k
rV } z2| j j!d1| d2| d3d4d5d6 |  j"d77  _"W 5 d}~X Y nX qȐq`t#  t | }| j jd8|dd d"d9dd:d;}| j jd<t| j$   t }| j% D ]\}}| j  r dS z>| j jjj d	|d= d  }||d= d> }|r.tjj|d}ntjj|d/}|s^tjjd>d|d= d> gd%}|stj|| j |d= d> d?}|d= d@ |_&|d= dA |_'|jd&d' tjj|d d dgd}|s| j jdB|d d  dC|d d  dD W qtjj|d d dgd} | sJ| j jdE|d d  dC|d d  dD W q| j jjj d	|d  }!tjj|!d gd}|stj||!| j dF}|jj(d"kr
|j| ks| j|kr
tjjdd|_|j| kr| }|}n| j|kr|}| }| j jd(| d)| d* ||_)| |_*|jd&d' W np   |  j"d77  _"| j j!dG|d=  dH|d d  dC|d d  dI|d d  dC|d d  dJdKd5d6 Y nX qt#  t | }"| j jdL|"dd t | }#| j jdM|#dd dS )NuD   
        Постобработка связей задач
        uF   Отключена обработка связей всех задачNc                 S   s   |  di  ddkS )Nro   rp   z'com.pyxis.greenhopper.jira:gh-epic-linkrq   rr   r   r   r   ru   `  rv   z2JiraAPIImport._process_relations.<locals>.<lambda>r   r   ri   r   r   Z
issuelinksr   r   )r   r   r   r   uD   Анализ связей всех задач выполнен за r      сек.u   Подзадачи: zsystem.additional_parentrA   zsystem.linkr|  r   rB   r   rx  uP   Не удалось связать задачи, возможно задача 'u#   ' не попала в импортparent_taskr  zrelation_type.coder  zsystem.finish:finishin_linkout_linkr   Tr   u,   Тип связи родительской 'u$   ' и дочерней задачи 'ud   ' изменен с 'Блокируется/Блокирует (ОО)' на 'Относится к'.u   У задачи 'u3   ' эпик(родительская задача) 'uo   ' из другого проекта. Создана связь 'Дополнительный родитель'z:additional_parent:r  )r  r  relation_typer   r*   u<   Не удалось создать связь задачи 'u&   ' с дочерней задачей 'r  zERR-0114r   rs  r)   uG   Создание связей подзадач выполнено за zsystem.duplicatezsystem.clone)ZBlocksZ	DuplicateZRelatesZClonersu   Связи: r  r   )r   r*   r   ZinwardZoutwardu=   Не удалось найти входящую задачу r  u   ). Возможно задача не попала в импорт или находится в проекте, который еще не импортирован.u?   Не удалось найти исходящую задачу )r  r   r*   u.   Не удалось создать связь z. in_link: z), out_link: re  zERR-0052uA   Создание связей задач выполнено за uL   Обработка связей всех задач выполнена за )+r*   rS   r  rw   rx   rd   rl   r  r  r   r   r  r,   rI   r   r   rO   r   rN   rT  r+   r   rG   ZCmfRelationTyper   r   ZCmfRelationOptionr   r  r   r  r   r.   r1   r0   r-   r  r   Zin_type_nameZout_type_namerB   r  r  )$r   r  Zepic_link_fieldZtotal_t1r   r   Zissue_parentZissue_epic_keyr   Zparent_ext_idZ	sub_tasksZissue_linksZ
issue_linkZlink_ext_idZanalysis_t2Zsubtasks_t1Zadditional_parent_relationZlink_relationr  Zchild_ext_idZ
child_taskZ	relationsZrelation_optionZrelation_ext_idr$  Zsubtasks_t2Z	map_namesZrelations_t1Zissue_relationZrelation_coder  r  r  Z
rel_ext_idZrelations_t2Ztotal_t2r   r   r   _process_relationsS  s   "




&
&

(


 
 
Fz JiraAPIImport._process_relationsu)   Обработка компонентовr  c              	   C   sF  t jjddd|d  dgddgd}t jj|ddd	gd
}|sNtd| | |d D ]}z|jszd|_|  | j	 rW  dS | jj
j
j d|d  }t jj|ddddddgd}|st j|| jdd}||_|d |_||_|dr | j|d | j d|d  d|_nd|_|d dkr>|j|_nD|d dkrV|j|_n,|d dkrn|j|_n|d dkrd|_|jr|jr|jdd  |d!d"r|js|  d|j_|jjr|d!d"|j_|jjjdd  t  | j jd#7  _W q\   t  |  jd#7  _| jj d$| d%d&d' Y q\X q\dS )(uG  https://docs.atlassian.com/software/jira/docs/api/REST/1000.824.0/#api/2/project-getProjectComponents
        Пока грузим как списки, после доработки будут отдельные обекты

        Args:
            project_info (dict): проект из джиры как есть
        r   rv  rw  r  r  rx  rs  Tr  r  uV   Данный тип проекта не поддерживает компоненты r   Nr   descr_documentdefault_ownerdefault_responsibler  r   r   r  r  r   r	  u   Компонент r   ZassigneeTypeZPROJECT_DEFAULTZPROJECT_LEADZCOMPONENT_LEADZ
UNASSIGNEDr   r   r   r)   u3   Ошибка загрузки компонента ERR-0053rt  rs  )!rG   r  rI   r   r  _get_project_componentsr  r   r*   r,   r   r   rt  r   r   r   r   rE   r  r  r  r  r  r  r  Zcreate_descr_documentZ
text_draftr   r-   r  r/   r0   r1   )r   r  r  r   ru  r   Zcomponents_listr   r   r   r  ]  sp    
  





 z!JiraAPIImport._process_componentsu   Обработка версийc              	   C   s  t jjddd|d  dgdgd}t jjd|dgd}t jjd	|dgd}| j|d
 dD ]}zD| j rxW  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jsBd|j_|jjdd |jrt|d s^|d rj|d n
|d |jr|jr|jdd t  | j jd7  _W q\   t  |  jd7  _| jjd| ddd Y q\X q\d S )Nr   rv  rw  z"scheme_wf.default_release_workflowrx  releaser  )r   r   ri   r   r   rv  ro  r  Tr  zlist.release:defaultrA   r   r   r   r   ZarchivedZreleasedr  r  r)   u+   Ошибка загрузки версии r  r   rs  )rG   r  rI   r   _get_project_versionsr*   r,   r   r   r   r  r  r   r   r   r  Zdefault_release_workflowr  r  r  r   r   r  Zset_default_statusr-   r  r/   r0   r1   )r   r  r  Zrelease_folderr/  rq  r   Zversion_listr   r   r   r    sb    





 zJiraAPIImport._process_versionsu*   Обработка JQL в фильтрахc                 C   s  t | }t| jjjj}t }tjj	dddgdddggddd	d
gd}|D ]x}d|j
 d|j d}|jspqL|jjd}|s|jjd}|s|jjd}tj| jjjjj}|jjdi dd}	|r|j|	krqL|sqLz| jd | jd|  |||\}
}|
|_tj|dd|_|jdd t  | jd|  | jd|
  | jd|  W qL tk
r } z.t  | jjd| d| d| d d!d" W 5 d}~X Y qLX qLt | }| jj d#|d$d% dS )&uP   
        Пост обработка JQL в фильтрах задач
        r*   r  Nr  r   Tr  ubql2bqlr   rx  r   " (re  jqlr3  ZjqlQueryZapplinkZrpcUrlr   z2--------------------------------------------------u   ФИЛЬТР: FZensure_asciir   zJQL:	zUBQL2:	zBQL:	r  u0   : ошибка преобразования JQL r^  zERR-0066r  rs  uC   Обработка JQL в фильтрах выполнена за r  r  )!r   r'   r*   r   r   r  process_timerG   r  r   r   rB   r  r   rI   rV  rW  r%  Zext_urlnetlocr+   Zget_modifiedr  r_   r<  r  r   r-   r.   r/   r1   rS   rT  )r   r  r   r  Ztask_filtersr  Z
filter_msgr3  r9  Zapplink_urlr  r  r$  r  r   r   r   _process_jql_in_filters  sX    

z%JiraAPIImport._process_jql_in_filtersu   Обработка аудита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 ]}| jjd|  | j rX d	S |d
 }| jjjj d| }ddd| dg}|dr|d d d
  d| }| jjjj d| }d|ddd| dgg}tj	j|ddgd}d| jjjj d}|rdt
t||jjdkrd| jjd| d|j  t|dt|j|_|jdd d	}|d|d  }	|d  }
|s| jjd |	 d! tj	jdd"|	gddgd}|r|jsd| d|_nd| dt|jkr|dr,d| jjjj d|d
  d}|jj|d|_d| |j }t
t||dkr| jjd#|	 d$| jjjj d!d%|d&d' |  jd7  _n||_|
|	kr|
|jkr|j|
 |jdd t  q.| jjd(|	 d) ||	 }|s||
 d}| jjr4|d* d+kr d}n|d* dkrBd}n|d, rBd}tj	jd-d.|gd/gd}tj	|	|d0 d1|t|jd| d| jd2}|	|
kr|
g|_|  t  | j jd7  _q.d	S )3u$   Маппим issueType в logic_typeztask.sub:defaultztask.userstory:defaulttask.agile:defaultztask.bug:defaultztask.epic:default)zsub-tasksubtasku   подзадачаz
user storyZ	userstoryZstoryu   историяr   u   задачаZbugu   багu   ошибкаZdefectu   эпикr  r  u-   Обрабатываем тип задачи Nr   r   r   rv  r}  r~  Zscoper   r  r|  r  rx  rd  z::\d+)::r)   u   ext_id типа задачи ry  r   Tr  r  r   u2   Поиск типа задачи по имени 'r  r  uW   Ошибка объединения одноименных типов с именем 'u*   ': одинаковый источник 'zERR-0118r  )r2   rt  u   Тип задачи 'u2   ' не найден. Создание новогоr  rL  r  rB   r   ui_colorr   r   )r   r   r  r  r  r   r*   )r   r*   rS   rT  r,   r   r   rI   rG   r  r   rY  findallr   r   r  r  r'   r   rg  rJ  r1   r0   r  r   r-   r5  r=   rF   r  r  )r   Z	name2coder  r  r  rw  Zissue_type_scope_idr  Zext_id_patternZissue_type_nameZissue_type_aliasZlogic_type_ext_id_oldZlogic_type_ext_id_mergedZtemplate_coder  r   r   r   _process_issue_type  s    






	
z!JiraAPIImport._process_issue_typeu2   Обработка бизнес-процессовc                    sh  i } dD ]}|||d < q dD ]6}j r@ 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sPq|jdd q|d D ]}j r  dS jjjj dj d|d  }tjj	|d}	|	stj|jdd}	|	jsjjd|	j dj d qh|d |	_|d |	_
fdd|d D }
tjjdd |
gd|	_t|	jt|
ksXtd!jjjj dj d|d"  }tjj	|d}|d#  }|d$kr|rd|_|jdd% ||	_|	d&r<|d& d  tt fd'd( d)d}z||	_W n8   jj d*  d+|	j d,j d-d.d/d0 Y nX |	jdd qht!  j j"d17  _"q*dS )2u   Импортируем workflowr  r   rq  Nr   r   ZentityIdr  r  rA   rt  r   Tr   r  r   r   r  rx  r  r   r  r  )r   r  rN  rO  rP  rQ  c                    s*   g | ]"} j jjj d j d | qS )r   )r*   r   r   r   )r   st)r   r  r   r   r     s     z3JiraAPIImport._process_workflow.<locals>.<listcomp>rS  r  uN   DEV: Fatal Вероятно, сломали создание статусов!rT  r  r  r  rW  c                    s   t | dt  kS rO  r.  rV  rX  r   r   ru     rv   z1JiraAPIImport._process_workflow.<locals>.<lambda>rZ  r[  r\  r]  r  r^  r_  r`  r)   )#r   r*   r,   rS   rT  r   r   rG   r  rI   r   r   r   r  r  r   r  r  r   r  r  r  r  r   r  r5  r  r  rw   rx   ra  rb  r1   r-   r  )r   Zjira_statusesr  Zjira_workflowZworkflow_idZtemplate_workflowr   r  r  r  r  r  r  r  rd  r   )rY  r   r  r   _process_workflow  s    
,

 
"

"
zJiraAPIImport._process_workflowu    Обработка схем БПc                 C   s  |  dD ]}| j r  d S | jjjj d|d  }tjjdd| dgd}|sjtd|d  | jjjj d|d	  }tj	j|d
}|stj	jdd}tj	||| jdd}|j
r|d |_|dd|_||_||_||_|jdd n| jjd|j d g }|d  D ]v\}}	| jjjj d| }
tjjddd|
 dgd}tjjdd|gdd|ggd}|r|j
s| jjd|j d|j d|j d ||j q|sFtjjdd|gdd|gdddgdd d ggdd!}|r2| jjd|j d|j d|j d" ||j qtjd#||| jd$}| jjjj d|	 }tjjdd| dgd}||_|jdd ||j qtjjd%d&|gdd|gdd d ggdd!}|D ]}|jdd' qt  | j jd(7  _q
d S ))Nr  r   r  r   rv  r~  r   u+   Не импортировался workflow r   r  r  rA   Tr  r   r   r   r   r~  r  r  r}  r  r  r  r  r  r  r  r  r*   r  r  r  r   r  rB   r  r  r)   )r   r*   r,   r   r   rG   r  rI   r  r  r  r   r   r  r  r  r   rS   r  r   r  r  rB   r   r  r   r  r-   r  )r   r  Zdefault_task_workflow_ext_idr  r  r  r  r  logic_type_idr  r  r  r  r  r  r  r   r   r   _process_workflow_scheme  s    

	z&JiraAPIImport._process_workflow_schemec                 C   sH   t jj}| dD ]0}|| j}|| jj d| t	
| qd S )Nr   r>  )r?  r@  rA  r   rI   rE   r  r*   r   rB  r<  )r   rE  r:  r   r   r   r   _cache_all_usersi  s    zJiraAPIImport._cache_all_usersu   Простой дампr8   c           	   	   C   s   t  }| j | d}| j | d}| rFt| t|d6}| D ](}| j j	d7  _	|
t|d  qXW 5 Q R X t|| | jjdd t  | }| jjd|j d	|d
d d S )N.jsonz.json.dirtyr  r)   rH  Tr  u
   Дамп 'u   ' выполнен за r  r  )r  r  r*   r[   r\   r]   rf   r  r^   json_object_countr;  r_   r<  re   rh   r   rS   rT  r#   )	r   Zapi_funcr   r  rb   rj   rc   r=  r  r   r   r   _simple_dumpo  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*   r[   r\   r]   r^   r_   rC  )r   r   rb   rc   r=  r   r   r   r     s    zJiraAPIImport._simple_getc              
   c   s   | j  d}| rt|D ]d}|dr2q"|drX| j jd| d|  q"t	| d| dd}t
|V  W 5 Q R X q"d S )Nr   .dirty.metau(   Пропускается каталог r  
/info.jsonr  )r*   r[   r\   r]   rf   listdirr  rS   r  r^   r_   r`   )r   rp  r  rc   r   r   r   r     s    

zJiraAPIImport._get_projectsc                 C   s&   |   D ]}||d kr|  S qd S rO  )Zget_projects)r   r  r  r   r   r   get_project  s    zJiraAPIImport.get_projectc              
   C   s@   | j  d|d}t|d}t|W  5 Q R  S Q R X d S )Nr   workflows.jsonr  )r*   r[   r\   r^   r_   r`   )r   r  workflows_filerc   r   r   r   r    s    
  z/JiraAPIImport._get_simplified_project_workflowsc              	   c   sH   | j  d|}t| dd}|D ]}t|V  q(W 5 Q R X d S )Nr   /issue_types.jsonr  r*   r[   r\   r^   r_   rC  r   r  rp  rc   r=  r   r   r   r    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   r    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   rP   r  r  r  r*   r[   r\   rf   r  r^   r_   r`   )r   r  	board_dirr$  rc   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   r  sprints_dirZ	sprint_idrc   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   sH   | j  d|}t| dd}|D ]}t|V  q(W 5 Q R X d S )Nr   /components.jsonr  r  r  r   r   r   r    s    z%JiraAPIImport._get_project_componentsFc                 C   sj   d}| j  d|d}| rft| D ]8}| s:q,|jdrHq,|r\|d s\q,|d7 }q,|S )Nr   r   r   r  r  r  r)   )	r*   r[   r\   r]   r   iterdiris_dirr   r  )r   r  r  r  	tasks_dirtask_dirr   r   r   r    s    
z"JiraAPIImport._count_project_tasksr   r  c           
   
   c   s   | j  d|d}| s:| j jd| d|  d S d}t| D ]}| sXqJ|j	}|
drjqJ|r~|d s~qJ||k r|d7 }qJ||| kr qt|d	d
}	t|	V  W 5 Q R X |d7 }qJd S )Nr   r   u   Каталог u    отсутствует. Возможно он был удален или еще не создан. Необходимо повторно запустить импорт проекта r   r  r  r)   	info.jsonr  )r*   r[   r\   r]   rS   r  r   r  r  r   r  r^   r_   r`   )
r   r  rE  r   r  r  r  r  Ztask_idrc   r   r   r   r     s.    
zJiraAPIImport.get_project_tasksc                 C   s$  |d d }i }|d D ]f}|d dkr*q|d   D ]F\}}||d|i}|di }||d s6t|d	 ||d < q6q| D ]}i }	|d   D ] \}}
|	|
t }|| qi |d< |	  D ]8\}}t|d
kr||d d< q|D ]}||d |< qqqdd | D |d< |S )u   
        Создает структуру схемы экранов проекта из данных плагина "Smart Jira Configuration"
        schemesZissueTypeScreenSchemeglobalActionsr   )BROWSEPROJECTSCREATEISSUES
EDITISSUESrZ  issueTypeIdactionsrW  r)   ru  c                 S   s   g | ]}|qS r   r   )r   r4  r   r   r   r     s     z<JiraAPIImport._get_project_screen_scheme.<locals>.<listcomp>r  )r   r  rI   r  rl   r  r  r   )r   smart_configscreen_schemer  rL  r  r   r  r  Zissue_type_screensrY  rW  Zissue_type_screenr   r   r   _get_project_screen_scheme  s0    z(JiraAPIImport._get_project_screen_schemec           
      C   s   t |d d}| r$t| |  |d d }|D ]}|d }z`| jjd| d | j	
tj|}|d| d	}t|d
}|| W 5 Q R X W q< tk
r }	 z$| jjd| d|	 dddd W 5 d }	~	X Y q<X q<d S )Nrp  rq  rr  rs  r   u(   Дамп бизнес-процесса 'u   ' как XMLrw  rx  zwb+uB   Не удалось получить бизнес-процесс 'u   ' как XML: r}  r  ra   rt  Z
error_type)r   r\   r]   re   rmtreemkdirr*   rS   rT  r=   Zget_workflow_as_xmlrV  rW  quoter^   r;  r.   r1   )
r   r  r  r  r  r  r  r  rc   r$  r   r   r   _get_project_workflows_as_xml  s(    
z+JiraAPIImport._get_project_workflows_as_xmlc                 C   s  dd | j j|dD }g }|r.| j |}n&| j jdd}|dt|d d d	d |D }i }|D ]}t|d
 }	t|d }
| j |
D ]t}||d |d i d}|	dkr|D ]*}||krq||d |d d|d |< qq|	|d |d d|d |	< qqj|S )Nc                 S   s   g | ]}t |d  qS r  rS  r  r   r   r   r   3  s   z>JiraAPIImport._get_field_config_issue_type.<locals>.<listcomp>rv  T)Z
is_defaultru  r   )r  fieldConfigurationIdc                 S   s$   g | ]}|d  dkrt |d  qS )r  ru  rS  )r   field_configurationr   r   r   r   F  s   r  r  )r   contextisHidden
isRequired)ZissuetypeIdr  r  r  )r=   get_issue_for_projectZ"get_field_configuration_issue_typeZget_field_configr   r'   Zget_field_config_fieldsr  )r   field_configuration_scheme_idr  Zissue_types_projectZfield_configuration_mappingZfield_config_defaultZissue_types_schemefields_usedr  r  Zfield_configuration_idrm   
field_usedr  r   r   r   _get_field_config_issue_type1  sN    
z*JiraAPIImport._get_field_config_issue_typec                 C   s  | j |}| ||}| D ]X}|d }|ds:q | j ||}|sNq | j ||}z| j ||}W nz tk
r }	 z\i }|  j	d7  _	d| d| d|	 }
t
|	dr|
d|	jj 7 }
| jj|
d	d
dd W 5 d}	~	X Y nX | j ||}|dr:|d  D ]&\}}|| |dk	r||d< qq |D ]:}|d |}|sZq>|| |dk	r>||d< q>q |S )u   
        Возвращает список используемых полей в проекте
        в виде сруктуры как через плагин "Smart Jira Configuration" в box версии
        r   customfield_r)   u9   Не удалось получить опции поля u    в контексте r/  responsez HTTP: Response text -> zERR-0109r8  ra   r  NisAnyIssueTyper  options)r=   Z&get_project_field_configuration_schemer  rl   rU  Z!get_field_context_project_mappingZget_field_contextZget_field_context_optionr.   r0   hasattrr  r   r*   r1   Z#get_field_context_issuetype_mappingrI   r   r  )r   r  r  r  r  Zfield_used_idZ
context_idr  Zcontext_optionr$  Z
error_textZcontext_issuetypesr  Zcontext_issue_typer   r   r   _get_project_fields_usedm  sL    





z&JiraAPIImport._get_project_fields_usedc                 c   sB   |d  d}t |D ]$}|dkr&q|| d| dV  qd S )Nr	  z/attachmentsall_attachments.zipr  )r  rb   )rf   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  )r^   r_   rC  )r   r   comments_file_pathrc   r=  r   r   r   rZ    s    z!JiraAPIImport._get_issue_commentsc              	   C   s6   |d  d}t |d}t|}W 5 Q R X |p4g S )Nr	  z/worklog.jsonr  r^   r_   r`   )r   r   r  rc   r5   r   r   r   rF    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_pathrc   r   r   r   rl    s    z#JiraAPIImport._get_issue_propertiesc              
   C   s:   |d  d}t |d}t|W  5 Q R  S Q R X d S )Nr	  z/watchers.jsonr  r  )r   r   Zwatchers_file_pathrc   r   r   r   r     s    z!JiraAPIImport._get_issue_watchersc              
   C   sD   | j  d}| r@t|d}t|W  5 Q R  S Q R X i S )Nglobal_settings.jsonr  )r*   r[   r\   r]   r^   r_   r`   )r   global_settings_file_pathrc   r   r   r   rL     s
    z'JiraAPIImport._get_jira_global_settingsc              	   C   sJ   | j  }| j d}t|d}t|| W 5 Q R X |d | _d S )Nzcloud_id.jsonrZ   ZcloudId)	r=   Zget_cloud_idr*   r[   r\   r^   r_   ra   rK   )r   rV  	data_filerc   r   r   r   _get_cloud_id  s
    
zJiraAPIImport._get_cloud_idc              	   C   s@   | j  }| j d}t|d}t|| W 5 Q R X d S )Nr  rZ   )r=   Zget_configurations_of_jirar*   r[   r\   r^   r_   ra   )r   Zglobal_settings_datar  rc   r   r   r   _dump_jira_global_settings  s    
z(JiraAPIImport._dump_jira_global_settingsu/   Обработка ссылок в тексте)r   attachments_dirr   c                    s  d}|s|S t |ddd D ](}d}|dr8d}|j| }z|drh| jjd|  W q |d	stj	
| jj|}|| jjs| jjd
|  W q t|dd \}}	|s| jjd|  W q tdtj	|}
|
r`|
d  |
d dd} |d kr`|d d }tt fdd|d }|r`| jjd|  W q tj	|dd dd }tj|}||}tjj||d | jjjjd}|stj| j||d | jjjjd}||_||_d|_|   t!  W q  t"k
rH } z,t#  | jjd| d|  |d7 }W 5 d }~X Y q X q t |d}|jddid D ]}|jd!r| $|jd! |d"  nb|jd#r| $|jd# |d"  n<tj	%|jd }tj	&|j'}| $|d$ d ( |d"  qf|S )%Nr   rR  c                 S   s   |  dp|  dS rF  rH  rJ  r   r   r   ru     rv   z+JiraAPIImport._dump_links.<locals>.<lambda>rG  r-  zmailto:u   Это почта: httpuH   Это внешняя ссылка, оставляем как есть: rM  u   Это не файл: rN  r)   rn  r=  ri   r
  c                    s   |  d kS rO  rq   rP  rR  r   r   ru     rv   uE   Этот файл уже обработан во вложениях: r  rL  r   r-  
obj_ext_idr   r*   r-  r   r   Fu0   Не удалось скачать ссылку r/  r.  r'  r(  r)  r+  r	  r,  r   ))r   r2  rI  r*  rU  r*   rS   r  rV  rW  urljoinr=   r  r\  r]  r   rY  rZ  rX  rw   rx   rG   r~  Z_get_filenamer\   CmfImportDownloadrI   r   r   pathr   
downloadedr   r-   r.   r/   r@  r%  r&  r3  r5  )r   r   r  r   r0   r8  r   r  ra  encodingr^  Zattach_filenamer_  r`  r   r  rb   download_jobr<  Zdoc_soupr9  r3  r   rR  r   _dump_links  s~    



 




 zJiraAPIImport._dump_linksc                 C   s   | j D ]}| j | d sq||s&q|| di }| D ]z}|dsNq>|d |d |d |d d}|drd	d
 |d  D |d< | j | dg }||kr||  qq>q| | j  dS )u   
        В box версии, контексты полей получаем из плагина "Smart Jira Configuration"
        rp   r  r   r   isGlobalContextr  )r   r   r	  r  r  c                 S   s   g | ]}|qS r   r   )r   optionr   r   r   r   -  s     z5JiraAPIImport._get_field_contexts.<locals>.<listcomp>N)rd   rI   rl   r  r   rk   )r   r  r{   Zcontextsr  Zcontext_dataZfield_contextr   r   r   _get_field_contexts  s*    




z!JiraAPIImport._get_field_contextsc                 C   sJ  | j |d }| jD ] }| j| d s,q|d |s<q|d | d}|r|D ]}|ds|| jd| tj qV| j jr| j| dg D ]*}|d |d kr|dr|d |d< qqV|| j| d krV| j| d 	| qV| j| d	 d 
d
dd }|dkr>|d | }|r8| || j |d  q|dkr~|d | pXg }	|	D ]}| || j |d  q^q|dkr|d | }
|
r8| |d | |d  q|dkr|d | pg }|D ]}
| |
|d  qq|dkr|d | }| j| dg }|r|| tt|| j| d< q| | j dS )u   На коробке только через мету задачи можно получить варианты выбора полей

        Args:
            issue (dict): задача
        r   rp   ri   ZallowedValuesr   u   Выбор без id: r  rU  ro   r  r)   rL  
userpickerr	  multiuserpickergrouppickermultigrouppickerr  N)r=   Zget_issue_metard   rI   r*   r+   rR   r  rF   r   r   r@  rE   r>  rN  r   r  rk   )r   r   metar{   r  r
  Zcur_optcustom_field_typesr   r   r  r  rl   r   r   r   _get_field_options5  sV    






z JiraAPIImport._get_field_options)r   r  c              	   C   sR   | j | j|d |}t|d d}t|d}tj||dd W 5 Q R X d S )Nr   rp  r  rZ   Fr  )r=   Z get_simplified_project_workflowsrK   r   r\   r^   r_   ra   )r   r   r  rq  r  rc   r   r   r   "_dump_simplified_project_workflowsp  s    z0JiraAPIImport._dump_simplified_project_workflows)last_dump_datenew_dump_datec           "      C   s  t dd d}| jjd| d|  zh| jj|d ||||dD ]F}	z6z | j r|W W   W W 5 Q R  dS | jjd	|	d
  d |t	|	d }
|t	|	d d }|

 rt|
| |jdd ||	d< | |	 |
d}|	d d rr| jjdt|	d d   ztj| jjd|	d  d}| jjrptj| jjd|	d  d}d}||}| jjjj d|	d  }tjj||| jjjjd}|stj| j||| jjjjd}||_||_d|_|  t  W nD tk
r: } z$| jjdt d| dddd  W 5 d }~X Y nX |	d d D ](}|d!rH|  |d! | j! | qH| j"d"r4|d#}|
 rt#| t$|d$}| j%|	d }|D ]^}|d!i | j!r|  |d! | j! | |d%i | j!r|  |d% | j! | qt&'|| W 5 Q R X |	d& d' D ](}|d!r@|  |d! | j! | q@|	d d(r|  |	d d(| j!| |	d d)r|  |	d d)i | j!| |	d d*i r|  |	d d*i | j!| || (|	d+ d, ||	7 }|d-}|
 r2t#| | jjd. t$|d/}| j)|	d D ]}|d!i | j!r|  |d! | j! | |d%i | j!r|  |d% | j! | |*t&+|d0  | j j,d7  _,| j-d1 || (|d2 ||	7 }q\W 5 Q R X | j.|	d |	d3< | j/|	d }|d4}t$|d$}t&'|| W 5 Q R X | j0|	d }|D ]}|  || j! | qp|d5}t$|d$}t&'|| W 5 Q R X t||
 |jdd |
d6} t	|
1dd7|	d< t$| d$.}t&'|	| | j j,d7  _,| j-d8 W 5 Q R X |
d9}!t$|!d:}|*d7 W 5 Q R X W n.   |d7 }| jjd;|	 d<ddd  Y nX W 5 t  X qJW n.   | jj2d=|d>  d? |d7 }Y nX |3| W 5 Q R X d S )@NFr  r   u   Задачи с u    до r   )rE  r   rD  rH  r)   u   Задача 'r   r  r  Texist_okr	  r_  ri   r
  u%   Обработка вложений: zsecure/attachmentzip/z.zipzsecure/issueAttachments/r  r   r  r  r  r/  zERR-0054r   ra   r  r   r  zworklog.jsonrZ   rA  ry  rz  r  r  r)  r  r   zcomments.jsonu#   Дампим комментарииr  rH  r4  r   r|  zproperties.jsonzwatchers.jsonr  r   r   r  wu0   Не удалось скачать задачу zERR-0111u2   Не получить задачи проекта r   u    с сервера)4r   r*   rS   rT  r=   Zget_all_project_issues_duringr-   r,   r\   r'   r]   re   rh   r  r  r   rf   r  r   r  rF   r   r   rG   r  rI   r   r  r   r.   r1   r!  r@  rE   rM   r  r^   Zissue_get_worklogr_   ra   r  Zget_commentsr;  r<  r  r  Zget_issue_remotelinksZget_issue_propertiesZget_watchersrJ  	exceptionr  )"r   rE  r   r  r  tasks_that_are_doner  r  r  r   r  Ztask_dir_tmpr  r-  r  Zattach_file_pathr   r  r<  r   Zworklog_file_namerc   ZworklogsrI  rJ  Zcomments_file_namer4  rX  Zproperties_fileZwatchersr  Zwatchers_fileZ	info_pathr  r   r   r   _dump_task_part  s     


 




  


  


$



zJiraAPIImport._dump_task_partr  r[  r  r  c                 C   sp  t jj}t|d  d}|jdd | j }d}t|| j d }	|	sNd}	d}
g }d}||kr|
|	 |	 }||krz|}| j	j
| jd|
 |
|	 ||||||d	d
}|| |  | jjd|  |
d7 }
qZ|	d }| jjd|	 d |D ]4}|j|d | r| jjddddd tdq| jjd | sX|| 7 }q>| jjd|  | j|d | |d dD ]}| j r|  S t|d d}| j d}| j d}| rt|| t|d}t|dx}t|db}|D ]V}||kr| | t!"|}|| j#}|r|$| jj% d| t&'| qW 5 Q R X W 5 Q R X W 5 Q R X |(  t)|| t|d d }| j d }| j d!}| rt|d"*  t|| t|dR}t|d<}t|d&}|D ]}||kr| | qW 5 Q R X W 5 Q R X W 5 Q R X |(  t)|| q|S )#Nrp  /tasksTr  r   r)   r   Z
dump_tasks)rE  r   r  r  r  r  r  targetr   r4   u$   Форкаем _dump_task_part proc=r  u%   Таймаут дампа задач u    минутtimeoutu$   Возможно завис дампzERR-0055r   ra   r  u"   Ошибка дампа задачuK   Закончили параллельное скачивание задачu   Ошибок: r   r   r	  r?  zusers.json.newry  r  r>  r:  zgroups.json.newa)+r?  r@  rA  r   r  r   Queuer  r   r~   Threadr  r   rE  r*   rS   rT  r   is_aliver1   TimeoutErroremptyrI   r   r  r,   r\   r[   r]   re   r  r^   r;  r_   rC  rE   r  r   rB  r<  r  rh   close)r   r  r[  r  r  rE  r  r  r  r|  ir  Z	max_limitr  r!  r   Zissue_users_pathZall_users_pathZall_users_path_newf1f2Zf3rb  r:  r   Zissue_groups_pathZall_groups_pathZall_groups_path_newr   r   r   _dump_tasks	  s    


  

"



B

,zJiraAPIImport._dump_tasksc              	   C   sH  | j jd|d  d|d  d | j|d }|r|dsi }| jjr`| j|d }n<|dg D ].}|d d	krl|d
 D ]}|d ||d < qql|dg D ]R}g |d< ||d g D ]4}|d | |d dkr| 	|d | j 
  qqt|d  d}	|	 r"t|	 t|	d}
t||
 W 5 Q R X d S )NuH   Дамп схемы безопасности задач проекта "r   r  r   re  r   r  r  BROWSE_PROJECTSr  r  levelsr  r   r   rp  /issue_security_scheme.jsonrZ   )r*   rS   rT  r=   Z!get_project_issue_security_schemerI   rF   Z get_issue_security_level_membersr   r@  r[   r   r]   rf   r  r^   r_   ra   )r   r  r  Zsecurity_schemeZsecurity_level_membersrL  security_levelrT   member	dump_filerc   r   r   r   #_dump_project_issue_security_schemeZ  s.    

z1JiraAPIImport._dump_project_issue_security_schemec                 C   s   | j jd t|d  d}| r2t| t|d}i }z"d}| jj	|d d
|d}W n: tk
r } z| j jt|d	d
dd W 5 d }~X Y nX t|| |W  5 Q R  S Q R X d S )Nug   Дампим конфигурацию проекта через плагин "Smart Jira Configuration"rp  z/smart_config.jsonr  )	ZprojectInformationZprojectSchemesZprojectIssuetypesZprojectVersionsZprojectComponentsZprojectMembersZprojectCustomfieldsZprojectGlobalActionsZprojectWorkflowActionsr   r   )r  ERR-0056r  ra   r  )r*   rS   rT  r   r]   rf   r  r^   r=   Zget_project_smart_configr   r.   r1   r'   r_   ra   )r   r  Zsmart_config_filerc   r  r  r$  r   r   r   _dump_smart_configw  s$    
 z JiraAPIImport._dump_smart_configEtc/UTC%Y-%m-%d %H:%M)dttzr6  r>   c                 C   sN   | pt j t jj|} t|}tjt j | ||}||}|S r   )	rG  nowtimezoneutcstrftimepytzZlocalizestrptimeZ
astimezone)r8  r9  r6  Zdt_tzZdt_strr   r   r   _datetime_in_user_tz  s
    

z"JiraAPIImport._datetime_in_user_tzc           @      C   s\  dd l }| jd d d }|d s*tddd |d D | _| j d	}|jd
d t| j}t	d| }| jD ]}|d }|d }|d }	zT| j
 rW  d S | j jd7  _| jjd|	 d ||}
|| d}|
d}| jjr| jj| jjd}n| jj| jjd}|r6|d d nd}| jj|d}d }| rt|d}t|}|d}W 5 Q R X |r| ||}tjtjjd}| ||}|
 rt|
| nt j!|d
d t"# }| j$|}t%||d< d }| jjs| &|}| jjd t'|d  d}| rFt (| t|d }| j)|d }zv|d! D ]h}|d" d# d$krl| jjr|d" dr| *|d" d | j  n| *|d" d% | j  qlW n(   | jj+d&| d'd(d)d*  Y nX t,|| W 5 Q R X | j-||d+ | jjr:|d, s~| j.|d d d- |d.< | j/|d |d/< | 0|d |d0< n| jjd1 t'|d  d2}| rt (| g }t|d R}| jj1|d dD ]8}|2|d  | j jd7  _|3t4|d3  qW 5 Q R X | j5|d |d4< | 6|| n| j5|d |d.< d|d. krx|d. d |d. d5|d.< n| j7|d. d |d. d6< |d7i |d. d7< | 8| |d8r| 9||d/< |d9i |d0< | :|d0  |d:}|r@| j;d;|  | jj|d< d
d=|d:< | *|d: | j< | j  | jjd> t'|d  d?} |  rtt (|  t| d D}| jj=|d dD ]*}!| j jd7  _|3t4|!d3  qW 5 Q R X | jjd@ t'|d  dA}"|" rt (|" t|"d }| jj>|d dB? D ]}#| j
 rF W 5 Q R  W  d S | j jd7  _| jj|#d
d=}$g }%|$dCg D ]}&|&d# dDkrvzN| jjr| jj@|&dE d|&dE dFdG|&dH< n| jj@|&d d|&dH< W nn |jAjBk
rD }' zJ|'jCjDdIkr2|%2|& | jjEdJ|$d  dK|' dL W Y qvn W 5 d }'~'X Y nX |&dHrv| *|&dH | j< | j  qv|$dCr|%D ]}(|$dC (|( q|3t4|$d3  q W 5 Q R X | jjdM t'|d  dN})|) rtF|) |)  t'|d  dO}*|* rtF|* |*  zv| jjG|d dBD ]\}+| j
 rX W W  d S | j jd7  _| jjdP|+d   | jH|+d |+d6< | jI|+d6 dQ d |+d6 dQ< | jJ|+d },| jjrdRdSdTd | jK|+d D ii}-|,L|- |,|+d6 dU< |d |+dV< |)t%|+d }.|.jd
d |.d}/t|/dW}t,|+| W 5 Q R X z|+d# dXk
r| jjdY | jM|+d D ]\}0| j
 	r W  W W  d S | j jd7  _|*t%|0d }1|1jd
d |1d}2|2 
r| jjdZ|0d  d[ 	qi |0d\< | jjdZ|0d   | jjN|0d d]gd^D ]t}3| j
 
rf  W  W W  d S |3d }4|4|3d |3d_ d] d |3d_ d] d |3d_ d] d d`da}5|5|0d\ |4< 
qDt|2dW}t,|0| | jOdb W 5 Q R X 	qW n |jAjBk
rn }6 z\|6jCjDdckrBddt%|6ks0det%|6krB| j;t%|6 n| jj+df|+ dgdhd)d*  W 5 d }6~6X Y n(   | jj+df|+ dgdhd)d*  Y nX q:W n4   |  jPd7  _P| jj+di| dgdhd)d* Y nX | j;dj t'|d  dk}7|7 rt (|7 t|7d b}| jQ|d D ]J}8| j
 rD W 5 Q R  W  d S | j jd7  _|3t4|8d3  q W 5 Q R X | j;dl t'|d  dm}9|9 rt (|9 t|9d }| jR|d D ]r}:| j
 r W 5 Q R  W  d S |:d:r| *|:d: | j< | j  | j jd7  _|3t4|:d3  qW 5 Q R X dnt jSdo< | j jT|7  _T| jjUd
dp tV  dqt jSdo< t|d |
 t%|
|d< |d  dr}t|dW}t,|| W 5 Q R X t"# | };| jjds|	 dt|;dudv t'|d  dw}<|rz|< sD| jjEdx|	 dy|d  dz|< d{| d|	 d }n6| W|d sz| jjEd}|	 dy|< d~| d| d }|d d s|d d }=| jj+d|= d|= d|	 d| d	dd(d)d* n"d}>t"# }| jjX|d ||d}|rd| }?|s|rD|?d7 }?|r |?d| 7 }?|r4|?d| 7 }?|?d| d7 }?| j;|? |>| jY||||d7 }>t"# | };| jjd|	 dt|;dudv n| jjd|	 d |>s||d< t|dW}t,|| W 5 Q R X n|  jP|>7  _PW qv   |  jPd7  _P|dr*| jj+d|	 ddd(d)d* n| jj+d| dd(d)d* Y qvX qv| j;d d S )Nr   r   r   	isCheckedu5   Не выбрали ни одного проекта!c                 S   s$   g | ]}|d  r|d r|d  qS )r2   rA  r   )r   valr   r   r   r     s       z0JiraAPIImport._dump_projects.<locals>.<listcomp>rU  r   Tr  P   r   r   r   r)   u   Дампим "r   r  r  )r3  )r   ZtimeZoner6  rv  ry  Z	dump_dater7  rp  u   Дампим права/permissions.jsonr  permissionsholderr  r   	parameteru0   Не удалось сдампить права r4  r  ra   r  )r  r  ZworkflowSchemerr  jira_screen_schemer  u/   Дампим типы задач проектаr  rH  r  )r   rT  rT  rq  r  Z
fieldsUsedr	  u1   Ищем руководителя проекта r   )absoluteu*   Дампим статусы проектаr  u$   Дампим роли проектаr  )r   r  r  Z	actorUserr?   )r   rb  r:  i  u&   Пользователь к роли "u   " не найден. u+   . Возможно он был удаленu&   Дампим доски проектаz/boards/z	/sprints/r  rx   r  r  c                 S   s   g | ]}|qS r   r   )r   Zqfr   r   r   r   z  s    r   r  rZ   )r  Zsimpleu&   Дампим спринты доскиu   Спринт u    уже скачанr'  r   )ri   ri   )r   r   r   )r   r   r   r   i  z"The board does not support sprintsuD   Данная доска не поддерживает спринтыu4   Не удалось сдампить спринты zERR-0057r   u   Не удалось сдампить доски, возможно проект не поддерживает доски или у вас нет прав project_info=u(   Дампим версии проектаr  u!   Дампим компонентыr  r   NO_CACHEr  1r  u&   Дамп данных проекта "u   " выполнен за r  r  r  u$   В каталоге проекта "r  u5   ), отсутствует каталог задач (u@   ). Дата последнего успешного дампа (u   ) будет сброшена.u/   В каталоге задач проекта "ud   ) отсутствуют задачи. Дата последнего успешного дампа (r-  ZhavePermissionu   Не удалось выполнить дамп задач проекта. Пользователь не имеет разрешения 'uA   '. Предоставьте пользователю право 'u0   ' в схеме прав для проекта 'r5  re  zERR-0128)rD  rH  u*   Дампим задачи проекта: u    (в периодu    с u    по u4    включительно, часовой пояс: r  u$   Дамп задач проекта "u   В проекте 'u5   ' нет новых/обновленных задачr  u   Проект "u   " является приватным и не может быть импортирован, отключите приватность в Jira или предоставьте пользователю праваzERR-0058u2   Не удалось получить проект u0   Закончили дампить проекты)Zrequestsr   r.   rQ   r*   r[   r\   r  r   r  r,   r  rS   rT  r=   rF   Zuser_find_by_user_stringr   Zget_permissionsr]   r^   r_   r`   rI   r@  rG  r:  r;  r<  r=  re   rh   rf   makedirsr  r  r  r'   r5  r   r  Zget_project_permission_schemer@  r1   ra   r3  Zget_project_schemeZget_project_screen_schemer  r  r   r;  r<  Zget_project_workflow_schemer  Zget_workflow_schemer  r  r  r+   rE   get_statusesZget_project_rolesrl   r   
exceptionsZ	HTTPErrorr  r  r  r  Zget_all_agile_boardsZget_agile_board_configurationZ
get_filterZget_advanced_board_settingsZget_board_quick_filtersr  Zget_sprintsZget_sprint_issuesr  r0   Zget_project_versions_paginatedZget_project_componentsenvironprogressr   r-   r  Zget_project_issues_count_duringr,  )@r   rL  rootZprojects_dirr[  r|  r   r  r   r  rp  Zproject_tmp_dirr  r:  Zuser_tzZuser_permissionsr  rc   Zcurrent_dumpZlast_dump_date_utcZnew_dump_date_utcr  r  r  r  permission_fileZperm_sch	perm_dictZ
types_filer  r  r  Zstatuses_filer=  Z	role_fileZrole_urir  Zunfound_actorsr  r$  Zunfound_actorZ
boards_dirr  r#  Zadvanced_settingsr  r  Zboard_info_filer   Zsprint_pathZsprint_file_pathr   r0  r1  r<  Zversion_list_filenamerq  Zcomponents_list_filenameru  r  r  r  Ztask_errorsZinfo_msgr   r   r   _dump_projects  s   












"  



"




"



"



 
 




	*      

"

"


 



    zJiraAPIImport._dump_projectsc                 C   s,  | j  }t|\}}}|| d }| j d| d | j jd | jjrX| 	  | j jd | 
  |  | _| j jjddr| j jd | | jjd	 n| j jd
tjd |   | j jd | | jjd | j jd | | jjd | | jjd | jjrV| j jd | | jjd | j jd | | jjd | j d | | jjd | | jjd | j d | | jjd | | jjd | j d | | jjd | j d | | jjd dt j!d < d!| j _"| j #  t$  d"t j!d < | j jd# | %  d$S )%u_   
        Загружаем все данные из апи, кроме аттачей
        d   u   Свободно места: rw  u$   Скачаем данные из APIu9   Дампим глобальные настройки Jirar  Tu'   Дампим пользователейr   uA   Не дампим пользователей из-за опцийr  u   Дампим статусыr  u    Дампим типы задачr  Zissue_security_schemesu*   Дампим бизнес процессыrq  u7   Дампим схемы бизнес процессовr  u   Дампим экраныrZ  r  u!   Дампим приоритетыr1  r  u+   Дамп решений(резолюций)r  u   Дамп фильтровr  r   rJ     rK  u   Дампим проектыN)&r*   r[   re   
disk_usager+   rS   rT  r=   rF   r  r  rL   rM   r   r   rI   r  r   rR   r  r  rN  Zget_issue_typesZget_issue_security_schemesZget_workflowsZget_all_workflow_schemesZget_all_screensZget_screen_schemeZget_all_prioritiesZget_priority_schemesZget_all_resolutionsZget_all_filtersrf   rP  rQ  r   r-   rU  )r   Zdownload_pathr  usedfreeZfree_percentr   r   r   download_data9  sT    





zJiraAPIImport.download_datac                 C   s`   dt jd< tjj| jjdddgd}|jrRt|j	|j d |_
|jdd	 t  d
t jd< d S )Nr   rJ  r  r  rQ  )r   ri   rV  Tr  rK  )rf   rP  rG   Z	CmfImportrI   r*   r   r  r  r  rQ  r   r-   )r   r*   r   r   r   r  l  s    
zJiraAPIImport._calc_progressc                  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}	|	jr|d |	_|	jdd n| jjd|	 d ddg}
ddddddddddddd d!d"d#g}|
| }d$g|
 }t	jj|	|d%D ]n}|jsF| jjd&|	 d'|jj d( q|
D ]}t||g  qJ|D ]}t||d) qb|jdd q|d* D ]$}zd	| jjjj d	|d
  d	}||d+ rt	jj||d+  dd,}n| jjd-|  W qd.d/d0| d0g}t	jj||d1}|st	jj||	|d2}|sf| jjd3| d4|	d5 |  jd67  _W q|jr|j | |_n||_|jsW q|d7 d8 d9kr| jjjj d	|d7 d9 d
  }t	jj|d}|j| n|d7 d8 d:krd|_nn|d7 d8 d;krd|_nR|d7 d8 d<kr:d|_n6|d7 d8 d=kr\d|_d|_ n|d7 d8 d>krxd|_!n|d7 d8 d?kr| j"j#r|d7 d@r| $|d7 d@ }n| $|d7 dA }|r|j%| n,| jjdB| dC|d5 |  jd67  _W qnb|d7 d8 dDkr<| j"j#rNd	| jjjj d	|d7 d@  d	}n&d	| jjjj d	|d7 dD d  d	}t	j&jd.d/d0| d0gd.gd1}|s|d7 dD d }t	j&jddE|gd.gd1}|r|js||_n||jkr|j | |_|jdd |j%| n,| jjdF| dG|d5 |  jd67  _W qn4| jjdH|d7 d8  dI|d5 |  jd67  _W q|jdd W n2   | jjdJ| dKdLdM |  jd67  _Y nX qdNdOdPdQdRdSgdTgdUdVgdW}|' D ]\}}zt	jjdXdY|gdZdY|	gg|d1}|D ]\}t	jjdXdY|gdZdY|	gg|d1}|js:q
|D ]}t||t(|| q>|jdd q
W n@   | jjd[|	 d\| d]| d^d_d`dM |  jd67  _Y nX qt)  |	S )aNr   r  rp  rD  c                 S   s$   i | ]}| d r|d  |d qS )r  rB   rq   r   r   r   r   r  {  s   
 z6JiraAPIImport._process_permissions.<locals>.<dictcomp>r  ry  r   r   r  Tr   r  r*   r   r   u#   Схема прав доступа u@    была изменена и не будет обновленаaccess_project_roleaccess_membersaccess_local_useraccess_ownerZaccess_owner_assistantaccess_authorZaccess_spectatorsZaccess_executorsaccess_responsibleZaccess_list_owneraccess_project_ownerZaccess_project_owner_assistantZaccess_project_spectatorsZaccess_project_executorsaccess_sdesk_clientZaccess_anonymousZaccess_guestZaccess_sharelink_anonymousr   r  u&   В схеме прав доступа u+    было изменено правило 'u,   ', оно не будет обновленоFrE  r  )rB   r  u4   Не нашли соответствия права r   rv  rw  rx  )project_permissionr   ri   u*   Не найдено правило для zERR-0059r   r)   rF  r  projectRole)applicationRoleZanyoneprojectLeadr)  r  sd.customer.portal.onlyr   r   rG  u9   Не нашли пользователя для прав zERR-0060r  r  u-   Не нашли группу для прав zERR-0061u'   Неизвестный тип прав zERR-0062u6   Не удалось загрузить правило zERR-0063CmfProjectPermPermissionrs  zPPP-RELEASE-EDITzPPP-OBJ-CREATEzPPP-OBJ-EDITzPPP-OBJ-DELETEzPPP-OBJ-TREEMOVEzPPP-OBJ-ORDERzPPP-TSK-ASSIGN-EXECUTORSzPPP-TSK-DEADLINEzPPP-TSK-ORDER)zPPP-PR-ADMINzPPP-TSK-ASSIGNzPPP-TSK-SCHEDULEzproject_permission.coder  r   u   В схеме uR    не удалось скопировать разрешения из права 'u   ' в 'r  zERR-0113CmfProjectPermSchemeRule)*r  r  r   r^   r_   r`   r*   r   r   rG   ZCmfProjectPermSchemerI   r  r   r   rS   r  rk  r   re  r  rj  r1   r0   r   r  r]  r   r_  rc  rb  r`  ra  rd  r=   rF   r   r^  r  r   getattrr-   ) r   r  r  rS  r  Zmap_permrc   Zperm_scheme_dictr   Zperm_schemeZrule_list_access_fieldsZrule_bool_access_fieldsZrule_access_fieldsZrule_fieldsZscheme_ruleZ
list_fieldZ
bool_fieldrT  r  r   r  r  r  r  r  Zcopy_access_rulesZfrom_rule_codeZto_rulesZ	from_ruleZto_rule_codeZto_ruleZrule_access_fieldr   r   r   r  w  sr   



 "





 

$&    	z"JiraAPIImport._process_permissionsc                 C   s"  t dd d}| }|dkr&q
| j r4q
| jjd|d   zj| jj|d |d tj	d | jjd	|d   t
jj|d
 d}d|_|  t  | jd W q tk
r } z0t  |d7 }| jjd|d  d|  W 5 d }~X Y qX q|| W 5 Q R X d S )NFr  r   r  u    Пытаемся скачать r-  r  r   u   Сохранили в r   r  Tr
  r)   u+   Неудалось скачать файл r/  )r   rI   r*   r,   rS   rT  r=   Zdownload_filer   ZIMPORT_DOWNLOAD_TIMEOUTrG   r  r  r   r-   r  r.   r/   r  r  )r   download_queueerror_queuer  r  Zdownload_job_objr<  r   r   r   _download_file_workerK  s2    
2z#JiraAPIImport._download_file_workerc           	      C   s  | j jd | j }| j }d}| j dg dd| j jjjgdddgg}tj	j
|dsp| j jd	 |S g }t| jD ]J}| jj| jd
| ||dd}|| |  | j jd|  q~tj	j|ddgdD ],}| j  r q||j|j|jd qt  |D ]}|d q| sF|D ]}|  q6| j  rV|S | j jd | s| j  r~|S || 7 }qd|S )Nu=   Скачиваем все найденные вложенияr   zplugin.plugin.source_hashr   r   r  Fr   u   Вложений нетro  )rm  rn  r  u    Запустили задачу r-  r  rx  )r   r-  r  r  u%   Закончили скачивать)r*   rS   rT  r   r#  r   r   r   rG   r  r  r  r   r~   r$  ro  r   rE  Zslistr,   r  r   r-  r  r-   r'  r   rI   )	r   rm  rn  r5   r   Zprocsr)  r  r  r   r   r   download_filesi  sF    





zJiraAPIImport.download_filesc                 C   s&  | j  rd S | j jd|d  d|d  d d }t|d  d}t|}t|}W 5 Q R X |r"| j jjj	 d|d	  }t
jj|d
}|st
j|| j dd}|jr|d |_|d|_||_|jdd |d D ]8}|d  d|d	  d}| j jjj	 d|d	  }	t
jj|	d
}
|
s@t
j||	| j dd}
|
jr|d |
_|d|
_t
jj|
dD ]}|jdd ql|dg D ]B}zt
j|
d}|d}|d}|dkrt
jjdd|_n|dkr,| j jjj	 d| }t
jj|d
}|rt
jj|d
|_ntd| n<|dkrJt
jjdd|_n|dkrht
jjdd|_n |d krt
jjd!d|_n|d"krl|rZd| j jjj	 d| d}t
jjd#d$d%| d%gd#gd&}|s| jjr|d' n|}t
jjdd(|gd#gd&}|rJ|js||_n||jkr6|j | |_|jdd ||_ntd)| nt
jjd*d|_n|d+krz| |}W n2 tk
r } zt| d,W 5 d }~X Y nX | j|d-d-d.\}}|r||_ntd/| n~|d0kr>| j jjj	 d| }t
j j|d
}|r.t!|jg|_"ntd1| n*|d2krZt
jjd3d|_ntd4| |jdd t#  W nP tk
r } z0|  j$d57  _$| j j%d6| d7| d8|d9 W 5 d }~X Y nX q|
jdd t#  |d:rt&|d:t&|d	 kr|
|_'|jdd qt#  |S );NuV   Импортируем схему безопасности задач проекта "r   r  r   re  rp  r/  r   r   r  Tr  r   r   r.  r  r  r  r  r  r  r   rg  zvar:current_userrA   rf  u0   Не найдена проектная роль rh  zvar:project_ownerr  z
var:authorr)  zvar:responsibler  r   rv  rw  rx  rG  r  u!   Не найдена группа ZUsersr   r  Fr+  u+   Не найден пользователь )ZgroupCustomFieldZuserCustomFieldu>   Не найдено пользовательское поле ri  zsdesk-client:defaultu-   Неизвестный тип правила r)   uF   Не удалось создать правило для уровня r^  zERR-0070r   ZdefaultSecurityLevelId)(r*   r,   rS   rT  r   r^   r_   r`   r   r   rG   ZCmfSecurityLevelSchemerI   r  r   r   r  r   r  ZCmfSecurityLevelRuler   r  r   Zaccess_memberr  r.   r  r=   rF   r   r4  r  CmfCustFieldr'   Zaccess_task_fieldsr-   r0   r1   r  Zdefault_task_security_level)r   r  r  r2  rc   rV  Zscheme_ext_idrT   Z	level_msgZlevel_ext_idr0  Z
level_ruler1  member_typemember_valuer  r  r   r  r  r:  r$  r  r=  cust_field_ext_id
cust_fieldr   r   r   r    s    












 


$z&JiraAPIImport._process_security_levelsrm   c                 C   s  |d d  dd}|d| jjjj  7 }|d d|g g g g dd	d	d
}|d }|d d ddd }|dkrd|d< nx|dkrd|d< nd|dkrd|d< nP|dkrd|d< n<|dkrd|d< dd |d D |d< n|dkrd|d< dd |d D |d< n|d kr2d!|d< |d |d< n|d"krNd#|d< i |d< n|d$krbd%|d< n|d&krvd&|d< n|d'krd(|d< np|d)krd*|d< n\|d+krd,|d< nH| jjd-|d.  d/|d  d0|d d  d1d2d3d4 |  jd7  _d }|S )5Nr   r   customfieldcfr=  r   T)r  r  r
  r  F)r   rp   r1  Zvisible_filterrequiredZrequiredChangedro   rp   r  r)   rL  Ztextarear   field_custom_typeZ	textfieldr'   floatr  )rj  Zradiobuttons
choice_strc                 S   s   i | ]}|d  |d qS r   r   r   r   optr   r   r   r  ;  s      z,JiraAPIImport._map_field.<locals>.<dictcomp>r  r2  )ZmultiselectZmulticheckboxeschoice_multic                 S   s   i | ]}|d  |d qS r}  r   r~  r   r   r   r  ?  s      r  r  Zcascadingselectchoice_cascade_multiZ
datepickerdaterG  r  r   r  r   )r  r  r  r*  r   r5  u6   ) имеет неподдерживаемый тип 'r  zERR-0064rq  rs  )rJ  r*   r   r   r5  r   r1   r0   )r   rm   r1  r5   r   r  r   r   r   
_map_field"  s^    
 













&zJiraAPIImport._map_fieldc                    sp  d | _ | jD ]Z}| jtjj d D ]B}d|krF| jdtj	   d S |d d |kr"| j| |d< q"q| jj
j
j}tjj|dgd}|stjd|d| jd	}d
|_|  tjjdd|d}| jjjdds| jjd d S | jd dd tj D }g }g }| jtjj d D ]}|dr<|d d sV| jd|d   q| |}	|d d dd}
|
d| jj
j
j  7 }
|
|d< |	sq|	d dkr|| | jj
j
j d|d d  }tjj|ddd d!gd}|stj|d |d |	d d|| jdd"}|
|kr||
 d |jjkr| jjd#|d d  d$|d d  d%|j d&||
 d  d'	d(d)d* q| jd+|
 d,|d  d- ||
 |d.< n(| jd/|
 d,|d  d0 || |jr|d |_|	d d1kr|jjpi }t |j!jpt  }|d d2 D ]}|d3 s8q&i t  }|d4g D ]:}t"j#|d5 d6d7d8}|d5 |< |d9 rN|$| qNfd:d;|D }|%| |%  qq&|}||_t&||_!|j'rd|_(|| |jdd< t)  tj*j||
||d=}|stj*||
||d=jdd< qt)  |+  |rtj,t-j-. /d>d
dd? tj0d@d
i dAd tj D }|D ]}||d  |d.< qdI fdBdC	|D ]D}tjj1|d. dD  }t2t|j3  |d d4 D ]}| qq| jjj}|dE D ].}|d tjjkr| jtjj d |d< q|| j_dFt4j5dG< | j  t)  dHt4j5dG< d S )JNri   r   uj   Текущая настройка не поддерживает импорт кастомных полейr   r   r  u8   Экран проектов Jira по умолчаниюTr   r   r  r*   r   _customr  )r   r  r   Zimport_custom_fieldsFuI   Отключен импорт пользовательских полейu8   Импорт пользовательских полейc                 S   s   i | ]}|d  |qS r{   r   r  r   r   r   r    s      z8JiraAPIImport._process_custom_fields.<locals>.<dictcomp>rp   u!   Поле не кастомное r   rw  rx  r=  r   rz  )r  r  r  r   widgetr2  r   disabled_choices)r   r   rz  dirtyr   r*   r  u,   Неудалось смапить поле 'r5  u   ): widget поля 'u7   ' не совпадает с существующим 'r  zERR-0065rq  rs  u   Поле с именем r  u4   ) есть в таблице, мапим в негоr   u(   Создаем поле с именем u   ), и мапим в негоr|  r  r	  r  r   rM      seplengthdisabledc                    s   h | ]}| kr|qS r   r   )r   r   )default_choicesr   r   	<setcomp>  s   z7JiraAPIImport._process_custom_fields.<locals>.<setcomp>r   )ru  r   r   ui_form_groupz%Y%m%d%H%M%S)Zmeta_versionZ
model_namer  r  c                 S   s   i | ]}|d  |qS r  r   r  r   r   r   r    s      c                    s   t | tr4 j| d}|s$ | d}|jr|  npt | tr j| d d}|s` | d d}| dd|_|rz|j|_|jr|  | dg D ]}|| qd S )Nr8   r   r  FrU  )	r   r'   rI   r  r   r   Z
cmf_hiddenr   Zchoice_parent_id)r
  Z
parent_optr   child)choice_modelcreate_optionr   r   r    s"    



z;JiraAPIImport._process_custom_fields.<locals>.create_optionr{   r   r   rJ  rK  )N)6r<   rd   r   rG   r   r   r*   r+   rR   r  r   r   r_  rI   r  r   CmfUiFormGroupr   r   rS   r  r|   r  rJ  r5  r   rq  r  r1   r  r   r2  r  r  cmfutiltranslit_stripr  r  r   r  r  r-   CmfUiFormFieldinvalidate_cacheZcustom_fields_gen_metarG  r:  r=  Zcustom_field_sync_update_modelsri   varsrz   rf   rP  )r   Zext_field_namerm   r   ui_view_formr  shop_fieldsZ
new_fieldsZ
m2m_fieldsZui_fieldr   ru  Zcurrent_choicesZcurrent_disabled_choicesr  default_disabled_choicesr
  
option_keyr  ui_form_fieldZfield_classr   r  r   )r  r  r  r   _process_custom_fieldsc  s    





6













z$JiraAPIImport._process_custom_fieldsc                    sR  dd t j D }|d }|d }| jjjj d| }t jj|ddgd}|s| jj	d	| d
| d t jd|d| jd}|j
}|jr||_|dd|_||_|  n| jjd| d |r| jjsddddddddddddddiddddddddddddd	}t jj|d }	|	D ]J}
||
j}|rr|d!d"|
_|d#d"|
_|d |
_|
jdd$ q6nrg }t jjd%d&|gd'd&dgdd&d ggd(gd)}|D ]>}||kr|jdd* q|j|_|jdd$ || qd d d d d d+}	| jjs|	D ]}dd&|gd,d&|d-kr2d.nd/gd%d&|gg}|d0kr\|d1d&d2g t jj|dd,gd3}
|
st jj|d,gd4}|r|d5 }
d|
_|
jdd$ n"| jjd6| d7| d8| d9 |
|	|< qt  t|d: }|d: D ]J}|d;kr|	d< r|	d< }
n|d }|d }| d| }t jj|d,d=gdd>}
|
s| jj	d?| d@| d
| d t jd/||d| jdA}
|
jr| jjdB| dC|
j d
| dD| dE	 nL|
js| jjd6| dF|
j d
| dD| dE	 n||
_||
_|
jdd$ |dG D ](}|d   dHs.q dIdJ}|dK| jjjj   7 }||krbqt!t" fdLdM| j#t jj$ dG d }|sq| jjjj d|dN d  }t j%j|dOdPgd}t jjdQd&|gd%d&|ggdRgd4}|r |js | jjd6| dS|j& dT|j'j dU q|st jjdQd&|gd%d&|gd=d&dgddVd ggddW}|r~| jjd6| dS|j& dX qt j|||| jddY}|j(dZkr|	d[ p|
|_'n$|j(d\kr|	d] p|
|_'n|
|_'|j)r|j'j*}|j'j}| jj	d?| d^|j& d
| d_|d/krd`nda db| dc |jdd$ qq|+  t  |S )dNc                 S   s   i | ]}|d  |qS r  r   r  r   r   r   r  )  s      z1JiraAPIImport._process_screen.<locals>.<dictcomp>r   r   r   r   r*   r  u   Создан экран 'r5  re  r   T)r  r   r  r*   r   r   u   Экран u|    был изменен пользователем. Изменения из импорта не будут примененыr  )r  r  i  i  i  r  i  ip  )hiddenr  iX  i@  i(#  )	_main   Участники   Даты   Планu   Разработкаu
   СвязиZ_addonr  _descrr  r  Fr  r   r   r  r  z-cmf_created_at)rx   Zorder_byr  )r  r  r  r  r  r  r  r  tabr  rL  Zclick)rx   r  ri   rx  r   u   На экране u6    не найдена системная группа 'u   '. Возможно она была удалена пользователем. Поля на экране могут отображаться некорректно. Создайте группу с названием 'u$   ' и повторите импортZtabsr)   r  r  )r   ri   r  u   На экран u$    добавлена вкладка ')r  r   r   r  r*   u   C экрана uD    пользователем была удалена вкладка 'r/  uL   ). Изменения из импорта не будут примененыuF    пользователем была изменена вкладка 'ri   r  rw  rx  r=  c                    s   |  do| d d  kS )Nr   r   rq   rv  Zjira_field_idr   r   ru     s    
z/JiraAPIImport._process_screen.<locals>.<lambda>r   r   rz  ru  zui_form_group.typeu    поле 'um   ' было изменено или уже добавлено пользователем во вкладку 'uL   '. Изменения из импорта не будут примененыr  r  u   ' было удалено пользователем. Изменения из импорта не будут применены)ru  r   r   r*   r  )r   r   r  Zrolesr  )r  rG  r  u    добавлено поле 'r  u   во вкладкуu   в группуrG  r  ),rG   r   r|   r*   r   r   r_  rI   rS   rT  rI  r  r   r   r  r   r  r=   rF   r  r   r  r  r  r  r  r   r-   r   r  rU  rJ  r5  rw   rx   r   r   rq  r   r  rz  r  r  r  )r   rW  r  rY  Zscreen_nameZscreen_ext_idui_formZui_form_is_newZdefault_groupsZui_form_groupsr  Zgroup_configZcurrent_ui_form_fieldsZui_form_fieldsr  r  rw  r  Znum_tabsr  Ztab_idZtab_nameZ
tab_ext_idZ
jira_fieldr   rm   rt  ru  Z
group_typer   r  r   ra  (  s   

 %
	





		
2zJiraAPIImport._process_screenu,   Обработка схемы экрановc              
   C   s  | dr>|d }|d }| jjjj d| }tjj |dgd}|sZtj|| jdd}|jrdd	 | d
D }|d |_|j	dd |j
stjj|dD ]}|  q|d D ]}|d }	d }
|	dkr$| jjjj d|	 }tjj ddd| dgd}
|
s$| jjd|	 ddd q|d  D ]\}}| |}|sl| jjd| d| ddd q0z| |}W n0   | jjd| d| ddd Y q0Y nX dd d!d"d d!d"d#}| j r  d S ||d$| |d| jd%}tjj f |d&d'gi}|stjf |}|
r*|j|
 |j	dd q0qn| jjjj d|d  }tjj |dgd}|stj|d(  d)|d  || jdd*}|j	dd tjj | jjjjdgd}|jrtjj |dgd}|stj|d| jd+}|jr||_||_d$|_|j	dd t  |S ),NrH  r   r   r   r  Tr  c                 S   s   i | ]}|d  |qS r  r   r  r   r   r   r  |  s      z8JiraAPIImport._process_screen_scheme.<locals>.<dictcomp>rZ  r   r   )r  r  r  ru  r   rv  r}  r~  r   ;   Не удалось найти логический тип r}  CmfUiFormSchemers  r  u8   Не удалось найти в дампе экран u    для zERR-0069u:   Не удалось импортировать экран zERR-0068r  r  r  )ru  r  r  r  r  r  r  r   )r  r  r  Zcrud_choicer*   ri   logic_typesr   u+   : Схема экранов проекта r   r   r*   r  r\  )rI   r*   r   r   rG   r  r  r   r   r   rI  ZCmfUiFormSchemeRuler   r  r  r1   r   ra  r,   r  r   r_  r  r  r  r-   )r   r  Zscreen_scheme_dataZscreen_scheme_idr   r  rZ  r  Zissue_type_datar  r  r  rL  rY  rW  r  Zaction_mappingr  r  r   r   r   r  k  s    





z$JiraAPIImport._process_screen_schemec                 C   s  i }t  }|ds|S dd tj D }|d  D ]}|d dsLq8|d dd}|d| jj	j	j
  7 }||krq8| jtjj d	 D ]}|d
sq|d |d
 d kr|d  D ]\\}}	|	dsq| }
|	|
d< ||i }|
||
d < |	d r|di }|
||
d < qqq8| D ]\}}d}| jj	j	j
 d|d  }|d  d|d  }|dkrd| jj	j	j
 d| d}tjjddd| dgd}|s| jjd| ddd q,|d| 7 }|d|d  7 }n|d7 }tjj|dgd}|s.tj||d| jd }|jdd! |||f | D ]h\}}
|
d }	| jj	j	j
 d| }tjj|d"d#d$gd}tjj||d%}|stj||| jd&}|	d'd(|_|	d)d( |_|jd*kr|jjpi }t |jjpt  }i }t  }|	d+i  D ]N}tj|d, d-d.d/}|d, ||< |d0 rH|| ||kr|| q| | ||_t!||_||_t!||_|  |j"r|jdd! t#  qDq,|S )1u1    Импорт конфигураций полейr  c                 S   s   i | ]}|d  |qS r  r   r  r   r   r   r    s      z5JiraAPIImport._process_field_conf.<locals>.<dictcomp>r   r  rw  rx  r=  ri   r   r  r  r  Nr   r   5   : Конфигурация полей проекта r   r   rv  rw  r   r  r}  CmfCustFieldConfSchemers  u    для типа     по умолчаниюr   r  Tr  r   rz  r2  r  )ru  r   )ru  r   r*   r  Fr  r|  r  r   rM  r  r  r  )$r  rI   rG   r   r|   rl   rU  rJ  r*   r   r   r5  r   r   r   r  r  r  r1   r6  r   r  rq  r8  ry  Zvisiblerz  r2  r   r  r  r  r  r   r  r-   )r   r  Zlogic_type_fieldslogic_type_field_confr  r  r{   Z
task_fieldr  r  rm   ri   r  r  r   r  r  Zfield_idZfield_ext_idru  r  r  r  r2  r  r
  r  r   r   r   _process_field_conf  s    



	





z!JiraAPIImport._process_field_confuA   Обработка схемы конфигурации полейc                 C   s  | j jjj d|d  }tjj|dgd}|sbtj|d  d|d  || j dd	}|jdd
 tjj|dgd}|stj|d  d|d  d|d| j d}|jdd
 | |}|	d |f |j
rntjj|dD ]}|jdd qt }|D ]V\}}	|	|	 ||	|r|gng d| j d}
|s4d|
d< tjf |
}|jdd
 q|D ]}	|	  |	jdd
 qR|  || _|S )Nr   r   r   r  r   u@   : Схема конфигурации полей проекта r   Tr  r   r  r  r  r  r  )r   r  r  r  r*   r)   r  )r*   r   r   rG   r  rI   r   r6  r  r  r  ZCmfCustFieldConfSchemeRuler   r  r  Z
calc_cacher  r7  )r   r  r   r7  r  r  r  Zfield_confsr  Z
field_confr  r   r   r   r  n  sV    

z(JiraAPIImport._process_field_conf_schemec                 C   s  |    |  j|  7  _| j  |   |   |   |   |   |   |   | 	  |   | 
  |   |   | jjr|   |   |   |   |   | j| jjjddd | j| jjjddd |   |   | jjjddr"|  j| j 7  _n| jjd | j r@d S d| j_| j  t  |  D ]>}|d d	d
 | j D krq`| jj!d|d  d q`| j"d| jj#  | j S )NZprocess_task_linksTr  Zimport_filtersZprocess_linksu2   Отключена обработка ссылокrV  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-   Импортировано объектов: )$r[  r0   rp  r=   r(  r  r  r  r  r  r  r  rF   r  r  r  r  r*   r   r   rI   r  r  r  Zprocess_cross_linksrS   r  r,   rQ  r   r-   r   rQ   rT  r+   r  )r   r   r   r   r   process_import  sV    

zJiraAPIImport.process_import)T)r   r   )TTN)NN)NN)T)N)N)T)F)r   r  F)NN)NN)N)Nr6  r7  )r#   r$   r%   r&   r  r(   r   r'   r   r   rD   propertyrd   rk   rn   ry   staticmethodr   r   r   r}   rU   r   r   r   r   r   r   r   r   r   r:   r  r#  r=  r4  r   rc  r  r  r  r  rG   r  r  r  r%  rM  re  r  r  r  r  r  rh  r  r  r   r  r  r  r  r6  r   r   r>  r@  rK  rQ  rW  r\  rk  rm  rr  rv  rx  r{  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r   r   r  r  r  r  r  r!  r.  r  r  r  r   r  r  r  r  r  rZ  rF  rl  r   rL   r  r  r  r  r  r   r  r  r,  r3  r5  r@  rU  r[  r  r  ro  rp  r  r  r  ra  r  r  r  r  __classcell__r   r   rW   r   r;   A   s  
	
	!

	#> 


JV4 u
#

 2 W  <8  G


 A B@
.
  o
{8}

'
'# l
  ?
5
:

 
[
b#<7C=    Q" 	   3 U% A F  Ex 4r;   )3Zcmf.appr   Zcmf.includeZcmf.utilr   Zdataclassesr  r  rG  r>  rB  rY  r\  pathlibr   re   rV  typingr   r   r   r	   r
   r   r   Zbs4r   	itertoolsr   textwrapr   r   Z
cmf.modelsr   Z%common.models.cmf_plugin_import_mixinr   Zmodules.jira.apir   Zmodules.jira.base_importr   Zmodules.jira.jql.parserr   rG   r   r   r   r   Z	dataclassr   r:   r;   r   r   r   r   <module>   s6   $ 