U
    iM                     @   sv   d dl Z d dlmZ d dlmZ d dlT d dlmZ G dd deZ	G dd	 d	eZ
G d
d deZG dd dZdS )    N)	HTTPError)IntEnum)*)BigGanttClientc                   @   s   e Zd ZdS )PluginNotFoundErrorN__name__
__module____qualname__ r   r   $./modules/jira/managers/big_gantt.pyr   	   s   r   c                   @   s   e Zd ZdS )TaskNotFoundErrorNr   r   r   r   r   r      s   r   c                   @   s    e Zd ZdZdZdZdZdZdS )TaskType               N)r   r	   r
   ISSUEZVERSIONZ	COMPONENTZSPRINTZPROJECTr   r   r   r   r      s
   r   c                   @   s   e Zd ZdZd4ddZdd Zdd Zd	d
 Zdd Zdd Z	dd Z
dd Zdd Zdd Zdd Zd5ddZdd Zdd Zd d! Zd"d# Zd$d% Zd&d' Zd(d) Zd*d+ Zd,d- Zd.d/ Zd0d1 Zd2d3 ZdS )6BigGanttManagerzeu.softwareplant.bigganttNc                 C   s\   || _ |   || _|p4t|j|j|j| |jd| _	| 
  |   tjjdd| _d S )N)urlusernamepasswordZcookies
verify_sslzsystem.additional_parent)code)_jira_client_require_plugin
cmf_importr   r   r   r   Zget_session_cookiesr   _client_mkdir_set_main_extplatform_idmodelsZCmfRelationTypeget_additional_parent_relation)selfr   Zjira_clientZbiggantt_clientr   r   r   __init__   s    zBigGanttManager.__init__c              
   C   sr   z| j | j}|d| _W nN tjk
rX } z|jjdkrFt	d W 5 d}~X Y n t
k
rl    Y nX dS )uE   Проверить установку плагина BigGantt в Jiraversioni  u7   Плагин BigGantt не установлен в JiraN)r   Zget_plugin_info
plugin_keyr"   Zplugin_versionrequestsr   responseZstatus_coder   	Exception)r$   pluginexcr   r   r   r   0   s    zBigGanttManager._require_pluginc                 C   s$   | j  d| _| jjdd dS )u9   Создать основной каталог дампаZbigganttTexist_okN)r   Zget_download_pathjoinpathbiggantt_dirmkdirr$   r   r   r   r   <   s    zBigGanttManager._mkdirc              	   C   sV   | j d}| rLt|d}t|}W 5 Q R X tdd |D d| _nd| _dS )uT   Установить id основного экземпляра интеграцииextplatform.jsonrc                 s   s*   | ]"}| d s| dr|d V  qdS )ZisMainZ	isPrimaryidN)r"   ).0extplatformr   r   r   	<genexpr>H   s   
 
z;BigGanttManager._set_main_extplatform_id.<locals>.<genexpr>N)r0   r/   existsopenjsonloadnext_main_extplatform_id)r$   extplatform_filefdatar   r   r   r    A   s    z(BigGanttManager._set_main_extplatform_idc                    s   g   fdd|  S )uR   Собрать все id задач из древовидной структурыc                    s0   | D ]&}  |d  |d r|d  qd S )NtaskIdchildren)append)itemsitemidstraverser   r   rI   U   s    z3BigGanttManager._collect_task_ids.<locals>.traverser   )r$   tree_structurer   rG   r   _collect_task_idsQ   s    z!BigGanttManager._collect_task_idsc                    s    fdd|S )u  
        Пересобрать структуру, состоящую только из задач.
        Структура может содержать не только задачи, но и спринты, версии, компоненты и проекты.
        c                    s   g }| D ]}  |d d }|r|d tjkrd|d i}|| | }|d rv|d }|rn||d< ng |d< || q|d r||d  q|S )NrB   extTaskType	extTaskIdrC   )r"   r   r   updatecopyrD   extend)rE   	structurerF   	task_dataZupdate_dataZnew_itemrC   tasksrI   r   r   rI   d   s$     

