U
    -i                    @   s   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                       s,  e Zd Zejjd Zejjdg Z fddZedd Z	e
dd Ze
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duddZdvddZe dd  Zd!d" Zd#d$ Zd%d& Zd'd( Zd)d* Zd+d, Zdwd.d/Zd0d1 Zd2d3 Z d4d5 Z!d6d7 Z"d8d9 Z#d:d; Z$d<d= Z%d>d? Z&d@dA Z'dBdC Z(dDdE Z)dFdG Z*dHdI Z+e dJdK Z,dLdM Z-dNdO Z.dPdQ Z/e dRdS Z0dTdU Z1dVdW Z2dXdY Z3dZd[ Z4d\d] Z5d^d_ Z6d`da Z7e dbdc Z8ddde Z9dfdg Z:edhdidj Z;edkdldm Z<dndo Z=edpdqdr Z>dsdt Z?  Z@S )x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 )
u5    Клиент для работы с Kaiten 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,   B   s(    
	



	zCmfPluginZephyrScale.clientc                  C   s   g } | S )Nr!   )r   r!   r!   r"   calc_models_settingsZ   s    z)CmfPluginZephyrScale.calc_models_settingsc                  C   s    dddddddddg} | S )Nr    displayName)model_field	json_pathemailemailAddressdoes_not_workZactiver!   )Zuser_settingsr!   r!   r"   _get_user_import_settings_   s
    z.CmfPluginZephyrScale._get_user_import_settingsc           
   
   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 (key)::idext_idLIKE%T--Ztask_code_prefix)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-   h   s.    

z%CmfPluginZephyrScale.get_all_projectsc                 C   s>   | j jjd}t|| _| jr2tjj|d| _nt	j
| _dS )u   
        Устанавливает резервного пользователя,
        если пользователь не будет найден в методе _get_person()
        default_user_idrN   N)r   json_settingsr?   getbool_is_default_userrV   	CmfPerson_fallback_personrZ   Zsystem_user)r1   ra   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 )	NZselectedObjectsr?   r   	isCheckedu8   Не выбраны проекты для импортаc                 S   s$   g | ]}|d  r|d r|d  qS )r   rj   r!   ).0sr!   r!   r"   
<listcomp>   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 )Nusers:user:)APPREDIS_DBredis_simple_getrd   user_keysetr   rN   pickledumps)r1   redis_db	user_datarK   r!   r!   r"   _cache_all_users   s    z%CmfPluginZephyrScale._cache_all_usersc                 C   s   |sdS |  |}|S )u`   
        Метод получает значение параметра объекта
        N)rd   )Zobj_dataattrr?   r!   r!   r"   
_get_value   s    
zCmfPluginZephyrScale._get_valuec                 C   s   |dkr| S |S )NrG   r!   )r1   
field_namer?   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    Преобразование настроек для модели rC   rD   r   )r   r   )r1   r   ro   Znormalized_objZsettingr?   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   get_download_pathjoinpathexistsr(   removeopenjson_object_countwritejsonrz   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"   rv      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   rz   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_dsrN   rK   r    )offsetlimitresultsmajorVersionz '' (rL   Texist_oktestcaseversions.jsonwzutf-8)encoding   )indentr   r   )parentsr   dir	info.jsonu&   Не удалось получить 'u   ' проекта ') [z	] offset=z limit=r   zERR-0005CmfTestcasedump)
error_codeobj_type
error_type)r   r,   _project_datard   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_keyr^   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_worker   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   rN   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   rY   startr   r   r   join)r1   r   r   Zget_total_entities_funcr   r   totalr   r   Zpagethreadsithreadr!   r!   r"   _dump_test_entities6  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 )2Nr\   Tr   P   rN   rK   rI   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-0006rW   r   )r   r   u*   Дамп проектов завершен)3r   r   r   r   lenr0   intrd   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   projects_dirZcntstepr`   r   r   r^   project_dirZproject_tmp_dirr]   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   Свободно места: rQ   u5   Скачивание данных через API ... rq      u,   Дамп выбранных проектов)ZloggingZ	getLoggerr   r   ZhandlersZsetLevellevelr   r   
disk_usager   r,   r
   Z	get_usersr*   r   r?   r   r   r   )r1   r   Zdownload_pathr   usedfreeZfree_percentr!   r!   r"   download_data  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 )	Nrr   rq   r    r   r6   rF   rB   uH   В дампе не найдены данные пользователя )rs   rt   ru   rd   r   rN   ry   r   rv   rw   lowerr   )r1   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	| d.dd |rr|d
 }|S )3NrT   r    z[,;\s]+rE   c                 S   s   g | ]}|  r|  qS r!   )striprk   rE   r!   r!   r"   rm   =  s      z8CmfPluginZephyrScale._process_person.<locals>.<listcomp>r   c                    s"   g | ]} | d d kr|qS @r   splitr   Z
