
    0iM                         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e          Z	 G d d	e          Z
 G d
 de          Z G d d          ZdS )    N)	HTTPError)IntEnum)*)BigGanttClientc                       e Zd ZdS )PluginNotFoundErrorN__name__
__module____qualname__     $./modules/jira/managers/big_gantt.pyr   r   	           Dr   r   c                       e Zd ZdS )TaskNotFoundErrorNr	   r   r   r   r   r      r   r   r   c                   "    e Zd ZdZdZdZdZdZdS )TaskType               N)r
   r   r   ISSUEVERSION	COMPONENTSPRINTPROJECTr   r   r   r   r      s'        EGIFGGGr   r   c                       e Zd ZdZddZd Zd Zd Zd Zd Z	d	 Z
d
 Zd Zd Zd ZddZd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd ZdS )BigGanttManagerzeu.softwareplant.bigganttNc                 f   || _         |                                  || _        |p9t          |j        |j        |j        |                                |j                  | _	        | 
                                 |                                  t          j                            d          | _        d S )N)urlusernamepasswordcookies
verify_sslzsystem.additional_parent)code)_jira_client_require_plugin
cmf_importr   r"   r#   r$   get_session_cookiesr&   _client_mkdir_set_main_extplatform_idmodelsCmfRelationTypeget_additional_parent_relation)selfr*   jira_clientbiggantt_clients       r   __init__zBigGanttManager.__init__   s    '$& 
. ) )3355"-+
 +
 +
 	%%'''+1+A+E+E+ ,F ,
 ,
(((r   c                     	 | j                             | j                  }|                    d          | _        dS # t
          j        $ r%}|j        j        dk    rt          d           d}~wt          $ r  w xY w)uE   Проверить установку плагина BigGantt в Jiraversioni  u7   Плагин BigGantt не установлен в JiraN)r(   get_plugin_info
plugin_keyr1   plugin_versionrequestsr   responsestatus_coder   	Exception)r3   pluginexcs      r   r)   zBigGanttManager._require_plugin0   s    	&66tGGF"(**Y"7"7D! 	 	 	|'3..)*cddd 	 	 		s   9= A; A,,A;c                     | j                                                             d          | _        | j                            d           dS )u9   Создать основной каталог дампаbigganttTexist_okN)r*   get_download_pathjoinpathbiggantt_dirmkdirr3   s    r   r-   zBigGanttManager._mkdir<   sF     O==??HHTT.....r   c                 6   | j                             d          }|                                rct          |d          5 }t                              |          }ddd           n# 1 swxY w Y   t          d |D             d          | _        dS d| _        dS )uT   Установить id основного экземпляра интеграцииextplatform.jsonrNc              3   z   K   | ]6}|                     d           s|                     d          ,|d         V  7dS )isMain	isPrimaryidN)r1   ).0extplatforms     r   	<genexpr>z;BigGanttManager._set_main_extplatform_id.<locals>.<genexpr>H   sa        *5"x004?OOK4P4P%     r   )rH   rG   existsopenjsonloadnext_main_extplatform_id)r3   extplatform_filefdatas       r   r.   z(BigGanttManager._set_main_extplatform_idA   s    ,556HII""$$ 	-&,, $yy||$ $ $ $ $ $ $ $ $ $ $ $ $ $ $(, 9=   ) )D%%% )-D%%%s   A&&A*-A*c                 0    g fd |           S )uR   Собрать все id задач из древовидной структурыc                 z    | D ]6}                     |d                    |d         r |d                    7d S )NtaskIdchildren)append)itemsitemidstraverses     r   rf   z3BigGanttManager._collect_task_ids.<locals>.traverseU   sU     / /

4>***
# /HT*-.../ /r   r   )r3   tree_structurere   rf   s     @@r   _collect_task_idsz!BigGanttManager._collect_task_idsQ   s>    	/ 	/ 	/ 	/ 	/ 	/ 	   
r   c                 (    fd |          S )u  
        Пересобрать структуру, состоящую только из задач.
        Структура может содержать не только задачи, но и спринты, версии, компоненты и проекты.
        c                    g }| D ]}                     |d         d           }|r|d         t          j        k    rod|d         i}|                    |           |                                }|d         r |d                   }|r||d<   ng |d<   |                    |           |d         r$|                     |d                              |S )Nr`   extTaskType	extTaskIdra   )r1   r   r   updatecopyrb   extend)	rc   	structurerd   	task_dataupdate_datanew_itemra   tasksrf   s	          r   rf   z8BigGanttManager._update_tree_structure.<locals>.traversed   s   I E E!IId8nd;;	 E=!9X^!K!K#Y{%;#K
 KK,,,#yy{{HJ' 6#+8D,<#=#=# 63;HZ0035HZ0$$X....J' E!(($z2B)C)CDDDr   r   )r3   rg   rt   rf   s     `@r   _update_tree_structurez&BigGanttManager._update_tree_structure^   s4    	 	 	 	 	 	6 x'''r   c                     | j                                         }| j                            d          }t	          |d          5 }t
                              ||dd           d d d            n# 1 swxY w Y   |                                  d S )NrL   wr   Findentensure_ascii)r,   get_extplatformrH   rG   rV   rW   dumpr.   )r3   rS   r[   r\   s       r   _dump_extplatformz!BigGanttManager._dump_extplatform   s    l2244,556HII"C(( 	DAIIk1QUICCC	D 	D 	D 	D 	D 	D 	D 	D 	D 	D 	D 	D 	D 	D 	D%%'''''   A//A36A3c                 t   | j                                         }| j                            d          }t	          |d          5 }t
                              ||dd           d d d            n# 1 swxY w Y   t          d |D             d          | _        t          d |D             d          | _	        d S )	Nzfields.jsonrw   r   Frx   c              3      K   | ]E}|                     d d                                          dk    .t          |d                   V  FdS )name keyfieldIdNr1   lowerstrrR   fields     r   rT   z4BigGanttManager._dump_task_fields.<locals>.<genexpr>   s`        */99VR((..00E99 E)$%%9999 r   r   c              3      K   | ]E}|                     d d                                          dk    .t          |d                   V  FdS )r   r   summaryr   Nr   r   s     r   rT   z4BigGanttManager._dump_task_fields.<locals>.<genexpr>   s`        */99VR((..00I== E)$%%==== r   )
