U
    g                    @   sX  d dl mZ d dlT 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mZ d dlZd dlmZmZmZmZmZmZmZ d dlmZ d dlmZ d d	lmZ 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)*N)Path)TemporaryDirectory)DictOptionalListCallableUnionTypeIterator)BeautifulSoup)permutations)cached_property)commit_all_dsinit_ds)	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   zD| j d  | j  r$W dS  | f||}| j j  |W S  tk
r   | j j  |  jd7  _| j d  Y dS X d S )Nz================== r      u   Ошибка )	
cmf_importlog	is_canceldpcommit	Exceptionrollback
has_errors	log_error)objargskwargsres)funcr   r   r    wrapper.   s    
z3catch_exception.<locals>.decorator.<locals>.wrapperr   )r8   r9   r   )r8   r    	decorator-   s    z"catch_exception.<locals>.decoratorr   )r   r;   r   r:   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dee$d9d:d;Z%dd<d=Z&ed>d?d@ Z'edAdBdC Z(edDdEdF Z)e*j+ddGdHZ,dIdJ Z-dKdL Z.dMdN Z/edOdPdQ Z0edRdSdT Z1edUdVdW Z2eedXdYdZZ3d[d\ Z4d]d^ Z5ed_d`da Z6ed_dbdc Z7edddedf Z8edgdhdi Z9djdk Z:d dldmZ;e<dndodpZ=e<dndqdrZ>edsedtdudvZ?dwdx Z@edyedtdzd{ZAed|d}d~ ZBdd ZCeddd ZDdd ZEedd!ddZFeddd ZGeddd ZHededddZIeddd ZJeddd ZKeddd ZLeddd ZMeddd ZNeddd ZOdd ZPededddZQedddZRdd ZSdd ZTdd ZUdd ZVdd ZWdd ZXdd ZYdd ZZdd Z[dd Z\dd Z]d"ddƄZ^ddȄ Z_ddʄ Z`dd̄ Zadd΄ ZbedtddЄZcedtdd҄ZdedtddԄZeedtddքZfedtdd؄Zgddڄ Zhdd܄ Ziddބ Zjed߃ee<edddZkdd Zldd ZmeendddZod#eedddZpd$eeeedddZqd%ddZrdd Zsed&eeeedddZtdd Zudd Zvdd Zwdd  Zxdd Zydd Zzdd Z{dd Z|d	d
 Z}e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;   Класс загрузки объектов через APIr2   _JiraAPIImport__jira_fieldsN)jirareturnc                    s   t  j|| || _d| _| j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conncloudmodelsCmfActivitygetdefault_activitycloud_id_get_jira_global_settingsjira_global_settingsZepicsissue_relationssubtasksboardsselected_projectsr2   loggingZ	getLoggerr+   loggerZhandlersZsetLevellevel_prepare_multiprocessingr>   update_fields)r   r?   r5   r6   rV   	__class__r   r    rF   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existsrY   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   r\   zfields.json.r]   )shutilr>   r+   r^   r_   osgetpidra   rb   rd   move)r   fieldsrh   re   file_path_tmprf   r   r   r    update_jira_fieldsn   s    z JiraAPIImport.update_jira_fieldsc                 C   s(   | j  D ]}|d |kr
|  S q
d S )Nr   )rg   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rL   rf   
field_typer   r    <lambda>       z2JiraAPIImport._get_field_by_type.<locals>.<lambda>)nextfilterrg   ro   )r   rw   rp   r   rv   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)r}   r~   r7   r   r   r    _get_field_name   s    zJiraAPIImport._get_field_namec                 C   s   dd l }dd l}dd l}dd l}|| _ || _tj| _tj| _|	 d | _
| jjd| j
d  ddd tjr~ttj| j
| _
| jjdtj dd | j}| jjdt|d	  d
dd tt|d | j
| _
| j
stdd S )Nr   r*   z
cpu_count=u%   , надо не менее 2 ядерT)	anonymouszconfig.IMPORT_PROCESS=zavailable_memory=i   @u-   Гб, по 2 Гигабайта на ядроl        u   Ресурсов системы недостаточно для импорта, обратитесь в техподдержку для дополнительной информации.)	threadingqueuemultiprocessingpsutilconfigZIMPORT_THREADSZthreading_max_forksZIMPORT_DOWNLOAD_THREADSdownload_threading_max_forks	cpu_countmax_processesr+   r,   ZIMPORT_PROCESSminZvirtual_memoryZ	availableintr0   )r   r   r   r   r   Zavailable_memoryr   r   r    rX      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)rg   itemsrL   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lenrg   rL   )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dictrL   listr   r(   join)r4   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_funcr}   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   rl   )r   r   r   r   r   verbose_name)r   r   r}   r4   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   .0r4   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_usersloginr0   rY   r   rJ   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   rl   r   r   r~   r   r   captionr   )Z_normalize_settingsr+   json_settingsr?   r   	enumeraterJ   r   r   r   _normalize_jira_valuer   )r   settingsr   issueZnumr   r   r   r   r    previewK  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   rL   )r   r4   r   Znormalized_objr   r   r   r   r    _normalize_objZ  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r{   ::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   rL   r   rJ   	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_listf  s*    


zJiraAPIImport._process_listu8   Обработка наблюдателей задачиc                 C   s   d|d  d|d d  d}|  |D ]r}| jjjrJ| j|d |d}n| j|d |d}|sntd	| ||jks(||jks(||jkrq(|j	
| q(t  d
S )u;   Добавляем наблюдателей в задачуu$   Наблюдатели задачи r   : "rl   r   "rA   r4   uI   _process_watchers: Не найден наблюдатель задачи N)_get_issue_watchersr?   rH   rI   _get_personCmfErrorresponsibler   	cmf_owner
spectatorsr   commit_with_event)r   	issue_objr   r4   watcherpersonr   r   r    _process_watchers  s    
zJiraAPIImport._process_watchersu#   Обработка вложенийc                 C   s6  ddl m} dd l}d|d  d|d d  d}t|d	  d
}d}| r8||}| D ]}	zz*|		drW W qh|d d D ]}
|
d |	kr qqt
j|	}t
jj||ddddgd}|st
j| j|d|d}|jr|
r(|
dr| j|
d | j |d|_|
d |_||	d}|jdd || |jdd |
r|j|
d kstd|j d|
d  d|j  W 5 Q R X W nx tk
r   | jjd|	 dd |d |j  |d!7 }Y n8   | jjd"|	 d#|d | jj  |d!7 }Y nX W 5 | jdd X qhW 5 Q R X | |D ]}zzt
j|d$ }t
jj||d%}|st
j| j|d|d}|jr|jdd |  t |d& |j! t
j"jj#$ }|%|j&}|'  |j  W n8   | jjd"|	 d#|d | jj  |d!7 }Y nX W 5 | jdd X qB|S )'Nr   )RDisku   Вложения задачи r   r  rl   r   r  
issue_pathz /attachments/all_attachments.zip
attachment	processed/filenameimport_originalurlZurl_preview_imgZurl_previewr   r   rl   T)r+   r   r  r   r   r  r   r   sizeu   Текущий размер z != u    из метыu7   Обранужена проблема вложения uI   , размер файла не совпадает с метой из JIRAzERR-0034r*   :   Не удалось обработать вложение zERR-0035	file_namer   r   re   )(Zrdisk.rdiskr  zipfiler   r`   ZipFileZnamelistr+   inc_statendswithrJ   CmfDocument_get_filenameCmfAttachmentrL   r  r	  rG   r   r   ra   r  Zupload_stream_filest_sizeAssertionErrorr.   r/   r3   r1   _get_issue_attachmentsZ
upload_dirrh   copyZfull_path_fileZCmfRFileZdata_driverZget_rdZ	get_rfileZ
_file_namemake_preview)r   r  
jira_issuer  r   r4   Zall_attach_zip_patherrorsZmyzipZzip_attach_nameattach_infoZattach_namer  Zattach_fattachment_infordiskZrfiler   r   r    _process_attachments  s    






, 
   z"JiraAPIImport._process_attachmentsuB   Обработка упоминаний пользователей)r   r@   c                 C   sv  ddl m}m} |jdkr d}nd}|s,dS t|d}|jdd	id
D ]$}z|jdrl| |jd }np|jdr| |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 qF tk
rj } z0|  jd7  _| jjd| d| d|d W 5 d}~X Y qFX qFt|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>
            Nhtml.parserclass
user-hoverattrsdata-account-iddata-usernamehrefr   u[   Не найдены атрибуты для определения пользователя)Z	person_idZperson_loginZperson_hrefZperson_namer*   uR   Ошибка конвертации упоминания пользователя : zERR-0036r  )urllib.parser2  r3  
class_namer   find_allr8  rL   r	  query_get_user_info_from_dumplowerrG   r0   formatr(   r   r   r;  r   Zreplace_withZ
currentTagr2   r+   r3   )r   r4   r   r2  r3  ZTMPLdoc_souptagr  
parsed_urlr@  	user_infonew_tager   r   r    _process_mentions  sJ    



	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 q<td| d S )N:user:r   r   r   r   uQ   Не нашли информацию по пользователю в дампе )APPREDIS_DBredisrL   r+   r   pickleloadsr   rG   rB  r0   )r   user_idredis_dbrG  r   r   r    rA  7  s    

z&JiraAPIImport._get_user_info_from_dumpu#   Конвертация ссылок)r   r   c                    s  |s|S t |}|dd D ]x}|jdrF| jjd|  q|drv|jd drv| jjd|  q| jjd|  |dr|jd }n
|jd	 }t	j
|d
d dd }tdt	j
|dd }	|	r(|	d  |d d }
tt fdd|
d }|r(|d }tj|}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t|S )!Nc                 S   s   |  dp|  dS Nr;  srchas_attrrE  r   r   r    rx   K  ry   z.JiraAPIImport._process_links.<locals>.<lambda>Zcmf_convertedu   Уже обработали r;  #u   Это якорь u&   Обрабатываем ссылку rT  r  ?r   (/attachment(?:/content)?/(\d+)(?:/)?(.*)r*   rl   r  c                    s   |  d kS Nr   rt   itemZ	attach_idr   r    rx   ^  ry   r  r  )r   rl   r   Zsrc_origTZvideoZcontrolsz100%widthZheightZ	href_origu   Заменили на z/people/r   )r   r?  r8  rL   r+   rV   inforV  
startswithurllibparseunquoter   researchrz   r{   rJ   r$  r%  r&  sgetr  	mimetypes
guess_typer   r	  r;  r(   )r   r   r   r,  r+  Z	text_souprE  r  r  	url_matchattachmentsattachZ
attach_obj	mime_type
account_idr  r   r_  r    _process_linksF  sd    

 
 





zJiraAPIImport._process_linksc              	   C   s0  |rd| dnd}| j jd|  | jjjrV|d dkrV| j jd|d   | || jt	j
j d }d	| j jjj d	|| j  d	}|d
 dd}d}	|D ]}
t|
|	krt|
}	qtt	j
jjt	j
jjt	j
jj}|	|krzt|dkr|d |d< d|d< d|d< nbt|dkrF|d |d< |d |d< d|d< n2t|dkr|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|rT| 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(d) |sd*dd+d,| j jjj d-gdd.d gg}t	j
jd/d0|d1 g|g|d}|st	j
jd1d0|d1 g|g|d}t|dkr>| j jd2|d1  d3t| d| d4dd |  jd7  _g }|sJ| j jd5|d1  d|  d
d0|d
 g|g}t	j
j||d}|sJd*g}t |t|D ]}t|dkrdd0|d g}nnt|dkr|!dd0|d gdd0|d gg n<t|dkr|!dd0|d gdd0|d gdd0|d gg q||g}t	j
j||d}t|dkr|  jd7  _| j jd6|d
  d7|d1  d8t| d| d4dd |r|d }n*| j "d9|d
  d7|d1  d:| t#j$ d;}|sz|rrd"}d}|d1 }t	j
jd/d0|% g|dr\| j "d<| d=t#j& |d1 d>\}}| d?| d>| }|d7 }qt	j
||| j d"d@}nd |fS |r(|j'r|D ]}t(||||  q|jr||jkr|j | |_n||_t	j)* }t	j)+ }|j,!| |j,!| d"|_-|dA dB D ]}| jjjr2d	|dC  d	}nd	|d
  d	}d	| j jjj | }t	j)jddd| dgdgd}|st	j)jd
