U
    iE                     @   sN   d dl 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	ZdS )
    N)*)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d2d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d3d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d.d/ Zd0d1 ZdS )4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requestsZ	HTTPErrorZresponseZstatus_coder   	Exception)r   pluginexcr	   r	   r
   r   &   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   2   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  r|d V  qdS )ZisMainidNr	   ).0extplatformr	   r	   r
   	<genexpr>>   s      z;BigGanttManager._set_main_extplatform_id.<locals>.<genexpr>N)r&   r%   existsopenjsonloadnext_main_extplatform_id)r   extplatform_filefdatar	   r	   r
   r   7   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
   r?   H   s    z3BigGanttManager._collect_task_ids.<locals>.traverser	   )r   tree_structurer	   r=   r
   _collect_task_idsD   s    z!BigGanttManager._collect_task_idsc                    s    fdd|S )u  
        Пересобрать структуру, состоящую только из задач.
        Структура может содержать не только задачи, но и спринты, версии, компоненты и проекты.
        c                    s   g }| D ]}|d  }|d  j  d d }d|krtd|r|d |d  j  d d |d  j d d	 d
}|| | }|d r|d }|r||d< ng |d< || q|d r||d  q|S )Nr8   columnsZNONEr   z/browse/z	\/\w+-\d+	extTaskIdvaluesummary)rC   keyrE   r9   )key_field_idresearchsummary_field_idupdatecopyr:   extend)r;   	structurer<   	task_dataZtask_urlZupdate_dataZnew_itemr9   r   tasksr?   r	   r
   r?   W   s(    

z8BigGanttManager._update_tree_structure.<locals>.traverser	   )r   r@   rQ   r	   rP   r
   _update_tree_structureQ   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 )Nr)   w   FindentZensure_ascii)r   Zget_extplatformr&   r%   r0   r1   dumpr   )r   r-   r5   r6   r	   r	   r
   _dump_extplatformt   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.jsonrS   rT   FrU   c                 s   s.   | ]&}| d d dkrt|d V  qdS )name rF   fieldIdNr   lowerstrr,   Zfieldr	   r	   r
   r.      s   z4BigGanttManager._dump_task_fields.<locals>.<genexpr>rZ   c                 s   s.   | ]&}| d d dkrt|d V  qdS )rY   rZ   rE   r[   Nr\   r_   r	   r	   r
   r.      s   )
r   Zget_task_fieldsr&   r%   r0   r1   rW   r3   rG   rJ   )r   fieldsZfields_filer6   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.jsonrS   rT   FrU   )r   Zget_box_scope_definitionr%   r0   r1   rW   )r   box_idsettings_dirZscope_definitionscope_definition_filer6   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.jsonrS   rT   FrU   )r   Zget_box_task_structurer%   r0   r1   rW   )r   rc   rd   Ztask_structureZtask_structure_filer6   r	   r	   r
   _dump_box_task_structure   s    
z(BigGanttManager._dump_box_task_structured   c              	   C   s   i }t dt||D ]8}||||  }| j||}|D ]}	|	||	d < q:q|d}
t|
d}tj||ddd W 5 Q R X |S )Nr   r8   z
tasks.jsonrS   rT   FrU   )rangelenr   Zget_box_tasksr%   r0   r1   rW   )r   rc   r>   	gantt_dirZ
chunk_sizeZ	all_tasksitask_idsrQ   rO   Z
tasks_filer6   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.jsonrS   rT   FrU   tree_structure.json)	r   Zget_box_tree_structurer%   r0   r1   rW   rA   rn   rR   )
r   rc   rk   r@   Zoriginal_tree_structure_filer6   rm   rQ   rN   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.jsonrS   rT   FrU   )r   Zget_box_all_linksr%   r0   r1   rW   )r   rc   rk   Z	all_linksZall_links_filer6   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' ()Tr#   z	info.jsonrS   rT   FrU   settingsgantt)r   loggerinfor%   r'   r0   r1   rW   rf   rg   rq   rr   )
r   box_data	boxes_dirrc   Zbox_namebox_dirZ	info_filer6   rd   rk   r	   r	   r
   	_dump_box   s     



zBigGanttManager._dump_boxc                 C   s8   | j d}|jdd | j D ]}| || q"d S )NboxesTr#   )r&   r%   r'   r   Zget_box_hierarchyr|   )r   rz   ry   r	   r	   r
   _dump_boxes   s    zBigGanttManager._dump_boxesc                 C   s   |    |   |   dS )u2   Дамп данных из плагина BigGanttN)rX   ra   r~   r(   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)r&   r%   r/   iterdirrY   endswithr:   )r   box_idsrz   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   ' не найденrv   ro   u/   В дампе диаграммы (блока) 'u#   ' отсутствует файл ''r*   N)
r&   r%   r/   FileNotFoundErrorr0   r1   r2   r   rw   warning)r   rc   r@   rz   r{   rp   r6   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filterr`   )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saverw   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 }|d }| d| d} j jjj d| }	tjjdd	|	gd
dgd}
|dkr ||||
 |r|||
|d  qd S )Nr9   r   rF   rC   z (rt   z::Zext_idr   r   r      )r   r!   source_hashr   ZCmfTaskr   r   )r;   r   r   Zcurrent_depthr<   r9   Ztask_keyZtask_idZ
task_identZtask_ext_idZtaskr   r?   r	   r
   r?   G  s     z7BigGanttManager.process_box_relations.<locals>.traverse)NNr   )r   )r   rc   r@   r	   r   r
   process_box_relationsC  s    
z%BigGanttManager.process_box_relationsc                 C   s"   |   D ]}| | t  qdS )u   Обработать связи родительских и дочерних задач во всех диаграммах (блоках)N)r   r   Z
cmf_commit)r   rc   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   ru   rb   r*   c                 3   s(   | ] }|d  d  j kr|d V  qdS ZextPlatformr+   ZscopeDefinitionElementsNr4   r,   Z	scope_defr(   r	   r
   r.   ~  s   z7BigGanttManager.get_boxes_by_project.<locals>.<genexpr>extPlatformScopeDefinitionsJIRA_PROJECTrD   r   /r   rs   )r&   r%   r/   r   rY   r   r0   r1   r2   r3   r   rsplitr:   )r   Zproject_id_or_keyr   rz   r{   re   r6   r7   scope_definition_elementsproject
project_idproject_keyr	   r(   r
   get_boxes_by_projectd  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}   ru   rb   r*   c                 3   s(   | ] }|d  d  j kr|d V  qdS r   r   r   r(   r	   r
   r.     s   z9BigGanttManager.get_box_scope_projects.<locals>.<genexpr>r   r   rD   r   r   r   r   rY   )
r&   r%   r/   r0   r1   r2   r3   r   r   r:   )r   rc   Zprojectsre   r6   r7   r   r   r   r   Zproject_namer	   r(   r
   get_box_scope_projects  s.    
   
z&BigGanttManager.get_box_scope_projects)N)rh   )r   r   r   r   r   r   r   r   rA   rR   rX   ra   rf   rg   rn   rq   rr   r|   r~   r   r   r   r   r   r   r   r   r	   r	   r	   r
   r      s0   
#
5+r   )r   Zcmf.includeZmodules.jira.clientsr   r    r   r   r   r	   r	   r	   r
   <module>   s
   