U
     @i                    @   s   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mZ d dl	m
Z
 d dlmZ d dlmZ d dlmZ d dlT d d	lmZ d d
lmZ e ZdddZedd ZG dd dejZdS )    N)contextmanager)permutations)Path)Queue)BeautifulSoup)cmf_context)*)ZephyrScale)cmf_plugin_zephyr_scalec                    s    fdd}|S )Nc                    s    fdd}|S )Nc              
      s   zt} j dkr"|d|d  7 }|d k	rJ| jjd d| dd dd | j rZW dS  | f||}t  |W S  tk
r } zBt  |  jd7  _| jd|rd| nd	 d
|  W Y dS d }~X Y nX d S )N_simple_dump r   z=====TZ	anonymous   u   Ошибка . )	__name__
cmf_importlog	is_cancel
cmf_commit	Exceptioncmf_rollback
has_errors	log_error)objargskwargs_nameresexc)funcname 0./modules/jira/models/cmf_plugin_zephyr_scale.pywrapper   s     
 
$z3catch_exception.<locals>.decorator.<locals>.wrapperr"   )r    r$   r!   )r    r#   	decorator   s    z"catch_exception.<locals>.decoratorr"   )r!   r&   r"   r%   r#   catch_exception   s    r'   c                	   c   s&   zdt jd< d V  W 5 dt jd< X d S )N1ZNO_CACHEr   )osenvironr"   r"   r"   r#   enable_cache.   s    

r+   c                       s  e Zd Zejjd Zejjdg ZdZ fddZe	dd Z
dd	 Zed
d Zedd ZeedddZdd Zdd Zdd Zdd Zdd Zdd Zedd Zdd  Zd!d" Zed#dd$d%Zdd&d'Zd(d) Zd*d+ Zd,d- Ze d.d/ Z d0d1 Z!d2d3 Z"d4d5 Z#d6d7 Z$d8d9 Z%d:d; Z&d<d= Z'd>d? Z(d@dA Z)ddCdDZ*dEdF Z+dGdH Z,dIdJ Z-dKdL Z.dMdN Z/dOdP Z0dQdR Z1dSdT Z2dUdV Z3dWdX Z4dYdZ Z5d[d\ Z6d]d^ Z7d_d` Z8dadb Z9dcdd Z:dedf Z;dgdh Z<didj Z=e dkdl Z>dmdn Z?dodp Z@dqdr ZAe dsdt ZBdudv ZCdwdx ZDdydz ZEd{d| ZFd}d~ ZGdd ZHdd ZIe dd ZJdd ZKdd ZLeddd ZMeddd ZNdd ZOeddd ZPdd ZQ  ZRS )CmfPluginZephyrScale)clientget_all_projectsNc                    s   t  j|| g | _d| _d S )Nr   )super__init__selected_projectsr   )selfr   r   	__class__r"   r#   r0   A   s    zCmfPluginZephyrScale.__init__c              	   C   sl   | j sf| dddddddg tt| jjt| jj| jj | jj	 | jj
j| jjjt d| _ | j S )	u;    Клиент для работы с Zephyr Scale REST API pluginzplugin.ext_urlzplugin.ext_loginzplugin.ext_passwordzplugin.ext_tokenzplugin.cloudzplugin.verify_ssl)urlusernamepasswordtokencloud
verify_sslZsession)_CmfPluginZephyrScale__clientload_fieldsr	   strr5   Zext_urlZ	ext_loginZext_passwordZdecryptZ	ext_tokenr:   valuer;   ZcmfutilZrequests_sessionr2   r"   r"   r#   r-   G   s(    	



	zCmfPluginZephyrScale.clientc                 C   sN   d}t ||}|r<t|d}| jj d|j d| S td| dS )u   
        Конвертирует ключ Zephyr в код Eva

        Args:
            key (str): ключ

        Returns:
            str: код
        z^([A-Za-z]+)-([A-Za-z]+)(\d+)$   -u8   Не удалось преобразовать ключ N)rematchintgroup_projecttask_code_prefixZcode_prefixr   )r2   keymodelpatternrD   numberr"   r"   r#   convert_code_   s    
z!CmfPluginZephyrScale.convert_codec                  C   s   g } | S )Nr"   )r   r"   r"   r#   calc_models_settingsr   s    z)CmfPluginZephyrScale.calc_models_settingsc                  C   s    dddddddddg} | S )Nr!   displayName)model_fieldattremailemailAddressdoes_not_workactiver"   )Zuser_settingsr"   r"   r#   _get_user_import_settingsw   s
    z.CmfPluginZephyrScale._get_user_import_settings)
field_namec                 C   s&   |sd S | j |gd}|r"|d S d S )N)Zfields_namer   )Zimport_shop_fields)rJ   rW   r   r"   r"   r#   _get_field_name   s    z$CmfPluginZephyrScale._get_field_namec                 C   s    dddd}||kr|| S dS )Nu   ИмяZEmailu   Активный)rO   rS   rU   r   r"   )r2   rQ   mappingr"   r"   r#   _get_setting_title_by_attr   s    z/CmfPluginZephyrScale._get_setting_title_by_attrc           
   
   O   s   |  dg | jj| _g }z| j}| D ]}|d |d< |d }|d|d  d7 }d| j d|d  d}tjjd	d
d| dgdddgd}|r|d7 }||d< || q,W 5 Q R X W n. t	k
r }	 zt
|	  W 5 d }	~	X Y nX |S )Nzplugin.source_hashr!   original_name (rI   )::idext_idLIKE%T--rH   )filterZinclude_deletedfieldsu    [импортирован])r=   r5   source_hashr-   Zget_projectsmodels
CmfProjectsgetappendr   gdebug)
r2   r   r   projectsr-   project_dataproject_nameproject_ext_idprojectr   r"   r"   r#   r.      s.    

z%CmfPluginZephyrScale.get_all_projectsc                    s   g  |_ j dg  fdd}d }j  d}| rVdD ]} qVqL|sdd jjjjdd	D }|r|d
 }|st	d||j
tj  dg d  S )Nzplugin.plugin.*c                    sj   | }|D ]H} | |d |d< ||d |d< |d |d< |j|d< q
 |j|d d S )NrQ   Zfile_valrP   titleicon)r!   re   )
_get_valuerX   rZ   rs   rj   verbose_name)r   Zsettings_funcrJ   Zobj_settingssettingresultr2   r"   r#   _get_settings   s    zACmfPluginZephyrScale.tmplt_import_settings.<locals>._get_settingsrm   usersc                 S   s   g | ]}|qS r"   r"   ).0r   r"   r"   r#   
<listcomp>   s     z>CmfPluginZephyrScale.tmplt_import_settings.<locals>.<listcomp>r   )r7   Z	limit_endr   ua   Не найдено ни одного пользователя, импорт невозможенselectedObjects)r!   r?   )r   r=   get_download_pathjoinpathexists_simple_getr-   	get_usersr7   r   rV   rg   	CmfPersonrj   )r2   r   ry   userprojects_dirrz   r"   rw   r#   tmplt_import_settings   s$    	z*CmfPluginZephyrScale.tmplt_import_settingsc                 C   s>   | j jjd}t|| _| jr2tjj|d| _nt	j
| _dS )u   
        Устанавливает резервного пользователя,
        если пользователь не будет найден в методе _get_person()
        default_user_idr_   N)r   json_settingsr?   getbool_is_default_userrg   r   _fallback_personrk   Zsystem_user)r2   r   r"   r"   r#   _set_fallback_person   s
    