user_loginr!   r"   rm   ?  s      c                    s"   g | ]}| d d  kr|qS r   r   r   r   r!   r"   rm   @  s      r   Zemail_2rM   r   r   	last_namer   
first_namesecond_name   u?   Часть полного имени пользователя 'u   ' длиннее u_    символов. Фамилия, Имя и Отчество не были заполнены.zERR-0110rg   r   r   Zrg_member_ofrO   rP   rQ   rS   rT   uP   Возможно найден некорректный пользователь ud   ,так как ext_id содержит несколько ID из одного источника: 'uq   '.Необходимо повторно импортировать локальных пользователей.zERR-0004r   r   ORzNOT LIKEz%::z::%z==ZloginILIKEu+   Пользователей с почтой z > zERR-0037uH   Не удалось найти пользователя с почтой u+   Пользователей с именем rJ   z) > )r   ro   rV   rg   Zverbose_namer,   r9   rer   r   r   rU   rw   minr   Z
max_lengthr   r   r   r   r   rd   rO   r?   countlistr   warningr   rY   )r1   r|   Znormalized_dataZemailsZemails_by_loginZemails_by_namerO   Z	full_nameZcurrent_length_namer    Zmax_length_namerT   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-0045rg   r   r   )r   r  r   rh   rf   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 )Nr\   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_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 )
Nr\   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_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 )
Nr\   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 )Nr\   r  r   r   )
r   r   r   r   r  r    r  r   r   r  )r1   r   r   r   r!   r!   r"   _get_projectsV  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:rN   rR   rO   rT   u!   Не найдена версия ERR-0051r   )rU   rV   ZCmfListrd   r   r   )r1   r   Z
version_idrO   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 )NrN   r    	projectIdu   Папка 'r   rL   rM   tree_parenttree_node_is_branchr   TparentrO   r   import_originalrn   )r   r   rU   rV   CmfTestcaseFolderrd   _projectr    r%  re   r&  import_raw_jsonr   )folder_datar%  	folder_idZfolder_namer   testcase_folder_ext_idtestcase_folderZsubfolder_data_create_testcase_folderr1   r!   r"   r2  p  s2    zOCmfPluginZephyrScale._process_testcase_folders.<locals>._create_testcase_folderzfoldertree_testcase.jsonr  u   Тест-кейсыr   Tr&  r(  r    typesystemrT   rn   r%  =rR   rS   rT   include_archivedZsave_import)r   r   r   r  rV   CmfRegistryrd   r+  re   r*  rX   r&  r   r   )r1   r   r   r   r   r%  r-  r!   r1  r"   _process_testcase_folderso  s,    
z.CmfPluginZephyrScale._process_testcase_foldersc                 C   sp   t jjdd| _dddd}i | _| d|D ]<}|dd	 }||d}t jj|| jd
}|| j|< q.d S )Ntestcase.base:defaultcodedraftapprovedfailr?  r@  Z
deprecatedr   r    r   r>  workflow)rV   CmfWorkflowrd   _testcase_workflow_testcase_statusesrv   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)rd   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    rS   u   Тег 'u   ' не найденzERR-0015)r   r   r   )transliteraterO  rd   r   r   r<   testcase_msgreplacerV   CmfTagr   rY   r   errors)r1   testcase_objtestcase_datarO  Ztestcase_labelstagsZlabelrU  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componentIdrM   rN   rR   r   u%   Не найден компонент r!  r"  )rd   rU   rV   ZCmfComponentrY   r   r   )r1   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}|rd|sPtjd||| jdd}||_|jdd	 n|rt|jdd
 t  d S )NrK   ZpreconditionrM   z::prerO   ZpreTstep_sectionr(  rO   r   r)  r9  )ZTEXKOM_db_delete)	rd   rU   rV   CmfTestcaseStepr   textr   deleter   )r1   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 qt
  d S )NZ
testScriptstepstestCaserN   indexdescriptionexpectedResulttestDatarM   re  mainTrf  r     r9  )rd   rU   rV   rh  r   ri  expected_result	test_dataordernor   r   )r1   r^  r_  rn  r   step_idZ
step_indexZstep_descriptionZstep_expected_resultZstep_test_datark  rl  r!   r!   r"   _process_testcase_steps  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-0019r"  r   rK   r   u,    Обработка комментариевTr   r   rM   rN   re  r'  z**	createdBy	createdOnZbodyr9  r   	processeduB    Не удалось обработать комментарий: r   zERR-0020)"r   r   is_filer   r   r<   rZ  r]  statst_sizer   r   r   r   rU   rV   Z
CmfCommentrd   r=   r)  r
  