d.|d
 gdgd}|st	j)|| j d"|d
 |dD}|j'r|d
 |_.|js||_n||jkr|j | |_|jd"d# |j,!| q|j/r(|jd"d# ||fS )EN()r   u0   Импортируем пользователя ZaccountTypeZ	atlassianu   Неизвестный тип rl   r   r       r   r*   	last_name
first_namesecond_name   u?   Часть полного имени пользователя "u   " длиннее u_    символов. Фамилия, Имя и Отчество не были заполнены.zERR-0110r   obj_typer   rg_member_ofr   LIKE%r{   rl   u    ext_id пользователя N    содержит несколько ID из одного источника: z::.+?::Tr   uP   Возможно найден некорректный пользователь ud   ,так как ext_id содержит несколько ID из одного источника: 'uq   '.Необходимо повторно импортировать локальных пользователей.zERR-0004r   )
error_coderz  ORzNOT LIKE%::::%r   r   ILIKEr   u+   Пользователей с почтой z > zERR-0037uH   Не удалось найти пользователя с почтой u+   Пользователей с именем  (z) > uM   Не нашли пользователя среди существующих ) FuQ   Обнаружена учетная запись с дублирующим email u   , добавляем цифру@+)r   r   r+   r  groupsr   groupId)r   r+   r  r   import_raw_json)0r+   rV   ra  r?   rH   rI   warningr   r   rJ   r   r   r   r   rG   r   r   r   rv  Z
max_lengthru  rw  r2   r3   rL   r   r   countrf  subr  r   r   r   r,   rU   INFOrB  WARNINGr  setattrCmfPersonGroup
jira_group
user_groupr{  Z
user_localr   
is_changed)r   r   createupdater4   Zobj_msgZ	user_dictr   Z	full_nameZcurrent_length_namer   Zmax_length_namerl   r  Znot_source_hash_filterZpersonsr  Z
name_combo
is_creatednr   Zprefix_emaildomainr   r  r  Z
group_infogroupr   r   r    _process_person  sh    



*" 
&
 

   
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 |j  | j jd7  _W q
   |  jd7  _| jjd| ddd Y q
X q
d S )Nr  r   r   r   r|  r}  r   r~  r  T)r   r   r+   r  r  r   r*   u4   Не удалось загрузить группу ERR-0038r  ry  )r   r+   r-   r   r   rJ   r  rL   r  r   r   r  r.   r/   imported_object_countr2   r3   )r   Z
group_datar   r  r   r   r    _process_groupsV  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 ]}z^| j 	 rPW  d S | 
|\}}| j  jd7  _|jr|js|jds|r||jj W q8   |  jd7  _| j jd| d	d
d Y q8X q8|r| j jjddrttjjt|gd d S )N
load_usersTuA   Не грузим пользователей из-за опцийrW   r   r*   z.evateam.ruu@   Не удалось загрузить пользователя r  r   ry  Zsend_invites)r5   )r+   r   r   rL   r,   rU   r  setr   r-   r  r  r   r   r#  addr2   r3   Zschedule_deferred_jobrJ   r   Zregister_personsr   )r   Znew_user_emailsr   r  r  r   r   r    _process_usersy  s,    
 zJiraAPIImport._process_usersu#   Обработка статусовc                 C   s   |  dD ]}| j r dS | jjjr2|d }n|d d }| jjjj d|d  }tj	j
|d}|sdd|d gd	ddgg}tj	j
|d
}|stj	|d | jd}||_t||_|d |_|jdd | jj  | j jd7  _q
dS )uc   
        Грузим статусы из Jira и сопостовляем с нашими
        statusesNstatusCategoryr   r   r   r   r   r   r   )r   r+   Tr   r*   )r   r+   r-   r?   rH   rI   r   r   rJ   CmfStatusCoderL   r   r   get_status_typestatus_typer   r  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:defaultrC   r   r   =r   Ttemplater   r+   r  r   r<  r   r   r   r   ZassociatedWithr   
issueTypeshierarchyLevelrY  :r  workflowr   r  r~  !=forcetransitionstype)r  r   )r  r   r+   c                    s(   g | ] }| d r  d|d   qS )ZfromStatusReferencer   rt   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_deleter|  r}  r   )r  
logic_typetarget_workflowr+   cmf_model_name)_get_issue_types_for_projectrJ   CmfWorkflowrL   !_get_simplified_project_workflowsr+   r   r   r  r   r   r  r  _create_status	CmfStatusr   r  deleter   rB  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  Zworkflow_scheme_dataZ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   rJ   r  rL   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  =  sH    "

zJiraAPIImport._create_statusc           2         s  ddl m} dd l}i }d }d }i }t|d d}tjjdd}	|d d }
|
D ]}||d	 }| j	j
j
j d
| }tjjdd|gd}|stj||	| j	d}|d	 |_|dd|_|jdd |s|dr|}|d }| j|d dD ]}|d |kr
q|s |dr |}||ks@|drf||krfd| j	j
j
j d|d  d}|||< |d D ]*}|d d |d< | ||||d < qnqt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#}| s4td$|j d%t|d&}| }W 5 Q R X t|d'}|sjtd(t  i }|d)D ]}|jd	d*id+jdd,}||  |d < |d-D ]}|d }|jd.kr|jd/|d0}|s| j	jd1|j d2| d3|d4 q|jd	d5id+}| |||d	 |r6|jdd,ndg |d6d d7 d8}|d9 !|d  |jd	d:id+}|r|jdd,|d;< qq~ std<t"  d=t"| d>|d?D ]}|d6d d7 }  | }!|!rd|!_#|!jdd@ |d }|jd	d5id+}||d	 |r*|jdd,ndg | d8}|jd	d:id+}|r\|jdd,|d;< |||< q| j	$dAt"| dBt%j& |' D ]H}"| j	j
j
j d|j( }#|# d|"d  }$tj)j|$|dC}%|%stj)||$| j	ddD}%|%j*s| j	j+,dE|%j dF|j dG q|"d	 |%_|"d |%_ fdHdI|"d9 D |%_- |"dJ  |%_.|"d;r|"d; t/t0fdKdL| 1dMd }&z| 2|&|%_3W n8   | j	jdN dO|%j dP|j dQdRdS|dT Y nX |%jdd qW qT tk
r }' z$| j	jdU|j dV|' dW|d4 W 5 d }'~'X Y qTX qT| j	j
j
j d|d d  }(tj4j|(dX})|d dY }*|)stj4jdZd}+tj4|+|(| j	dd[})|)j*rH|*d	 |)_|*dd|)_||)_5||)_6g },|d d }|D ]j}d| j	j
j
j d|d  d}tj7jdd\d]| d]gd}-|,!|- |d^ r|-|)_8|d_ r|-|)_9q|,|)_:|*|)_;|)jdd n| j	j+,d`|)j da g }.|< D ]0\}/}tj7jdd\d]|/ d]gd}-tj=jdbd|-gdcd|)ggd}0|0r|0j*s| j	j+,dd|)j de|0j> df|-j dg |.!|0j> ql|0s~tj=jdbd|-gdcd|)gdhddgdid d ggddj}0|0rj| j	j+,dd|)j de|0j> df|-j dk |.!|0j> qltj=dl|-|)| j	dm}0||0_?|0jdd |.!|0j> qltj=jdndo|.gdcd|)gdid d ggddj}1|1D ]}0|0jddp qt@  |)S )qNr   )cmf_hashlibproject_dir	workflowsr  rC   jira_workflow_schememappingsr   r  r   r  r   r   r  r+   r   r   Tr   defaultr  r   r  subtaskr   r  r  r   r  r   r  r~  r  r  	workflow_.xmlu,   XML файл бизнес-процесса 'u   ' не найденrxmlur   Не удалось получить список переходов между статусами в виде XMLzsteps > stepzjira.status.idr7  )stripz)actions > action, actions > common-actionzcommon-actionactionr  u7   В XML разметке бизнес-процесса 'u%   ' не найден common-action ID zERR-0121r  zjira.descriptionzresults > unconditional-resultstep)r   r   r   fromtor  zjira.fieldscreen.idZfieldscreenu   Из XML получено u    статусов и u'    переходов между нимиzglobal-actions > actionr  u   Настраиваем u1    переходов между статусамиr   r  r  r   r+   r     Переход '$   ' в бизнес-процессе ';   ' был изменен и не будет обновленc                    s   g | ]} | qS r   r   )r   r  )
jira_stepsr   r    r     s   z4JiraAPIImport._process_wf_scheme.<locals>.<listcomp>r  c                    s   t | dt  kS r\  r(   rL   screen	screen_idr   r    rx     ry   z2JiraAPIImport._process_wf_scheme.<locals>.<lambda>screens7   Не удалось установить экран ID     для перехода '!   ' бизнес-процесса ''ERR-0122	CmfUiFormrz  r4   u   Не удалось импортировать переходы между статусами для бизнес-процесса «u   »: ERR-0067r  ra  r  r  r|  r}  ZdefaultIssueTypeZsubTask*   Схема бизнес-процесса '[   ' была изменена после импорта и не будет обновленаr  r  -   В схеме бизнес-процесса '   ' правило )    для логического типа 'j   ' было изменено или добавлено вручную и не будет обновленоcmf_deletedr+   r{   include_deletedV   ' было удалено вручную и не будет восстановленоr   r  r  r  r+   rD   NOT INr  )AZcmf.utilr  requestsr   r_   rJ   r  rL   Zshort_str_encr+   r   r   r   r   r  _get_statuses_for_projectr  r  r   r  r  r`   FileNotFoundErrorra   readr   r0   r   selectfindZget_textr3   
setdefaultr   r   r  r,   rU   r  ro   r   r  r  rV   r  r  r  rz   r{   r   _process_screencmf_ui_formr  r  r  r  Zdefault_task_logic_typeZdefault_subtask_logic_typestrict_task_logic_typer  r   r  rD   r  
cmf_commit)2r   project_infor  r'  r  Zdefault_wf_for_taskZdefault_wf_for_subtaskZall_statusesworkflows_dirr  r  r  Zworkflow_name_hashr  r  r  r  r  jira_statusr   workflow_filerf   workflow_xmlr  Zjira_transitionsr  Zjira_status_idr  Z	action_idZaction_descriptionZtransition_dataZaction_screen_idZaction_stepr  jira_transitionr  r  r  screen_datarI  r   	wf_schemeZwf_scheme_infor  r0  r  current_rulesr  r  rules_for_deletionr   )r  r  r    _process_wf_schemeo  s   


 








 




	z JiraAPIImport._process_wf_schemec              	   C   sV   d}t dd4 | 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-   rL   _process_issueput)r   Zissue_queueZissue_queue_errorsr-  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}z\dddd| dgdd|gddd| dgg}t
jj|d}|st
j|d}|jdd W qh tk
r$ }	 ztd| d|	  W 5 d }	~	X Y qhX qhd S )Nr   )translitr   r   rl   labelsrs  _rX  r   ruT)Zlanguage_codereversedr  aliasr  r  z"%r   r   r:   r   u*   Не удалось создать тег r<  )ZtransliteraterB  r  r   _count_project_tasksr+   r-   rL   unionreplacerJ   ZCmfTagr  r0   rU   r  )
r   r2  rB  tagsr   Ztag_nameZ
name_aliasr  Ztag_objrI  r   r   r    _process_tags  s,     
zJiraAPIImport._process_tagsu)   Обработка приоритетовc           
      C   s   | j jjj d|d  }tjjdd| dgd}d}dd	d
dddd}| dD ]F}|d |d krjqT|d D ]"}|d |krqr|d ||d < qr qqT|D ]@}tjjd|d}	|	stjddd|| j d}	||	_	|	j
dd qd S )Nr   r   r   r  r}  r   )ZLowestZLowZMediumZHighZHighestu   Отложено   Минимальныйu   Самый низкийu   Низший   Низкийu   Средний   Обычный   Высокийu   Высшийu   Наивысший   Критичныйu   КритическийrM  rN  rO  rP  rQ  u   Блокирующий)rY  r   r*   rt  rx  priority_schemesr   ZprojectKeys
prioritiesr   r   r  u   Приоритет)r   r   Zorig_captionr   r+   Tr   )r+   r   r   rJ   CmfCustFieldConfr   r   CmfCustFieldConfFieldrL   choicesr  )
r   r2  cust_field_conf_ext_idZcust_field_confsZpriority_namesrW  Zpriority_schemer   cust_field_confcust_field_conf_fieldr   r   r    _process_priorities  s<    	z!JiraAPIImport._process_prioritiesu5   Обработка решений(резолюций)c                 C   s   |  dD ]}| j r d S | jjjj d|d  }tjj|d}|s^tj|| j|dd}|jr|d |_	|d |_
|jdd	 | j jd
7  _q
t  d S )Nresolutionsr   r   r  T)r   r+   r  r  r   r   r   r*   )r   r+   r-   r   r   rJ   CmfResolutionrL   r  r   r   r  r  r1  )r   
resolutionresolution_ext_idZresolution_objr   r   r    _process_resolutions  s$    