z)CmfPluginZephyrScale._set_fallback_personc                 C   s:   | j d d d }|d s"tddd |d D | _d S )	Nr}   r?   r   	isCheckedu8   Не выбраны проекты для импортаc                 S   s$   g | ]}|d  r|d r|d  qS )r   r   r"   )r{   sr"   r"   r#   r|      s    z?CmfPluginZephyrScale._set_selected_projects.<locals>.<listcomp>children)settingsr   r1   )r2   Zroot_selectedr"   r"   r#   _set_selected_projects   s    z+CmfPluginZephyrScale._set_selected_projectsc                 C   sH   t jj}| dD ]0}|| j}|| jj d| t	
| qd S )Nrz   :user:)APPREDIS_DBredisr   r   user_keysetr   r_   pickledumps)r2   redis_db	user_datarI   r"   r"   r#   _cache_all_users   s    z%CmfPluginZephyrScale._cache_all_usersc                 C   s   |sdS |  |}|S )u`   
        Метод получает значение параметра объекта
        N)r   )Zobj_datarQ   r?   r"   r"   r#   rt      s    
zCmfPluginZephyrScale._get_valuec                 C   s   |dkr| S |S )NrT   r"   )r2   rW   r?   r"   r"   r#   _normalize_value   s    z%CmfPluginZephyrScale._normalize_valuec                 C   sP   i }|D ]B}|d sq|  ||d }| |d d |}|||d d < q|S )uC    Преобразование настроек для модели rP   rQ   rW   )rt   r   )r2   r   r   Znormalized_objrv   r?   r"   r"   r#   _normalize_obj  s    
z#CmfPluginZephyrScale._normalize_obju   Дампc           	   	   C   s   |pg }|p| j  }|| d}| r8t| || d}t|d<}|| D ],}| j  jd7  _|t	j
|ddd  q\W 5 Q R X t|| | j jjdd	 d S )
N.jsonz.json.dirtya+r   F)ensure_ascii
TZ	only_data)r   r~   r   r   r)   removeopenjson_object_countwritejsonr   shutilmover?   save)	r2   	file_nameapi_funcapi_argspath	file_pathZfile_tmp_pathfrowr"   r"   r#   r     s    
$z!CmfPluginZephyrScale._simple_dumpc              	   c   sV   |p| j  }|| d}| rRt|d}|D ]}t|V  q6W 5 Q R X d S )Nr   r+)r   r~   r   r   r   r   loads)r2   r!   r   r   r   r   r"   r"   r#   r   %  s    z CmfPluginZephyrScale._simple_getc           	   
   C   s   t |d }|d }|d }z| j|}| j d| }tjj|| jddgd}|svtj|d| || j| j|d	}||_|j	s|
 sd
|_|  t  W nN tk
r } z0t  | jjd| d| d| dddd W 5 d}~X Y nX dS )u   
        Создает задачу на скачивание вложения

        Args:
            attachment_data (dict): сырые данные вложения
        r_   r!   fileNamer^   r   
downloaded)
obj_ext_idrf   re   z/rest/tests/1.0/attachment/)r!   hrefr   rf   r   import_raw_jsonFu\   Не удалось создать задачу на скачивание вложения '' (). ERR-0007CmfImportDownloaddump
error_codeobj_type
error_typeN)r>   _attachments_dirr   rf   rg   r   r   r   r   Z
is_changedr   r   r   r   r   r   r   )	r2   attachment_dataatt_idatt_nameatt_file_nameZattachment_fileZattachment_ext_iddownload_jobr   r"   r"   r#   _pre_dump_attachment.  sB    
z)CmfPluginZephyrScale._pre_dump_attachmentc                 C   s    | dg D ]}| | qdS )u   
        Создает задачи на скачивание вложений сущности теста

        Args:
            test_entity_data (dict): сырые данные сущности теста
        attachmentsN)r   r   )r2   test_entity_datar   r"   r"   r#   _pre_dump_attachmentsX  s    z*CmfPluginZephyrScale._pre_dump_attachmentsc           
      C   s   |sdS d}| d}t |d}|dD ]b}|ds:q*|d }||krLq*t||}|s^q*|d}|d| d| d	d
}	| |	 q*dS )ud  
        Создает задачи на скачивание изображений, встроенных в текст HTML.
        Встроенные изображения не учитываются в параметре 'attachments' в данных сущности теста

        Args:
            html_text (str): текст HTML
        N!/rest/tests/1.0/attachment/image/(\d+)lxmlimgsrcr   	embedded_T)r_   r   r!   embedded)r   find_allhas_attrrC   searchrF   r   )
r2   Z	html_textsrc_pathrK   Zsoupr   	src_valuerD   img_idr   r"   r"   r#   _pre_dump_embedded_imagesb  s*    



z.CmfPluginZephyrScale._pre_dump_embedded_imagesc              	   C   s   | d}| rt| | j||}t|dF}|D ]:}|tj	|dddd  | 
|d | jd q:W 5 Q R X d S )	Ncomments.jsonr   FT)r   	sort_keysr   bodycomment)r   r   r)   r   r-   Zget_comments_forr   r   r   r   r   r   r   inc_stat)r2   entity_nametest_entity_idtest_entity_dircomments_fileZcommentsr   r   r"   r"   r#   _dump_test_entity_comments  s    