r,   get_task_fieldsrH   rG   rV   rW   r|   rY   key_field_idsummary_field_id)r3   fieldsfields_filer\   s       r   _dump_task_fieldsz!BigGanttManager._dump_task_fields   s   --//'00??+s## 	?qIIfaI>>>	? 	? 	? 	? 	? 	? 	? 	? 	? 	? 	? 	? 	? 	? 	? ! 39   
 
 !% 39   !
 !
r~   c                     | j                             |          }|                    d          }t          |d          5 }t                              ||dd           d d d            d S # 1 swxY w Y   d S )Nscope_definition.jsonrw   r   Frx   )r,   get_box_scope_definitionrG   rV   rW   r|   )r3   box_idsettings_dirscope_definitionscope_definition_filer\   s         r   _dump_box_scope_definitionz*BigGanttManager._dump_box_scope_definition   s    <@@HH , 5 56M N N'-- 	III&!%IHHH	I 	I 	I 	I 	I 	I 	I 	I 	I 	I 	I 	I 	I 	I 	I 	I 	I 	I    A,,A03A0c                     | j                             |          }|                    d          }t          |d          5 }t                              ||dd           d d d            d S # 1 swxY w Y   d S )Nztask_structure.jsonrw   r   Frx   )r,   get_box_task_structurerG   rV   rW   r|   )r3   r   r   task_structuretask_structure_filer\   s         r   _dump_box_task_structurez(BigGanttManager._dump_box_task_structure   s    <<VDD*334IJJ%s++ 	GqIInaIFFF	G 	G 	G 	G 	G 	G 	G 	G 	G 	G 	G 	G 	G 	G 	G 	G 	G 	Gr   c                 
   i }dd                     d |D                        d}	 | j                            |d          }n# t          $ r}|d }~ww xY w|d         D ]"}|d         |d	         d
         d||d         <   #|S )Nzid in (z, c                     g | ]}|S r   r   )rR   ext_task_ids     r   
<listcomp>z4BigGanttManager._get_jira_issues.<locals>.<listcomp>   s    "O"O"O;;"O"O"Or   )z
id,summary)r   issuesr   r   r   )
extTaskKeyextTaskSummaryrQ   )joinr(   jqlr   )r3   ext_task_idsr   r   r=   eissues          r   _get_jira_issuesz BigGanttManager._get_jira_issues   s    S		"O"O,"O"O"OPPSSS	(,,S,FFHH 	 	 	 G		
 h' 	 	E#El"'/)"<# #F5; s   A 
