U
    iq                    @   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 dd1d2Z!dd3d4Z"d5d6 Z#d7d8 Z$d9d: Z%d;d< Z&d=d> Z'd?d@ Z(dAdB 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=dkdl Z>e dmdn Z?dodp Z@dqdr ZAdsdt ZBe dudv ZCdwdx ZDdydz ZEd{d| ZFd}d~ ZGdd ZHdd ZIdd ZJe dd ZKdd ZLdd ZMeddd ZNeddd ZOdd ZPeddd ZQdd ZR  ZSS )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   sp   | j sj| 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 tj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timeout)_CmfPluginZephyrScale__clientload_fieldsr	   strr5   Zext_urlZ	ext_loginZext_passwordZdecryptZ	ext_tokenr:   valuer;   ZcmfutilZrequests_sessionconfigIMPORT_DOWNLOAD_TIMEOUT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patternrG   numberr"   r"   r#   convert_code`   s    
z!CmfPluginZephyrScale.convert_codec                  C   s   g } | S )Nr"   )r   r"   r"   r#   calc_models_settingss   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_settingsx   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)rM   rZ   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   Активный)rR   rV   rX   r   r"   )r2   rT   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 (rL   )::idext_idLIKE%T--rK   )filter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 )NrT   Zfile_valrS   titleicon)r!   ri   )
_get_valuer[   r]   rw   rn   verbose_name)r   Zsettings_funcrM   Zobj_settingssettingresultr2   r"   r#   _get_settings   s    zACmfPluginZephyrScale.tmplt_import_settings.<locals>._get_settingsrq   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   rY   rk   	CmfPersonrn   )r2   r   r}   userprojects_dirr~   r"   r{   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rb   N)r   json_settingsr@   getbool_is_default_userrk   r   _fallback_personro   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 )Nr~   :user:)APPREDIS_DBredisr   r   user_keysetr   rb   pickledumps)r2   redis_db	user_datarL   r"   r"   r#   _cache_all_users   s    z%CmfPluginZephyrScale._cache_all_usersc                 C   s   |sdS |  |}|S )u`   
        Метод получает значение параметра объекта
        N)r   )Zobj_datarT   r@   r"   r"   r#   rx      s    
zCmfPluginZephyrScale._get_valuec                 C   s   |dkr| S |S )NrW   r"   )r2   rZ   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    Преобразование настроек для модели rS   rT   rZ   )rx   r   )r2   r   r   Znormalized_objrz   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): сырые данные вложения
        rb   r!   fileNamera   r   
downloaded)
obj_ext_idrj   ri   z/rest/tests/1.0/attachment/)r!   hrefr   rj   r   import_raw_jsonFu\   Не удалось создать задачу на скачивание вложения '' (). ERR-0007CmfImportDownloaddump
error_codeobj_type
error_typeN)r?   _attachments_dirr   rj   rk   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_attachmentsY  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)rb   r   r!   embedded)r   find_allhas_attrrF   searchrI   r   )
r2   Z	html_textsrc_pathrN   Zsoupr   	src_valuerG   img_idr   r"   r"   r#   _pre_dump_embedded_imagesc  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_commentsFc           *      C   s  t dd | jd }| jd }| jd }	| }
|
d krJ||
 q|