z/CmfPluginZephyrScale._dump_test_entity_commentsc           $      C   sv  t dd` | jd }| jd }| jd }| }	|	d krJ||	 qh|	\}
}z|||
|d}|d D ]}|d }|d }|d }|d}| jj| d	| d
| d ||}|jdd |dkr| j	
|}|d}t|ddd}tj||dddd W 5 Q R X |r,|t|}|jddd t||d< |d}t|ddd}tj||dddd W 5 Q R X | | ddgdgdgd}||g D ]}| || q|dkr|d dpg }|D ]6}| | dddg}|D ]}| || qqn|d kr|d!p4g }|D ]}d }|d"pPg }|D ]} | d#rV| } qqV|r|d$ }|sq:| | | |d% |d& }!|!D ]8}"| |" dddd%g}|D ]}| |"| qАqq:| ||| qlW q, tk
rd }# zB| jjd'| d(| d
| d)| d*|
 d+| d,|# d-d.d/d0 W 5 d }#~#X Y q,X q,W 5 Q R X d S )1NFZinit_views_and_dsr_   rI   r!   )offsetlimitresultsmajorVersionz 'r   r]   Texist_oktestcaseversions.jsonwutf-8)encoding   )indentr   r   )parentsr   dir	info.json	objectivepreconditiondescriptionr   testruntestplan
testScriptstepstestDataexpectedResultr   testRunItemstestResultslastTestResultr   testScriptResultsu&   Не удалось получить 'u   ' проекта ') [z	] offset=z limit=r   zERR-0002CmfTestcaser   r   )r   _project_datar   putr   loggerinfor   mkdirr-   Zget_testcase_versionsr   r   r   r>   r   r   r   r   r   )$r2   entity_titler   get_test_entities_funcpagination_queue
entity_dir
project_idproject_keyro   Z
paginationr   r   Ztest_entitiesr   r   Ztest_entity_keyZtest_entity_nameZtest_entity_versionr   Zversions_dataZversions_filer   Ztest_entity_fileZtest_entity_text_fieldsZ
text_fieldr   	step_dataZtext_fieldstestrun_itemstestrun_itemZtest_result_datatest_resultstest_resultZstep_resultsZstep_result_datar   r"   r"   r#   _dump_test_entities_worker  s    







 
 







,z/CmfPluginZephyrScale._dump_test_entities_workerc              
   C   s   t | jd |}|jdd || jd }d}t }t|| d | D ]}	||	| |f qL|d  g }
t| jD ]R}tj	| j
d|d  |||||dd	}|
| |  | jjd
|  q||
D ]}|  qd S )Nr   Tr   r_   2   r   Z_dump_test_entities_worker_)r  r   r  r  r  targetr!   r   u$   Запущен обработчик )r   r	  r   r  r   ranger
  download_threading_max_forks	threadingThreadr  rj   startr   r  r  join)r2   r  r   Zget_total_entities_funcr  r  totalr   r  Zpagethreadsithreadr"   r"   r#   _dump_test_entities  s2    

z(CmfPluginZephyrScale._dump_test_entitiesc                 C   s  | j  d}|jdd t| j}td| }| jD ]j}|d }|d }|dp`|d}z| j  rxW  d S | j  j	d	7  _	| j j
d
| d| d| d ||}|| d}	| rt||	 n|	jdd | j|}
t|	|
d< | jd| jj|g|	d | jd| jj|g|	d | jd| jj|g|	d | jd| jj|g|	d | jd| jj|g|	d | jd| jj|g|	d | jd| jj|g|	d | jd| jj|g|	d | jd| jj|g|	d | jd| jj|g|	d | jd| jj|g|	d dD ]N}| j||}|	d| d}t|d}t j!||d d!d" W 5 Q R X q
t" , | j  j#|7  _#| j j$j%dd# t&  W 5 Q R X t|	| t||
d< |d$}t|d}t j!|
|d d!d" W 5 Q R X |
| _'t(| j'd d%| _)| j)jdd | *d&d'| jj+| jj, | *d(d)| jj-| jj. | *d*d+| jj/| jj0 W q8 t1k
r } z2|  j2d	7  _2| j j3d,| d-| d.d/d0d1 W 5 d }~X Y q8X q8| j 4d2 d S )3Nrm   Tr   P   r_   rI   r[   r!   r   u   Дамп проекта 'r   r  ].dirtyr   Zpermissions)r   r   r   ZroleslabelsenvironmentsZ
iterationsZdatasetsZtestcase_prioritiestestcase_statusestestplan_statusestestrun_statusesZtestresult_statusesr   Zfoldertree_r   zw+r   F)r   r   r   r   r   u   Тест кейсr   u!   План тестированияr   u   Тестовый прогонr   u2   Не удалось получить проект r   zERR-0003rh   r   )r   r   u*   Дамп проектов завершен)5r   r~   r   r  lenr1   rE   r   r   r   r  r  r   r   r   r-   Zget_projectr>   r   Zget_permissionsZ	get_rolesZ
get_labelsZget_environmentsZget_iterationsZget_datasetsZget_testcase_prioritiesZget_testcase_statusesZget_testplan_statusesZget_testrun_statusesZget_testresult_statusesZget_foldertree_forr   r   r   r+   progressr?   r   r   r	  r   r   r'  Zget_total_testcasesZget_testcasesZget_total_testplansZget_testplansZget_total_testrunsZget_testrunsr   r   r   r   )r2   r   Zcntsteprq   r  r  ro   project_dirZproject_tmp_dirrn   Zentityfoldertree_datafoldertree_filer   Zproject_data_filer   r"   r"   r#   _dump_projects7  s   


 
z#CmfPluginZephyrScale._dump_projectsc              	   C   s   t d}| jjj|_|| jjj | j }t	|\}}}|| d }| jj
d| d | jj
d | d| jj t   d| j_| jj  t  W 5 Q R X | jj
d |   d S )	Nzatlassian.rest_clientd   u   Свободно места: rb   u5   Скачивание данных через API ... rz      u,   Дамп выбранных проектов)ZloggingZ	getLoggerr   r  ZhandlersZsetLevellevelr~   r   
disk_usager  r   r-   r   r+   r1  r?   r   r   r6  )r2   r  Zdownload_pathr#  usedfreeZfree_percentr"   r"   r#   download_data  s    

z"CmfPluginZephyrScale.download_datac                 C   s0  zt jj|dddddgd}t|j}| j| jjt|j}t|j	}t|j
d}t|dkrvd	|d  d
nd}d}|jj}	|	r|	d}
|
rt|
tr|
d }d|dd|
 d}| jj| d| d| d| d t }| jj||ddddtjd}t | }|d }
|
d }|d|dd|
 d7 }|	r|	dsX|
|	d< |	dr~|d r~|d }||	d< |	|_d|_|  t  | jd | jj| d| d| d | d |
|fW S  tk
r* } z8t  | jj| d!| d| d"| d#d$d%|d&  W 5 d'}~X Y nX d'S )(u  
        Скачивает файл вложения

        Args:
            download_job_id (str): ID задачи на скачивание вложения

        Returns:
            tuple: размер файла в байтах, время скачивания
        r!   r   r   r   r   )r_   re   r^   r   z[ID: z] r   ZfileSize   r\   .3fu    MБ / u
    байт)u   Скачивание ''z: 'zapplication/octet-streamr   z
keep-alive)ZAcceptzAccept-CharsetZ
Connection)Zheaderstimeout	file_sizer   r   T
attachmentu
   Файл 'u    сохранен в 'u"   Ошибка скачивания z'. r   r   r   )r   r   r   Zext_hrefN) rg   r   r   r>   r!   r-   Z
url_joinerr6   r   r   r   splitr0  r   r?   
isinstancerE   r   r  r  timeperf_counterZdownload_fileZconfigZIMPORT_DOWNLOAD_TIMEOUTr   r   r   r   r   r   r   )r2   download_job_idZdownload_objr   Zatt_urlr   Zext_id_splitZfile_id_msgZfile_size_msgZ	file_datafile_size_bytesZfile_size_mbr!  rx   download_timer   r"   r"   r#   _download_file  s    



 


z#CmfPluginZephyrScale._download_filec                 C   s2  t  j}t  j}d}d}d}d}d}	tdd | j r@q| }
|
dkrRqzLz*| |
\}}||7 }|	|7 }	|d7 }W n t	k
r   |d7 }Y nX W 5 |d7 }X q4|d }|	dkr||	 nd}|||||	f}|
| | jjd| d| d	| d
| d| d|dd|dd| d W 5 Q R X d S )Nr   Fr   DONEr   r>  u   Поток 'z' (ID: uU   ) завершен. Скачано файлов (успешно/неуспешно): /    из 8   . Средняя скорость скачивания: .2f)    МБ/с. Скачанный объем: r?      МБ / 	    байт)r  current_threadr!   identr   r   r   r   rK  r   r
  r  r  )r2   download_queueresult_queueZthread_nameZ	thread_iderror_countdownloaded_counttotal_countdownloaded_bytestotal_download_timerH  rI  rJ  Zdownloaded_mb
speed_mb_sZstatsr"   r"   r#   _download_file_workerS  sB    