AAAd   c                    i }t          dt          |          |          D ]a}||||z            }| j                            ||          }d |D             }	|D ](}
d|
vs|
d         t          j        k    r|
||
d         <   )b|                    d          }t          |d          5 }t          	                    ||dd	           d d d            n# 1 swxY w Y   |S )
Nr   c                 R    g | ]$}d |v |d          t           j        k    |d         %S )rk   rl   )r   r   )rR   rq   s     r   r   z=BigGanttManager._dump_box_tasks_by_chunks.<locals>.<listcomp>   sC       +4 I--)M2Jhn2\2\ +&2\2\2\r   rk   r`   z
tasks.jsonrw   r   Frx   )
rangelenr,   get_box_tasksr   r   rG   rV   rW   r|   )r3   r   re   	gantt_dir
chunk_size	all_tasksitask_idsrt   r   rq   
tasks_filer\   s                r   _dump_box_tasks_by_chunksz)BigGanttManager._dump_box_tasks_by_chunks   sd   	q#c((J// 	; 	;A1Q^+,HL..vx@@E 8=  L
 # 	; 	;	 	11Y}5MQYQ_5_5_ 2;	)H-..	; ''55
*c"" 	BaIIi15IAAA	B 	B 	B 	B 	B 	B 	B 	B 	B 	B 	B 	B 	B 	B 	B s   (CCCc                 ,   | j                             |          }|                    d          }t          |d          5 }t                              ||dd           d d d            n# 1 swxY w Y   |                     |          }|                     |||          }|                     ||          }|                    d          }	t          |	d          5 }t                              ||dd           d d d            d S # 1 swxY w Y   d S )Nzoriginal_tree_structure.jsonrw   r   Frx   tree_structure.json)	r,   get_box_tree_structurerG   rV   rW   r|   rh   r   ru   )
r3   r   r   rg   original_tree_structure_filer\   r   rt   rp   tree_structure_files
             r   _dump_box_tree_structurez(BigGanttManager._dump_box_tree_structure   s   <<VDD'0'9'9:X'Y'Y$.44 	GIInaIFFF	G 	G 	G 	G 	G 	G 	G 	G 	G 	G 	G 	G 	G 	G 	G )).99..vxKK //FF	'001FGG%s++ 	BqIIi15IAAA	B 	B 	B 	B 	B 	B 	B 	B 	B 	B 	B 	B 	B 	B 	B 	B 	B 	Bs$    A++A/2A/D		DDc                     | j                             |          }|                    d          }t          |d          5 }t                              ||dd           d d d            d S # 1 swxY w Y   d S )Nzall_links.jsonrw   r   Frx   )r,   get_box_all_linksrG   rV   rW   r|   )r3   r   r   	all_linksall_links_filer\   s         r   _dump_box_all_linksz#BigGanttManager._dump_box_all_links   s    L226::	"++,<==.#&& 	B!IIi15IAAA	B 	B 	B 	B 	B 	B 	B 	B 	B 	B 	B 	B 	B 	B 	B 	B 	B 	Br   c                    |d         }|d         }| j         j                            d| d| d           |                    |          }|                    d           |                    d          }t          |d	          5 }t                              ||d
d           d d d            n# 1 swxY w Y   |                    d          }|                    d           |                     ||           | 	                    ||           |                    d          }	|	                    d           | 
                    ||	           |                     ||	           d S )NboxIdboxNameu*   Дамп диаграммы (блока) 'z' (r   TrD   z	info.jsonrw   r   Frx   settingsgantt)r*   loggerinforG   rI   rV   rW   r|   r   r   r   r   )
r3   box_data	boxes_dirr   box_namebox_dir	info_filer\   r   r   s
             r   	_dump_boxzBigGanttManager._dump_box   s   '"I&##$gQY$g$g^d$g$g$ghhh$$V,,t$$$$$[11	)S!! 	AQIIh!%I@@@	A 	A 	A 	A 	A 	A 	A 	A 	A 	A 	A 	A 	A 	A 	A ''
33D)))''===%%fl;;;$$W--	&&&%%fi888  33333s   B22B69B6c                     | j                             d          }|                    d           | j                                        D ]}|                     ||           d S )NboxesTrD   )rH   rG   rI   r,   get_box_hierarchyr   )r3   r   r   s      r   _dump_boxeszBigGanttManager._dump_boxes  sj    %..w77	&&&6688 	0 	0HNN8Y////	0 	0r   c                 ~    |                                   |                                  |                                  dS )u2   Дамп данных из плагина BigGanttN)r}   r   r   rJ   s    r   	dump_datazBigGanttManager.dump_data  s>          r   c                     g }| j                             d          }|                                rL|                                D ]7}|j                            d          r|                    |j                   8|S )u:   Получить все id диаграмм (блоков)r   z.meta)rH   rG   rU   iterdirr   endswithrb   )r3   box_idsr   r   s       r   _get_box_idszBigGanttManager._get_box_ids  s    %..w77	 	-$,,.. - -<((44 w|,,,,r   c                 R   g }| j                             d          }|                                r	 |                    |          }|                                st          d| d          |                    dd          }|                                st          d| d| d          t	          |d	          5 }t
                              |          }d
d
d
           n# 1 swxY w Y   n6# t          $ r)}| j        j        	                    |           Y d
}~nd
}~ww xY w|S )uZ   Получить древовидную структуру диаграммы (блока)r   u;   Каталог дампа диаграммы (блока) 'u   ' не найденr   r   u/   В дампе диаграммы (блока) 'u#   ' отсутствует файл ''rM   N)
rH   rG   rU   FileNotFoundErrorrV   rW   rX   r*   r   warning)r3   r   rg   r   r   r   r\   rA   s           r   _get_box_tree_structurez'BigGanttManager._get_box_tree_structure  s   %..w77	 	44#,,V44~~'' +qV\qqq   '.&6&6w@U&V&V#*1133 +S& S S<OS S S  
 -s33 2q%)YYq\\N2 2 2 2 2 2 2 2 2 2 2 2 2 2 2$ 4 4 4&..s333333334 s<   BC1 >C%C1 %C))C1 ,C)-C1 1
D$;DD$c           	      ,   d| d| }	 |r|r|j         |k    rt          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          }|s&t                              | j        | j        	          }||_        ||_        |j        r|	                    d
           | j        j
                            d| d|            dS | j        j
                            d| d| d           dS |r|st          d          |s|rt          d          dS dS # t          $ r/}| j        j
                            | d|            Y d}~dS d}~wt          $ r-}| j                            | d| dd           Y d}~dS d}~ww xY w)uW   Обработать связь родительской и дочерней задачuh   Невозможно установить связь между родительской задачей u$    и дочерней задачей relation_type=ORin_linkout_linkfilterr   )r   r*   T)save_importuU   Установлена связь между родительской задачей u)    и её дочерней задачей u   Задача uB    уже связана с родительской задачей uV    посредством поля 'Родительская задача' (parent_task)uX   Вероятно, дочерняя задача не была импортированаu`   Вероятно, родительская задача не была импортированаz. NzERR-0114CmfRelationOption)obj_type)parent_taskr/   r   r1   r2   r*   r   r   