z"JiraAPIImport._process_resolutions)project_structr2  c                 C   sV  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rD| j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rR| jjjrtd|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rd|_.d|_/d|_0d|_1d|_2|j
d
d  | 3| | 4| | j5 rd S t6  | 7| | $  | 8| | j j9d57  _9| $  |S )8Nr   r   r  r   r~  r  rr  u   Проект с именем u8    уже существует! Переименуем в TZtask_allow_multiple_sprintsFZsl_only_owner_approveZsl_deny_no_approveZsl_task_only_owner_closeui_form_schemer|  r}  )r+   r   r   r  	isPrivateprivateu"   Настройки проекта u    были изменены пользователем. Изменения из импорта не будут примененыr   r  r   r   r  r   )r   r+   r  r   r   )r   project_role)r   rf  r+   actorsr  atlassian-user-role-actorrG  rA   uX   Не удалось найти и добавить пользователя в роль u    проекта: r   zERR-0039r  uR   Не удалось привязать пользователя к проекту zatlassian-group-role-actorZ
actorGroupr  r  u<   Не найдена группа пользователей u#    для проектной ролиzERR-0040r*   u&   Неизвестный тип ролиr2  ):rJ   
CmfProjectrL   r  r   r   r+   rV   r  r   r  _process_screen_schemekeysis_newr  r  Zperm_policyr   r   r  _get_project_rolesr   r   CmfProjectRoler   ZCmfProjectRoleAssignmembersr?   rH   rI   r	  r3   r   r  r2   r0   _calc_progress_process_versions_process_componentsrL  _process_permissionsZproject_perm_scheme_process_security_levelssecurity_level_scheme_process_field_conf_schemecust_field_conf_schemeZ
show_listsZ	show_blogZ
show_pfeedZ	show_diskZ	show_chatr[  _process_tasksr-   r  _process_boards_process_sprintsr  )r   ra  r2  project_objrm  r   r   	role_infor   roleZrole_assignactorr   Z	sub_groupr   r   r    _process_project  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
tj dgddtddtddd}| jd|j	  | j
  |S )Nr   /usr/bin/python3	manage.pyshellz&plugin = models.CmfPluginJira.get(id="z(");retcode = plugin.process_issue_fork("", "r   ", , );T"/var/log/eva-import-subprocess.loga+&/var/log/eva-import-subprocess.err.logZ	close_fdsZstart_new_sessionstdoutstderr   Запустили )
subprocessPopenr+   r   r   r   IMPORT_OBJ_CNTra   r,   pid
log_detail)r   r2  doner  procr   r   r    _execute_task  s    
2  
zJiraAPIImport._execute_taskc           	      C   s  | j jd| j  d}| |d }g }t| jD ]0}| ||}|tj7 }|	| ||kr6 qhq6||k rt
d t|D ]L}| }|d k	r|  j|7  _|| | ||}|tj7 }|	| qqht|D ]"}|  |jr|  j|j7  _q| j jd d S )NuD   Грузим задачи в несколько процессов: r   r   r*   u0   Закончили обработку задач)r+   rV   ra  r   rH  ranger  r   r  r   timesleepr   pollr2   removecommunicate
returncode)	r   r2  r  Ztask_cntprocessrD  r  r  new_procr   r   r    ry    s2    




zJiraAPIImport._process_tasksu#   Обработка проектовc              
   C   s  t jjddjj}|  D ]}zv|d dd | jD kr@W qd }| j r\t	  W  d S |di }|r~| 
|| 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| jjjj d|d  |d< |d |jj|d ||d ||d |d}|d }|rZ| |}	|	|d< n0| jjjj d|d d  }
t jj|
d|d< | ||}W q tk
r   t  |  jd7  _| jjd| dd d! Y qX qd S )"NrB   rC   r   c                 S   s   g | ]}|d  qS r  r   r   r   r   r    r     s     z3JiraAPIImport._process_projects.<locals>.<listcomp>leaddefault_import_jira@evateam.comdefault_import_jirar   r   projectTypeKeybusinessproject.base:defaultsoftwareproject.agile:defaultservice_deskproject.servicedesk:defaultu$   ERROR! Проекты с типом 3    временно не поддерживаютсяr   r   r   r   r   r   r  r   activityZtask_code_prefixr  r   r  
simplifiedr  r  r  r*   <   Не удалось импортировать проект ERR-0041rj  ry  )rJ   rK   rL   r   r   r   rT   r+   r-   r  r	  rG   r  r0   r   r   r  r  r  Zrollback_purge_eventr2   r3   )r   r  r2  r|  project_leadr  r  ra  Zproject_simplifiedschemer   r   r   r    _process_projects  s`    


 zJiraAPIImport._process_projectsc              
   C   s  d }t jjddjj}|  D ]r}z(| j r:W  d S |d dd | jD krVW q| jj	j	j
 d|d  |d< |di }|r| || 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|d ||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 )NrB   rC   r   c                 S   s   g | ]}|d  qS r  r   r   r   r   r    r     s     z7JiraAPIImport._process_projects_box.<locals>.<listcomp>r   r   r  r  r  r  r  r  r  r  r  r  r  u$   ERROR! Поректы с типом r  r   r   r   r  r  r*   r  r  rj  ry  )rJ   rK   rL   r   r   r   r+   r-   rT   r   r   r	  rG   r  r0   r<  r  r  r2   r3   )r   r|  r  r2  r  r  r  ra  r   r   r    _process_projects_box  sT    
 z#JiraAPIImport._process_projects_boxu   Обработка досок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 ]f}z.| 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#gd$}|sVt j| j|dd%}|jrx||_||_|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r2||_||_|jdd& n"| jj	d-| d(| d| d. || qg }|
d/ d0 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 |_||_|jdd& n"| jj	d1| d(| d| d) || q|| jjjj d!| |d< t jj|d d2d3d4d5d6d7d8d#gd$}|st j|d | jdd9}|jr|d |_||_||_||d: |_||_||_||_||d; d	|_||
d< d|_|d |_|jdd& t  n"| jj	d=| d(| d|	 d. ttd>d? |
d@ dA d}ttdBd? |
d@ dA ddd, d}|rxdC|dD< |rdE|dD< d} t jj |dFd#gdG}!|!D ]X}"|"jj!pi }#|#dH}$|"jr|$r|$|"j"kr| jj	dI| dJ dK}  qqg }%dL}$|
d@ dA D ]J}&z|&d }'|&d }(| jjjj d!|' })t jjddM|)ggd#gddN}"|"st j||)| jddO}"|"jdd& |%|"j# |"j$r| jj	dP|" d(|' d|( dQ W q|"jj!pi }#|"jr|(|"_|&dR |"_%|&dS |"_&g }*|&dT D ]l}+| jjjj d!|+d  },t j'j|,dU}-|-sZ| jj(dV|" d(|' d|( dW|+ dX|dY q|*|- q|*|"_)|&dZ rd[|"_*n |&dT sd\|"_*n|&dDd]|"_*|#+|& n"| jj	dP|" d(|' d|( d. | r|$|"_"|"j"|#dH< |#|"_|"jdd& t  |$dL7 }$W nR t,k
rX }. z2|"j-.  | jj(d^|' d|( d|. d_|dY W 5 d}.~.X Y nX qt jj d`da|%gd2dM|gdFdbdggddc}/|/D ]}&|&j/ddd q|/r| jj	de|/  t  | j j0df7  _0W q   | jj-.  | jj(dg| dh|dY Y qX qdS )iz
        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)rs   ZparentChildassigneeepicr   Znonez1 -1wz2 -2wz3 -4wz6 none)z-1wz-2wz-4wZNONEr   r|  r}  r   u
   Доскиtree_node_is_branchr  N)r   r   r   r   r+   Tr   r   u!   Обработка доски ID r<  ra  r   r{   r   r  r  r   rl   )r+   r   r  r   u   Основной фильтр z (ID u;   ) был изменен и не будет обновленZswimlanesConfigZ	swimlanesrY  u   Дорожка 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    rx     ry   z/JiraAPIImport._process_boards.<locals>.<lambda>ZrapidListConfigZmappedColumnsc                 S   s   | d o| d  S r  r   r  r   r   r    rx     ry   z#00875ar  z#42526er+   r   rl   ordernou.   Порядок колонок на доске up    был изменен и не будет обновлен. Упорядочите колонки вручнуюF  r  )r{   rl   r#  r   r   r+   r  u   Колонка uG   ) была удалена и не будет восстановленаr   maxr  r  u   Для колонки u!   ) не найден статус zERR-0124r  r  r  z#6b778cz#0052ccu5   Не удалось создать колонку ID zERR-0042rD   r&  r  r"  r  uC   Удалены колонки, отсутствующие в Jira: r*   u:   Не удалось импортировать доску zERR-0043)1rJ   rj  rL   r   r+   r  r  _get_project_boardsr-   rV   ra  r   r   CmfTaskFilterr  r   r  r  r   ZCmfKanbanBoardr   r   r  r  r  r  Zswimlane_typer  r1  rz   r{   ZCmfKanbanBoardColumnr   r   r  rD   r!  Zmin_sizeZmax_sizer  r3   mapped_status_codesr  r  r0   r.   r1   r  r  )0r   r2  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_globalexcZcolumns_for_deletionr   r   r    rz  3  s6   
 
 



	









 zJiraAPIImport._process_boardsu#   Обработка спринтовc                 C   s  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  | jjd#|j d$t|d%   |d% D ]4}	| jjjj	 d|	 }
t jj|
d&dd'd(d)d*d+gd}|r|d,r| jjjj	 d-|j }t jj|d.d/d0gd}|slt j|| jd1}d2|_d3|j d4|j d5|_ ||_!|jr|j|j" d6 |j#d krt|j$d7kr|j%&| n|j%&| n0|  j'd77  _'| jj(d8|	 d9|d  d:|d; q|jdd |d d!kr|j"sFt j)j*|d<s|jd=|_|jdd | jjd>|j d? |+  t  | j j,d77  _,| j-dd@ qd S )ANr   r|  r}  r   r   r   r   r   r  r~  r   zlist.agile_sprint:defaultrC   r   r   r   r  r  rp  r  r   r   r   r  T)r   r  r+   r  r   r   r   stateclosedr  r   r  u0   Добавляем задачи в спринт r<  issues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+   rt  uB   Задача была в архивном спринте <a href="" target="_blank"></a>r  r*   u-   Неизвестная задача issue_id=u    в спринте zERR-0044r  )Z	task_listr  u   Запуск спринта "r  r  ).rJ   rj  rL   r   r  _get_all_sprintsr+   r-   r   r   r   r  r  r   r   r   r  r  r   r  Zget_default_statusr   r  r  rV   ra  r   r   r   r   r  r;  r   r   rm  r  r  rp  r   r2   r3   ZCmfListHistoryOTRr  Zdo_startr  r"  )r   r2  r   Zsprint_folderarchive_folderZsprint_logic_typer   r   Z
sprint_objZissue_idZ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_diff  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CmfUserry  Fr  Zdefault_user_idr  uA   ", ставим пользователя по умолчанию r  uc   ", указываем системного , в дампе, указываем системногоr*   )rA  r+   r3   gZsystem_userr  r   r   rL   rJ   r   r,   rU   r  r2   )r   rQ  r4   r   r  rD  r   r   r    r	    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.jsonr   r   r  
)r_   r`   ra   rb   rP  writedumps)r   r  r  Zgroups_pathrf   rowr4   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.jsonr   r  r  uM   Неудалось сдампить пользователя по ключу r  )rA  r0   r_   r`   ra   rb   rP  rG   r?   Zget_user_infor  r  r+   r,   rU   r  )r   rQ  r  Z
users_pathrf   r  r4   rG  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  rl   r   r  r  r   r+   r   r  r   r  updateAuthorcmf_modified_byr   started
start_dateZtimeSpentSeconds<   
time_spentr  r   r   r   r   r   r  r   Zremaining_estimater  )ZminutesTr   )r+   rV   ra  _get_issue_worklogsr   rL   rG   r	  r   r   rJ   ZCmfTimeTrackerHistoryr  r   datetimeZ	timedeltar  end_dater  )r   r   r   r4   worklogZtimetracker_historyhistoryr   r   r    _process_issue_worklog6	  s2    


