
    ΕiE                     b    d dl Z d dl d dlmZ  G d de      Z G d de      Z G d d	      Zy)
    N)*)BigGanttClientc                       e Zd Zy)PluginNotFoundErrorN__name__
__module____qualname__     $./modules/jira/managers/big_gantt.pyr   r          r   r   c                       e Zd Zy)TaskNotFoundErrorNr   r   r   r   r   r      r   r   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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y)BigGanttManagerzeu.softwareplant.bigganttNc                 h   || _         | j                          || _        |xsF t        |j                  |j
                  |j                  |j                         |j                        | _	        | j                          | j                          t        j                  j                  d      | _        y )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"--+
 	%%'+1+A+A+E+E+ ,F ,
(r   c                    	 | j                   j                  | j                        }|j                  d      | _        y# 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_keyr#   plugin_versionrequests	HTTPErrorresponsestatus_coder   	Exception)r%   pluginexcs      r   r   zBigGanttManager._require_plugin&   st    	&&66tGF"(**Y"7D!! 	||''3.)*cdd 		s   ;> B%A66Bc                     | j                   j                         j                  d      | _        | j                  j	                  d       y)u9   Создать основной каталог дампаbigganttTexist_okN)r   get_download_pathjoinpathbiggantt_dirmkdirr%   s    r   r   zBigGanttManager._mkdir2   s9     OO==?HHT.r   c                    | j                   j                  d      }|j                         rCt        |d      5 }t        j                  |      }ddd       t        d D        d      | _        yd| _        y# 1 sw Y   *xY w)uT   Установить id основного экземпляра интеграцииextplatform.jsonrNc              3   2   K   | ]  }|d    s	|d     yw)isMainidNr   ).0extplatforms     r   	<genexpr>z;BigGanttManager._set_main_extplatform_id.<locals>.<genexpr>>   s     T{k(>ST"Ts   

)r;   r:   existsopenjsonloadnext_main_extplatform_id)r%   extplatform_filefdatas       r   r    z(BigGanttManager._set_main_extplatform_id7   sw    ,,556HI""$&, $yy|$(,TdT)D%
 )-D%$ $s   A77B c                 *    g fd |       S )uR   Собрать все id задач из древовидной структурыc                 ^    | D ]'  }j                  |d          |d   s |d          ) y )NtaskIdchildren)append)itemsitemidstraverses     r   rX   z3BigGanttManager._collect_task_ids.<locals>.traverseH   s7     /

4>*
#T*-./r   r   )r%   tree_structurerW   rX   s     @@r   _collect_task_idsz!BigGanttManager._collect_task_idsD   s    	/ 	 
r   c                 &      fd |      S )u  
        Пересобрать структуру, состоящую только из задач.
        Структура может содержать не только задачи, но и спринты, версии, компоненты и проекты.
        c                    g }| D ]  }	|d      }|d   j                      d   d   }d|v rt        j                  d|      r|d   |d   j                      d   d   |d   j                     d   d	   d
}|j	                  |       |j                         }|d   r 
|d         }|r||d<   ng |d<   |j                  |       |d   s|j                   
|d                 |S )NrR   columnsNONEr   z/browse/z	\/\w+-\d+	extTaskIdvaluesummary)r_   keyra   rS   )key_field_idresearchsummary_field_idupdatecopyrT   extend)rU   	structurerV   	task_datatask_urlupdate_datanew_itemrS   r%   tasksrX   s           r   rX   z8BigGanttManager._update_tree_structure.<locals>.traverseW   s"   I E!$x.1	$Y/0A0AB6J5Q)biih.O%.{%;(3D4E4EFvNwW#,Y#78M8M#Nv#VW`#a#K
 KK,#yy{HJ'#+D,<#=#3;HZ035HZ0$$X.J'!(($z2B)CD-E. r   r   )r%   rY   ro   rX   s   ` `@r   _update_tree_structurez&BigGanttManager._update_tree_structureQ   s    	6 ''r   c                    | j                   j                         }| j                  j                  d      }t	        |d      5 }t
        j                  ||dd       d d d        | j                          y # 1 sw Y   xY w)Nr?   w   Findentensure_ascii)r   get_extplatformr;   r:   rH   rI   dumpr    )r%   rE   rM   rN   s       r   _dump_extplatformz!BigGanttManager._dump_extplatformt   sr    ll224,,556HI"C( 	DAIIk1QUIC	D%%'	D 	Ds   A55A>c                 B   | j                   j                         }| j                  j                  d      }t	        |d      5 }t
        j                  ||dd       d d d        t        d |D        d      | _        t        d |D        d      | _	        y # 1 sw Y   :xY w)	Nzfields.jsonrr   rs   Frt   c              3   ~   K   | ]5  }|j                  d d      j                         dk(  rt        |d          7 yw)name rb   fieldIdNr#   lowerstrrD   fields     r   rF   z4BigGanttManager._dump_task_fields.<locals>.<genexpr>   s>      */99VR(..0E9 E)$%   ;=r}   c              3   ~   K   | ]5  }|j                  d d      j                         dk(  rt        |d          7 yw)r|   r}   ra   r~   Nr   r   s     r   rF   z4BigGanttManager._dump_task_fields.<locals>.<genexpr>   s>      */99VR(..0I= E)$%r   )