is_changedsaver   debugr   r   r?   	log_error)r3   parent_identparentchild_identchild	error_msgrelation_optionrA   s           r   _process_relationz!BigGanttManager._process_relation:  s   @7C@ @2=@ @ 	
,	 #L% #L$..&,&>&B&B,c43ST $"+S&!9JU;S T"+S%!8:sF:S T  !+I6 'C 
' 
'O + *0*B*B*.*J'+ +C + + /5O+/4O,&1 ?',,,>>>O*00Qp| Q QCNQ Q    
 O*00q q qCOq q q    
  L L'  )C  D  D  D L L'  )K  L  L  LL L L L  	B 	B 	BO"**i+@+@3+@+@AAAAAAAAA 	 	 	O%%%%%%, &         	s0   CD% &D% ;&D% %
F/$EF&"FFc                 X                           |          }d fd	 |           dS )uz   Обработать связи родительских и дочерних задач в диаграмме (блоке)Nr   c                 .   | D ]}|d         }|dk    r|s|d         }| }
j         j        j        j         d| }t          j                            dd|gddg          }	|dk    r
                    ||||	           |r |||	|d	z              d S )
Nra   r   rl   z::ext_idr   r   r   r   )r*   r@   source_hashr/   CmfTaskr1   r   )rc   r   r   current_depthrd   ra   task_id
task_identtask_ext_idtaskr3   rf   s             r   rf   z7BigGanttManager.process_box_relations.<locals>.traverses  s     L L
+ A%%h% {+ '\
!%!7!>!JWWgWW~))$c;7)84 *  
 !1$$**<TRRR LHXz49JKKK'L Lr   )NNr   )r   )r3   r   rg   rf   s   `  @r   process_box_relationsz%BigGanttManager.process_box_relationso  sY    55f==	L 	L 	L 	L 	L 	L 	L, 	     r   c                 z    |                                  D ]%}|                     |           t                       &dS )u   Обработать связи родительских и дочерних задач во всех диаграммах (блоках)N)r   r  
cmf_commit)r3   r   s     r   process_relationsz!BigGanttManager.process_relations  sF    '')) 	 	F&&v...LLLL	 	r   c                     g } j                             d          }|                                r)|                                D ]}|j                            d          r|                    dd          }|                                sIt          |d          5 }t                              |          }ddd           n# 1 swxY w Y   t           fd|d         D             i           }|
                    d	g           D ]O}	|	d
         }