z$JiraAPIImport._process_issue_worklogc           	      C   s   |s|S t |d}|dD ]}|d}||j |  || |dg }dd |D }|sv|dg |d< q|d d	d
d
 }|d| g |d< qt	|S )uF   
        Конвертирует "Фрагмент кода"
        r4  ZprerD   r5  c                 S   s   g | ]}| d r|qS )zcode-)rb  )r   class_r   r   r    r   b	  s     
 z/JiraAPIImport._convert_code.<locals>.<listcomp>zlanguage-noner   -r*   z	language-)
r   r?  rH  extendcontentsclearr   rL   r   r(   )	r   r4   r   souprE  Zcode_tagZ	class_tagZ
code_classrD   r   r   r    _convert_codeQ	  s    


zJiraAPIImport._convert_codeu8   Обработка комментариев задачи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 |_| |jj|||_| ||jj|_||_|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dd# | j d$d% q0| j!d&| d'|  d S )(Nu$   Комментарий задачи r   r  rl   r   r  r   r*   r   r   r  uN   Комментарий уже есть, и правился в системе zERR-0046r  Tr  z**r   r  r   r   r   Z
visibilityr  r~  r   r:   uL   Ошибка обработки приватного комментария zERR-0047
propertiesc                 S   s   |  ddkS )Nr   zsd.public.commentrt   )pr   r   r    rx   	  ry   z7JiraAPIImport._process_issue_comments.<locals>.<lambda>ZinternalFr   r  r  u   Обработано u:    комментариев, из них приватных )"_get_issue_commentsr+   r   r   rJ   r   rL   r  r3   r   rG   r	  r   r  r  r   r   r   rJ  r   rp  r   r  r  ro  r  r   rd  r2   rz   r{   r  r"  r,   )r   r   r   r4   cntZprivate_cntr  r   Zcmf_commentr~  Zsd_public_commentr   r   r    _process_issue_commentsk	  sh    
 

 z%JiraAPIImport._process_issue_commentsu0   Обработка плагинов задачиc           	      C   s   |j jp
d}| |D ]}|d dkr|d rt|d}|jdddid	}|d d
D ]N}|sbqX|drx|d}n|jdddid	}||dd   || qX|| t||j _qd S )Nr   r   z&com.railsware.SmartChecklist.checklistr   r4  Zulr5  ztox-checklistr7  r  r  liztox-checklist--checkedr*   )	r   r   _get_issue_propertiesr   rH  r   rb  r   r(   )	r   r   r   r   Zissue_propertyr  Z	checklistvalr  r   r   r    _process_properties	  s    


z!JiraAPIImport._process_propertiesc              	   C   s  d|d  d|d d  d}dd | j tjj d D }|d	 d
 D ]8}| 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dgd }|s\tj| jd!|d"}|D ]}t||||  q`|  qFd S )#Nu   История задачи r   r  rl   r   r  c                 S   s   i | ]}|d  |qS )r   r   )r   rp   r   r   r    r  	  s      z2JiraAPIImport._process_history.<locals>.<dictcomp>	changelog	historiesz	::historyr   r   r  u   Аудит без автора r   r*   )r   r   r  r   r   rp   r   r   Z
fromStringZtoStringr   z<br>r+   r   r   r  r   r  T)r+   r  r   )r   rJ   r   r   r+   r   r   rL   r	  rG   rV   r  r  r   r  r  )r   r   r  r4   Zjira_map_fieldsr  r   r   r  r^  r   rp   ZdiffZhistory_commentr   r   r   r    _process_history	  s0    


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   r|  r  r   r  )rL   r+   r   r   rJ   ZCmfLinkr  r   r  r  r  rf  rg  r  r$  r   local_links)r   r   r  r  Z
remotelinkZremotelink_ext_idZremotelink_objZremotelink_applinkmatchZ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-startrl   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   rf   r   r   r    r   
  s     z0JiraAPIImport._process_gantt.<locals>.<listcomp>Tr   u8   Не удалось импортировать Гант u    для задачи 'r  zERR-0112ZCmfGanttTaskry  r*   )r|   rL   r   r  Zop_gantt_taskr   r  r  r0   r+   r3   r2   )r   r   r  ZganttZbaseline_start_fieldZbaseline_end_fieldrp   r   r   r    _process_gantt	  s4    
zJiraAPIImport._process_ganttu   Обработка задачиc                 C   sp  d}| j jjj d|d d d  }tjjddd| dgd	}|s`td
|d d d  |d d d}d|d  d|d d  d}| || jtj	j
 d }tjjdd| j jjj d|d d d  gdgd|d< |d j|d< | j|d< d|d< | j jjj d|d  |d< |d |d< |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$rp| j|d d$| j|d%|d&< |d& sp|  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) |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d0|d.< ||d1< |d2 r|d3 d4 |d2< ||d1< |pg }|r|d d d  d5|d d6 d  }n|d d6 d }d| j jjj d| d}tjjddd| dgd	|d7< |d d8r| j jjj d|d d8 d  }tjj|d|d8< |d8 s| j jd9|d d8 d:dd  |  jd!7  _| j jd;|  tj| j tj	|dd<|d gd=\}}|jrv| ||jj |_| !|jj |||_| "||jj |_|D ]}|j#$| qX|%d>d?g |d d@g |d dAg  D ]h}| j jjj dB|d  }	tj&j|	d}|s| j jdC| dDdEd  |  jd!7  _n|j'$| q|d dFg D ]h}| j jjj d|d  }	tj(j|	d}|sn| j jdG| dHdId  |  jd!7  _n|j)$| q| *|| | +|| |j,dJkrtj-j|dKddLgdM}||_.|j/sd|_/|j0ddN |d dO |_1| 2|| | 3|| ||_4|j5r|j0ddN t6  | 7|| |d dPg }|rzt8| j || W n   | j jdQdR|dS Y nX n| j j9d| dT || :||7 }|d dU dV r| ;|| | j<dWr| =|| | j jjj dX|d  }tj>j|d}|stj>|| j dY}||_?| j@jA dZ|d  }d[| d\| d]|_d^|_B|j0ddN |jCD  | j Ed_d` |S )au   
        Общая логика обработки которая потом разделяется на задачи и эпики
        r   r   rl   r   r   r   r|  r}  r   u$   Не проекта с ключем r   r  u   Задача r  r   r  r  r   r  r~  r  r  TZapprovedrD   securityr  Zperm_security_levelu:   Не найден уровень безопасности zERR-0048r   ry  r*   zStory Pointsr  reporterr  r  uB   Не найден автор(постановщик) задачи zERR-0049)r   exc_infocreatorr   u>   Не найден создатель(автор) задачи r  r  u6   Не найден исполнитель задачи Nr   r   renderedFieldsr   r  Z	issuetyper  r^  u'   Не найдена резолюция zERR-0116u2   Пытаемся создать задачу из r   r   fix_versionslogic_prefixZfixVersionsZversions
::version:u!   Не найдена версия zERR-0050r   
componentsu%   Не найден компонент zERR-0051CmfComponentz	task.epicr  r  r   r   Zinclude_systemrl   r   r   rC  u/   Не удалось привязать тегиzERR-0125)r  r4   u[    была изменена пользователем и не будет обновленаr  totaltimeTrackingEnabledz
::comment:r  zbrowse/u<   Задача импортирована из Jira: <a href="r  r  rt  r   r  )Fr+   r   r   rJ   rj  rL   r
  r   r   r   r   r  r  rM   CmfSecurityLevelr3   r2   rq   r	  rG   r,   rU   ZERRORr  r]  rV   ra  r   r   r  rJ  r   r   rp  r  r  r   r   r   r  r  r  r  r  r  r   r   r  r  r   r  r  r  r  r  r  Zprocess_tagsr  r1  r  rP   r  r   r   r?   r  r  r.   r/   r"  )r   r   sprintsr-  Zproject_ext_idr   Zsimplified_projectr4   Znormalized_issuer   Zstory_p_fieldZissuetype_ext_idr  r_  r  rD  r   versionZversion_obj	componentZcomp_objZepics_folderrK  r  r  r;  r   r   r    r?  !
  sB   ",

$
 
$
 .$
 .$
 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_issues
  s
    

zJiraAPIImport._process_issuesu3   Обработка связей всех задачc                 C   s:  t tdd | j d}|  D ]}| j|d | |d dD ]}| j r\  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qDq"| jdt| j  tjj	dd}| jD ]
}| j r  dS tjj	ddd|gdd|ggddgd}|sf| jjd| d q| j| D ]}tjj	|ddgd}|s| jjd| d qpz|j|jkrVtjjdddgddd|gdd|ggdd|gdd|ggggd }tjj	d!d}|D ]4}||_|jd"d# | jjd$| d%| d& q||_|jd"d# nb| jjd'| d(| d) |j d*| }tjj	|d+}|stj||||| jd,}|jd"d# W nR tk
r } z2| jjd-| d.| d/d0d1d2 |  jd37  _W 5 d}~X Y nX qpq| jj !  dd4d!d5d6}| jj"d7t| j#   | j$ D ]\}}| j rt dS z>| jj
j
j d|d8 d  }|	|d8 d9 }|rtjj	|d}ntjj	|d+}|stjj	d9d|d8 d9 gd }|s6tj|| j|d8 d9 d:}|d8 d; |_%|d8 d< |_&|jd"d# tjj	|d d dgd}|s| jjd=|d d  d>|d d  d? W qXtjj	|d
 d dgd}|s| jjd@|d
 d  d>|d
 d  d? W qX| jj
j
j d|d  }tjj	|dgd}|stj||| jdA}|jj'dkr|j|ksD|j|krtjj	d!d|_|j|krj|}|}n|j|kr~|}|}| jjd$| d%| d& ||_(||_)|jd"d# W np   |  jd37  _| jjdB|d8  dC|d d  d>|d d  dD|d
 d  d>|d
 d  dEdFd1d2 Y nX qX| jj !  dS )GuD   
        Постобработка связей задач
        c                 S   s   |  di  ddkS )Nrr   rs   z'com.pyxis.greenhopper.jira:gh-epic-linkrt   ru   r   r   r    rx     ry   z2JiraAPIImport._process_relations.<locals>.<lambda>Nr   r   rl   r   r   Z
issuelinksr   r   )r   r   r   r   u   Подзадачи: zsystem.additional_parentrC   r  r   rD   r   r~  uP   Не удалось связать задачи, возможно задача 'u#   ' не попала в импортparent_taskr  zrelation_type.coder  zsystem.finish:finishin_linkout_linkr   zsystem.linkTr   u,   Тип связи родительской 'u$   ' и дочерней задачи 'ud   ' изменен с 'Блокируется/Блокирует (ОО)' на 'Относится к'.u   У задачи 'u3   ' эпик(родительская задача) 'uo   ' из другого проекта. Создана связь 'Дополнительный родитель'z:additional_parent:r  )r(  r)  relation_typer   r+   u<   Не удалось создать связь задачи 'u&   ' с дочерней задачей 'r  zERR-0114r   ry  r*   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: rr  zERR-0052)*rz   r{   rg   ro   r   r   rH  r+   r-   rL   r   r   rR   r   rQ   r,   r   rJ   ZCmfRelationTyper   rV   r  r   ZCmfRelationOptionr   r*  r  r'  r   r0   r3   r2   r.   r/   ra  rl  r   Zin_type_nameZout_type_namerD   r(  r)  )r   Zepic_link_fieldr   r   Zissue_parentZissue_epic_keyr   Zparent_ext_idZ	sub_tasksZissue_linksZ
issue_linkZlink_ext_idr*  r'  Zchild_ext_idZ
child_taskZ	relationsZrelation_optionZrelation_ext_idr  Z	map_namesZissue_relationZrelation_coder(  r)  Z
rel_ext_idr   r   r    _process_relations  sl   "




&
&

