U
    
0iJ,                    @   s   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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)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                       sV  e Zd Zejjd Zejjdg 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"d~d$d%Zdd&d'Ze d(d) Zd*d+ Zd,d- Zd.d/ Zd0d1 Z d2d3 Z!d4d5 Z"dd7d8Z#d9d: Z$d;d< Z%d=d> Z&d?d@ Z'dAdB Z(dCdD Z)dEdF Z*dGdH Z+dIdJ Z,dKdL Z-dMdN Z.dOdP Z/dQdR Z0e dSdT Z1dUdV Z2dWdX Z3dYdZ Z4e d[d\ Z5d]d^ Z6d_d` Z7dadb Z8dcdd Z9dedf Z:dgdh Z;didj Z<e dkdl Z=dmdn Z>dodp Z?edqdrds Z@edtdudv ZAdwdx ZBedydzd{ ZCd|d} ZD  ZES )CmfPluginZephyrScale)clientget_all_projectsc                    s   t  j|| g | _d| _d S )Nr   )super__init__selected_projectsr   )selfr   r   	__class__r!   r"   r/   =   s    zCmfPluginZephyrScale.__init__c              	   C   sp   t td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 d	t_tjS )
u;    Клиент для работы с Zephyr Scale REST API r,   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)hasattr
thread_ctxload_fieldsr   strr4   Zext_urlZ	ext_loginZext_passwordZdecryptZ	ext_tokenr9   valuer:   ZcmfutilZrequests_sessionr,   r1   r!   r!   r"   r,   C   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   )r1   keymodelpatternrD   numberr!   r!   r"   convert_code[   s    
z!CmfPluginZephyrScale.convert_codec                  C   s   g } | S )Nr!   )r   r!   r!   r"   calc_models_settingsn   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_settingss   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!   )r1   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=   r4   source_hashr,   Zget_projectsmodels
CmfProjectsgetappendr   gdebug)
r1   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resultr1   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   )r6   Z	limit_endr   ua   Не найдено ни одного пользователя, импорт невозможенselectedObjects)r    r?   )r   r=   get_download_pathjoinpathexists_simple_getr,   	get_usersr6   r   rV   rg   	CmfPersonrj   )r1   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)r1   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   r0   )r1   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)r1   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!   )r1   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   )r1   r   r   Znormalized_objrv   r?   r!   r!   r"   _normalize_obj   s    
z#CmfPluginZephyrScale._normalize_obju   ДампNc           	   	   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)	r1   	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)r1   r    r   r   r   r   r!   r!   r"   r   !  s    z CmfPluginZephyrScale._simple_getc              	   C   st   | d}| rt| | j||}t|d6}|D ]*}|tj	|dddd  | j
d q:W 5 Q R X d S )Ncomments.jsonr   FT)r   	sort_keysr   comment)r   r   r(   r   r,   Zget_comments_forr   r   r   r   r   inc_stat)r1   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   s  t dd | j | jd }| jd }| jd }| }	|	d krT||	 q |	\}
}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 |r6|t|}|j	ddd t||d< |d}t|ddd}tj||dddd W 5 Q R X | ||| qvW q6 tk
r } zB| jjd| d| d
| d| d|
 d| d| ddd d! W 5 d }~X Y q6X q6W 5 Q R X W 5 Q R X d S )"NFZinit_views_and_dsr_   rI   r    )offsetlimitresultsmajorVersionz '' (r]   Texist_oktestcaseversions.jsonwzutf-8)encoding   )indentr   r   )parentsr   dir	info.jsonu&   Не удалось получить 'u   ' проекта ') [z	] offset=z limit=r   zERR-0002CmfTestcasedump)
error_codeobj_type
error_type)r   r,   _project_datar   putr   loggerinfor   mkdirZget_testcase_versionsr   r   r   r>   r   r   r   )r1   entity_titler   get_test_entities_funcpagination_queue
entity_dir
project_idproject_keyro   Z
paginationr   r   Ztest_entitiesZtest_entity_datar   Ztest_entity_keyZtest_entity_nameZtest_entity_versionr   Zversions_dataZversions_filer   Ztest_entity_filer   r!   r!   r"   _dump_test_entities_worker5  sr    







 
 
