
    iM                         d dl Z d dlmZ d dlmZ d dl d dlmZ  G d de      Z	 G d d	e      Z
 G d
 de      Z G d d      Zy)    N)	HTTPError)IntEnum)*)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ZdZdZdZy)TaskType               N)r
   r   r   ISSUEVERSION	COMPONENTSPRINTPROJECTr   r   r   r   r      s    EGIFGr   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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_keyr1   plugin_versionrequestsr   responsestatus_coder   	Exception)r3   pluginexcs      r   r)   zBigGanttManager._require_plugin0   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r3   s    r   r-   zBigGanttManager._mkdir<   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   j   K   | ]+  }|j                  d       s|j                  d      r|d    - yw)isMain	isPrimaryidN)r1   ).0extplatforms     r   	<genexpr>z;BigGanttManager._set_main_extplatform_id.<locals>.<genexpr>H   s4      *5"x0KOOK4P  %s   13)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""$&, $yy|$(,9= )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   rf   z3BigGanttManager._collect_task_ids.<locals>.traverseU   s7     /

4>*
#T*-./r   r   )r3   tree_structurere   rf   s     @@r   _collect_task_idsz!BigGanttManager._collect_task_idsQ   s    	/ 	 
r   c                 "    fd |      S )u  
        Пересобрать структуру, состоящую только из задач.
        Структура может содержать не только задачи, но и спринты, версии, компоненты и проекты.
        c                 b   g }| D ]  }j                  |d   d       }|rm|d   t        j                  k(  rWd|d   i}|j                  |       |j	                         }|d   r |d         }|r||d<   ng |d<   |j                  |       |d   s|j                   |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!IId8nd;	=!9X^^!K#Y{%;#K
 KK,#yy{HJ'#+D,<#=#3;HZ035HZ0$$X.J'!(($z2B)CD-E. r   r   )r3   rg   rt   rf   s     `@r   _update_tree_structurez&BigGanttManager._update_tree_structure^   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)NrL   wr   Findentensure_ascii)r,   get_extplatformrH   rG   rV   rW   dumpr.   )r3   rS   r[   r\   s       r   _dump_extplatformz!BigGanttManager._dump_extplatform   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.jsonrw   r   Frx   c              3   ~   K   | ]5  }|j                  d d      j                         dk(  rt        |d          7 yw)name keyfieldIdNr1   lowerstrrR   fields     r   rT   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   summaryr   Nr   r   s     r   rT   z4BigGanttManager._dump_task_fields.<locals>.<genexpr>   s>      */99VR(..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 !
	? 	?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.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   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.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   sb    <<VD*334IJ%s+ 	GqIInaIF	G 	G 	Gr   c                     i }ddj                  |D cg c]  }| c}       d}	 | j                  j                  |d      }|d   D ]  }|d   |d   d	   d
||d   <    |S c c}w # t        $ r}|d }~ww xY w)Nzid in (z, )z
id,summary)r   issuesr   r   r   )
extTaskKeyextTaskSummaryrQ   )joinr(   jqlr   )r3   ext_task_idsr   ext_task_idr   r=   eissues           r   _get_jira_issuesz BigGanttManager._get_jira_issues   s    		,"O;;"OPQQRS	((,,S,FH h' 	E#El"'/)"<#F5;	
  #P  	 G		s   	A$
A) )	A92A44A9c                    i }t        dt        |      |      D ]|  }||||z    }| j                  j                  ||      }|D 	cg c]!  }	d|	v r|	d   t        j
                  k(  r|	d   # }
}	|D ]%  }	d|	vs|	d   t        j
                  k7  r|	||	d   <   ' ~ |j                  d      }t        |d      5 }t        j                  ||dd	       d d d        |S c c}	w # 1 sw Y   |S xY w)
Nr   rk   rl   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   rq   r   
tasks_filer\   s                r   _dump_box_tasks_by_chunksz)BigGanttManager._dump_box_tasks_by_chunks   s   	q#c(J/ 	;A1Q^,HLL..vx@E 9>+4 I-)M2Jhnn2\ +&L 
 # 	;	 	1Y}5MQYQ_Q_5_ 2;	)H-.	;	;( ''5
*c" 	BaIIi15IA	B )"	B s   &C5CC(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.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'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.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`    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' (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&##&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boxesTrD   )rH   rG   rI   r,   get_box_hierarchyr   )r3   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)r}   r   r   rJ   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)rH   rG   rU   iterdirr   endswithrb   )r3   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#   ' отсутствует файл ''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	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   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   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                 <   | D ]  }|d   }|dk(  r|s|d   }| }
j                   j                  j                  j                   d| }t        j                  j                  dd|gddg      }	|dkD  r
j                  ||||	       |s |||	|d	z           y )
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
+ A%h {+ 'y
!%!7!7!>!>!J!J K2gYW~~))$c;7)84 * 
 !1$**<TRXz49JK'Lr   )NNr   )r   )r3   r   rg   rf   s   `  @r   process_box_relationsz%BigGanttManager.process_box_relationso  s#    55f=	L, 	 r   c                 d    | j                         D ]  }| j                  |       t                 y)u   Обработать связи родительских и дочерних задач во всех диаграммах (блоках)N)r   r  
cmf_commit)r3   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   rM   Nc              3   R   K   | ]  }|d    d   j                   k(  r|d      ywextPlatformrQ   scopeDefinitionElementsNrZ   rR   	scope_defr3   s     r   rT   z7BigGanttManager.get_boxes_by_project.<locals>.<genexpr>  s7      %$]3D9T=V=VV "";<   $'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	$,,. <<((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   rM   Nc              3   R   K   | ]  }|d    d   j                   k(  r|d      ywr  r
  r  s     r   rT   z9BigGanttManager.get_box_scope_projects.<locals>.<genexpr>  s7      ]+D1T5N5NN 34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  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:   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G":B B4.063j!8)V#r   r    )r<   requests.exceptionsr   enumr   cmf.includemodules.jira.clientsr   r?   r   r   r   r    r   r   r   <module>r$     sD     )   /	) 			 	w F Fr   