(


 
 
Fz JiraAPIImport._process_relationsu)   Обработка компонентовri  c              	   C   s:  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  | j jd#7  _W q\   |  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   r|  r}  r  r  r~  r  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-0053r  ry  )rJ   rj  rL   r   r(  _get_project_componentsr  r  r+   r-   r   r   r  r   r   r   r	  rG   r-  r  r.  r  r  r  r,  Zcreate_descr_documentZ
text_draftr   r  r2   r3   )r   r2  r|  r   r%  r   Zcomponents_listr   r   r    rs    sl    
  





 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 ]x}z>| 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 | j jd7  _W q\   |  jd7  _| jjd| ddd Y q\X q\d S )Nr   r|  r}  z"scheme_wf.default_release_workflowr~  releaser  )r   r   rl   r   r   r  r  r  Tr  zlist.release:defaultrC   r   r   r   r   ZarchivedZreleasedr  r  r*   u+   Ошибка загрузки версии r/  r   ry  )rJ   rj  rL   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  r2   r3   )r   r2  r|  Zrelease_folderr  r$  r   Zversion_listr   r   r    rr  3  s^    





 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 ]"}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^|||\}
}|
|_tj|dd|_|jdd | jjd| d| d|
 d| d	 W qL   | jjd| d| ddd  Y qLX qLt | }| jjd!|d"d# dS )$uP   
        Пост обработка JQL в фильтрах задач
        r+   r  Nr  r   Tr  ubql2bqlr   r~  r  " (rr  jqlr@  ZjqlQueryZapplinkZrpcUrlr   FZensure_asciir   u   Фильтр z: JQL u%    переобразован в UBQL2 z (BQL: "z")u0   : ошибка преобразования JQL zERR-0066r  ry  uC   Обработка JQL в фильтрах выполнена за .3f    сек.)r   r(   r+   r   r   r  process_timerJ   r  r   r   rD   r  r   rL   rc  rd  r2  Zext_urlnetlocZget_modifiedr3  rb   r  r4  r  rV   ra  r3   )r   r6  r   t1Ztask_filtersZtask_filterZ
filter_msgr@  rF  Zapplink_urlr3  r4  t2r   r   r    _process_jql_in_filtersg  sP    

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   st  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
r|d
 d d  d|d  }n|d }| jjjj d| }tj	jddd| dgdgd}d| jjjj d}|r6t
t||jjdkr6| jjd| d|j  t|dt|j|_|jdd d	}|r>q.|d|d  }|d  }| jjd| d tj	jdd |gdd!gd}|r~|jr@|d
rd| jjjj d|d  d}	|jj|	d|_d| |j }
t
t||
dkr8| jjd"| d#| jjjj dd$|d%d& |  jd7  _n|
|_nd| d|_||krp||jkrp|j| |jdd q.| jjd'| d( || }|s|| d}| jjjr|d) d*krd}n|d) dkrd}n|d+ rd}tj	jd,d-|gd.gd}tj	||d/ d0|t|jd| d| jd1}||krP|g|_|  t  | j jd7  _q.d	S )2u$   Маппим issueType в logic_typeztask.sub:defaultztask.userstory:defaulttask.agile:defaultztask.bug:defaultztask.epic:default)zsub-taskr  u   подзадачаz
user storyZ	userstoryZstoryu   историяr   u   задачаZbugu   багu   ошибкаZdefectu   эпикr  r  u-   Обрабатываем тип задачи NZscoper   r   r  r   r   r|  r  r  r~  rq  z::\d+)::r*   u   ext_id типа задачи r  r   Tr  ZuntranslatedNamer   u2   Поиск типа задачи по имени 'r  r  rG  uW   Ошибка объединения одноименных типов с именем 'u*   ': одинаковый источник 'zERR-0118r  )r4   rz  u   Тип задачи 'u2   ' не найден. Создание новогоr  rY  r  rD   r   ui_colorr   r   )r   r   r  r  rA  r   r+   ) r   r+   rV   ra  r-   rL   r   r   rJ   r  r   rf  findallr   r   r  r  r(   r  r  rJ  r3   r2   rG  r   rB  r?   rH   rI   rA  r  r  )r   Z	name2coder  r  r  r  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                    sb  i } dD ]}|||d < q dD ]0}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 qhj j!d17  _!q*dS )2u   Импортируем workflowr  r   r  Nr   r   ZentityIdr  r@  rC   r  r   Tr   r  r   r   r  r~  r  r   r  r  r  r  r	  r
  r  c                    s*   g | ]"} j jjj d j d | qS )r   )r+   r   r   r   )r   st)r   r  r   r    r   m  s     z3JiraAPIImport._process_workflow.<locals>.<listcomp>r  r  uN   DEV: Fatal Вероятно, сломали создание статусов!r  r  r  r  r  c                    s   t | dt  kS r\  r  r  r  r   r    rx   {  ry   z1JiraAPIImport._process_workflow.<locals>.<lambda>r  r  r  r  r  r  r  r  r*   )"r   r+   r-   rV   ra  r   r   rJ   r  rL   r   r   r  r  r  r   r  r  r   r  r  r  r  r   r(  rB  r  r  rz   r{   r.  r/  r3   r  )r   Zjira_statusesr4  Zjira_workflowZworkflow_idZtemplate_workflowr   r7  r  r  r  r  r  r  r8  r   )r  r   r  r    _process_workflow2  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' q| j jd(7  _q
d S ))Nr  r   ZdefaultWorkflowr   r|  r  r   u+   Не импортировался workflow r   r  r  rC   Tr  r   r   r   r   r  r  ZissueTypeMappingsr  r  r  r  r  r  r  r   r!  r+   r  r"  r$  r   r%  rD   r&  r  r*   )r   r+   r-   r   r   rJ   r  rL   r(  r  r  r   r   r  r  r  r  rV   r  r   r  r  rD   r   r  r   r  r  )r   r  Zdefault_task_workflow_ext_idr  Zwf_scheme_ext_idr9  r  r:  logic_type_idworkflow_namer  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   rK  )rL  rM  rN  r   rL   rG   r  r+   r   rO  r  )r   rR  rG  r   r   r   r    _cache_all_users  s    zJiraAPIImport._cache_all_usersu   Простой дампr:   c              	   C   s   | j  | d}| j  | d}| r>t| t|d6}| D ](}| j  jd7  _|t	
|d  qPW 5 Q R X t|| | j jdd t  d S )N.jsonz.json.dirtyr  r*   r  Tr  )r+   r^   r_   r`   ri   r  ra   json_object_countr  rb   r  rh   rk   r  r  )r   Zapi_funcr   re   rm   rf   r  r   r   r    _simple_dump  s    

 zJiraAPIImport._simple_dumpc              	   c   sN   | j  | d}| rJt|d}|D ]}t|V  q.W 5 Q R X d S )NrJ  r+)r+   r^   r_   r`   ra   rb   rP  )r   r   re   rf   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.jsonrM  )r+   r^   r_   r`   ri   listdirr#  rV   r  ra   rb   rc   )r   r  r  rf   r   r   r    r     s    

zJiraAPIImport._get_projectsc                 C   s&   |   D ]}||d kr|  S qd S r\  )Zget_projects)r   r  r2  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.jsonrM  )r+   r^   r_   ra   rb   rc   )r   r  workflows_filerf   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.jsonrM  r+   r^   r_   ra   rb   rP  r   r  r  rf   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.jsonrM  rV  rW  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.jsonrM  rV  rW  r   r   r    rn  /  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   rS   r  rP  rM  r+   r^   r_   ri   rQ  ra   rb   rc   )r   r  	board_dirr  rf   r   r   r    r  5  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  rP  rM  rZ  )r   r  sprints_dirZ	sprint_idrf   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.jsonrM  rV  rW  r   r   r    r2  A  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.jsonrM  rV  rW  r   r   r    r0  G  s    z%JiraAPIImport._get_project_componentsc                 C   s<   d}| j  d|d}| r8tdd t|D }|S )Nr   r   r   c                 s   s   | ]}| d  V  qdS )rN  rO  N)r#  )r   entryr   r   r    	<genexpr>R  s     z5JiraAPIImport._count_project_tasks.<locals>.<genexpr>)r+   r^   r_   r`   sumri   rQ  )r   r  r  	tasks_dirr   r   r    rH  M  s
    z"JiraAPIImport._count_project_tasksr   r  c              
   c   s   | j  d|d}| s:| j jd| d|  d S tt|D ]\\}}||k rZqH|	drfqH||| krv qt