cmf_author	cmf_ownercmf_created_atcmf_modified_atr(  r,  ri  r   r   r   r   r   Ztask_msg)r1   r^  r_  r   r  r   r   Zcomment_dataZcomment_ext_idr   r   r!   r!   r"   _process_testcase_comments+  sd    



z/CmfPluginZephyrScale._process_testcase_commentsc                 C   sr  dt _|d }|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r| |d |_|dr:| |d |_|d|_|dpV|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   rK   r   u   [Тест кейс z (vz)]     Начало обработкиTr   rM   rO   r8  r<  rR   rN   )r>  rT   )
logic_typer(  rO   r   r)  r    rJ  priorityestimatedTimeru  <   r{  owner	updatedByr|  	updatedOnfolderr$  re  r9  r  	objectivev    был изменен пользователем. Новые данные из импорта не применены8    Завершение обработки. Ошибок: r   r}  )-r<   r]  rZ  r   r   rU   rV   r   rd   ZCmfLogicTyper+  r)  r    rF  rD  rG  r   rJ  rM  Zsignificanceestimate_timer
  r  r  cmf_modified_byr  r  r*  r  r,  r   Zcmf_ver_numberZcmf_ver_curri  rd  rc  rb  r`  r   rm  rz  r  r   r  r   )r1   r_  r  Ztestcase_major_versiontestcase_ext_idr^  r  r   r.  r/  r0  r!   r!   r"   _process_testcased  sz    


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   rd   r   r   r   r   r  r  )r1   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  rY   r   r  r   r   )r1   r   r  r   r   r   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@  rA  rB  r   r    r   rC  )rV   rE  rd   _testplan_workflow_testplan_statusesrv   r   rH  rI  r!   r!   r"   _set_testplan_statuses  s    z+CmfPluginZephyrScale._set_testplan_statusesc                 C   s  dt _|d }d| dt _| jjt j ddd | j d| }tjj|dd	}|snt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|_||_|jdd |rvt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   rK   u   [Тест план r   r  Tr   rM   r  r'  r    rJ  r{  r  r  r|  r  r  r9  r(  tree_parent_folder    Папка тест-кейсовZcase_folder)Zroot_folder_nameZroot_folder_typeZtestcase_idsr  r  r   r}  )!r<   r]  Ztestplan_msgr   r   rU   rV   CmfTestplanrd   r+  is_newr)  r    r%  r  rD  r  r   rJ  r
  r  r  r  r  r  ri  r,  r   ZCmfTestplanTestcaseFolderZsetupr   r  r   )r1   testplan_datar%  r  Ztestplan_ext_idZtestplan_objZtestplan_is_newr  r!   r!   r"   _process_testplan  sj    



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   rd   r   r   r   r   r  r  )r1   testplan_queuer%  r   r  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&  r3  Z_process_testplan_worker_)r  r%  r   r   r%  r6  rR   r7  r9  )rV   r:  rd   r+  r   r   r  r   r   r  rY   r   r  r   r   re   r  rX   r&  r   )	r1   r   r%  r  r   r   r   Z	testplansr  r!   r!   r"   _process_testplans9  sD    



z'CmfPluginZephyrScale._process_testplansc                 C   sp   t jjdd| _dddd}i | _| d|D ]<}|dd	 }||d
}t jj|| jd}|| j|< q.d S )Nztestcycle.base:defaultr=  r   in_progressclosed)not executedin progressZdoner   r    r   r?  rC  )rV   rE  rd   _testcycle_workflow_testcycle_statusesrv   r   rH  rI  r!   r!   r"   _set_testcycle_statusesd  s    z,CmfPluginZephyrScale._set_testcycle_statusesc                 C   s   dddddd| _ d S )Nr   r  ZpassedZfailedlocked)r  r  passrA  Zblocked)_testrun_statusesr@   r!   r!   r"   _set_testrun_statusest  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 )NrN   rM   rR   r   u'   Не найдено окружение r!  r"  )rU   rV   CmfTestEnvironmentrd   r   r   )r1   testcase_runenvironment_dataenvironment_idrO   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sourceScriptIdrM   rR   rN   r   u   Не найден шаг z: r!  r"  re  rt  T)r(  r   rg  rO   r   r)  rq  rr  rs  r   testResultStatusr    r   rp  r   ru  r9  )rU   rV   rh  rd   r   r   ZCmfTestcaseRunHistoryStepcache_testcaserl  ri  rv  rw  Zactual_resultr  r   rJ  rx  r   )	r1   	step_datacur_historyZsource_step_idZsource_step_ext_idrl  ry  rk  Zrun_stepr!   r!   r"   _process_testrun_step  sH    	z*CmfPluginZephyrScale._process_testrun_stepc                 C   sZ  |d }|d }| 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rP|d |_| |d d |_	|d|_
| |d|_|ddd d |_t|ddd d |_| ||d|_| ||d|_| j|d d  |_|jd
d |jj}|sbt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 )Nro  rK   rM   r   zcur_history.cache_testcasezcur_history.deffectsr   rR   rN   T)r   r(  Ztestcycle_testcase_folderrO   r   r)  r    r  r  Z
assignedTor  r   ru  r  executionTimeZjiraVersionIdr  r  r9  r'  ZtestScriptResultsZ
traceLinksZissueId)$rU   rV   ZCmfTestcaseRunrd   r   r   r)  r    rM  r  ri  r
  ZresponsibleZcache_estimate_timer   
spent_timer#  releaser  r  r  r   rJ  r   r  r?   ZCmfTestcaseRunHistoryr   r  ZcurZ	iterationr  ZCmfTaskZdeffectsrY   r   )r1   testrun_data	testcycler  r_  r  Ztestrun_ext_idr  r  r  r   r  Z
steps_datar  Ztrace_linksZ
trace_linkZissue_idZtask_ext_idZtaskr!   r!   r"   _process_testrun  s    	

z%CmfPluginZephyrScale._process_testrunc                 C   sZ  dt _|d }d| dt _| jjt j ddd | j d| }tjj|dd	}|snt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   rK   u   [Тест-цикл r   r  Tr   rM   r  r'  r    rJ  r{  r  r  r|  r  ZplannedStartDateZplannedEndDateZprojectVersionIdr  ru  r  r  rq  r9  r  r  )r    r(  r  ZtestRunItemsZtestResultsZlastTestResultr  r  r  r}  )'r<   r]  Ztestrun_msgr   r   rU   rV   ZCmfTestcyclerd   r+  r  r)  r    r  rD  r  r   rJ  r
  r  r  r  r  r  Z
start_dateZfinish_dater#  r  r  r   r  ri  r,  r   ZCmfTestcycleTestcaseFolderr  r   r  r   )r1   r  r  Ztestcycle_ext_idr  Ztestcycle_is_newr  Ztestrun_itemsZtestrun_itemZtest_resultsZtest_resultr!   r!   r"   _process_testcycle
  s    



z'CmfPluginZephyrScale._process_testcyclec              
   C   sf   t ddR | }|d krqXt|d}t|d}t|}W 5 Q R X | | qW 5 Q R X d S r  )r   rd   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  rY   r   r  r   r   )r1   r   r  r   r   r   Ztestrunsr  r!   r!   r"   _process_testcyclesh  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   rN   r    rq  rM   re  Tr'  r9  )rv   rd   rU   rV   r  r+  r   r)  r    ri  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   rN  r   rN   r    r   rP  rQ  r   rR  TrS  r   r  rU  rV  rW  rX  r$   r9  u+   Не удалось создать тег 'r   z). zERR-0011r\  r   )rY  rO  rv   r[  rV   r\  rd   r   r   r   r   r   r   )r1   r   rO  Ztag_dataZtag_idZtag_namer    rU  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
gd}|s~td| d| d| dd|_|jdd t	  || _
| | | | | | | | | | | | | | | | |   | | d S )Nr   rN   rK   r    rM   rO   rP   rQ   r,  
show_testsr   u   Проект 'r   r   uY   ] не найден. Возможно он еще не импортирован из JiraTr9  )r   r>   rU   rV   rW   rd   r   r  r   r   r+  r  r  r;  rK  r  r  r  r  r  r  )r1   r]   r   r   r   r^   r_   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 hq| | t  W nN t	k
r   t
  |  jd7  _| jjd| d| d	| d
ddd Y nX W 5 d | _d | _X qd S )Nc                 S   s   g | ]}t |d  qS rb   )r>   )rk   pr!   r!   r"   rm     s     z:CmfPluginZephyrScale._process_projects.<locals>.<listcomp>rN   rK   r    r   u=   Не удалось импортировать проект 'r   r   r   zERR-0032rW   r   )r0   r  r>   r+  r   r   r   r  r   r   r   r   r   )r1   Zselected_projects_idsr]   r   r   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	accountIdrK   )r   r   r*   r    r?   r   r   Zget_max_processesZmax_processesr4   rU   Z_normalize_settingsrc   ro   r,   r9   rw   ri   rp   r   r  )r1   r   r!   r!   r"   process_import  s    
z#CmfPluginZephyrScale.process_import)NN)N)F)Ar   
__module____qualname__r	   r+   Zui_meta_skipZapi_methodsr/   propertyr,   staticmethodrA   rH   r-   ri   rp   r}   r   r   r   r&   r
   rv   r   r   r   r   r   r   r  r
  r  r  r  r  r#  r;  rK  rM  rb  rd  rm  rz  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+   4   s   





	

M& ) !
*%
9" 9
O
A+	(U
P

*
 r+   )N)ry   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   

	