z8BigGanttManager._update_tree_structure.<locals>.traverser   )r$   rJ   rT   r   rS   r   _update_tree_structure^   s    z&BigGanttManager._update_tree_structurec              	   C   sJ   | j  }| jd}t|d}tj||ddd W 5 Q R X |   d S )Nr3   wr   FindentZensure_ascii)r   Zget_extplatformr0   r/   r:   r;   dumpr    )r$   r7   r?   r@   r   r   r   _dump_extplatform   s
    
z!BigGanttManager._dump_extplatformc              	   C   sn   | j  }| jd}t|d}tj||ddd W 5 Q R X tdd |D d| _td	d |D d| _	d S )
Nzfields.jsonrV   r   FrW   c                 s   s.   | ]&}| d d dkrt|d V  qdS )name keyfieldIdNr"   lowerstrr6   Zfieldr   r   r   r8      s   z4BigGanttManager._dump_task_fields.<locals>.<genexpr>r\   c                 s   s.   | ]&}| d d dkrt|d V  qdS )r[   r\   summaryr^   Nr_   rb   r   r   r   r8      s   )
r   Zget_task_fieldsr0   r/   r:   r;   rY   r=   Zkey_field_idZsummary_field_id)r$   fieldsZfields_filer@   r   r   r   _dump_task_fields   s     
z!BigGanttManager._dump_task_fieldsc              	   C   sB   | j |}|d}t|d}tj||ddd W 5 Q R X d S )Nscope_definition.jsonrV   r   FrW   )r   Zget_box_scope_definitionr/   r:   r;   rY   )r$   box_idsettings_dirZscope_definitionscope_definition_filer@   r   r   r   _dump_box_scope_definition   s    
z*BigGanttManager._dump_box_scope_definitionc              	   C   sB   | j |}|d}t|d}tj||ddd W 5 Q R X d S )Nztask_structure.jsonrV   r   FrW   )r   Zget_box_task_structurer/   r:   r;   rY   )r$   rg   rh   Ztask_structureZtask_structure_filer@   r   r   r   _dump_box_task_structure   s    
z(BigGanttManager._dump_box_task_structurec              
   C   s   i }dd dd |D  d}z| jj|dd}W n& tk
rZ } z|W 5 d }~X Y nX |d D ]"}|d	 |d
 d d||d < qd|S )Nzid in (z, c                 S   s   g | ]}|qS r   r   )r6   Zext_task_idr   r   r   
<listcomp>   s     z4BigGanttManager._get_jira_issues.<locals>.<listcomp>)z
id,summary)rd   issuesr]   rd   rc   )Z
extTaskKeyZextTaskSummaryr5   )joinr   jqlr   )r$   ext_task_idsrn   rp   r)   eZissuer   r   r   _get_jira_issues   s    
z BigGanttManager._get_jira_issuesd   c              	   C   s   i }t dt||D ]^}||||  }| j||}dd |D }	|D ](}
d|
ksH|
d tjkrdqH|
||
d < qHq|d}t|d}tj	||dd	d
 W 5 Q R X |S )Nr   c                 S   s*   g | ]"}d |kr|d  t jkr|d qS )rL   rM   )r   r   )r6   rR   r   r   r   rl      s    z=BigGanttManager._dump_box_tasks_by_chunks.<locals>.<listcomp>rL   rB   z
tasks.jsonrV   r   FrW   )
rangelenr   Zget_box_tasksr   r   r/   r:   r;   rY   )r$   rg   rH   	gantt_dirZ
chunk_sizeZ	all_tasksitask_idsrT   rq   rR   Z
tasks_filer@   r   r   r   _dump_box_tasks_by_chunks   s    
z)BigGanttManager._dump_box_tasks_by_chunksc           
   	   C   s   | j |}|d}t|d}tj||ddd W 5 Q R X | |}| |||}| ||}|d}	t|	d}tj||ddd W 5 Q R X d S )Nzoriginal_tree_structure.jsonrV   r   FrW   tree_structure.json)	r   Zget_box_tree_structurer/   r:   r;   rY   rK   rz   rU   )