| d| dd}t|V  W 5 Q R X qHd S )	Nr   r   u   Каталог u    отсутствует. Возможно он был удален или еще не создан. Необходимо повторно запустить импорт проекта r_  r  rP  rM  )r+   r^   r_   r`   rV   r  r   ri   rQ  r#  ra   rb   rc   )r   r  startr   rc  iZtask_idrf   r   r   r    r   U  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
EDITISSUESr  issueTypeIdactionsr  r*   r  c                 S   s   g | ]}|qS r   r   )r   vr   r   r    r     s     z<JiraAPIImport._get_project_screen_scheme.<locals>.<listcomp>r  )r   r-  rL   r   ro   r  r  r   )r   smart_configscreen_schemer  r  r  r   r  rl  Zissue_type_screensr  r  Zissue_type_screenr   r   r    _get_project_screen_schemeg  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 )Nr  r  r  r  r   u(   Дамп бизнес-процесса 'u   ' как XMLr  r  r]   uB   Не удалось получить бизнес-процесс 'u   ' как XML: r  r  rd   rz  Z
error_type)r   r_   r`   rh   rmtreemkdirr+   rV   ra  r?   Zget_workflow_as_xmlrc  rd  quotera   r  r0   r3   )
r   r2  r3  r  r  rG  r6  r5  rf   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  r(   r  r   r   r    r     s   z>JiraAPIImport._get_field_config_issue_type.<locals>.<listcomp>r  T)Z
is_defaultr  r   )rk  fieldConfigurationIdc                 S   s$   g | ]}|d  dkrt |d  qS )rk  r  rv  )r   field_configurationr   r   r    r     s   rk  rw  )r   contextisHidden
isRequired)ZissuetypeIdrz  r{  ry  )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_usedrx  r  Zfield_configuration_idrp   
field_usedr  r   r   r    _get_field_config_issue_type  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-0109rV  rd   rq  NisAnyIssueTypery  options)r?   Z&get_project_field_configuration_schemer  ro   rb  Z!get_field_context_project_mappingZget_field_contextZget_field_context_optionr0   r2   hasattrr  r   r+   r3   Z#get_field_context_issuetype_mappingrL   r   r  )r   r  r}  r~  r  Zfield_used_idZ
context_idry  Zcontext_optionr  Z
error_textZcontext_issuetypesr  Zcontext_issue_typer   r   r    _get_project_fields_used  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  re   )ri   rQ  )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.jsonrM  )ra   rb   rP  )r   r   comments_file_pathrf   r  r   r   r    r    s    z!JiraAPIImport._get_issue_commentsc              	   C   s6   |d  d}t |d}t|}W 5 Q R X |p4g S )Nr  z/worklog.jsonrM  ra   rb   rc   )r   r   r  rf   r7   r   r   r    r  "  s    z!JiraAPIImport._get_issue_worklogsc              
   C   s:   |d  d}t |d}t|W  5 Q R  S Q R X d S )Nr  z/properties.jsonrM  r  )r   r   Zproperties_file_pathrf   r   r   r    r  (  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.jsonrM  r  )r   r   Zwatchers_file_pathrf   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.jsonrM  )r+   r^   r_   r`   ra   rb   rc   )r   global_settings_file_pathrf   r   r   r    rO   2  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.jsonr]   ZcloudId)	r?   Zget_cloud_idr+   r^   r_   ra   rb   rd   rN   )r   data	data_filerf   r   r   r    _get_cloud_id9  s
    
zJiraAPIImport._get_cloud_idc              	   C   s@   | j  }| j d}t|d}t|| W 5 Q R X d S )Nr  r]   )r?   Zget_jira_global_settingsr+   r^   r_   ra   rb   rd   )r   Zglobal_settings_datar  rf   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 ]2}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|_|   |j!"  W q  t#k
rR } z2| jj!$  | 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"  qp|S )%Nr   Zlxmlc                 S   s   |  dp|  dS rS  rU  rW  r   r   r    rx   L  ry   z+JiraAPIImport._dump_links.<locals>.<lambda>rT  r;  zmailto:u   Это почта: httpuH   Это внешняя ссылка, оставляем как есть: rZ  u   Это не файл: r[  r*   rt  rD  rl   r  c                    s   |  d kS r\  rt   r]  r_  r   r    rx   e  ry   uE   Этот файл уже обработан во вложениях: r  rY  r   r;  
obj_ext_idr   r+   r;  r  r   Fu0   Не удалось скачать ссылку r<  r4  r5  r6  r7  r9  r  r:  r   )*r   r?  rV  r8  rb  r+   rV   r  rc  rd  urljoinr?   r  ri  rj  r   rf  rg  re  rz   r{   rJ   r$  r%  r_   CmfImportDownloadrL   r   r   pathr   
downloadedr  r.   r/   r0   r1   r  r2  r3  r@  rB  )r   r   r  r   r2   rE  r   r  rn  encodingrk  Zattach_filenamerl  rm  r  re   download_jobrI  rD  rF  r@  r   r_  r    _dump_linksF  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"
        rs   ry  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)rg   rL   ro   r-  r   rn   )r   r~  r~   Zcontextsry  Zcontext_dataZfield_contextr   r   r    _get_field_contexts  s*    




z!JiraAPIImport._get_field_contextsc                 C   sL  | j |d }| jD ]"}| j| d s,q|d |s<q|d | d}|r|D ]}|ds|| jd| tj qV| j 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 | }|r:| || j |d  q|dkr|d | pZg }	|	D ]}| || j |d  q`q|dkr|d | }
|
r:| |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   rs   rl   ZallowedValuesr   u   Выбор без id: r  childrenrr   r  r*   rY  
userpickerr  multiuserpickergrouppickermultigrouppickerrC  N)r?   Zget_issue_metarg   rL   r+   r,   rU   r  rH   rI   r   r   r  rG   r  r  r   r  rn   )r   r   metar~   r  r  Zcur_optcustom_field_typesr   r   r  r  ro   r   r   r    _get_field_options  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   r  rS  r]   Fr7  )r?   Z get_simplified_project_workflowsrN   r   r_   ra   rb   rd   )r   r   r  r  rT  rf   r   r   r    "_dump_simplified_project_workflows  s    z0JiraAPIImport._dump_simplified_project_workflows)last_dump_datenew_dump_datec	           "      C   s  t dd || _d}	| jjd| d|  zX| jj|d ||||dD ]6}
z z| j rW 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 r~| jjdt|
d d   ztj| jjd|
d  d}| jjjrxt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|_|  |j  W nD tk
rF } z$| jj dt! d| dddd  W 5 d }~X Y nX |
d d D ](}|d!rT| "|d! | j# | qT| j$d"r@|	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!rL| "|d! | j# | qL|
d d(r| "|
d d(| j#| |
d d)r| "|
d d)i | j#| |
d d*i r| "|
d d*i | j#| |  j*| +|
d+ d, ||
7  _*|	d-}| rDt%| | 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0d1 |  j*| +|d2 ||
7  _*qnW 5 Q R X | jj1|
d |
d3< | j2|
d }|	d4}t&|d$}t()|| W 5 Q R X | j3|
d }|D ]}| "|| j# | q|	d5} t&| d$}t()|| W 5 Q R X t|| |jdd |	d6}!t
|4dd7|
d< t&|!d$.}t()|
| | j j/d7  _/| j0d8 W 5 Q R X W n.   |	d7 }	| jj d9|
 d:ddd  Y nX W 5 | jj  X qPW n.   | jj5d;|d<  d= |	d7 }	Y nX |6|	 W 5 Q R X d S )>NFr=  r   u   Задачи с u    до r   )rd  r  r  r  r*   u   Задача 'r   r  rN  Texist_okr  rl  rl   r  u%   Обработка вложений: zsecure/attachmentzip/z.zipzsecure/issueAttachments/r  r   r  r  r  r<  zERR-0054r   rd   rq  r   r!  zworklog.jsonr]   r  r	  r
  r  r  r  r  r   zcomments.jsonu#   Дампим комментарииr  r  r  r   r  zproperties.jsonzwatchers.json	info.jsonr   r   u0   Не удалось скачать задачу zERR-0111u2   Не получить задачи проекта r   u    с сервера)7r   r?   r+   rV   ra  Zget_all_project_issues_duringr.   r/   r-   r_   r(   r`   rh   rk   rs  r  r   ri   r  r   r  rH   rI   r   r   rJ   r  rL   r   r  r  r0   r3   r/  r  rG   rP   r  ra   Zissue_get_worklogrb   rd   r2   r  Zget_commentsr  r  rK  r"  Zget_issue_remotelinksZget_issue_propertiesZget_watchersrJ  	exceptionr@  )"r   rd  r  rc  r2  r?   tasks_that_are_doner  r  r-  r   Ztask_dirZtask_dir_tmpr  r;  r  Zattach_file_pathr   r  rI  r.  Zworklog_file_namerf   Zworklogsr  r  Zcomments_file_namer  r   Zproperties_fileZwatchersr  Zwatchers_fileZ	info_pathr   r   r    _dump_task_part  s     


 


  


   


*


zJiraAPIImport._dump_task_partr2  r  r  r  c                 C   s  t jj}t|d  d}|jdd | j }d}t|| j d }	|	sNd}	d}
g }d}||kr|
|	 |	 }||kr||}| j	j
| jd|
 |
|	 |||t| jj| jj| jj| jj| jj| jjjd	|||d
d}|| |  | jjd|  |
d7 }
qZ|	d }| jjd|	 d |D ]8}|j|d | r(| jjddddd tdq(| jjd | s|| 7 }qp| 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rD|)| t*+|}|| j,}|rD|-| jj. d | t/0| qDW 5 Q R X W 5 Q R X W 5 Q R X |1  t&2|| t|d #d!}| j$ #d!}| j$ #d"}|% rt(|d#3  t&'|| t(|dR}t(|d<}t(|d&}|D ]}||krL|)| qLW 5 Q R X W 5 Q R X W 5 Q R X |1  t&2|| q|S )$Nr  /tasksTr  r   r*   r   Z
dump_tasks)r  r   tokenpassword
verify_sslrI   )rd  r  rc  r2  r?   r  r  r  targetr   r6   u$   Форкаем _dump_task_part proc=r  u%   Таймаут дампа задач u    минут)timeoutu$   Возможно завис дампzERR-0055r   rd   rq  u"   Ошибка дампа задачuK   Закончили параллельное скачивание задачu   Ошибок: r   r   r  r  zusers.json.newr   r  rK  r  zgroups.json.newa)4rL  rM  rN  r   rs  r   Queuer   r   r   Threadr  r   r?   r  r   r  r  r  rH   rI   r   rd  r+   rV   ra  r   is_aliver3   TimeoutErroremptyrL   r   rH  r-   r_   r^   r`   rh   r*  ra   r  rb   rP  rG   r  r   rO  r  unlinkrk   close)r   r2  r  r  r  rR  rc  r  r-  r  re  r  Z	max_limitr  r  r   Zissue_users_pathZall_users_pathZall_users_path_newf1f2Zf3linerG  r   Zissue_groups_pathZall_groups_pathZall_groups_path_newr   r   r    _dump_tasksv  s    

 


  
"



B

,zJiraAPIImport._dump_tasksc              	   C   sJ  | j jd|d  d|d  d | j|d }|r|dsi }| jjjrb| j|d }n<|dg D ].}|d d	krn|d
 D ]}|d ||d < qqn|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   r5  r   rr  r   r  rg  ZBROWSE_PROJECTSr  rp  levelsr  r   r   r  /issue_security_scheme.jsonr]   )r+   rV   ra  r?   Z!get_project_issue_security_schemerL   rH   rI   Z get_issue_security_level_membersr   r  r^   r   r`   ri   r  ra   rb   rd   )r   r2  rn  Zsecurity_schemeZsecurity_level_membersr  security_levelrW   member	dump_filerf   r   r   r    #_dump_project_issue_security_scheme  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"r  z/smart_config.jsonr  )	ZprojectInformationZprojectSchemesZprojectIssuetypesZprojectVersionsZprojectComponentsZprojectMembersZprojectCustomfieldsZprojectGlobalActionsZprojectWorkflowActionsr   r   )r  ERR-0056rj  rd   rq  )r+   rV   ra  r   r`   ri   r  ra   r?   Zget_project_smart_configr   r0   r3   r(   rb   rd   )r   r2  Zsmart_config_filerf   rn  r  r  r   r   r    _dump_smart_config  s$    
 z JiraAPIImport._dump_smart_configEtc/UTC%Y-%m-%d %H:%M)dttzrC  r@   c                 C   sN   | pt j t jj|} t|}tjt j | ||}||}|S r   )	r  nowtimezoneutcstrftimepytzZlocalizestrptimeZ
astimezone)r  r  rC  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 }z| j
 rW  d S | j jd7  _| jjd| d ||}	|| d}
|	d}| jjjr| jjj| jjd}n| jjj| jjd}|r4|d d n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j$|d }t%|
|d< d }| jjjs
| &|}| jjd t'|d  d}| r>t (| t|d}| j)|d }zx|d  D ]j}|d! d" d#krd| jjjr|d! dr| *|d! d | j  n| *|d! d$ | j  qdW n(   | jj+d%| d&d'd(d)  Y nX t,|| W 5 Q R X | j-||d* | jjjr:|d+ s~| j.|d gd d, |d-< | j/|d g|d.< | 0|d |d/< n| jjd0 t'|d  d1}| rt (| g }t|dR}| jj1|d d2D ]8}|2|d  | j jd7  _|3t4|d3  qW 5 Q R X | j5|d |d4< | 6|| n| j7| jj8 d5|d   |d-< d|d- kr|d- d |d- d6|d-< n.| j7| jj8 d7|d- d   |d- d8< |d9i |d- d9< | 9| |d:r| :||d.< |d;i |d/< | ;|d/  |d<}|rp| j<d=|  | j7|d> }|=  | |d<< | *|d< | j> | j  | jjd? t'|d  d@}| rt (| t|dD}| jj?|d d2D ]*} | j jd7  _|3t4| d3  qW 5 Q R X | jjdA t'|d  dB}!|! r,t (|! t|!d}| jjj@|d dCA D ]}"| j
 rx W 5 Q R  W  d S | j jd7  _| j7|" }#g }$|#dDg D ] }%|%d" dEkrzT| jjjr| jjjB|%dF d|%dF dGdH|%dI< n| jjjB|%d d|%dI< W nn |jCjDk
r~ }& zJ|&jEjFdJkrl|$2|% | jjGdK|#d  dL|& dM W Y qn W 5 d }&~&X Y nX |%dIr| *|%dI | j> | j  q|#dDr|$D ]}'|#dD (|' q|3t4|#d3  qRW 5 Q R X | jjdN t'|d  dO}(|( r(tH|( |(  t'|d  dP})|) rVtH|) |)  z:| jjI|d dCD ] }*| j
 r W W  d S | j jd7  _| jjdQ|*d   | jjJ|*d |*d8< | j7|*d8 dR d>  |*d8 dR< | jK|*d }+| jjj	r<dSdTdUd | jL|*d D ii},|+M|, |+|*d8 dV< |d |*dW< |(t%|*d }-|-jd
d |-d}.t|.dX}t,|*| W 5 Q R X zL|*d" dYk
r| jjdZ | jN|*d D ]}/| j
 	r W  W W  d S | j jd7  _|)t%|/d }0|0jd
d |0d}1|1 
rP| jjd[|/d  d\ 	qg |/d]< | jjd[|/d   | jO|/d D ]6}2| j
 