8z*CmfPluginZephyrScale._download_file_workerc                 C   sp  dd| j gdddgg}| j d}d}g }| jD ]r}t|d }||}t|dsht|d }d	d
| dgg}|| }	tjj	|	d}
|
r4||
7 }|
|	 q4|s| jjd dS | jjd|  t }t }d}d}d}d}d}g }t| jD ]N}tj| jd|d  ||dd}|
| |  | jjd|  q |D ].}tjj|ddgdD ]}||j qlqTt  |D ]}|d q|D ]}|  q| j r| jjd | s| \}}}}}||7 }||7 }||7 }||7 }||7 }q|d }|dkr0|| nd}| jjd| d| d| d|dd|dd| d  |S )!Nrf   =r   Frm   r   r_   rM  r   ra   rb   rd   u3   Нет вложений для скачиванияu'   Скачивание вложений: Z_download_file_worker_r   )rV  rW  r  u   Запущен поток rc   rd   re   rL  u   Импорт прерванr>  u{   Скачивание вложений завершено. Скачано файлов (успешно/неуспешно): rN  rO  rP  rQ  r?  rR  rS  )rf   r   r~   r   r1   r>   endswithrg   r   countrj   r  r  r   r  r  r  r   r^  r!  Zslistr
  r_   r   r"  r   warningemptyr   )r2   Zmain_filterZprojects_pathZattachment_countfiltersrn   r  Zproject_pathZpath_filterZdownload_filterZdownload_countrV  rW  Z
main_countZtotal_downloadedZtotal_errorsZtotal_downloaded_bytesr\  r$  r%  r&  filter_r   rZ  rY  rX  r[  rJ  Ztotal_downloaded_mbr]  r"   r"   r#   download_files  s    




,z#CmfPluginZephyrScale.download_filesc                 C   s   t jj}|| jj d| }|d k	r2t|S | dD ]}|| j	|krX|  S |dd
 |
 krx|  S |dd
 |
 kr|  S |dd
 |
 kr|  S |dd
 |
 kr<|  S q<td| d S )	Nr   rz   r!   r   r7   rS   rO   uH   В дампе не найдены данные пользователя )r   r   r   r   r   r_   r   r   r   r   lowerr   )r2   user_idr   Z	user_infor"   r"   r#   _get_user_data_from_dump  s     

z-CmfPluginZephyrScale._get_user_data_from_dumpc              	      sv  |  || jtjj d }| jjs|d  td|d }dd |D }t	|dkr fdd|D } fd	d|D }|r|d
 |d< n|r|d
 |d< n|d
 |d< |
|d  |d
 |d< d| j 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rt	|dkrb|d
 |d< d|d< d|d< nbt	|dkr|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}|rd|jjd| j ddkrd| jjd | d!|j d"d#dd$ |srd%dd&d'| j d(gdd)d gg}tjjd*d+|d g|g|d}|srtjjdd+|d g|g|d}t	|dkr| jjd,|d  d-t	| d.dd |  jd7  _g }|s| jjd/|d   dd+|d g|g}tjj||d}|sd%g}t|t	|D ]}t	|dkrdd+|d
 g}nnt	|dkr|dd+|d
 gdd+|d gg n<t	|dkrl|dd+|d
 gdd+|d gdd+|d gg ql||g}tjj||d}t	|dkrd|  jd7  _| jjd0|d  d1|d  d2t	| d3dd |rr|d
 }|S )4Nre   r!   z[,;\s]+rR   c                 S   s   g | ]}|  r|  qS r"   )stripr{   rR   r"   r"   r#   r|      s      z8CmfPluginZephyrScale._process_person.<locals>.<listcomp>r   c                    s"   g | ]} | d d kr|qS @r   rD  rm  Z
user_loginr"   r#   r|     s      c                    s"   g | ]}| d d  kr|qS rn  rp  rm  rq  r"   r#   r|     s      r   Zemail_2r^   r   r   	last_namer   
first_namesecond_namerA   u?   Часть полного имени пользователя 'u   ' длиннее u_    символов. Фамилия, Имя и Отчество не были заполнены.zERR-0004r   r   r   Zrg_member_ofr`   ra   rb   ra  uP   Возможно найден некорректный пользователь ud   ,так как ext_id содержит несколько ID из одного источника: 'uq   '.Необходимо повторно импортировать локальных пользователей.zERR-0005r   r   ORzNOT LIKEz%::z::%z==ZloginILIKEu+   Пользователей с почтой z > ERR-0006uH   Не удалось найти пользователя с почтой u+   Пользователей с именем r\   z) > r   )r   r   rg   r   ru   r-   r:   rC   rD  r0  r   rf   r   minrs  
max_lengthrr  rt  r   r   r   r   r`   r?   rc  listr  rd  r   rj   )r2   r   Znormalized_dataZemailsZemails_by_loginZemails_by_namer`   Z	full_nameZcurrent_length_namer!   Zmax_length_namere   personZnot_source_hash_filterZpersonsZ_filterZ
name_combor"   rq  r#   _process_person  s    



$
 z$CmfPluginZephyrScale._process_personFc              
   C   s   |r|dkrdS z*|  |}| |}|s8td| W nn tk
r } zP|rT nD| j}| jrjd| nd}| jj| d| ddd	 |  jd
7  _W 5 d}~X Y nX |S )u  
        Возвращает пользователя по какому-либо идентификатору (id, имя, логин, email и др.).

        Args:
            user_id (str): Идентификатор пользователя для поиска.
            raise_on_error (bool, optional): Вызвать исключение при ошибке поиска
                или вернуть резервного пользователя ('Система' или пользователь по умолчанию).
                Defaults to False.

        Raises:
            Exception: Исключение при ошибке поиска пользователя.

        Returns:
            CmfPerson: Объект пользователя.
        unknownNue   Пользователь с указанными данными не найден в системе: u   по умолчанию u   'Система'u;   . Будет установлен пользователь zERR-0008r   ru  r   )rk  r~  r   r   r   r   r   r   )r2   rj  Zraise_on_errorr   r}  r   Z
person_msgr"   r"   r#   _get_person  s*    

 z CmfPluginZephyrScale._get_personc              
   c   s   | j  dt|d}| s>| j jd| d|  d S d}| D ]}| sXqJ|j	}|
drjqJt|dd}t|}W 5 Q R X d	}|D ]}	|	d
 rt|	d } qq||d}
|
 sqJt|
d}t|V  W 5 Q R X |d	7 }qJd S )Nrm   r      Каталог     отсутствует. Возможно он был удален или еще не создан. Необходимо повторно запустить импорт проекта r   r*  z.metar   rr   latestVersionr   r   r   r   r~   r   r>   r   r  rd  iterdiris_dirr!   rb  r   r   load)r2   r  Ztestcases_dirrc  Ztestcase_dirtestcase_keyr   Zversionsmajor_versionversiontestcase_filer"   r"   r#   _get_project_testcases  s<    
  
z+CmfPluginZephyrScale._get_project_testcasesc              
   c   s   | j  dt|d}| s>| j jd| d|  d S d}| D ]^}| sXqJ|j	}|
drjqJ|d}| s~qJt|d}t|V  W 5 Q R X |d	7 }qJd S )
Nrm   r   r  r  r   r  r   r  r   r  )r2   r  Ztestplans_dirrc  Ztestplan_dirtestplan_keytestplan_filer   r"   r"   r#   _get_project_testplans  s.    
  

z+CmfPluginZephyrScale._get_project_testplansc              
   c   s   | j  dt|d}| s>| j jd| d|  d S d}| D ]^}| sXqJ|j	}|
drjqJ|d}| s~qJt|d}t|V  W 5 Q R X |d	7 }qJd S )
Nrm   r   r  r  r   r  r   r  r   r  )r2   r  Ztestruns_dirrc  Ztestrun_dirtestrun_keyZtestrun_filer   r"   r"   r#   _get_project_testruns  s.    
  

z*CmfPluginZephyrScale._get_project_testrunsc              
   c   s`   | j  d}| r\| D ]:}|jdr2q t|dd}t	|V  W 5 Q R X q d S )Nrm   r  r   r   )