,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   Zdownload_threading_max_forks	threadingThreadr   rj   startr   r   r   join)r1   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 ]F}|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 |
| _'| (d%d&| jj)| jj* | (d'd(| jj+| jj, | (d)d*| jj-| jj. W q8 t/k
r~ } z2|  j0d	7  _0| j j1d+| d,| d-d.d/d0 W 5 d }~X Y q8X q8| j 2d1 d S )2Nrm   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_statuses)r   testruntestplanZfoldertree_r   zw+r   F)r   r   r   r   u   Тест кейсr   u!   План тестированияr   u   Тестовый прогонr   u2   Не удалось получить проект r   zERR-0003rh   r   )r   r   u*   Дамп проектов завершен)3r   r~   r   r   lenr0   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   Zget_total_testcasesZget_testcasesZget_total_testplansZget_testplansZget_total_testrunsZget_testrunsr   r   r   r   )r1   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_projects  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 | jX | d| jj t   d| j_| jj  t  W 5 Q R X | jj
d |   W 5 Q R X 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*   r   r?   r   r   r   )r1   r   Zdownload_pathr   usedfreeZfree_percentr!   r!   r"   download_dataP  s     

z"CmfPluginZephyrScale.download_datac                 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   r6   rS   rO   uH   В дампе не найдены данные пользователя )r   r   r   r   r   r_   r   r   r   r   lowerr   )r1   user_idr   Z	user_infor!   r!   r"   _get_user_data_from_dumph  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   splitr  Z
user_loginr!   r"   r|     s      c                    s"   g | ]}| d d  kr|qS r  r  r  r  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   rd   re   uP   Возможно найден некорректный пользователь ud   ,так как ext_id содержит несколько ID из одного источника: 'uq   '.Необходимо повторно импортировать локальных пользователей.zERR-0005r   r   ORzNOT LIKEz%::z::%z==ZloginILIKEu+   Пользователей с почтой z > zERR-0006uH   Не удалось найти пользователя с почтой u+   Пользователей с именем r\   z) > zERR-0007)r   r   rg   r   ru   r,   r9   rC   r  r   r   rf   r   minr  Z
max_lengthr  r  r   r   r   r   r`   r?   countlistr   warningr   rj   )r1   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!   r  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   r  r   )r
  r  r   r   r   r   r   r   )r1   r	  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   r  iterdiris_dirr    endswithr   r   load)r1   r   Ztestcases_dirr  Ztestcase_dirtestcase_keyr   Zversionsmajor_versionversiontestcase_filer!   r!   r"   _get_project_testcasesE  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'  )r1   r   Ztestplans_dirr  Ztestplan_dirtestplan_keytestplan_filer   r!   r!   r"   _get_project_testplansj  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'  )r1   r   Ztestruns_dirr  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    r*  r   r   r+  )r1   r   r   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   )r1   r   Z
version_idr`   r.  r!   r!   r"   _get_version  s    z!CmfPluginZephyrScale._get_versionc              	      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_branchr7  Tparentr`   r   import_originalr   )r   r   rf   rg   CmfTestcaseFolderr   rG   r    r;  r   r<  import_raw_jsonr   )folder_datar;  	folder_idZfolder_namer   testcase_folder_ext_idtestcase_folderZsubfolder_data_create_testcase_folderr1   r!   r"   rG    s2    zOCmfPluginZephyrScale._process_testcase_folders.<locals>._create_testcase_folderzfoldertree_testcase.jsonr%  u   Тест-кейсыr   Tr<  r>  r    typesystemre   r   r;  =rc   rd   re   include_archivedZsave_import)r   r   r   r+  rg   CmfRegistryr   rG   r   r@  ri   r<  r   r   )r1   r   r   r   r   r;  rB  r!   rF  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rT  rU  Z
deprecatedr   r    r   rS  workflow)rg   CmfWorkflowr   _testcase_workflow_testcase_statusesr   r  	CmfStatusr1   r   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   )ZhighZnormalZlow)r   r  )r1   Zpriority_nameZ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   translitr   u    Обработка теговTr   r   _#r   ruZlanguage_codereversedr  aliasr  ""%r    rd   u   Тег 'u   ' не найденzERR-0010)r   r   r   )transliteraterd  r   r   r   r<   testcase_msgreplacerg   CmfTagr   rj   r   errors)r1   testcase_objtestcase_datard  Ztestcase_labelstagsZlabelrj  Zfilter_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componentIdr^   r_   rc   r7  u%   Не найден компонент zERR-0011r8  )r   rf   rg   ZCmfComponentrj   r   r   )r1   rs  rt  
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}|rd|sPtjd||| jdd}||_|jdd	 n|rt|jdd
 t  d S )NrI   Zpreconditionr^   z::prer`   ZpreTstep_sectionr>  r`   r   r?  rN  )ZTEXKOM_db_delete)	r   rf   rg   CmfTestcaseStepr   textr   deleter   )r1   rs  rt  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 qt
  d S )NZ