r  W  W W  d S |/d] 2|2d  
qt|1dX}t,|/| | jPd^ W 5 Q R X 	qW n |jCjDk
rl }3 z\|3jEjFd_kr@d`t%|3ks.dat%|3kr@| j<t%|3 n| jj+db|* dcddd(d)  W 5 d }3~3X Y n(   | jj+db|* dcddd(d)  Y nX qtW n4   |  jQd7  _Q| jj+de| dcddd(d) Y nX | j<df t'|d  dg}4|4 rt (|4 t|4db}| jR|d D ]J}5| j
 rB W 5 Q R  W  d S | j jd7  _|3t4|5d3  qW 5 Q R X | j<dh t'|d  di}6|6 rt (|6 t|6d}| jS|d D ]r}7| j
 r W 5 Q R  W  d S |7d<r| *|7d< | j> | j  | j jd7  _|3t4|7d3  qW 5 Q R X djt jTdk< | j jU|7  _U| jjVd
dl | jjWX  dmt jTdk< t|d |	 t%|	|d< |d  dn}t|dX}t,|| W 5 Q R X t"# | }8| jjdo| dp|8dqdr t'|d  ds}9|r~|9 sH| jjGdt| du|d  dv|9 dw| dx	 d }n6| Y|d s~| jjGdy| du|9 dz| dx d }t"# }| jjZ|d ||d{}d|| }:|s|r|:d}7 }:|r|:d~| 7 }:|r|:d| 7 }:|:d| d7 }:| j<|: |  jQ| j[||||d7  _Qt"# | }8| jjd| dp|8dqdr | jQsv||d< t|dX}t,|| W 5 Q R X W qv   |  jQd7  _Q|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 )r4   r  r   )r   r  r   r   r    r     s       z0JiraAPIImport._dump_projects.<locals>.<listcomp>r  r   Tr  P   r   r   r*   u   Дампим "r  rN  r  )r@  )r   ZtimeZoner  r   Z	dump_dater  r   r  u   Дампим права/permissions.jsonr  permissionsholderr  r   	parameteru0   Не удалось сдампить права r  rj  rd   rq  )rn  r  ZworkflowSchemer  jira_screen_schemer~  u/   Дампим типы задач проектаrU  r  r  r  z$rest/projectconfig/1/workflowscheme/)r   ra  zrest/api/2/workflowscheme/ra  r  rf  Z
fieldsUsedr  u1   Ищем руководителя проекта r   u*   Дампим статусы проектаrX  u$   Дампим роли проектаrY  )r   rg  rh  Z	actorUserrA   )r   ro  rG  i  u&   Пользователь к роли "u   " не найден. u+   . Возможно он был удаленu&   Дампим доски проектаz/boards/z	/sprints/r  r{   r  r  c                 S   s   g | ]}|qS r   r   )r   Zqfr   r   r    r     s    r   r  r]   )r  Zsimpleu&   Дампим спринты доскиu   Спринт u    уже скачанr  r   i  z"The board does not support sprintsuD   Данная доска не поддерживает спринтыu4   Не удалось сдампить спринты zERR-0057r   u   Не удалось сдампить доски, возможно проект не поддерживает доски или у вас нет прав project_info=u(   Дампим версии проектаr]  u!   Дампим компонентыr^  r   NO_CACHEr  1rP  u&   Дамп данных проекта "u   " выполнен за r8  r9  r  u$   В каталоге проекта "r5  u5   ), отсутствует каталог задач (u@   ). Дата последнего успешного дампа (u   ) будет сброшена.u/   В каталоге задач проекта "ud   ) отсутствуют задачи. Дата последнего успешного дампа ()r  r  u*   Дампим задачи проекта: u    (в периодu    с u    по u4    включительно, часовой пояс: rr  r  u$   Дамп задач проекта "rc  u   Проект "u   " является приватным и не может быть импортирован, отключите приватность в Jira или предоставьте пользователю праваzERR-0058u2   Не удалось получить проект u0   Закончили дампить проекты)\r'  r   r0   rT   r+   r^   r_   rs  r   r   r-   rK  rV   ra  r?   rH   rI   Zuser_find_by_user_stringr   r`   ra   rb   rc   rL   r  r  r  r  r  r  rh   rk   ri   makedirsr  r:  rR  r(   r  r   r  Zget_project_permission_schemer  r3   rd   r  Zget_project_schemeZget_project_screen_schemer  r|  r   r  r  Zget_project_workflow_schemer  jira_requestr  ru  rp  r  r,   raise_for_statusrG   get_statusesZget_project_rolesro   r   
exceptionsZ	HTTPErrorr  r  r  rr  Zget_all_agile_boardsZget_agile_board_configurationZget_advanced_board_settingsZget_board_quick_filtersr  Zget_sprintsZget_sprint_issuesr"  r2   Zget_project_versions_paginatedZget_project_componentsenvironprogressr  r.   r/   rH  Zget_project_issues_count_duringr  );r   r'  rootZprojects_dirr  r  r   r  Zproject_namer  Zproject_tmp_dirr  rG  Zuser_tzr  rf   Zcurrent_dumpZlast_dump_date_utcZnew_dump_date_utcr  r<  r2  rn  permission_fileZperm_sch	perm_dictZ
types_filer  r  r  r7   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   rI  Zversion_list_filenamer$  Zcomponents_list_filenamer%  r=  rc  Zinfo_msgr   r   r    _dump_projects  sr   









"  


"



"


"



$ 



*      

"

"


 
 

    zJiraAPIImport._dump_projectsc                 C   s  | j  }t|\}}}|| d }| j d| d | j jd | jjj	rZ| 
  | 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j	rZ| 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jd dt j!d< d| j _"| j #  t$  d t j!d< | j jd! | %  d"S )#u_   
        Загружаем все данные из апи, кроме аттачей
        d   u   Свободно места: r}  u$   Скачаем данные из APIu9   Дампим глобальные настройки Jirar  Tu'   Дампим пользователейr   uA   Не дампим пользователей из-за опцийr  u   Дампим статусыr  u    Дампим типы задачr  Zissue_security_schemesu*   Дампим бизнес процессыr  u7   Дампим схемы бизнес процессовr  u   Дампим экраныr  ro  u!   Дампим приоритетыrT  rS  u+   Дамп решений(резолюций)r\  r   r     r  u   Дампим проектыN)&r+   r^   rh   
disk_usager,   rV   ra  r?   rH   rI   r  r  rO   rP   r   r   rL   rL  r   rU   r  rI  r  Zget_issue_typesZget_issue_security_schemesZget_workflowsZget_workflow_schemeZget_all_screensZget_screen_schemeZget_all_prioritiesZget_priority_schemesZget_all_resolutionsri   r  r  r  r  r  )r   Zdownload_pathr   usedfreeZfree_percentr   r   r    download_data  sP    





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   r  r  rK  r  )r   rl   r  Tr  r  )ri   r  rJ   Z	CmfImportrL   r+   r   rK  r   r  r  r  r  )r   r+   r   r   r    rq    s    
zJiraAPIImport._calc_progressc                 C   st   dd l }|jdddd| jj d| jjj d| d| d	tj d
gddt	ddt	ddd}| j
d|j  |S )Nr   r  r  r  z&cmf_import = models.CmfImport.get(id="z#");cmf_import.process_cross_links("r  r  r  r  Tr  r  r  r  r  )r  r  r+   r   r?   rH   r  r   r  ra   r,   r  )r   
model_namer  r  r  r   r   r    _execute_cross_links  s    
.  z"JiraAPIImport._execute_cross_linksc                 C   sf  dddgdddgg}dD ]8}| j jd| d	| j  d
}tt| }|j|d}|s\qt  g }t| jD ]0}| 	||}|t
j7 }|| ||krp qqp| j   ||k r"td t|D ]V}| }	|	dk	r|  j|	7  _|| | 	||}
|t
j7 }||
 | j   qqt|D ]&}|  |jr*|  j|j7  _q*q| j jd dS )uU   
        Заменим ссылки на задачи и документы
        r+   r  Nr  r   T)r$  r   rj  r   u   Обрабатываем u+    в несколько процессов: r   r   r*   u2   Закончили обработку ссылок)r+   rV   ra  r   varsrJ   r  r1  r  r  r   r  r   r  r  r  r   r  r2   r  r  r  )r   r  r  r  r}   Zobj_cntr  rD  r  r  r  r   r   r    _process_cross_links  sB    








z"JiraAPIImport._process_cross_linksc                  C   s  ddl m} t|d  d}| }dd |d D }t|d}t|}W 5 Q R X | jjjj d	|d
  }t	j
j|d}	|	st	j
|d| jd}	|	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|_nr|d7 d8 d;krd|_nV|d7 d8 d<kr:d|_n:|d7 d8 d=kr\d|_d|_ n|d7 d8 d>krxd|_!n|d7 d8 d?kr| j"j#j$r|d7 d@r| %|d7 d@ }n| %|d7 dA }|r|j&| n,| jjdB| dC|d5 |  jd67  _W qnd|d7 d8 dDkr@| j"j#j$rRd	| 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)|| qB|jdd qW n@   | jjd[|	 d\| d]| d^d_d`dM |  jd67  _Y nX qt*  |	S )aNr   )get_datar  r  c                 S   s"   i | ]}|d  r|d  |d qS )Z	jira_coderD   r   r   r   r   r    r    s    z6JiraAPIImport._process_permissions.<locals>.<dictcomp>Zproject_perm_permissionr   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,   ', оно не будет обновленоFr  Z
permission)rD   r#  u4   Не нашли соответствия права r   r|  r}  r~  )project_permissionr   rl   u*   Не найдено правило для zERR-0059r  r*   r  r  projectRole)applicationRoleZanyoneprojectLeadr  r  sd.customer.portal.onlyr   r   r  u9   Не нашли пользователя для прав zERR-0060r  r  u-   Не нашли группу для прав zERR-0061u'   Неизвестный тип прав zERR-0062u6   Не удалось загрузить правило zERR-0063CmfProjectPermPermissionry  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)+Zcmf.system_datar  r   ra   rb   rc   r+   r   r   rJ   ZCmfProjectPermSchemerL   r  r   r  rV   r  r  r   r  r  r  r3   r2   r   ro  r  r   r  r  r  r  r  r  r?   rH   rI   r	  r  r  r   getattrr1  ) r   r2  r  r  Zsystem_dataZmap_permrf   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_fieldr  Zpermr  role_ext_idr~  r  r  
group_nameZcopy_access_rulesZfrom_rule_codeZto_rulesZ	from_ruleZto_rule_codeZto_ruleZrule_access_fieldr   r   r    rt    sr   



 "




 
$&    	z"JiraAPIImport._process_permissionsc                 C   sd  t ddN d}| }|dkr&qL| j r4qL| jjd|d   | jj|d dtj	d}z|
  t|d	 }t|d
"}|jddD ]}|| qW 5 Q R X | jjd|d	   tjj|d d}	d|	_|	  | jd W nJ tk
r> }
 z*|d7 }| jjd|d  d|  W 5 d }
~
X Y nX W 5 Q R X q|| W 5 Q R X d S )NFr=  r   r>  u    Пытаемся скачать r;  T)streamr  r  zwb+i    )Z
chunk_sizeu   Сохранили в r   r  r  r*   u+   Неудалось скачать файл r<  )r   rL   r+   r-   rV   ra  r?   r  r   ZIMPORT_DOWNLOAD_TIMEOUTr  r   ra   Ziter_contentr  rJ   r  r  r  r"  r0   r  r@  )r   download_queueerror_queuer-  r  r7   Z	save_pathrf   chunkZdownload_job_objrI  r   r   r    _download_file_worker  s0    
<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 q|D ]}|d q| s@|D ]}|  q0| j  rP|S | j jd | s| j  rx|S || 7 }q^|S )Nu=   Скачиваем все найденные вложенияr   zplugin.plugin.source_hashr   r   r  Fr   u   Вложений нетr  )r
  r  r  u    Запустили задачу r;  r  r~  )r   r;  r  r>  u%   Закончили скачивать)r+   rV   ra  r   r  r   r   r   rJ   r  r  r  r   r   r  r  r   rd  Zslistr-   r@  r   r;  r  r  r   rL   )	r   r
  r  r7   r  Zprocsre  r  r  r   r   r    download_files  sD    





zJiraAPIImport.download_filesc                 C   s4  | j  rd S | j jd|d  d|d  d d }t|d  d}t|}t|}W 5 Q R X |r0| j jjj	 d|d	  }t
jj|d
}|st
j|| j dd}|jr|d |_|d|_||_|jdd |d D ]B}|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 ]H}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rn|r\d| j jjj	 d| d}t
jjd#d$d%| d%gd#gd&}|s| jjjr|d' n|}t
jjdd(|gd#gd&}|rL|js||_n||jkr8|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
}|r0t"|jg|_#ntd1| n*|d2kr\t
jjd3d|_ntd4| |jdd |j$%  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 |
j$%  |d:rt(|d:t(|d	 kr|
|_)|jdd q|j$%  |S );NuV   Импортируем схему безопасности задач проекта "r   r5  r   rr  r  r  r   r   r  Tr  r   r   r  r  r  re  r  rp  r  r   r  zvar:current_userrC   r   u0   Не найдена проектная роль r  zvar:project_ownerr  z
var:authorr  zvar:responsibler  r   r|  r}  r~  r  r  u!   Не найдена группа ZUsersr   uH   . Возможно пользователь был удален в Jira.F)r  r  u+   Не найден пользователь )ZgroupCustomFieldZuserCustomFieldu>   Не найдено пользовательское поле r  zsdesk-client:defaultu-   Неизвестный тип правила r*   uF   Не удалось создать правило для уровня z. zERR-0070r  ZdefaultSecurityLevelId)*r+   r-   rV   ra  r   ra   rb   rc   r   r   rJ   ZCmfSecurityLevelSchemerL   r  r   r   r  r  r"  ZCmfSecurityLevelRuler   r  r   Zaccess_memberro  r0   r  r?   rH   rI   r   rA  r  CmfCustFieldr(   Zaccess_task_fieldsr.   r/   r2   r3   r   Zdefault_task_security_level)r   r2  rv  r  rf   r  Zscheme_ext_idrW   Z	level_msgZlevel_ext_idr  Z
level_ruler  member_typemember_valuer  r~  r   r  r  rG  r  r  rD  cust_field_ext_id
cust_fieldr   r   r    ru    s    












 