r   r~   r   r   r  r!   rb  r   r   r  )r2   r   r3  r   r"   r"   r#   _get_projects  s    z"CmfPluginZephyrScale._get_projectsc                 C   sL   |sd S | j  d| }tjj|ddgd}|sH| jjd| d|d |S )Nz
::version:r_   rc   r`   re   u!   Не найдена версия zERR-0009r   )rf   rg   ZCmfListr   r   r   )r2   r   Z
version_idr`   r  r"   r"   r#   _get_version#  s    z!CmfPluginZephyrScale._get_versionc           	      C   s   g g d}|D ]}| d}|s"q| j d| }tjj |ddgd}|sf| jjd| dd	|d
 q|d d }|dkr|d | q|d | qdd | D S )N)defectscoverageZissueIdr^   rc   r_   r  u!   Не найдена задача uC   . Возможно она не импортирована из JirazERR-0018r  typeZ	systemKeyZBLOCKSr  r  c                 S   s   i | ]\}}|r||qS r"   r"   )r{   kvr"   r"   r#   
<dictcomp>M  s       z8CmfPluginZephyrScale._get_task_links.<locals>.<dictcomp>)r   rf   rg   ZCmfTaskr   r   rj   items)	r2   r   trace_links
task_links
trace_linkZissue_idZtask_ext_idZtaskZ	link_typer"   r"   r#   _get_task_links2  s*    

z$CmfPluginZephyrScale._get_task_linksc           
      C   s   t jjj}|D ]}|d}|d}|s,q|d}| j d| }t jj|d}	|	slt j||| jdd}	|	jr||	_|p|d | |	_||	_	|	j
dd qd S )	Nr6   ZurlDescriptionr_   r^   r`   Tparentr`   r   import_originalZsave_import)rg   ZCmfLinkr!   r{  r   rf   r   r  r6   r   r   )
r2   r   r  Zmax_link_name_lengthr  r6   Zurl_descriptionZlink_idZlink_ext_idlinkr"   r"   r#   _process_web_linksO  s*    



z'CmfPluginZephyrScale._process_web_linksc                 C   s  d}| d}| dD ]}|ds*q|d }||kr<qt||}|sNq|d}d| }	| j d|	 }
tjjdd	|
gd
ddggdddgd}|rt	|j
 rtjj|