r   get_task_fieldsr;   r:   rH   rI   rx   rK   rc   rf   )r%   fieldsfields_filerN   s       r   _dump_task_fieldsz!BigGanttManager._dump_task_fields{   s    --/''00?+s# 	?qIIfaI>	? !39 
 !%39 !
	? 	?s   BBc                     | j                   j                  |      }|j                  d      }t        |d      5 }t        j                  ||dd       d d d        y # 1 sw Y   y xY w)Nscope_definition.jsonrr   rs   Frt   )r   get_box_scope_definitionr:   rH   rI   rx   )r%   box_idsettings_dirscope_definitionscope_definition_filerN   s         r   _dump_box_scope_definitionz*BigGanttManager._dump_box_scope_definition   sd    <<@@H , 5 56M N'- 	III&!%IH	I 	I 	I   AA%c                     | j                   j                  |      }|j                  d      }t        |d      5 }t        j                  ||dd       d d d        y # 1 sw Y   y xY w)Nztask_structure.jsonrr   rs   Frt   )r   get_box_task_structurer:   rH   rI   rx   )r%   r   r   task_structuretask_structure_filerN   s         r   _dump_box_task_structurez(BigGanttManager._dump_box_task_structure   sb    <<VD*334IJ%s+ 	GqIInaIF	G 	G 	Gr   c                 >   i }t        dt        |      |      D ]5  }||||z    }| j                  j                  ||      }|D ]
  }	|	||	d   <    7 |j	                  d      }
t        |
d      5 }t        j                  ||dd       d d d        |S # 1 sw Y   |S xY w)Nr   rR   z
tasks.jsonrr   rs   Frt   )rangelenr   get_box_tasksr:   rH   rI   rx   )r%   r   rW   	gantt_dir
chunk_size	all_tasksitask_idsro   rk   
tasks_filerN   s               r   _dump_box_tasks_by_chunksz)BigGanttManager._dump_box_tasks_by_chunks   s    	q#c(J/ 	;A1Q^,HLL..vx@E" ;	1:	)H-.;	; ''5
*c" 	BaIIi15IA	B 	B s   .BBc                    | j                   j                  |      }|j                  d      }t        |d      5 }t        j                  ||dd       d d d        | j                  |      }| j                  |||      }| j                  ||      }|j                  d      }	t        |	d      5 }t        j                  ||dd       d d d        y # 1 sw Y   xY w# 1 sw Y   y xY w)Nzoriginal_tree_structure.jsonrr   rs   Frt   tree_structure.json)	r   get_box_tree_structurer:   rH   rI   rx   rZ   r   rp   )
r%   r   r   rY   original_tree_structure_filerN   r   ro   rj   tree_structure_files
             r   _dump_box_tree_structurez(BigGanttManager._dump_box_tree_structure   s    <<VD'0'9'9:X'Y$.4 	GIInaIF	G )).9..vxK //F	'001FG%s+ 	BqIIi15IA	B 	B	G 	G	B 	Bs   C.CCC&c                     | j                   j                  |      }|j                  d      }t        |d      5 }t        j                  ||dd       d d d        y # 1 sw Y   y xY w)Nzall_links.jsonrr   rs   Frt   )r   get_box_all_linksr:   rH   rI   rx   )r%   r   r   	all_linksall_links_filerN   s         r   _dump_box_all_linksz#BigGanttManager._dump_box_all_links   s`    LL226:	"++,<=.#& 	B!IIi15IA	B 	B 	Br   c                 h   |d   }|d   }| j                   j                  j                  d| d| d       |j                  |      }|j	                  d       |j                  d      }t        |d	      5 }t        j                  ||d