$
z&JiraAPIImport._process_security_levelsrp   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cfrD  r   T)rK  r  r  r  F)r   rs   r>  Zvisible_filterrequiredZrequiredChangedrr   rs   r  r*   rY  Ztextarear   field_custom_typeZ	textfieldr(   floatr  )r+  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  rW  )ZmultiselectZmulticheckboxeschoice_multic                 S   s   i | ]}|d  |d qS r  r   r  r   r   r    r    s      rC  rK  Zcascadingselectchoice_cascade_multiZ
datepickerdater  r  r   r  r   )r  r  r  u
   Поле 'r   ' (u6   ) имеет неподдерживаемый тип 'r  zERR-0064r  ry  )rJ  r+   r   r   rB  r   r3   r2   )r   rp   r>  r7   r   r  r   r   r    
_map_field  s^    
 













&zJiraAPIImport._map_fieldc                    s   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rpi }g }|d d2 D ]V}|d3 sq|d4g D ].}|d5 ||d < |d6 r*||d  q* qdq||_||_ |j!rd|_"|| |jdd7 |j#$  tj%j||
||d8}|stj%||
||d8jdd7 q|j#$  |&  |rNtj't(j() *d9d
dd: tj+d;d
i d<d tj D }|D ]}||d  |d.< q6dD fd=d>	|D ]D}tjj,|d. d?  }t-t|j.  |d d4 D ]}| qqb| jjj}|d@ D ].}|d tjjkr| jtjj d |d< q|| j_dAt/j0dB< | j  | jj#$  dCt/j0dB< d S )ENrl   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>rs   u!   Поле не кастомное r   r  r  rD  r   r  )r  rK  r  r   widgetrW  r   disabled_choices)r   r   r  dirtyr   r+   r  u,   Неудалось смапить поле 'r!  u   ): widget поля 'u7   ' не совпадает с существующим 'r  zERR-0065r  ry  u   Поле с именем r  u4   ) есть в таблице, мапим в негоr   u(   Создаем поле с именем u   ), и мапим в негоr  ry  r  r  r   disabledr   )r  r   r   ui_form_groupz%Y%m%d%H%M%S)Zmeta_versionr  r  r  c                 S   s   i | ]}|d  |qS r%  r   r  r   r   r    r  d  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 )Nr:   r   r)  Fr  )	r   r(   rL   r  r  r   Z
cmf_hiddenr   Zchoice_parent_id)r  Z
parent_optr   childZchoice_modelcreate_optionr   r    r-  h  s"    



z;JiraAPIImport._process_custom_fields.<locals>.create_optionr~   r   r   r  r  )N)1r>   rg   r   rJ   r   r   r+   r,   rU   r  r   r   r  rL   r  r  CmfUiFormGroupr   r   rV   r  r   r"  rJ  rB  r   r  r&  r3   r  r   rW  r'  r  r(  r.   r/   CmfUiFormFieldinvalidate_cacheZcustom_fields_gen_metar  r  r  Zcustom_field_sync_update_modelsrl   r  r}   ri   r  )r   Zext_field_namerp   r   ui_view_formr*  shop_fieldsZ
new_fieldsZ
m2m_fieldsZui_fieldr   r  rW  r'  ry  r  ui_form_fieldZfield_classr   r  r   r,  r    _process_custom_fields  s   





6











z$JiraAPIImport._process_custom_fieldsc                    sX  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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}|rt|d!d"|
_|d#d"|
_|d |
_|
jdd$ q8nrg }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js|	D ]}dd&|gd,d&|d-kr6d.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 ]H}|d;kr|	d< r|	d< }
n|d }|d }| d| }t jj|d,gdd=}
|
s| jj	d>| d?| d
| d t jd/||d| jd@}
|
jr| jjdA| dB|
j d
| dC| dD	 nL|
js| jjd6| dE|
j d
| dC| dD	 n||
_||
_|
jdd$ |dF D ](}|d   dGs0q  dHdI}|dJ| jjjj ! 7 }||krdqt"t# fdKdL| j$t jj% dF d }|sq| jjjj d|dM d  }t j&j|dNdOgd}t jjdPd&|gd%d&|ggdQgd4}|r"|js"| jjd6| dR|j' dS|j(j dT q|st jjdPd&|gd%d&|gdUd&dgddVd ggddW}|r| jjd6| dR|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|,  |j-.  |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   Создан экран 'r!  rr  r   T)r  r   r  r+   r   r   u   Экран u|    был изменен пользователем. Изменения из импорта не будут примененыr  )systemr  i  i  i  r  i  ip  )hiddenr  iX  i@  i(#  )	_main   Участники   Даты   Планu   Разработкаu
   СвязиZ_addonr$  _descrre  r5  Fr6  r   r   r  r  z-cmf_created_at)r{   Zorder_byr  )r8  r9  r7  r:  r;  r  r;  r  tabr:  r  Zclick)r{   r5  rl   r~  r   u   На экране u6    не найдена системная группа 'u   '. Возможно она была удалена пользователем. Поля на экране могут отображаться некорректно. Создайте группу с названием 'u$   ' и повторите импортZtabsr*   r7  )r   rl   r#  u   На экран u$    добавлена вкладка ')r  r   r   r  r+   u   C экрана uD    пользователем была удалена вкладка 'r<  uL   ). Изменения из импорта не будут примененыuF    пользователем была изменена вкладка 'rl   r  r  r  rD  c                    s   |  do| d d  kS )Nr   r   rt   r  Zjira_field_idr   r    rx   h  s    
z/JiraAPIImport._process_screen.<locals>.<lambda>r   r   r  r  zui_form_group.typeu    поле 'um   ' было изменено или уже добавлено пользователем во вкладку 'uL   '. Изменения из импорта не будут примененыr!  r  r"  u   ' было удалено пользователем. Изменения из импорта не будут применены)r  r   r   r+   r  )r   r   r  Zrolesr8  )r   r  r9  u    добавлено поле 'r  u   во вкладкуu   в группуz 'r  )/rJ   r   r   r+   r   r   r  rL   rV   ra  rm  r  r   r   r  r  r  r?   rH   rI   r.  r   r5  r6  r  r/  r  r   r1  r   r!  rb  rJ  rB  rz   r{   r   r   r  r   r*  r  r  r  r0  r.   r/   )r   r  r2  r  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_fieldsr3  r  Zfilter_r  Znum_tabsr<  Ztab_idZtab_nameZ
tab_ext_idZ
jira_fieldr   rp   r  r  Z
group_typer   r=  r    r.    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 ),Nr  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>r  r   r   )rb  r  rk  r  r   r|  r  r  r   ;   Не удалось найти логический тип r  CmfUiFormSchemery  rl  u8   Не удалось найти в дампе экран u    для zERR-0069u:   Не удалось импортировать экран zERR-0068r  r  r*  )r  r  Zeditviewri  rj  rh  r   )rb  r  r  Zcrud_choicer+   rl   logic_typesr   u+   : Схема экранов проекта r   r   r+   r  r  )rL   r+   r   r   rJ   r@  r  r   r   r  rm  ZCmfUiFormSchemeRuler   r  r  r3   r   r.  r-   rB  r   r  rb  r  r  r  )r   r2  Zscreen_scheme_dataZscreen_scheme_idr   rb  r  r  Zissue_type_datar  r  r  r  r  r  r>  Zaction_mappingr  r1  r   r   r    rk    s    





z$JiraAPIImport._process_screen_schemec                 C   s6  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 ]\}}
|
d }	| jj	j	j
 d| }tjj|d"gd}tjj||d#}|stj||| jd$}|	d%d&|_|	d'd& |_|jd(kr"i }g }|	d)i  D ].}|d* ||d < |d+ r||d  q||_||_|  qDq,|S ),u1    Импорт конфигураций полейr~  c                 S   s   i | ]}|d  |qS r%  r   r  r   r   r    r  O  s      z5JiraAPIImport._process_field_conf.<locals>.<dictcomp>r   r  r  r  rD  rl   r   ry  r  anyNr   r   5   : Конфигурация полей проекта r   r   r|  r}  r   r?  r  CmfCustFieldConfSchemery  u    для типа     по умолчаниюr   r  Tr#  r   r  )r  r   )r  r   r+   r{  Frz  r  r  r   r)  )r  rL   rJ   r   r   ro   rb  rJ  r+   r   r   rB  r   r   r   r*  r-  r  r3   rU  r  r  r  rV  r  Zvisibler  r   rW  r'  )r   r2  Zlogic_type_fieldslogic_type_field_confr2  r  r~   Z
task_fieldrF  ry  rp   rl   r  rX  r   r  rY  Zfield_idZfield_ext_idr  rZ  rW  r'  r  r   r   r    _process_field_confF  s    




z!JiraAPIImport._process_field_confuA   Обработка схемы конфигурации полейc           
      C   sJ  | 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
r>tjj|dD ]}|jdd q|D ]L\}}|||r|gng d| j d}	|s$d|	d< tjf |	}|jdd
 q|  |S )Nr   r   r   r  r   u@   : Схема конфигурации полей проекта r   TrC  r   rE  rG  r#  re  r  )r   rY  rB  r  r+   r*   r  )r+   r   r   rJ   rF  rL   r  rU  rI  r  r  ZCmfCustFieldConfSchemeRuler   r  r0  )
r   r2  r   rx  rY  rH  r  r  Z
field_confr  r   r   r    rw    sJ    
z(JiraAPIImport._process_field_conf_schemec                 C   s  t dD ]}|   | js q qt dD ]}|  }|s( q>q(|  j|7  _|   |   |   |   |   |   |   |   |   | 	  |   | 
  | jjjr|   |   |   |   |   n|   |   |   |   |   | j rd S d| j_| j  t  |  D ]>}|d dd | jD krZq8| jjd|d  d q8| jd	| jj   | j S )
Nrx  r  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  r  r2   r  rq  r  r  r  rC  r4  r`  r?   rH   rI   rE  rH  r  r  r  r+  r>  r?  r+   r-   r  r  r  r   rT   rV   ra  r,   r  )r   rD  r7   r   r   r   r    process_import  sV    


zJiraAPIImport.process_import)T)r   r   )T)TTN)N)N)r   r  )NN)NN)N)Nr  r  )r$   r%   r&   r'   r   r)   r   r(   r   r   rF   propertyrg   rn   rq   r|   staticmethodr   r   r   r   rX   r   r   r   r   r   r   r   r   r  r<   r  r1  rJ  rA  r   rp  r  r  r  r  rJ   r  r  r  r<  rA  rL  r[  r`  r  r  ry  r  r  rz  r{  r  r	  r   r  r  r  r  r  r  r  r  r  r?  r&  r+  rs  rr  r>  r?  rC  rE  rH  rI  rL  r   r   rR  r  r  r(  rn  r  r  r2  r0  rH  r   rp  ru  r  r  r)  r  r  r  r  rO   r  r  r  r  r  r   r  r  r  r  r  r  r  r  rq  r  r  rt  r  r  ru  r"  r4  r.  rk  rI  rw  rJ  __classcell__r   r   rZ   r    r=   A   sh  
	
!

	#> 


J[9 W
"

 2  

7
  #
>
,
  e
_9

'# Z

 q>
3
6

 
Z
a#<7C=    U"	  m/

- U$ A 4  Bxm-r=   )3Zcmf.appr   Zcmf.includeZdataclassesr  r  r  rO  rf  ri  pathlibr   rh   Ztempfiler   rc  typingr   r   r   r	   r
   r   r   Zbs4r   	itertoolsr   r   Zcmf.data_providers.baser   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   rJ   r   r   r   r   Z	dataclassr   r<   r=   r   r   r   r    <module>   s6   $ 