dddgd}|sL|j}|r|d n|	}tj||	|d|
|j| jdd}|jdd tt	|j
d,}|j| ddd d|_|jdd W 5 Q R X |jd |jd< t|j|jd< t|j|jd< d|jd< q| jjtj d|	 dd |d! qd"S )#u   
        Конвертирует путь src у встроенного изображения

        Args:
            obj (_type_): объект теста
            text_soup (BeautifulSoup): объект текста
        r   r   r   r   r   r   r^   r   ra   r   r_  Trc   r   r   ra  r6   Zurl_previewZurl_preview_imgr  r!   )r!   r   r  r   r`   r   r   r  r  rbFZsmart_backupZ
mark_dirtyZsrc_origzdata-attach-idZcmf_convertedu    Не найден файл 'r@  ry  r   r   N)r   r   rC   r   rF   rf   rg   r   ri   r   r   r   CmfAttachmentr   r   r   r   r   upload_filereadr  Zattrsr>   r6   r_   r   
thread_ctxtest_entity_msg)r2   r   	text_soupr   rK   r   r   rD   r   Zimg_nameZ
img_ext_idZdownloaded_filerC  Zatt_datar!   r   r"   r"   r#   _convert_embedded_img_srch  sv    




z.CmfPluginZephyrScale._convert_embedded_img_srcc              
   C   s   |s|S z<t |d}| || |jr>ddd |jjD n|}W n\ tk
r } z>t|jdk}| jj	t
j d|rzdnd d| d	|d
 W 5 d }~X Y nX |S )Nr   r   c                 S   s   g | ]}t |qS r"   r>   )r{   cr"   r"   r#   r|     s     z6CmfPluginZephyrScale._convert_text.<locals>.<listcomp>
CmfCommentu4    Не удалось обработать текстu    комментарияr   zERR-0026r  )r   r  r   r"  r   r   r   
class_namer   r   r  r  )r2   r   textr  r   Z
is_commentr"   r"   r#   _convert_text  s    
&z"CmfPluginZephyrScale._convert_textc                 C   s  |sd S | j jtj ddd |D ]}z&t|d }|d }|d }| j|}| sftd| j	 d| d| }t
jj|d	}	|	st
j||| j dd
}	|	jr<||	_||	_|d|	_|dr| |d |	_ntj|	_|	j|	_||	_|	jdd t|d,}
|	j|
 ddd d|	_|	jdd W 5 Q R X t  | j dd W q$ tk
r } zBt  | j jtj d| d| d| d|d t jd7  _W 5 d }~X Y q$X q$d S )Nu$    Обработка вложенийTr   r_   r!   r   uf   Не найден файл. Возможно при скачивании возникли ошибкиr^   r  r  	createdOnZuserKeyr  r  Fr  rC  	processedu<    Не удалось обработать вложение 'r   r   ERR-0014r  r   ) r   r   r  r  r>   r   r   r   r   rf   rg   r  r   r  r!   r   cmf_created_atr  
cmf_authorrk   Zanonymous_user	cmf_ownerr   r   r   r  r  r   r   r   r   errors)r2   r   Zattachments_datar   r   r   r   Zatt_fileZ
att_ext_idrC  r   r   r"   r"   r#   _process_attachments  sj    


z)CmfPluginZephyrScale._process_attachmentsc              	      s    fdd | d}t|d}t|}W 5 Q R X tjjjddddgd	}|d
 D ]} || qZttj	j
dd|gdgdd|_|jdd t  d S )Nc                    s   | d }| d }| d }j d| d| d j d| d| }tjj|dd	gd
}|svtjj|j dd}||_||_t	| d |_
| |_|  | d D ]} || qd S )Nr_   r!   	projectIdu   Папка 'r   r]   r^   tree_parenttree_node_is_branchr  Tr  r   )r   r   rf   rg   CmfTestcaseFolderr   rG   r!   r  r   r  r   r   )folder_datar  	folder_idZfolder_namer  testcase_folder_ext_idtestcase_folderZsubfolder_data_create_testcase_folderr2   r"   r#   r    s2    zOCmfPluginZephyrScale._process_testcase_folders.<locals>._create_testcase_folderzfoldertree_testcase.jsonr  u   Тест-кейсыr  Tr  r  r!   r  systemre   r   r  r_  rc   rd   re   include_archivedr  )r   r   r   r  rg   CmfRegistryr   rG   r   r  ri   r  r   r   )r2   r3  r5  r   r4  r  r  r"   r  r#   _process_testcase_folders  s,    
z.CmfPluginZephyrScale._process_testcase_foldersc                 C   sp   t jjdd| _dddd}i | _| d|D ]<}|dd	 }||d}t jj|| jd
}|| j|< q.d S )Ntestcase.base:defaultcodedraftapprovedfailr  r  Z
deprecatedr-  r!   r   r  workflow)rg   CmfWorkflowr   _testcase_workflow_testcase_statusesr   ri  	CmfStatusr2   r3  Z
status_mapZstatus_dataZstatus_nameZstatus_codestatusr"   r"   r#   _set_testcase_statuses<  s    z+CmfPluginZephyrScale._set_testcase_statusesc                 C   s   dddd}| | pdS )Nr   r   r  )ZhighZnormalZlow)r   ri  )r2   Zpriority_nameZsignificance_mapr"   r"   r#   _get_significanceL  s
    z&CmfPluginZephyrScale._get_significancec                 C   s  ddl m} |dg }|r4| jjtj ddd g }|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
d| d||	 W q< t
k
r }
 z0| jjtj d|
 d|d t jd7  _W 5 d }
~
X Y q<X q<|S )Nr   translitr+  u    Обработка теговTr   r   _#r   ruZlanguage_codereversedrw  aliasrx  ""%r!   r`  u   Тег 'u   ' не найденzERR-0010r  r   )transliterater  r   r   r   r  r  replacerg   CmfTagr   rj   r   r  )r2   testcase_objtestcase_datar  Ztestcase_labelstagsZlabelr  rg  tagr   r"   r"   r#   _get_testcase_tagsT  s:    
"z'CmfPluginZephyrScale._get_testcase_tagsc                 C   sb   g }| d}|r^| j d| }tjj |ddgd}|rF|| n| jjd| d|d |S )	NZcomponentIdr^   r_   rc   r  u%   Не найден компонент zERR-0011r  )r   rf   rg   ZCmfComponentrj   r   r   )r2   r  r  
componentsZcomponent_idZcomponent_ext_idZ	componentr"   r"   r#   _get_testcase_componentsv  s    
z-CmfPluginZephyrScale._get_testcase_componentsc                 C   s   |d }| d}| j d| d}tjj |d}|rl|sPtjd||| jdd}| |||_|jdd	 n|r||jdd
 t	  d S )NrI   r   r^   z::prer  ZpreTstep_sectionr  r`   r   r  r  )ZTEXKOM_db_delete)
r   rf   rg   CmfTestcaseStepr   r  r  r   deleter   )r2   r  r  r  Ztestcase_preconditionstep_ext_idtestcase_stepr"   r"   r#   _process_testcase_prestep  s$    
z.CmfPluginZephyrScale._process_testcase_prestepc                 C   s   |d  dpg }|D ]}| dr&q|d }|d }| d}| d}| d}	| j d	| }
tjj |
d
}|stjd||
| jdd}| |||_| |||_| ||	|_|d d |_	|j
dd | || dg  qt  d S )Nr   r   testCaser_   indexr   r  r   r^   r  mainTr  r     r  r   )r   rf   rg   r  r   r  r  expected_result	test_dataordernor   r  r   )r2   r  r  r   r2  step_idZ
step_indexZstep_descriptionZstep_expected_resultZstep_test_datar  r  r"   r"   r#   _process_testcase_steps  s4    



z,CmfPluginZephyrScale._process_testcase_stepsc                 C   s   | j  d| d|d  }tjj|d}|sBtj||| jdd}n|dg |jr|drv| |d |_|j|_	|dr|d |_
|j
|_||_||_| ||d	|_|jdd
 t  d S )Nr^   r_   r  Tr  z**	createdByr  r   r  )rf   rg   r  r   r   r=   r  r  r  r  r  cmf_modified_atr  r   r  r  r   r   )r2   r   obj_keycomment_dataZcomment_ext_idr   r"   r"   r#   _process_comment  s,    


z%CmfPluginZephyrScale._process_commentc           	      C   s  t |d}| sH| jjtj d| dd|d t jd7  _d S | j	dkr| jj
tj dd	d
 t|d}|D ]}z*t|}| ||| | jdd W q tk
r
 } z<t  | jjtj d| d| d|d t jd7  _W 5 d }~X Y qX qW 5 Q R X d S )Nr   u6    Файл комментариев не найден 'u\   '. Возможно при дампе комментариев возникли ошибкиzERR-0012r  r   r   u,    Обработка комментариевTr   r   r   r  uB    Не удалось обработать комментарий: r   zERR-0013)r   r   is_filer   r   r  r  r  statst_sizer   r   r   r   r  r   r   r   )	r2   r   Zobj_dirr	  r   r   r   r
  r   r"   r"   r#   _process_comments  s8    

z&CmfPluginZephyrScale._process_commentsc                 C   s  dt _|d }| |tj}|d }d| d| dt _| jjt j ddd	 | j d
| }tjj	|dddgd}|stj
j	dddgd}tj||| j|| jdd}|jr||_|d |_| j|_| j	|d d  |_| |d d |_|	ddd d |_| |	d|_|	dr<| |d |_n|j|_|	dr`| |d |_|	d|_|	dp||j|_|	dr|d d }|d d }	| j d
| d
|	 }
tjj	|
d }||_||_|j dd! ||_!|d" |_"| #||	d#|_$| %|||_&| '|||_(|j dd! t)  |	d$g }| *||}|+ D ]"\}}|d%krl||_,n||_-qR|j dd! | .|| | /|| | 0|| n| jj12t j d& | 3||	d'g  | 4||d( | | jjt j d)t j dd	 | j5d*d+ t jS ),Nr   rI   r   u   [Тест кейс z (vz)]     Начало обработкиTr   r^   deffectscovered_tasksr`   r  re   r  rc   r_   )r  re   )r  
logic_typer  r`   r   r  r!   r  priorityestimatedTimer  <   r  owner	updatedByr  	updatedOnfolderr  r  r  r  r   
traceLinksr  v    был изменен пользователем. Новые данные из импорта не примененыr   r   8    Завершение обработки. Ошибок: r   r  )6r  r  rM   rg   r  r  r   r   rf   r   ZCmfLogicTyperG   r  r  r!   r  r  r  ri  r  r  Zsignificanceestimate_timer  r  r  cmf_modified_byr  r  r  r  r   r   Zcmf_ver_numberZcmf_ver_curr  r  r  r  r  r  r   r  r  r  r  r  r  r  r  rd  r  r  r   )r2   r  r  Ztestcase_codeZtestcase_major_versiontestcase_ext_idr  r  r  r  r  r  r  r  	type_linktasksr"   r"   r#   _process_testcase  s    	




z&CmfPluginZephyrScale._process_testcasec              
   C   sf   t ddR | }|d krqXt|d}t|d}t|}W 5 Q R X | | qW 5 Q R X d S NFr   r   r  )r   r   r   r   r   r   r  r$  )r2   testcase_queuer   r  r   r  r"   r"   r#   _process_testcase_worker`  s    z-CmfPluginZephyrScale._process_testcase_workerc                 C   s   t  }g }t| jD ]2}tj| jd| d|id}|| |  q| |}|D ]}|	|d  qV|D ]}|	d  qn|D ]}|
  qd S )NZ_process_testcase_worker_r&  r  r   )r   r  threading_max_forksr  r   r'  rj   r!  r  r
  r"  )r2   r  r&  r$  r%  r&  Z	testcasesr  r"   r"   r#   _process_testcasesm  s&     