\}}z0|||||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 qnR|d krr|d }| j	|}|d!}|jtj|dddddd |D ]} | d }!| j	||!}"|d"t|!d#}#|#jjddd |#jtj|"dddddd | d$ d }$d }%|"D ]}&|&d |$kr|&}% qq|"r|"d% }%|%sqh| |% | |%d& |%d' }'|'D ]8}(| |( dddd&g}|D ]}| |(| qRq4qh| ||| qnW q, tk
r }) zB| jjd(| d)|	 d
| d*| d+| d,| d-|) d.d/d0d1 W 5 d })~)X Y q,X q,W 5 Q R X d S )2NFZinit_views_and_dsrb   rL   r!   )offsetlimitarchivedresultsmajorVersion '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  testrun_items.jsonitemstest_results.json$lastTestResultr   r   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   Zget_testrun_testrunitems
write_textr   Zget_testrun_testresultsparentr   r   r   )*r2   entity_titler   get_test_entities_funcpagination_queue
entity_dirr   
project_idproject_keyrs   Z
paginationr   r   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_fieldsZ
testrun_idtestrun_itemstestrun_items_filetestrun_itemitem_idtest_resultstest_results_filelast_test_result_idZtest_result_data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}d}t }	t|| d | D ]}
|	|
| |f qP|	d  g }t| jD ]T}tj	| j
d|d  ||||	||d	d
}|| |  | jjd|  q|D ]}|  qd S )Nr   Tr   rb   r   2   r   Z_dump_test_entities_worker_)r  r   r  r  r  r   targetr!   r   u$   Запущен обработчик )r   r  r   r  r   ranger  download_threading_max_forks	threadingThreadr&  rn   startr   r  r  join)r2   r  r   Zget_total_entities_funcr  r   r  totalr   r  Zpagethreadsithreadr"   r"   r#   _dump_test_entities;  s4    

z(CmfPluginZephyrScale._dump_test_entitiesc                 C   s  | j  d}|jdd t| j}td| }| jD ]}|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, | j*d(d'| jj+| jj,dd) | *d*d+| jj-| jj. | *d,d-| jj/| jj0 W q8 t1k
r } z2|  j2d	7  _2| j j3d.| d/| d0d1d2d3 W 5 d }~X Y q8X q8| j 4d4 d S )5Nrq   Tr   P   rb   rL   r^   r!   r   u   Дамп проекта 'r   r  ].dirtyr   Zpermissions)r   r   r   ZroleslabelsenvironmentsZ
iterationsZdatasetstestcase_prioritiestestcase_statusestestplan_statusestestrun_statusesZtestresult_statusesr  foldertree_r   zw+r   F)r   r   r   r   r   u   Тест кейсr   u$   Тест кейс (архивный)r'  u!   План тестированияr  u   Тестовый прогонr  u2   Не удалось получить проект r   zERR-0003rl   r   )r   r   u*   Дамп проектов завершен)5r   r   r   r  lenr1   rH   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   r5  Zget_total_testcasesZget_testcasesZget_total_testplansZget_testplansZget_total_testrunsZget_testrunsr   r   r   r   )r2   r   Zcntstepru   r  r  rs   project_dirZproject_tmp_dirrr   Zentityfoldertree_datafoldertree_filer   Zproject_data_filer   r"   r"   r#   _dump_projectsc  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   Свободно места: re   u5   Скачивание данных через API ... r~      u,   Дамп выбранных проектов)ZloggingZ	getLoggerr   r  ZhandlersZsetLevellevelr   r   
disk_usager  r   r-   r   r+   rA  r@   r   r   rF  )r2   r  Zdownload_pathr1  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   )rb   ri   ra   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headersr<   	file_sizer   r   T
attachmentu
   Файл 'u    сохранен в 'u"   Ошибка скачивания z'. r   r   r   )r   r   r   Zext_hrefN) rk   r   r   r?   r!   r-   Z