testScriptstepstestCaser_   indexdescriptionexpectedResulttestDatar^   rz  mainTr{  r     rN  )r   rf   rg   r}  r   r~  expected_result	test_dataordernor   r   )r1   rs  rt  r  r   step_idZ
step_indexZstep_descriptionZstep_expected_resultZstep_test_datar  r  r!   r!   r"   _process_testcase_stepsW  s2    



z,CmfPluginZephyrScale._process_testcase_stepsc                 C   s  t |d d}| sL| jjtj d| dd|d t jd7  _d S |d }| j	d	kr| jj
tj d
dd t|dD}|D ]6}zt|}| j d| d|d  }tjj|d}	|	stj||| jdd}	n|	dg |	jsW q|dr| |d |	_|	j|	_|d |	_|	j|	_||	_||	_|d|	_|	jdd 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   r   u6    Файл комментариев не найден 'u\   '. Возможно при дампе комментариев возникли ошибкиzERR-0012r8  r   rI   r   u,    Обработка комментариевTr   r   r^   r_   rz  r=  z**	createdBy	createdOnZbodyrN  r   	processeduB    Не удалось обработать комментарий: r   zERR-0013)"r   r   is_filer   r   r<   ro  rr  statst_sizer   r   r   r   rf   rg   Z
CmfCommentr   r=   r?  r!  
cmf_author	cmf_ownercmf_created_atcmf_modified_atr>  rA  r~  r   r   r   r   r   Ztask_msg)r1   rs  rt  r   r,  r   r   Zcomment_dataZcomment_ext_idr   r   r!   r!   r"   _process_testcase_commentsw  sd    