r$   rg   rw   rJ   Zoriginal_tree_structure_filer@   ry   rT   rQ   tree_structure_filer   r   r   _dump_box_tree_structure   s    


z(BigGanttManager._dump_box_tree_structurec              	   C   sB   | j |}|d}t|d}tj||ddd W 5 Q R X d S )Nzall_links.jsonrV   r   FrW   )r   Zget_box_all_linksr/   r:   r;   rY   )r$   rg   rw   Z	all_linksZall_links_filer@   r   r   r   _dump_box_all_links   s    
z#BigGanttManager._dump_box_all_linksc           
   	   C   s   |d }|d }| j jd| d| d ||}|jdd |d}t|d	}tj||d
dd W 5 Q R X |d}|jdd | || | 	|| |d}	|	jdd | 
||	 | ||	 d S )NboxIdZboxNameu*   Дамп диаграммы (блока) 'z' (rm   Tr-   z	info.jsonrV   r   FrW   settingsgantt)r   loggerinfor/   r1   r:   r;   rY   rj   rk   r}   r~   )
r$   box_data	boxes_dirrg   Zbox_namebox_dirZ	info_filer@   rh   rw   r   r   r   	_dump_box   s     



zBigGanttManager._dump_boxc                 C   s8   | j d}|jdd | j D ]}| || q"d S )NboxesTr-   )r0   r/   r1   r   Zget_box_hierarchyr   )r$   r   r   r   r   r   _dump_boxes  s    zBigGanttManager._dump_boxesc                 C   s   |    |   |   dS )u2   Дамп данных из плагина BigGanttN)rZ   re   r   r2   r   r   r   	dump_data  s    zBigGanttManager.dump_datac                 C   sD   g }| j d}| r@| D ]}|jdr2q ||j q |S )u:   Получить все id диаграмм (блоков)r   z.meta)r0   r/   r9   iterdirr[   endswithrD   )r$   box_idsr   r   r   r   r   _get_box_ids  s    zBigGanttManager._get_box_idsc              
   C   s   g }| j d}| rzp||}| s<td| d|dd}| sftd| d| dt|d	}t|}W 5 Q R X W n0 tk
r } z| jj	| W 5 d
}~X Y nX |S )uZ   Получить древовидную структуру диаграммы (блока)r   u;   Каталог дампа диаграммы (блока) 'u   ' не найденr   r{   u/   В дампе диаграммы (блока) 'u#   ' отсутствует файл ''r4   N)
r0   r/   r9   FileNotFoundErrorr:   r;   r<   r   r   warning)r$   rg   rJ   r   r   r|   r@   r,   r   r   r   _get_box_tree_structure  s&    

 z'BigGanttManager._get_box_tree_structurec              
   C   s|  d| d| }z|r|r|j |krtjjdd| jgddd|gdd|ggdd|gdd|ggggddgd}|stj| j| jd	}||_||_|jr|j	d