url_joinerr6   r   r   r   splitr@  r   r@   
isinstancerH   r   r  r  timeperf_counterZdownload_filerA   rB   r   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/  r|   download_timer   r"   r"   r#   _download_file0  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   rN  u   Поток 'z' (ID: uU   ) завершен. Скачано файлов (успешно/неуспешно): /    из 8   . Средняя скорость скачивания: .2f)    МБ/с. Скачанный объем: rO      МБ / 	    байт)r-  current_threadr!   identr   r   r   r   rZ  r   r  r  r  )r2   download_queueresult_queueZthread_nameZ	thread_iderror_countdownloaded_counttotal_countdownloaded_bytestotal_download_timerW  rX  rY  Zdownloaded_mb
speed_mb_sZstatsr"   r"   r#   _download_file_worker  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 )!Nrj   =r   Frq   r   rb   r\  r   rd   re   rg   u3   Нет вложений для скачиванияu'   Скачивание вложений: Z_download_file_worker_r   )re  rf  r)  u   Запущен поток rf   rg   ri   r[  u   Импорт прерванrN  u{   Скачивание вложений завершено. Скачано файлов (успешно/неуспешно): r]  r^  r_  r`  rO  ra  rb  )rj   r   r   r   r1   r?   endswithrk   r   countrn   r  r  r   r+  r,  r-  r.  rm  r/  Zslistr  rb   r   r0  r   warningemptyr   )r2   Zmain_filterZprojects_pathZattachment_countfiltersrr   r  Zproject_pathZpath_filterZdownload_filterZdownload_countre  rf  Z
main_countZtotal_downloadedZtotal_errorsZtotal_downloaded_bytesrk  r2  r3  r4  filter_r   ri  rh  rg  rj  rY  Ztotal_downloaded_mbrl  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   r~   r!   r   r7   rV   rR   uH   В дампе не найдены данные пользователя )r   r   r   r   r   rb   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 )4Nri   r!   z[,;\s]+rU   c                 S   s   g | ]}|  r|  qS r"   )stripr   rU   r"   r"   r#   r   3  s      z8CmfPluginZephyrScale._process_person.<locals>.<listcomp>r   c                    s"   g | ]} | d d kr|qS @r   rS  r|  Z
user_loginr"   r#   r   5  s      c                    s"   g | ]}| d d  kr|qS r}  r  r|  r  r"   r#   r   6  s      r   Zemail_2ra   r   r   	last_namer   
first_namesecond_namerD   u?   Часть полного имени пользователя 'u   ' длиннее u_    символов. Фамилия, Имя и Отчество не были заполнены.zERR-0004r   r   r   Zrg_member_ofrc   rd   re   rp  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   rk   r   ry   r-   r:   rF   rS  r@  r   rj   r   minr  
max_lengthr  r  r   r   r   r   rc   r@   rr  listr  rs  r   rn   )r2   r   Znormalized_dataZemailsZemails_by_loginZemails_by_namerc   Z	full_nameZcurrent_length_namer!   Zmax_length_nameri   personZnot_source_hash_filterZpersonsZ_filterZ
name_combor"   r  r#   _process_person%  s    



$
 z$CmfPluginZephyrScale._process_personc              
   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   r  r   )rz  r  r   r   r   r   r   r   )r2   ry  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 )Nrq   r      Каталог     отсутствует. Возможно он был удален или еще не создан. Необходимо повторно запустить импорт проекта r   r8  z.metar   rr   latestVersionr   r   r   r   r   r   r?   r   r  rs  iterdiris_dirr!   rq  r   r   load)r2   r  Ztestcases_dirrr  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 )
Nrq   r  r  r  r   r  r   r  r   r  )r2   r  Ztestplans_dirrr  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 )
Nrq   r  r  r  r   r  r   r  r   r  )r2   r  Ztestruns_dirrr  testrun_dirtestrun_keyZtestrun_filer   r"   r"   r#   _get_project_testruns0  s.    
  

z*CmfPluginZephyrScale._get_project_testrunsc              
   c   s   | j  d}| r| D ]^}|jdr2q |d}| s\| j jd| d q t	|d}t