z/CmfPluginZephyrScale._process_testcase_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}|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r4| |d |_|	drP| |d |_|	d|_|	dpl|j|_|	dr|d d }|d d }	| j d
| d
|	 }
tjj	|
d}||_||_|j dd ||_!|d  |_"|	d!|_#| $|||_%| &|||_'|j dd t(  | )|| | *|| | +|| n| jj,-t j d" | jjt j d#t j dd	 | j.d$d% t jS )&Nr   rI   r   u   [Тест кейс z (vz)]     Начало обработкиTr   r^   r`   rM  rQ  rc   r_   )rS  re   )rS  
logic_typer>  r`   r   r?  r    r_  priorityestimatedTimer  <   r  owner	updatedByr  	updatedOnfolderr:  rz  rN  r&  	objectivev    был изменен пользователем. Новые данные из импорта не применены8    Завершение обработки. Ошибок: r   r  )/r<   rr  rM   rg   r   ro  r   r   rf   r   ZCmfLogicTyperG   r?  rS  r    r[  rY  r\  r  r_  rb  Zsignificanceestimate_timer!  r  r  cmf_modified_byr  r  r@  r  rA  r   Zcmf_ver_numberZcmf_ver_curr~  ry  rx  rw  ru  r   r  r  r  r   r  r   )r1   rt  r,  Ztestcase_codeZtestcase_major_versiontestcase_ext_idrs  r  r   rC  rD  rE  r!   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  )r1   testcase_queuer   r/  r   rt  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   r0  r   r   )r1   r   r  r   r   r   Z	testcasesrt  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:defaultrR  rT  rU  rV  rW  r   r    r   rX  )rg   rZ  r   _testplan_workflow_testplan_statusesr   r  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rx||_|d |_||_| j|_| j	|d d  |_| |	d|_|	dr| |d |_|	dr| |d |_|	d|_|	dp(|j|_|	d|_||_|jdd |rtj||d}|  |jddg d n| jj !t j d | jjt j dt j dd | j"dd d S )Nr   rI   u   [Тест план r   r  Tr   r^   r  rS  r>  r`   r   r?  r    r_  r  r  r  r  r  r  rN  r>  tree_parent_folder    Папка тест-кейсовZcase_folder)Zroot_folder_nameZroot_folder_typeZtestcase_idsr  r  r   r  )#r<   rr  rM   rg   CmfTestplanZtestplan_msgr   r   rf   r   rG   is_newr?  rS  r    r;  r  rY  r  r  r_  r!  r  r  r  r  r  r~  rA  r   ZCmfTestplanTestcaseFolderZsetupr   r  r   )	r1   testplan_datar;  r1  Ztestplan_codeZtestplan_ext_idZtestplan_objZtestplan_is_newr  r!   r!   r"   _process_testplan9  sp    


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+  r  )r1   testplan_queuer;  r   r2  r   r  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   Тест-планыr  Tr<  rH  Z_process_testplan_worker_)r  r;  r   r   r;  rK  rc   rL  rN  )rg   rO  r   rG   r   r   r  r   r   r  rj   r   r3  r   r   r   r  ri   r<  r   )	r1   r   r;  r  r   r   r   Z	testplansr  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:defaultrR  r   in_progressclosed)not executedin progressZdoner   r    r   rT  rX  )rg   rZ  r   _testcycle_workflow_testcycle_statusesr   r  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   r  ZpassedZfailedlocked)r  r  passrV  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   r7  u'   Не найдено окружение zERR-0014r8  )rf   rg   CmfTestEnvironmentr   r   r   )r1   testcase_runenvironment_dataenvironment_idr`   environmentr!   r!   r"   _get_testrun_environment  s    z-CmfPluginZephyrScale._get_testrun_environmentc           	      C   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 S )NZsourceScriptIdr^   rc   r_   r7  u   Не найден шаг z: zERR-0015r8  rz  r  T)r>  r   r|  r`   r   r?  r  r  r  r   testResultStatusr    r   r  r   r  rN  )rf   rg   r}  r   r   r   ZCmfTestcaseRunHistoryStepcache_testcaser  r~  r  r  Zactual_resultr  r  r_  r  r   )	r1   	step_datacur_historyZsource_step_idZsource_step_ext_idr  r  r  Zrun_stepr!   r!   r"   _process_testrun_step  sH    	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|_| |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|_d
|_|j |_ |jd
d ||_|jd
d |d }|D ]}| !|| q|di }|D ]L}|d}|r"| j d| }tj"j|dd	gd}|r"|j#$| q"|jd
d t%  d S )Nr  rI   r^   r   zcur_history.cache_testcasezcur_history.deffectsr7  rc   r_   T)rS  r   r>  Ztestcycle_testcase_folderr`   r   r?  r    r  r  Z
assignedTor  r   r  r  executionTimeZjiraVersionIdr  r  rN  r  ZtestScriptResultsZ
traceLinksZissueId)&rM   rg   ZCmfTestcaseRunrf   r   r   r   r?  rS  r    rb  r  r~  r!  ZresponsibleZcache_estimate_timerE   
spent_timer9  releaser  r  r  r  r_  r   r  r?   ZCmfTestcaseRunHistoryr   r  ZcurZ	iterationr  ZCmfTaskZdeffectsrj   r   )r1   testrun_data	testcycler  rt  r4  Ztestrun_codeZtestrun_ext_idr  r,  r  r   r  Zcur_history_codeZ
steps_datar  Ztrace_linksZ
trace_linkZissue_idZtask_ext_idZtaskr!   r!   r"   _process_testrun  s    


z%CmfPluginZephyrScale._process_testrunc                 C   sr  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 |_|	dr| |d |_|	d|_|	dp"|j|_|	d|_|	d|_| ||	d|_|	ddd d |_t|	ddd d |_ |	d|_!||_"|j#dd tj$j	||d}|s|stj$d||d}|#  |	dpg }|D ]@}	|		dpg }
|
D ]$}|	d sq | %||| q qn| jj&'t j 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  ZplannedStartDateZplannedEndDateZprojectVersionIdr  r  r  r  r  rN  r  r  )r    r>  r  ZtestRunItemsZtestResultsZlastTestResultr  r  r  r  ))r<   rr  rM   rg   ZCmfTestcycleZtestcycle_msgr   r   rf   r   rG   r  r?  rS  r    r  rY  r  r  r_  r!  r  r  r  r  r  Z
start_dateZfinish_dater9  r  r  rE   r  r~  rA  r   ZCmfTestcycleTestcaseFolderr  r   r  r   )r1   Ztestcycle_dataZtestcycle_keyZtestcycle_codeZtestcycle_ext_idr  Ztestcycle_is_newr  Ztestrun_itemsZtestrun_itemZtest_resultsZtest_resultr!   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 r  )r   r   r   r   r   r   r+  r  )r1   testcycle_queuer  Ztestcycle_filer   r  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_r  r   r   )r   r   r  r   r   r  rj   r   r5  r   r   )r1   r   r  r   r   r   Ztestrunsr  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^   rz  Tr=  rN  )r   r   rf   rg   r  rG   r   r?  r    r~  Zslugr   )r1   r   r  r  Zenvironment_nameZenvironment_descriptionZenvironment_ext_idr  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   rc  r   r_   r    r   re  rf  r   rg  Trh  r  r  rj  rk  rl  rm  r$   rN  u+   Не удалось создать тег 'r   z). zERR-0016rq  r  )rn  rd  r   rp  rg   rq  r   r   r   r   r   r   r   )r1   r   rd  Ztag_dataZtag_idZtag_namer    rj  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 S )Nr   r_   rI   r    r^   r`   ra   rb   rH   rA  
show_testsr  u   Проект 'r   r   uY   ] не найден. Возможно он еще не импортирован из JiraTrN  )r   r>   rf   rg   rh   r   r   r  r   r   rG   r  r  rP  r`  r  r  r  r  r  r  )r1   rn   r   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   r  )r0   r6  r>   rG   r   r   r   r  r   r   r   r   r   )r1   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  S )Nr   u   Импорт Jira Zephyr ScaleZimport_settingsZ	accountIdrI   )r   r   r*   r    r?   r   r   Zget_max_processesZmax_processesr4   rf   Z_normalize_settingsr   r   r,   r9   r   r   r   r  r  )r1   r   r!   r!   r"   process_import\  s    
z#CmfPluginZephyrScale.process_import)NN)N)F)Fr   
__module____qualname__r	   r+   Zui_meta_skipZapi_methodsr/   propertyr,   rM   staticmethodrN   rV   r>   rX   rZ   r-   r   r   r   r   rt   r   r   r&   r
   r   r   r   r   r   r  r
  r  r!  r0  r3  r5  r6  r9  rP  r`  rb  rw  ry  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  __classcell__r!   r!   r2   r"   r+   5   s   


&


	

M& ) !
*%
9" 9
R
D+	(\
S

+
 r+   )N)r   rC   r   r   
contextlibr   	itertoolsr   pathlibr   Zqueuer   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    

	