|	d                             dd          d         }||
|fv r|                    |d                     nP|S )u+  
        Получить все диаграммы (блоки) в которых используется проект

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

        Returns:
            list: список id диаграмм (блоков)
        r   r   r   r   rM   Nc              3   V   K   | ]#}|d          d         j         k    |d         V  $dS extPlatformrQ   scopeDefinitionElementsNrZ   rR   	scope_defr3   s     r   rT   z7BigGanttManager.get_boxes_by_project.<locals>.<genexpr>  sM        %$]3D9T=VVV "";<VVVV r   extPlatformScopeDefinitionsJIRA_PROJECTvaluer"   /r   r   )rH   rG   rU   r   r   r   rV   rW   rX   rY   r1   rsplitrb   )r3   project_id_or_keyr   r   r   r   r\   r]   scope_definition_elementsproject
project_idproject_keys   `           r   get_boxes_by_projectz$BigGanttManager.get_boxes_by_project  s    %..w77	 	$,,..  <((44 (/(8(8E\(](]%,3355 /55 (99Q<<D( ( ( ( ( ( ( ( ( ( ( ( ( ( ( -1   )-.K)L  
 - -)  9<<^RPP  G!(!1J")%."7"7Q"?"?"CK(Z,EEEtG}555 F s    CC	C	c                      g } j                             d|dd          }|                                s|S t          |d          5 }t                              |          }ddd           n# 1 swxY w Y   t           fd|d         D             i           }|                    dg           D ]L}|d	         }|d
                             dd          d         }	|d         }
|	                    ||	|
f           M|S )u  
        Получить все проекты, которые содержит диаграмма (блок)

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

        Returns:
            list: список проектов (id, key, name)
        r   r   r   rM   Nc              3   V   K   | ]#}|d          d         j         k    |d         V  $dS r  r  r  s     r   rT   z9BigGanttManager.get_box_scope_projects.<locals>.<genexpr>  sM        ]+D1T5NNN 34NNNN r   r  r  r  r"   r  r   r  r   )
rH   rG   rU   rV   rW   rX   rY   r1   r  rb   )r3   r   projectsr   r\   r]   r  r  r  r  project_names   `          r   get_box_scope_projectsz&BigGanttManager.get_box_scope_projects  sr     $ 1 : :VZ)@!
 !
 %++-- 	O'-- 	 99Q<<D	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  %)   !%&C!D  
 %
 %
! 144^RHH 	E 	EG )J!%.//Q77;K"6?LOOZlCDDDDs   A..A25A2)N)r   )r
   r   r   r:   r6   r)   r-   r.   rh   ru   r}   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r  r!  r   r   r   r    r       s       ,J
 
 
 
(
 
 
/ / /
- - -   !( !( !(F( ( (
 
 
,I I IG G G  "   :B B B B B B4 4 4.0 0 0      63 3 3j! ! !8  ) ) )V# # # # #r   r    )r<   requests.exceptionsr   enumr   cmf.includemodules.jira.clientsr   r?   r   r   r   r    r   r   r   <module>r&     s
    ) ) ) ) ) )           / / / / / /	 	 	 	 	) 	 	 		 	 	 	 		 	 	 	    w   F F F F F F F F F Fr   