d | jj
d| d|  q| jj
d| d| d n"|r|stdn|s|rtdW nz tk
r8 } z| jj
| d|  W 5 d}~X Y n@ tk
rv } z | jj| d| ddd W 5 d}~X Y nX dS )uW   Обработать связь родительской и дочерней задачuh   Невозможно установить связь между родительской задачей u$    и дочерней задачей relation_type=ORin_linkout_linkfilterrd   )r   r   T)Zsave_importuU   Установлена связь между родительской задачей u)    и её дочерней задачей u   Задача uB    уже связана с родительской задачей uV    посредством поля 'Родительская задача' (parent_task)uX   Вероятно, дочерняя задача не была импортированаu`   Вероятно, родительская задача не была импортированаz. NzERR-0114CmfRelationOption)Zobj_type)parent_taskr!   r   r"   r#   r   r   r   Z
is_changedZsaver   debugr   r   r*   Z	log_error)r$   parent_identparentZchild_identchildZ	error_msgZrelation_optionr,   r   r   r   _process_relation:  sR    


(z!BigGanttManager._process_relationc                    s&     |}d fdd	| dS )uz   Обработать связи родительских и дочерних задач в диаграмме (блоке)Nr   c           
         s   | D ]}|d }|dkr|sq|d }| } j jjj d| }tjjdd|gddgd}	|dkrt ||||	 |r|||	|d	  qd S )
NrC   r   rM   z::Zext_idr   r   r   r   )r   r+   source_hashr!   ZCmfTaskr"   r   )
rE   r   r   Zcurrent_depthrF   rC   Ztask_idZ
task_identZtask_ext_idZtaskr$   rI   r   r   rI   s  s    z7BigGanttManager.process_box_relations.<locals>.traverse)NNr   )r   )r$   rg   rJ   r   r   r   process_box_relationso  s    
z%BigGanttManager.process_box_relationsc                 C   s"   |   D ]}| | t  qdS )u   Обработать связи родительских и дочерних задач во всех диаграммах (блоках)N)r   r   Z
cmf_commit)r$   rg   r   r   r   process_relations  s    
z!BigGanttManager.process_relationsc              
      s   g } j d}| r| D ]}|jdr2q |dd}| sHq t|d}t|}W 5 Q R X t	 fdd|d D i }|
d	g D ]>}	|	d
 }
|	d ddd }||
|fkr||d   q qq |S )u+  
        Получить все диаграммы (блоки) в которых используется проект

        Args:
            project_id_or_key (str): ключ или id проекта

        Returns:
            list: список id диаграмм (блоков)
        r   r   r   rf   r4   c                 3   s(   | ] }|d  d  j kr|d V  qdS ZextPlatformr5   ZscopeDefinitionElementsNr>   r6   Z	scope_defr2   r   r   r8     s   z7BigGanttManager.get_boxes_by_project.<locals>.<genexpr>extPlatformScopeDefinitionsJIRA_PROJECTvaluer   /r   r   )r0   r/   r9   r   r[   r   r:   r;   r<   r=   r"   rsplitrD   )r$   Zproject_id_or_keyr   r   r   ri   r@   rA   scope_definition_elementsproject
project_idproject_keyr   r2   r   get_boxes_by_project  s0    

	z$BigGanttManager.get_boxes_by_projectc              	      s   g } j d|dd}| s"|S t|d}t|}W 5 Q R X t fdd|d D i }|dg D ]8}|d	 }|d
 ddd }	|d }
|	||	|
f qj|S )u  
        Получить все проекты, которые содержит диаграмма (блок)

        Args:
            box_id (str): id диаграммы (блока)

        Returns:
            list: список проектов (id, key, name)
        r   r   rf   r4   c                 3   s(   | ] }|d  d  j kr|d V  qdS r   r   r   r2   r   r   r8     s   z9BigGanttManager.get_box_scope_projects.<locals>.<genexpr>r   r   r   r   r   r   r   r[   )
r0   r/   r9   r:   r;   r<   r=   r"   r   rD   )r$   rg   Zprojectsri   r@   rA   r   r   r   r   Zproject_namer   r2   r   get_box_scope_projects  s.    
   
z&BigGanttManager.get_box_scope_projects)N)rt   )r   r	   r
   r'   r%   r   r   r    rK   rU   rZ   re   rj   rk   rs   rz   r}   r~   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r      s2   
#
5+r   )r(   Zrequests.exceptionsr   enumr   Zcmf.includeZmodules.jira.clientsr   r*   r   r   r   r   r   r   r   r   <module>   s   