z'CmfPluginZephyrScale._process_testcasesc                 C   sp   t jjdd| _dddd}i | _| d|D ]<}|dd	 }||d}t jj|| jd
}|| j|< q.d S )Nztestplan.base:defaultr  r  r  r  r  r.  r!   r   r  )rg   r  r   _testplan_workflow_testplan_statusesr   ri  r  r  r"   r"   r#   _set_testplan_statuses  s    z+CmfPluginZephyrScale._set_testplan_statusesc           	      C   s  dt _|d }| |tj}d| dt _| jjt j ddd | j d| }tjj	|dd	}|s~tj|| j
|| jdd
}|j}|jr||_|d |_||_| j|_| j	|d d  |_| |	d|_|	dr| |d |_n|j|_|	dr| |d |_|	d|_|	dp2|j|_| ||	d|_||_|jdd |rtj||d}|  |j ddg d n| jj!"t j d | #||	dg  | $||d | | jjt j dt j dd | j%dd d S )Nr   rI   u   [Тест план r)  r  Tr   r^   )r`   r  r  r  r`   r   r  r!   r  r  r  r  r  r  r   r  r  tree_parent_folder    Папка тест-кейсовZcase_folder)Zroot_folder_nameZroot_folder_typeZtestcase_idsr  r   r   r  r   r  )&r  r  rM   rg   CmfTestplanr  r   r   rf   r   rG   is_newr  r  r!   r  r*  r  r+  ri  r  r  r  r  r   r  r  r  r  r   r   ZCmfTestplanTestcaseFolderZsetupr  rd  r  r  r   )	r2   testplan_datar  r  Ztestplan_codeZtestplan_ext_idZtestplan_objZtestplan_is_newr  r"   r"   r#   _process_testplan  sv    


z&CmfPluginZephyrScale._process_testplanc              
   C   sh   t ddT | }|d krqZt|d}t|d}t|}W 5 Q R X | || qW 5 Q R X d S r%  )r   r   r   r   r   r   r  r4  )r2   testplan_queuer  r   r  r   r3  r"   r"   r#   _process_testplan_worker  s    z-CmfPluginZephyrScale._process_testplan_workerc           	      C   s   t jj| jddddgd}t }g }t| jD ]4}tj| j	d| ||dd}|
| |  q.| |}|D ]}||d	  qr|D ]}|d  q|D ]}|  qtt jjd
d|gdgdd|_|jdd d S )Nu   Тест-планыr1  Tr  r  Z_process_testplan_worker_)r5  r  r  r   r  r_  rc   r  r  )rg   r  r   rG   r   r  r(  r  r   r6  rj   r!  r  r
  r"  r   r1  ri   r  r   )	r2   r  r  r5  r$  r%  r&  Z	testplansr3  r"   r"   r#   _process_testplans  sD    



z'CmfPluginZephyrScale._process_testplansc                 C   sp   t jjdd| _dddd}i | _| d|D ]<}|dd	 }||d
}t jj|| jd}|| j|< q.d S )Nztestcycle.base:defaultr  r   in_progressclosed)not executedin progressZdoner/  r!   r   r  r  )rg   r  r   _testcycle_workflow_testcycle_statusesr   ri  r  r  r"   r"   r#   _set_testcycle_statuses  s    z,CmfPluginZephyrScale._set_testcycle_statusesc                 C   s   dddddd| _ d S )Nr   r8  ZpassedZfailedlocked)r:  r;  passr  Zblocked)_testrun_statusesr@   r"   r"   r#   _set_testrun_statuses(  s    z*CmfPluginZephyrScale._set_testrun_statusesc                 C   sT   |sd S |d }| j  d| }tjj|ddgd}|sP| jjd| d|d |S )Nr_   r^   rc   r  u'   Не найдено окружение r  r  )rf   rg   CmfTestEnvironmentr   r   r   )r2   testcase_runenvironment_dataenvironment_idr`   environmentr"   r"   r#   _get_testrun_environment1  s    z-CmfPluginZephyrScale._get_testrun_environmentc                    s  |d }| j  d| }tjj|ddgd}|sR| jjd| d| d|d	 d S |d }| j  d| }tjj|d
}|stj||jd|| jdd}||_| 	||d|_
| 	||d|_| 	||d|_| 	||d|_| j|d d  d|_|d d d |_|jdd |d}	|	r@t|	ni }	t|	   fdd|dg D }
| ||
 |dg }| ||}| D ]&\}}|dkr||_|j| q|jdd |jdd d S )NZsourceScriptIdr^   rc   r_   r  u   Не найден шаг z: zERR-0015r  r  r   T)r  r   r  r`   r   r  r   r  r   r   testResultStatusr!   r   r  r   r  r  ZstepAttachmentsMappingc                    s   g | ]}|d   kr|qS r   r"   )r{   rC  Zids_to_remover"   r#   r|   m  s   z>CmfPluginZephyrScale._process_testrun_step.<locals>.<listcomp>r   r  r  )rf   rg   r  r   r   r   ZCmfTestcaseRunHistoryStepcache_testcaser  r  r  r  r  Zactual_resultrA  ri  r  r  r   r   r   r   valuesr  r  r  r  extend)r2   r  cur_historyZsource_step_idZsource_step_ext_idr  r  r  Zrun_steprY   r   r  r  r"  r#  r"   rJ  r#   _process_testrun_stepA  sf    	



z*CmfPluginZephyrScale._process_testrun_stepc              	   C   s  |d }|d }|  |tj}| j d| }tjj|dddgd}|s|d }	| j d|	 }
tjj|
dd	gd}tj|||||| jd
d}|jr||_|d |_	| 
|d d |_| ||d|_|jj|_|jj|_| |d|_|ddd d |_t|ddd d |_| ||d|_| ||d|_| j|d d  |_|jd
d |jj}|  |tj }|stj |||| jd
d}||_|j	|_	|j|_!|j|_|j|_|j|_|j|_|j|_|j|_|j|_d
|_"|j#|_#|jd
d |dg }| $||}|% D ]\}}|dkr,||_&q,|jd
d ||_|jd
d |d }|D ]}| '|| qr| (||dg  |dr|d |d|d|d	 d }| )||| t*  d S )!Nr  rI   r^   r   zcur_history.cache_testcasezcur_history.deffectsr  rc   r_   T)r  r   r  Ztestcycle_testcase_folderr`   r   r  r!   r  r   Z
assignedTor  r   r  r  executionTimeZjiraVersionIdrG  rI  r  r-  r  r  r  r   r   ZactualStartDate)r   r  r  r_   )+rM   rg   ZCmfTestcaseRunrf   r   r  r   r  r  r!   r  r  r  r  r   r  r  r  ZresponsibleZcache_estimate_timerE   
spent_timer  releaserH  rG  rA  ri  r  r   rN  r?   ZCmfTestcaseRunHistoryrK  ZcurZ	iterationr  r  r  rO  r  r  r   )r2   testrun_data	testcycler  r  r  Ztestrun_codeZtestrun_ext_idrD  r  r!  r   rN  Zcur_history_coder  r  r"  r#  Z
steps_datar  r
  r"   r"   r#   _process_testrun}  s    