|V  W 5 Q R X q d S )Nrq   r  r   uN   Отсутствует файл info.json в каталоге проекта 'rP  r  )r   r   r   r   r  r!   rq  r  rs  r   r   r  )r2   r   rC  Z	info_filer   r"   r"   r#   _get_projectsL  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:rb   rf   rc   ri   u!   Не найдена версия zERR-0009r   )rj   rk   ZCmfListr   r   r   )r2   r   Z
version_idrc   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issueIdra   rf   rb   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>  s       z8CmfPluginZephyrScale._get_task_links.<locals>.<dictcomp>)r   rj   rk   ZCmfTaskr   r   rn   r	  )	r2   r   trace_links
task_links
trace_linkZissue_idZtask_ext_idZtaskZ	link_typer"   r"   r#   _get_task_linksl  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urlDescriptionrb   ra   rc   Tr  rc   r   import_originalZsave_import)rk   ZCmfLinkr!   r  r   rj   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_links  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   ra   r   rd   r   rn  Trf   r   r   rp  r6   Zurl_previewZurl_preview_imgr  r!   )r!   r   r  r   rc   r   r   r  r  rbFZsmart_backupZ
mark_dirtyZsrc_origzdata-attach-idZcmf_convertedu    Не найден файл 'rP  r  r   r   N)r   r   rF   r   rI   rj   rk   r   rm   r   r   r   CmfAttachmentr   r   r   r   r   upload_filereadr  Zattrsr?   r6   rb   r   
thread_ctxtest_entity_msg)r2   r   	text_soupr   rN   r   r   rG   r   Zimg_nameZ
img_ext_idZdownloaded_filerR  Zatt_datar!   r   r"   r"   r#   _convert_embedded_img_src  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   r0  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   rb   r!   r   uf   Не найден файл. Возможно при скачивании возникли ошибкиra   r  r  	createdOnZuserKeyr  r  Fr  rR  	processedu<    Не удалось обработать вложение 'r   r   ERR-0014r  r   ) r   r   r  r  r?   r   r   r   r   rj   rk   r  r   r  r!   r   cmf_created_atr  
cmf_authorro   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_idrR  r   r   r"   r"   r#   _process_attachments  sj    


z)CmfPluginZephyrScale._process_attachmentsc              
      s   fdd dddt jddddt jdd	d
dt jdd}| D ]\}}|d| d}t|d}t|}W 5 Q R X |d }t j	j
j|d d |d d ddgd}	|d D ]}
 ||