d       d d d        |j                  d      }|j	                  d       | j                  ||       | j                  ||       |j                  d      }	|	j	                  d       | j                  ||	       | j                  ||	       y # 1 sw Y   xY w)NboxIdboxNameu*   Дамп диаграммы (блока) 'z' ()Tr7   z	info.jsonrr   rs   Frt   settingsgantt)r   loggerinfor:   r<   rH   rI   rx   r   r   r   r   )
r%   box_data	boxes_dirr   box_namebox_dir	info_filerN   r   r   s
             r   	_dump_boxzBigGanttManager._dump_box   s,   '"I&##&PQYPZZ]^d]eef$gh$$V,t$$$[1	)S! 	AQIIh!%I@	A ''
3D)''=%%fl;$$W-	&%%fi8  3	A 	As   7D((D1c                     | j                   j                  d      }|j                  d       | j                  j	                         D ]  }| j                  ||        y )NboxesTr7   )r;   r:   r<   r   get_box_hierarchyr   )r%   r   r   s      r   _dump_boxeszBigGanttManager._dump_boxes   sP    %%..w7	&668 	0HNN8Y/	0r   c                 d    | j                          | j                          | j                          y)u2   Дамп данных из плагина BigGanttN)ry   r   r   r=   s    r   	dump_datazBigGanttManager.dump_data   s&      r   c                     g }| j                   j                  d      }|j                         rL|j                         D ]9  }|j                  j                  d      r|j                  |j                         ; |S )u:   Получить все id диаграмм (блоков)r   z.meta)r;   r:   rG   iterdirr|   endswithrT   )r%   box_idsr   r   s       r   _get_box_idszBigGanttManager._get_box_ids   sm    %%..w7	$,,. -<<((4w||,-
 r   c                    g }| j                   j                  d      }|j                         r	 |j                  |      }|j                         st        d| d      |j                  dd      }|j                         st        d| d| d      t	        |d	      5 }t
        j                  |      }d
d
d
       |S |S # 1 sw Y   |S xY w# t        $ r0}| j                  j                  j                  |       Y d
}~|S d
}~ww xY w)uZ   Получить древовидную структуру диаграммы (блока)r   u;   Каталог дампа диаграммы (блока) 'u   ' не найденr   r   u/   В дампе диаграммы (блока) 'u#   ' отсутствует файл ''r@   N)
r;   r:   rG   FileNotFoundErrorrH   rI   rJ   r   r   warning)r%   r   rY   r   r   r   rN   r4   s           r   _get_box_tree_structurez'BigGanttManager._get_box_tree_structure   s"   %%..w7	4#,,V4~~'+UV\U]]pq  '.&6&6w@U&V#*113+I& R<<O;PPQS 
 -s3 2q%)YYq\N2
 ~2
  % 4&&..s334s6   A0C C5C CC C 	D%DDc           	      T   d| d| }	 |r	|r|j                   |k7  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      }|s+t        j                  | j                  | j
                  	      }||_        ||_        |j                  r|j                  d
       | j
                  j                  j                  d| d|        y| j
                  j                  j                  d| d| d       y|r|st        d      |s|rt        d      yy# t        $ r4}| j
                  j                  j                  | d|        Y d}~yd}~wt        $ r-}| j
                  j                  | d| dd       Y d}~y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   r#   r$   r   r   r   
is_changedsaver   debugr   r   r2   	log_error)r%   parent_identparentchild_identchild	error_msgrelation_optionr4   s           r   _process_relationz!BigGanttManager._process_relation  s   77Cn E22=@ 	
,	%$$.&,&>&>&B&B,c43S3ST $"+S&!9JU;S T"+S%!8:sF:S T  !+I6 'C 
'O +*0*B*B*.*J*J'+ +C + /5O+/4O,&11',,,>OO**00op|o} ~CCN-Q
 OO**00'} 5CCO. Qpq
 '  )C  D  D'  )K  L  L !&V  	BOO""**i[3%+@AA 	OO%%+Ru%, &  	s0   CD6 ),D6 D6 6	F'?*E..F':#F""F'c                 H      j                  |      }d fd	 |       y)uz   Обработать связи родительских и дочерних задач в диаграмме (блоке)Nc                 P   | D ]  }|d   }|dk(  r|s|d   }|d   }| d| d}j                   j                  j                  j                   d| }	t        j                  j                  dd	|	gd