z%CmfPluginZephyrScale._process_testrunc                 C   s  dt _|d }| |tj}d| dt _| jjt j ddd | j d| }tjj	|dd	gd
}|stj|| j
|| jdd}|j}|jr||_|d |_| j|_| j	|d d  |_| |	d|_|	dr| |d |_n|j|_|	dr| |d |_|	d|_|	dp0|j|_|	d|_|	d|_| ||	d|_|	ddd d |_t|	ddd d |_ | !||	d|_"||_#|j$dd |	dg }| %||}|& D ]\}	}
|	dkr|
|_'q|j$dd | (|| tj)j	||d}|s&|s>tj)d||d }|$  |	d!pLg }|D ]Z}|	d"pdg }|D ]&}|	d#rj| *|||  qRqj|rR| *|d$ || qRn| jj+,t j d% | -||	d&g  | .||d' | | jjt j d(t j dd | j/d)d* d S )+Nr   rI   u   [Тест-цикл r)  r  Tr   r^   r  r  r-  r!   r  r  r  r  r  r  ZplannedStartDateZplannedEndDateZprojectVersionIdr  r  r  rP  r   r  r  r  r.  r0  )r!   r  r/  r  r  r  r  r  r   r   r  rT  r  )0r  r  rM   rg   ZCmfTestcycler  r   r   rf   r   rG   r2  r  r  r!   r<  r  r=  ri  r  r  r  r  r   r  r  Z
start_dateZfinish_dater  rR  r  rE   rQ  r  r  r   r   r  r  r  r  ZCmfTestcycleTestcaseFolderrU  r  rd  r  r  r   )r2   Ztestcycle_dataZtestcycle_keyZtestcycle_codeZtestcycle_ext_idrT  Ztestcycle_is_newr  r  r"  r#  r  r  r  r  r  r"   r"   r#   _process_testcycle  s    





z'CmfPluginZephyrScale._process_testcyclec              
   C   sf   t ddR | }|d krqXt|d}t|d}t|}W 5 Q R X | | qW 5 Q R X d S r%  )r   r   r   r   r   r   r  rV  )r2   testcycle_queuerT  Ztestcycle_filer   rS  r"   r"   r#   _process_testcycle_workerN	  s    z.CmfPluginZephyrScale._process_testcycle_workerc                 C   s   t  }g }t| jD ]2}tj| jd| d|id}|| |  q| |}|D ]}|	|d  qV|D ]}|	d  qn|D ]}|
  qd S )NZ_process_testcycle_worker_rW  r  r   )r   r  r(  r  r   rX  rj   r!  r  r
  r"  )r2   r  rW  r$  r%  r&  ZtestrunsrS  r"   r"   r#   _process_testcycles[	  s&     


z(CmfPluginZephyrScale._process_testcyclesu%   Обработка окруженийc                 C   s   |  d|D ]|}|d }|d }|d}| j d| }tjj|d}|sbtj| j|| jdd}|jr||_||_	|j|_
|jdd	 qd S )
Nr,  r_   r!   r   r^   r  Tr  r  )r   r   rf   rg   rC  rG   r   r  r!   r  Zslugr   )r2   r3  rE  rF  Zenvironment_nameZenvironment_descriptionZenvironment_ext_idrG  r"   r"   r#   _process_environmentst	  s$    
z*CmfPluginZephyrScale._process_environmentsu   Обработка теговc                 C   s  ddl m} | d|D ]}|d }|d }z|dddd	}||d
dd}ddd|gddd| dgddd| dgg}tjj|d}	|	stj|d}	|	jdd t  W q t	k
r }
 z.t
  | jjd| d| d|
 ddd W 5 d }
~
X Y qX qd S )Nr   r  r+  r_   r!   r   r  r  r   r  Tr  rw  rx  r  r  r  r`  r%   r  u+   Не удалось создать тег 'r   r   zERR-0016r  rv  )r  r  r   r  rg   r  r   r   r   r   r   r   r   )r2   r3  r  Ztag_dataZtag_idZtag_namer!   r  Z
tag_filterZtag_objr   r"   r"   r#   _process_tags	  s0    
z"CmfPluginZephyrScale._process_tagsc                 C   s  t |d }t|d }|d }|d }d| j d| d}tjjddd| dgd	d
dgd}|std| d| d| dd|_|jdd t	  || _
| | | | |d| _| | | | | | | | | | | | |   | | d S )Nr   r_   rI   r!   r^   r`   ra   rb   rH   r   
show_testsra  u   Проект 'r   r  uY   ] не найден. Возможно он еще не импортирован из JiraTr  r   )r   r>   rf   rg   rh   r   r   r\  r   r   rG   rZ  r[  r   r   r  r  r)  r,  r7  r>  rB  rY  )r2   rn   r3  r  r  ro   rp   Zproject_objr"   r"   r#   _process_project	  s>    







z%CmfPluginZephyrScale._process_projectu#   Обработка проектовc                 C   s   dd | j D }|  D ]}t|d }|d }|d }zz:| j rRW W  d S ||krbW W zq| | t  W n` t	k
r } zBt
  |  jd7  _| jjd| d| d	| d
| ddd W 5 d }~X Y nX W 5 d | _d | _X qd S )Nc                 S   s   g | ]}t |d  qS r   r  )r{   pr"   r"   r#   r|   	  s     z:CmfPluginZephyrScale._process_projects.<locals>.<listcomp>r_   rI   r!   r   u=   Не удалось импортировать проект 'r   r  z]. zERR-0017rh   ru  )r1   r  r>   rG   r	  r   r   r]  r   r   r   r   r   )r2   Zselected_projects_idsrn   r  r  ro   r   r"   r"   r#   _process_projects	  s,    


z&CmfPluginZephyrScale._process_projectsc              	   C   s   d| _ || _t   d| j_| jj  t  W 5 Q R X | jj| _| jj	j	j
| _
| | jjd | _| jjrpdnd| _|   |   | j |   |   W 5 Q R X |   | j  S )Nr   u   Импорт Jira Zephyr ScaleZimport_settingsZ	accountIdrI   )r   r   r+   r!   r?   r   r   Zget_max_processesZmax_processesr5   rf   Z_normalize_settingsr   r   r-   r:   r   r   r   r=  rh  r_  )r2   r   r"   r"   r#   process_import	  s"    
z#CmfPluginZephyrScale.process_import)NN)N)F)Sr   
__module____qualname__r
   r,   Zui_meta_skipZapi_methodsr<   r0   propertyr-   rM   staticmethodrN   rV   r>   rX   rZ   r.   r   r   r   r   rt   r   r   r'   r   r   r   r   r   r   r  r'  r6  r=  rK  r^  rh  rk  r~  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r$  r'  r)  r,  r4  r6  r7  r>  rB  rH  rO  rU  rV  rX  rY  rZ  r[  r]  r_  r`  __classcell__r"   r"   r3   r#   r,   8   s   


&


	*
%
~& 0V2Z !
*%
M;9"!"
d
I+	<i
g

-
 r,   )N)r   rC   r   r  rF  
contextlibr   	itertoolsr   pathlibr   Zqueuer   Zbs4r   Zcmf.appr   Zcmf.includeZ!modules.jira.clients.zephyr_scaler	   Zmodules.jira.fieldsr
   localr  r'   r+   r,   r"   r"   r"   r#   <module>   s$   

	