|	 qt|jdd|	gdgdd|	_|	jdd t  qLd S )Nc           	   	      s   |d }|d }|d }j d| j d| d| d j d| d| }| j|d	d
gd}|sz| j|j dd}||_||_t|d |_	||_
|  |d D ]} | || qd S )Nrb   r!   	projectIdu   Папка r   r   r`   ra   tree_parenttree_node_is_branchr  Tr  r   )r   r   r  rj   r   rJ   r!   r  r   r  r   r   )	folder_modelfolder_datar  	folder_idZfolder_namer  Zfolder_ext_idfolderZsubfolder_data_create_folderr2   r"   r#   r  >  s2    "zICmfPluginZephyrScale._process_test_entity_folders.<locals>._create_folderu   Тест-кейсыr  )r!   r  )registryr  u   Тест-планыCmfTestplanu   Тест-прогоныCmfTestcycle)r   r  r  r?  r   r  r  r  r!   r  Tr  )r  r!   r  systemri   r   r  rn  rf   )rg   ri   include_archivedr  )rk   CmfTestcaseFolderCmfTestplanFolderCmfTestcycleFolderr	  r   r   r   r  ZCmfRegistryr   rJ   r   rm   r  r   r   )r2   rC  r  Ztest_entityZentity_datarE  r   rD  r  r  r  r"   r  r#   _process_test_entity_folders=  sP    "		

z1CmfPluginZephyrScale._process_test_entity_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)rk   CmfWorkflowr   _testcase_workflow_testcase_statusesr   rx  	CmfStatusr2   rC  Z
status_mapZstatus_dataZstatus_nameZstatus_codestatusr"   r"   r#   _set_testcase_statuses  s    z+CmfPluginZephyrScale._set_testcase_statusesc                 C   s>   i | _ | d|D ]&}|d }|dd }|| j |< qd S )Nr;  rb   r!   r   )_testcase_prioritiesr   r   rx  )r2   rC  Zpriority_datapriority_idpriority_namer"   r"   r#   _set_testcase_priorities  s
    z-CmfPluginZephyrScale._set_testcase_prioritiesc                 C   s2   | j |}|sdS dddd}|| p0dS )Nr   r   )ZhighZnormalZlow)r  r   rx  )r2   r  r  Zsignificance_mapr"   r"   r#   _get_significance  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   translitr9  u    Обработка теговTr   r   _#r   ruZlanguage_codereversedr  aliasr  ""%r!   ro  u   Тег 'u   ' не найденzERR-0010r  r   )transliterater  r   r   r   r  r  replacerk   CmfTagr   rn   r   r  )r2   testcase_objtestcase_datar  Ztestcase_labelstagsZlabelr  rv  tagr   r"   r"   r#   _get_testcase_tags  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componentIdra   rb   rf   r  u%   Не найден компонент zERR-0011r  )r   rj   rk   ZCmfComponentrn   r   r   )r2   r  r  
componentsZcomponent_idZcomponent_ext_idZ	componentr"   r"   r#   _get_testcase_components  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 )NrL   r   ra   z::prer  ZpreTstep_sectionr  rc   r   r  r  )ZTEXKOM_db_delete)
r   rj   rk   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  testCaserb   indexr   r  r  ra   r  mainTr  r     r  r   )r   rj   rk   r  r   r  r  expected_result	test_dataordernor   r  r   )r2   r  r  r  rB  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 )Nra   rb   r  Tr  z**	createdByr  r   r  )rj   rk   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_comments8  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 }||_|d! |_||_ |j!dd" ||_"|d# |_#| $||	d$|_%| &|||_'| (|||_)|j!dd" t*  |	d%g }| +||}|, D ]"\}}|d&krv||_-n||_.q\|j!dd" | /|| | 0|| | 1|| n| jj23t j d' | 4||	d(g  | 5||d) | | jjt j d*t j dd	 | j6d+d, t jS )-Nr   rL   r   u   [Тест кейс z (vz)]     Начало обработкиTr   ra   deffectscovered_tasksrc   r  ri   r  rf   rb   )r  ri   )r  
logic_typer  rc   r   r  r!   r  priorityestimatedTimer  <   r  owner	updatedByr  	updatedOnr  r  r  r   r  r  r   
traceLinksr  v    был изменен пользователем. Новые данные из импорта не примененыr   r   8    Завершение обработки. Ошибок: r   r  )7r  r  rP   rk   r  r  r   r   rj   r   ZCmfLogicTyperJ   r  r  r!   r  r  r  rx  r  r  Zsignificanceestimate_timer  r  r  cmf_modified_byr  r  r  r  Zcmf_archivedr   r   Zcmf_ver_numberZcmf_ver_curr  r  r  r
  r	  r  r   r  r	  r&  r'  r  r  r  r  rs  r  r$  r   )r2   r  r  Ztestcase_codeZtestcase_major_versiontestcase_ext_idr  r)  r  r  Ztestcase_folder_ext_idZtestcase_folderr  r  	type_linktasksr"   r"   r#   _process_testcaseZ  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  r8  )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;  rn   r/  r  r  r0  )r2   r  r:  r2  r3  r4  Z	testcasesr  r"   r"   r#   _process_testcases  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  )rk   r  r   _testplan_workflow_testplan_statusesr   rx  r  r  r"   r"   r#   _set_testplan_statuses  s    z+CmfPluginZephyrScale._set_testplan_statusesc                 C   sD  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 |_d |_| j|_| j	|d d  |_| |	d|_|	dr| |d |_n|j|_|	dr| |d |_|	d|_|	dp2|j|_| ||	d|_|	dr|d d }|d d }| j d| d| }	tj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   rL   u   [Тест план r7  r%  Tr   ra   )rc   r  r  r  rc   r   r  r!   r  r  r-  r.  r  r/  r   r  r  rb   r  r  r  tree_parent_folder    Папка тест-кейсовZcase_folder)Zroot_folder_nameZroot_folder_typeZtestcase_idsr1  r   r   r2  r  r  )(r  r  rP   rk   r  r  r   r   rj   r   rJ   is_newr  r  r!   r  r>  r  r?  rx  r  r  r  r  r4  r  r  r  r  r  r  r   r   ZCmfTestplanTestcaseFolderZsetupr  rs  r  r$  r   )r2   testplan_datar  Ztestplan_codeZtestplan_ext_idZtestplan_objZtestplan_is_newr  r  Ztestplan_folder_ext_idZtestplan_folderr  r"   r"   r#   _process_testplan  s    


z&CmfPluginZephyrScale._process_testplanc              
   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 r9  )r   r   r   r   r   r   r  rG  )r2   testplan_queuer  r  r   rF  r"   r"   r#   _process_testplan_workerF  s    z-CmfPluginZephyrScale._process_testplan_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_testplan_worker_rH  r)  r   )r   r+  r<  r-  r.  rI  rn   r/  r  r  r0  )r2   r  rH  r2  r3  r4  Z	testplansrF  r"   r"   r#   _process_testplansS  s&     


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  )rk   r  r   _testcycle_workflow_testcycle_statusesr   rx  r  r  r"   r"   r#   _set_testcycle_statusesl  s    z,CmfPluginZephyrScale._set_testcycle_statusesc                 C   s   dddddd| _ d S )Nr   rK  ZpassedZfailedlocked)rM  rN  passr  Zblocked)_testrun_statusesrC   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 )Nrb   ra   rf   r  u'   Не найдено окружение r  r  )rj   rk   CmfTestEnvironmentr   r   r   )r2   testcase_runenvironment_dataenvironment_idrc   environmentr"   r"   r#   _get_testrun_environment  s    z-CmfPluginZephyrScale._get_testrun_environmentc                    s  |d }| j  d| }tjj|ddgdd}|sXtjd|j|| jddd}|jdd	 |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}	|	rFt|	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sourceScriptIdra   rf   rb   T)rc   ri   rh   r  )r  r  rc   r   r  Zcmf_deletedr  r  )r  r   r  rc   r   r  r   r  r  r   testResultStatusr!   r   r  r   r  ZstepAttachmentsMappingc                    s   g | ]}|d   kr|qS r   r"   )r   rR  Zids_to_remover"   r#   r     s   z>CmfPluginZephyrScale._process_testrun_step.<locals>.<listcomp>r   r0  r  )rj   rk   r  r   cache_testcaser   r   ZCmfTestcaseRunHistoryStepr  r  r  r  r  Zactual_resultrT  rx  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_stepr\   r   r  r  r6  r7  r"   r]  r#   _process_testrun_step  sn    	



z*CmfPluginZephyrScale._process_testrun_stepc              	   C   s  |d }|  |tj}| j d| }tjj|dddgd}|s|d }	| j d|	 }
tjj|
ddd	gd
}tj|||||| jdd}|jr||_|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 ]}| '|| qh| (||dg  |dr|d |d|d|d	 d }| )||| t*  d S )!NrL   ra   r   zcur_history.cache_testcasezcur_history.deffectsr  Trf   rb   r(  )r  r   r  Ztestcycle_testcase_folderrc   r   r  r!   Z
priorityIdr   Z
assignedTor+  r   r  r,  executionTimeZjiraVersionIdrZ  r\  r  rA  r0  r  r  r   r   ZactualStartDate)r   r  r  rb   )+rP   rk   CmfTestcaseRunrj   r   r  r   r  r  r!   r  r*  r  r  r   r  r  r  ZresponsibleZcache_estimate_timerH   
spent_timer  releaser[  rZ  rT  rx  r  r   ra  r@   ZCmfTestcaseRunHistoryr^  ZcurZ	iterationr  r	  r&  rb  r  r   r   )r2   r  testrun_data	testcycler  r  Ztestrun_codeZtestrun_ext_idrW  r  r5  r   ra  Zcur_history_coder  r  r6  r7  Z
steps_datar  r  r"   r"   r#   _process_testrun  s    





z%CmfPluginZephyrScale._process_testrunc              
   C   sD  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|_"|	dr|d d }|d d }| j d| d| }	tj#j	|	d}
|
|_$||_%|j&dd |	d g }| '||}|( D ]\}}|d!kr$||_)q$|j&dd | *|| tj+j	||d"}|st|stj+d#||d$}|&  t,|d% }|-d&}|. rt/|d'}t01|}W 5 Q R X ng }|D ]}|d }|-d(t2|d)}|. rt/|d'}t01|}W 5 Q R X nq|d* }|d }|d+ }|D ]*}|d |kr@| 3||||  q֐q@|r| 3||d || qi }tj4j5|dgd,}|D ]}|	|jdd- ||j< q||_6|j&dd n| jj78t j d. | 9||	d/g  | :||d% | | jjt j d0t j dd | j;d1d2 d S )3Nr   rL   u   [Тест-цикл r7  r%  Tr   ra   r'  r(  rA  r!   r  r  r-  r.  r  r/  ZplannedStartDateZplannedEndDateZprojectVersionIdr+  r  r,  rc  r   r  r  rb   r  r  r0  r  rB  rD  )r!   r  rC  r   r  r  r	  r
  r  r  )r  ri   r   r1  r   r2  rh  r  )<r  r  rP   rk   r  r  r   r   rj   r   rJ   rE  r  r  r!   rO  r  rP  rx  r  r  r  r  r4  r  r  Z
start_dateZfinish_dater  rf  r3  rH   re  r  r  r  r  r   r   r  r	  r'  r  ZCmfTestcycleTestcaseFolderr   r   r   r   r   r  r?   ri  rd  r  Ztestcase_run_cacher  rs  r  r$  r   )r2   Ztestcycle_dataZtestcycle_keyZtestcycle_codeZtestcycle_ext_idrh  Ztestcycle_is_newr  r  Ztestcycle_folder_ext_idZtestcycle_folderr  r  r6  r7  r  r  r  r   r  r   r!  r#  r"  Zlast_test_resultr$  r  r%  Z	run_cacheZtestcase_runsrW  r"   r"   r#   _process_testcycleC	  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 r9  )r   r   r   r   r   r   r  rj  )r2   testcycle_queuerh  Ztestcycle_filer   rg  r"   r"   r#   _process_testcycle_worker	  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_rk  r)  r   )r   r+  r<  r-  r.  rl  rn   r/  r  r  r0  )r2   r  rk  r2  r3  r4  Ztestrunsrg  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:  rb   r!   r   ra   r  Tr  r  )r   r   rj   rk   rV  rJ   r   r  r!   r  Zslugr   )r2   rC  rX  rY  Zenvironment_nameZenvironment_descriptionZenvironment_ext_idrZ  r"   r"   r#   _process_environments	  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  r9  rb   r!   r   r  r  r   r  Tr  r  r  r  r   r  ro  r%   r  u+   Не удалось создать тег 'r   r   zERR-0016r  r  )r  r  r   r  rk   r  r   r   r   r   r   r   r   )r2   rC  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   rb   rL   r!   ra   rc   rd   re   rK   r   
show_testsrp  u   Проект 'r   r  uY   ] не найден. Возможно он еще не импортирован из JiraTr  r   )r   r?   rj   rk   rl   r   r   rp  r   r   rJ   rn  ro  r   r   r  r  r  r=  r@  rJ  rQ  rU  rm  )r2   rr   rC  r  r  rs   rt   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   X
  s     z:CmfPluginZephyrScale._process_projects.<locals>.<listcomp>rb   rL   r!   r   u=   Не удалось импортировать проект 'r   r  z]. zERR-0017rl   r  )r1   r  r?   rJ   r  r   r   rq  r   r   r   r   r   )r2   Zselected_projects_idsrr   r  r  rs   r   r"   r"   r#   _process_projectsV
  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	accountIdrL   )r   r   r+   r!   r@   r   r   Zget_max_processesZmax_processesr5   rj   Z_normalize_settingsr   r   r-   r:   r   r   r   rM  rw  rs  )r2   r   r"   r"   r#   process_importw
  s"    
z#CmfPluginZephyrScale.process_import)NN)N)F)F)F)Tr   
__module____qualname__r
   r,   Zui_meta_skipZapi_methodsr=   r0   propertyr-   rP   staticmethodrQ   rY   r?   r[   r]   r.   r   r   r   r   rx   r   r   r'   r   r   r   r   r   r   r&  r5  rF  rM  rZ  rm  rw  rz  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r	  r  r  r  r   r$  r8  r;  r=  r@  rG  rI  rJ  rQ  rU  r[  rb  ri  rj  rl  rm  rn  ro  rq  rs  rt  __classcell__r"   r"   r3   r#   r,   8   s   


&


	*
%
 
 . 
( 7V2Z !
*%M;S"!"
e
O	Ck
 

/
 r,   )N)r   rF   r   r-  rU  
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$   

	