dg      }
|dkD  rj                  ||||
       |s |||
|dz           y )NrS   r   rb   r_   z (r   z::ext_idr   r   r      )r   r3   source_hashr!   CmfTaskr#   r   )rU   r   r   current_depthrV   rS   task_keytask_id
task_identtask_ext_idtaskr%   rX   s              r   rX   z7BigGanttManager.process_box_relations.<locals>.traverseG  s     L
+ A%h;{+ (zG9A6
!%!7!7!>!>!J!J K2gYW~~))$c;7)84 * 
 !1$**<TRXz49JK%Lr   )NNr   )r   )r%   r   rY   rX   s   `  @r   process_box_relationsz%BigGanttManager.process_box_relationsC  s#    55f=	L* 	 r   c                 d    | j                         D ]  }| j                  |       t                 y)u   Обработать связи родительских и дочерних задач во всех диаграммах (блоках)N)r   r   
cmf_commit)r%   r   s     r   process_relationsz!BigGanttManager.process_relations^  s-    '') 	F&&v.L	r   c                 F    g } j                   j                  d      }|j                         r|j                         D ]  }|j                  j                  d      r|j                  dd      }|j                         sBt        |d      5 }t        j                  |      }ddd       t         fdd   D        i       }|j                  d	g       D ];  }	|	d
   }
|	d   j                  dd      d   }||
|fv s'|j                  |d             |S # 1 sw Y   uxY w)u+  
        Получить все диаграммы (блоки) в которых используется проект

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

        Returns:
            list: список id диаграмм (блоков)
        r   r   r   r   r@   Nc              3   R   K   | ]  }|d    d   j                   k(  r|d      ywextPlatformrC   scopeDefinitionElementsNrL   rD   	scope_defr%   s     r   rF   z7BigGanttManager.get_boxes_by_project.<locals>.<genexpr>~  s7      %$]3D9T=V=VV "";<   $'extPlatformScopeDefinitionsJIRA_PROJECTr`   r   /r   r   )r;   r:   rG   r   r|   r   rH   rI   rJ   rK   r#   rsplitrT   )r%   project_id_or_keyr   r   r   r   rN   rO   scope_definition_elementsproject
project_idproject_keys   `           r   get_boxes_by_projectz$BigGanttManager.get_boxes_by_projectd  s:    %%..w7	$,,. <<((4(/(8(8E\(]%,335/5 (99Q<D( -1)-.K)L
 -)  9<<^RP G!(!1J")%."7"7Q"?"CK(Z,EEtG}5)6 '( (s   DD 	c                     g } j                   j                  d|dd      }|j                         s|S t        |d      5 }t        j                  |      }ddd       t         fdd   D        i       }|j                  dg       D ]8  }|d	   }|d
   j                  dd      d   }	|d   }
|j                  ||	|
f       : |S # 1 sw Y   pxY w)u  
        Получить все проекты, которые содержит диаграмма (блок)

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

        Returns:
            list: список проектов (id, key, name)
        r   r   r   r@   Nc              3   R   K   | ]  }|d    d   j                   k(  r|d      ywr   r   r   s     r   rF   z9BigGanttManager.get_box_scope_projects.<locals>.<genexpr>  s7      ]+D1T5N5NN 34r   r   r   r`   r   r   r   r   r|   )
r;   r:   rG   rH   rI   rJ   rK   r#   r  rT   )r%   r   projectsr   rN   rO   r  r  r  r  project_names   `          r   get_box_scope_projectsz&BigGanttManager.get_box_scope_projects  s      $ 1 1 : :VZ)@!
 %++-O'- 	 99Q<D	  %)!%&C!D
 %
! 144^RH 	EG )J!%.//Q7;K"6?LOOZlCD		E #	  	 s    CC)N)d   )r   r	   r
   r,   r(   r   r   r    rZ   rp   ry   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GB B4.063j!6)V#r   r   )r.   cmf.includemodules.jira.clientsr   r2   r   r   r   r   r   r   <module>r     s2      /	) 			 	c cr   