
    V^hZ                     ~    d dl m Z  d dlmZ d dlT d dlZd dlmZ  G d dej        j	        j
        j                  ZdS )    )cached_property)Path)*N)JiraApic                   \    e Zd Zej        j        j        j        j        dz   ZdZ	ej        j        j        j        j
        ddgz   Z
ed             Zd Zd Zd Zd	 Zed
             ZdefdZd Zd Zd Zed             Z fdZ fdZddZddZd dZd Zd Zd Zd Z d Z!d Z" xZ#S )!CmfPluginJira)jiraNtestget_all_projectsc                 h   | j         s|                     g d           t          | j        j        j        | j        j        j        | j        j                                        | j        j	                                        | j        j
        j        | j        j        j                  | _         | j         S )N)pluginplugin.ext_urlzplugin.ext_loginzplugin.ext_tokenzplugin.ext_passwordzplugin.cloudzplugin.verify_ssl)urlusernametokenpassword
verify_sslcloud)_CmfPluginJira__jiraload_fieldsr   r   ext_urlvalue	ext_login	ext_tokendecryptext_passwordr   r   )selfs    (./modules/jira/models/cmf_plugin_jira.pyr	   zCmfPluginJira.jira   s    { 	` X X X Y Y Y!dk&9&?$+J_Je"k3;;==H`HhHhHjHj#';#9#?t{GXG^` ` `DK {    c                     ddl m} ddlm} | j        5 } |||                                          cd d d            S # 1 swxY w Y   d S )Nr   JiraAPIImportJiraCSVImport)modules.jira.api_importr"   modules.jira.csv_importr$   r	   tmplt_import_settingsr   
cmf_importr"   r$   r	   s        r   r'   z#CmfPluginJira.tmplt_import_settings   s    999999999999Y 	K$ =z22HHJJ	K 	K 	K 	K 	K 	K 	K 	K 	K 	K 	K 	K 	K 	K 	K 	K 	K 	Ks   ?AAc                     ddl m} ddlm} |j        dk    r=| j        5 } |||                                          cd d d            S # 1 swxY w Y    ||                                          S )Nr   r!   r#   api)r%   r"   r&   r$   typer	   previewr(   s        r   r-   zCmfPluginJira.preview!   s    999999999999?e## Ad$}T:66>>@@A A A A A A A A A A A A A A A A}Z((00222s   A

AAc                     ddl m} ddlm} d|_        | j        5 } |||                                          cd d d            S # 1 swxY w Y   d S )Nr   r!   r#   u#   Импорт данных из Jira)r%   r"   r&   r$   namer	   process_importr(   s        r   r0   zCmfPluginJira.process_import)   s    999999999999?
Y 	D$ =z22AACC	D 	D 	D 	D 	D 	D 	D 	D 	D 	D 	D 	D 	D 	D 	D 	D 	D 	Ds   AA
A
c                     ddl m}  || j        |          }t          ||          rt	          ||          } |             d S |j                            d| d           d S )Nr   r!   u   Метод 'u   ' не существует)r%   r"   r	   hasattrgetattrloggererror)r   r)   process_methodr"   jira_importmethods         r   process_entityzCmfPluginJira.process_entity0   s    999999#mDIz::;// 	`[.99FFHHHHH##$^>$^$^$^_____r   c                  
    g } | S )uR   Собственный магазин при выборе импорта из Jira )ress    r   calc_models_settingsz"CmfPluginJira.calc_models_settings:   s    

 
r   cmf_import_idc                .   ddl m} g }	 g }| j        5 }|                                D ]O}|d         |d         |d         d}|                    d          r|d         |d<   |                    |           P	 d d d            n# 1 swxY w Y   n# t          $ rw}	t                              |	           t          j
                            |dd	g
          }
d  || j        |
                                          D             }|s Y d }	~	nd }	~	ww xY w|S )Nr   r!   idkeyr/   )r@   rA   r/   	isPrivater   zplugin.plugin.*r@   fieldsc                     g | ]}|S r;   r;   .0objs     r   
<listcomp>z2CmfPluginJira.get_all_projects.<locals>.<listcomp>_   s    WWW33WWWr   )r%   r"   r	   get_projectsgetappend	Exceptiongdebugmodels	CmfImport_get_projects)r   r>   argskwargsr"   r<   r	   projectproject_dataer)   s              r   r   zCmfPluginJira.get_all_projectsJ   s   999999	C -d#0022 
- 
-G &dm&u~ '$ $L
 {{;// I4;K4H[1JJ|,,,,
-- - - - - - - - - - - - - - -  	 	 	GGAJJJ)--M^G_-``JWW--	:"F"F"T"T"V"VWWWC     	 
s<   	B A%B9B B		B B	B 
DA-DDc                     | j         5 }t          d |                                D                       cddd           S # 1 swxY w Y   dS )uE   
        Проверяем подключение к апи
        c                     g | ]}|S r;   r;   rF   s     r   rI   z&CmfPluginJira.test.<locals>.<listcomp>i   s    <<<<<<r   N)r	   boolrJ   )r   rS   rT   r	   s       r   r
   zCmfPluginJira.testd   s     Y 	>$<<(9(9(;(;<<<==	> 	> 	> 	> 	> 	> 	> 	> 	> 	> 	> 	> 	> 	> 	> 	> 	> 	>s   +A  AAc                     ddl m} | j        5 } |||                                          cd d d            S # 1 swxY w Y   d S Nr   r!   )r%   r"   r	   download_datar   r)   r"   r	   s       r   r]   zCmfPluginJira.download_datak   s    999999Y 	C$ =z22@@BB	C 	C 	C 	C 	C 	C 	C 	C 	C 	C 	C 	C 	C 	C 	C 	C 	C 	C   9= =c                     ddl m} | j        5 } |||                                          cd d d            S # 1 swxY w Y   d S r\   )r%   r"   r	   download_filesr^   s       r   ra   zCmfPluginJira.download_filesp   s    999999Y 	D$ =z22AACC	D 	D 	D 	D 	D 	D 	D 	D 	D 	D 	D 	D 	D 	D 	D 	D 	D 	Dr_   c                    ddl m} ddlm} dd l}d}t
                                          5  t
                                          5  t          j	        
                    | ddg          } ||j        j        |          }	|j        j        j         d| }
t          j        
                    dd	d
|
 dgddg          }|st          d|
           |j        |	_        g }|	j                                        }|	j                                        }|j                            d|	j                    |j                                        }t/          |	j                  D ]v}|	j                            |	j        d| |||d          }|                    |           |                                 |	j        j                            d|            wd}|	                    |||t>          j                   D ]7}|	j        !                                r n|dz  }|"                    |           8|D ]}|"                    d           |	j        j                            d           |D ]}|#                                 |j                                        |z
  }|	j        j                            d||$                                z   d           d}|%                                s+||
                                z  }|%                                +|	j        j                            d|            ||z  }d d d            n# 1 swxY w Y   d d d            n# 1 swxY w Y   |S )Nr   r!   )cmf_contextr   zplugin.plugin.source_hashrC   ::ext_idLIKEz%::z::%cust_field_conf_schemeimport_raw_jsonfilterrD   u)   Не найден проект с ext_id u@   Грузим задачи в несколько потоков: _process_issue_thread)issue_queueissue_queue_errorsrU   )targetr/   rT   u.   Параллельный обработчик )only_processing   DONEu&   Ждем обработки задачu*   ------------------------ скорость u    задач в секундуu?   Закончили обработку задач, ошибок )&r%   r"   cmf.apprc   datetimecmfutildisable_acldisable_notifyrP   rQ   rK   r   r	   source_hash
CmfProjectCmfErrorrg   queueQueuer4   infothreading_max_forksnowrange	threadingThreadrk   rL   startr)   get_project_tasksconfigIMPORT_ONLY_NEW_OR_UPDATED	is_cancelputjointotal_secondsempty)r>   
project_idr   limitr"   rc   rs   errorsr)   
api_importproject_ext_idrU   issue_processrl   rm   siproccntissuediff
has_errorss                         r   process_issue_forkz CmfPluginJira.process_issue_forku   s   999999''''''  "" :	! :	!G$:$:$<$< :	! :	!)--LgGh-iiJ&z'8'=zJJJ * 1 8 DTT
TTN'++ &*C*C*C*CD,% ,  G  ][>[[\\\070NJ-M$*0022K!+!1!7!7!9!9""  $Gfp  gE  $G  $G  H  H  H!%%''A:9:: k k!+22%;444'2.@#*  3   $$T***

%,112icg2i2ijjjjC#55 & A	 6   	' 	' (2244 Eq&&&&% ( (''''!(--.WXXX%  		$((**Q.D!(--  /U[^aeasasauau[u  /U  /U  /U  V  V  VJ(..00 7044666
 )..00 7!(--.|pz.|.|}}}j Fu:	! :	! :	! :	! :	! :	! :	! :	! :	! :	! :	! :	! :	! :	! :	! :	! :	! :	! :	! :	! :	! :	! :	! :	! :	! :	! :	! :	! :	! :	!v s6   M(K?MM(M	M(M	M((M,/M,c                    |                     ddg           |j        rF|j        dk    r;t          j                            | j        j        j        d|j        d                   S t                      
                    |          S )Nrh   r   CmfTaskbrowserA   )r   rh   
class_nameospathr   r   r   r   supercalc_ext_hrefr   rH   	__class__s     r   r   zCmfPluginJira.calc_ext_href   su    *,<=>>> 	_3>Y#>#>7<< 3 9(3CVW\C]^^^ww$$S)))r   c                     |                     dg           |j        dk    r|j        r|j        d         S t                                          |          S )Nrh   r   
issue_path)r   r   rh   r   calc_dump_pathr   s     r   r   zCmfPluginJira.calc_dump_path   sT    *+,,,>Y&&3+>&&|44ww%%c***r   r/   c           
         ddl }dt                      d}dt                      d}d}t                      }t          |j        j                            d                    }	|	                    |          }
|
                                rt          |
d          5 }|D ]Q}t          
                    |          }|                    t          |d                   ||         f           |dz  }R	 ddd           n# 1 swxY w Y   nF|
                                r1|
                                D ]}|                                s|                    d          }|                                sBt          |d          5 }t                              |          }|                    t          |d                   ||         f           |dz  }ddd           n# 1 swxY w Y   |d	k    r[|                    d
d          }|                                r|                    |          5 }|                                D ]K}|                    d          r|d                             ||         |f           |dxx         dz  cc<   L	 ddd           n# 1 swxY w Y   |                    d          }t          |d          5 }|D ]b}t          
                    |          }|d                             ||         t          |d                   f           |dxx         dz  cc<   c	 ddd           n# 1 swxY w Y   ||d}|d	k    r
||d
<   ||d<   |S )u  
        Возвращает информацию о дампе сущности,
        общее количество объектов и множество объектов с кортежами вида (id, name/key).
        Для задач дополнительно добавляется информация об их вложениях и комментариях с
        множеством кортежей вида (task_key, id/name)

        Args:
            project (object): объект CmfProject
            entity (str): название сущности (название каталога или файла)
            field (str, optional): дополнительное поле сущности 
                                   для добавления в кортеж объекта вместе c id.
                                   Defaults to "name".

        Returns:
            dict: _description_
        r   Ncountobjsproject_dirzr+r@   rp   z	info.jsontasksattachmentszall_attachments.zip/r   r   zcomments.jsoncomments)zipfilesetr   rh   r   rK   joinpathis_fileopenjsonloadsaddstris_diriterdirexistsloadZipFilenamelistendswith)r   rU   entityfieldr   attachment_statscomment_statsdumped_countdumped_objsr   	objs_pathfrowobj_dataobj_dirobj_data_fileattach_filezip_fileattach_namecomment_data_filecomment_datastatss                         r   _get_dump_stats_by_entityz'CmfPluginJira._get_dump_stats_by_entity   s   " 	 EE
 

 EE
 

 ee728<<]KKLL((00	 #	8i&& &! & &C#zz#HOOS$%8%8(5/$JKKK A%LL&& & & & & & & & & & & & & & &
  	8$,,.. 8 8~~''  ' 0 0 = =$++-- -.. &!#yy||HOOS$%8%8(5/$JKKK A%L& & & & & & & & & & & & & & & W$$")"2"2=BW"X"XK"))++ ?$__[99 ?X/7/@/@/B/B ? ?#.#7#7#<#< !-$, 0 8 < <huo{=[ \ \ \ 0 9 9 9Q > 9 9 9 9	?? ? ? ? ? ? ? ? ? ? ? ? ? ? ? )0(8(8(I(I%/66 8!#$ 8 8C+/::c??L)&155xLY]L^H_H_6`aaa)'222a7222288 8 8 8 8 8 8 8 8 8 8 8 8 8 8 "
 
 W#3E-  -E*sL   AC>>DDAG""G&	)G&	3A!J!!J%	(J%	A&MM	M	c                 ,   dd|gg dg}|r|                     |           t                              |          }|                    |          }t	                      }|                    |g d          }	|	D ]}
|
j        r3|
j                            d          d                             d	          nd
}|rt          |
|d
          nd
}|
j
        r4t          |
j
        d                   }|
j
                            |          }|dk    r'|                    |
j        j        |
j        f           |dk    r"|                    |
j        j        |f           |r|                    ||f           |                    |           ||d}|S )u  
        Возвращает информацию об обработанных объектах сущности

        Args:
            project (object): объект CmfProject
            entity (str): название cmf модели
            filter_by (list, optional): дополнительный фильтр. Defaults to None.
            field (str, optional): дополнительное поле сущности 
                                   для добавления в кортеж объекта вида (id, name/key).
                                   Defaults to None.

        Returns:
            dict: _description_
        rU   =)r)   z!=N)rj   )z--re   r/   zparent.coderh   ri   rd   rp   zversion:Nr@   CmfAttachment
CmfCommentr   )rL   rt   get_model_by_namer   r   slistre   splitlstripr3   rh   r   rK   r   parentcoder/   )r   rU   r   	filter_byr   filter_modelprocessed_countprocessed_objsr   rH   obj_id	obj_fieldr   s                 r   _get_process_stats_by_entityz*CmfPluginJira._get_process_stats_by_entity  s     W%&&&
  	&NN9%%%))&11++W+55{{MMM  
 
  	+ 	+CEHZYSZ%%d++A.55jAAAUYF5:DUD111I" ;S0677/33E::	((""CJOSX#>????<''""CJOV#<==== +""FI#67777""6**** %"
 
 r   Fc                   	 |rd |D             	d |D             }t          	                                                              t          |                                                    }t          	                                          |z
  }	fd|D             }n|                    |          }||z
  }|sdndt          |          d}|S )u  
        Возвращает результат проверки сдампленных и обработанных объектов
        в виде статуса и множества кортежей необработанных объектов

        Args:
            dump_objs (set): сдампленные объекты
            process_objs (set): обработанные объекты
            check_by_id (bool, optional): осуществлять проверку только по id. Defaults to False.
        c                 ,    i | ]}|d          |d         S r   rp   r;   rG   r   s     r   
<dictcomp>z4CmfPluginJira._check_consistency.<locals>.<dictcomp>P  s"    7771qt777r   c                 ,    i | ]}|d          |d         S r   r;   r   s     r   r   z4CmfPluginJira._check_consistency.<locals>.<dictcomp>Q  s"    ===1AaD!A$===r   c                 $    h | ]}||         fS r;   r;   )rG   id_	dump_dicts     r   	<setcomp>z3CmfPluginJira._check_consistency.<locals>.<setcomp>T  s"    EEESC30EEEr   u   ОКu   НЕКОРРЕКТНО)statusunprocessed)r   keysintersectionlist)
r   	dump_objsprocess_objscheck_by_idprocess_dictr   diff_idsr   resultr   s
            @r   _check_consistencyz CmfPluginJira._check_consistencyE  s      	377Y777I=====Ly~~//00==c,BSBSBUBU>V>VWWL9>>++,,|;HEEEEHEEEKK$11,??L#l2K$/Mff5M,,
 
 r   c                     |                      |d          }|                     |dg dd          }d|d         |d         d}|                     |d	         |d	         d
          }|                    |           |S )u   
        Возвращает статистику по спринтам проекта

        Args:
            project (object): объект CmfProject

        Returns:
            dict: данные статистики
        sprintsCmfList)logic_type.coder   zlist.agile_sprint:defaultr/   r   r   u   Спринтыr   r   dumped	processedr   T)r   r   r   r   updater   rU   
dump_statsprocess_stats
stats_datar   s         r   _get_project_sprint_statsz'CmfPluginJira._get_project_sprint_stats^  s     33GYGG
99KKK	 : 
 
 ' )&w/
 


 ((v&! ) 
 

 	&!!!r   c                     |                      |d          }|                     |dg dd          }d|d         |d         d}|                     |d	         |d	                   }|                    |           |S )
u   
        Возвращает статистику по релизам (версиям) проекта

        Args:
            project (object): объект CmfProject

        Returns:
            dict: данные статистики
        zversions.jsonr   )r   r   zlist.release:defaultr/   r   u   Релизыr   r   r   r  r  s         r   _get_project_version_statsz(CmfPluginJira._get_project_version_stats|  s     33G_MM
99FFF	 : 
 
 % )&w/
 


 ((F);]6=RSS&!!!r   c                     |                      |d          }|                     |dd          }d|d         |d         d}|                     |d         |d                   }|                    |           |S )	u   
        Возвращает статистику по компонентам проекта

        Args:
            project (object): объект CmfProject

        Returns:
            dict: данные статистики
        zcomponents.jsonCmfComponentr/   r   u   Компонентыr   r   r   r  r  s         r   _get_project_component_statsz*CmfPluginJira._get_project_component_stats  s     33G=NOO
99 : 
 
 - )&w/
 


 ((F);]6=RSS&!!!r   c                     |                      |d          }|                     |dd          }d|d         |d         d}|                     |d         |d                   }|                    |           |S )	u   
        Возвращает статистику по доскам проекта

        Args:
            project (object): объект CmfProject

        Returns:
            dict: данные статистики
        boardsCmfKanbanBoardr/   r  u
   Доскиr   r   r   r  r  s         r   _get_project_board_statsz&CmfPluginJira._get_project_board_stats  s     33GXFF
99 : 
 
 # )&w/
 


 ((F);]6=RSS&!!!r   c                    |                      |dd          }|                     |dd          }d|d         |d         d}|                     |d         |d                   }|                    |           |                     |d	d
          }d|d         d         |d         d}|                     |d         d         |d                   }|                    |           |                     |dg d          }	d|d         d         |	d         d}
|                     |d         d         |	d                   }|
                    |           |||
gS )u  
        Возвращает статистику по задачам проекта, их вложениям и комментариям

        Args:
            project (object): объект CmfProject

        Returns:
            dict: данные статистики
        r   rA   r  r   u   Задачиr   r   r   r   r/   u   Вложенияr   r   )	log_levelr   r   )r   u   Комментарииr   r  )r   rU   r  r  task_stats_datatask_resultattach_process_statsattachment_stats_dataattachment_resultcomment_process_statscomment_stats_datacomment_results               r   _get_project_task_statsz%CmfPluginJira._get_project_task_stats  s    33GWE3RR
99 : 
 
 % )&w/
 

 --v&!
 
 	{+++#@@  A  
  
 ) /8-g6!
 !

 !33}%f- (
 
 	$$%6777 $ A A+++ !B !
 !
 / ,W5.w7
 

 00z"6*!&)
 
 	!!.111!68JKKr   c                    g }|                      |          }|                    |           |                     |          }|                    |           |                     |          }|                    |           |                     |          }|                    |           |                     |          }|D ]}|                    |           |S )u   
        Возвращает отчет сдампленных и обработанных объектов

        Args:
            project (object): объект CmfProject
        )r  rL   r
  r  r  r  )	r   rU   r   sprint_stats_dataversion_stats_datacomponent_stats_databoard_stats_datar  r  s	            r   project_statszCmfPluginJira.project_stats  s      !::7CC&'''!<<WEE'(((#@@II)***88AA%&&&66w??) 	% 	%JLL$$$$r   )r/   )NN)F)$__name__
__module____qualname__modulesr	   rD   cmf_plugin_jirar   ui_meta_skipr   api_methodspropertyr'   r-   r0   r9   staticmethodr=   r   r   r
   r]   ra   r   r   r   r   r   r   r  r
  r  r  r  r#  __classcell__)r   s   @r   r   r      s       <&6DQT^^LF,%5COS
 
K
   XK K K3 3 3D D D` ` `   \S    4> > >C C C
D D D
 @ @ \@D* * * * *+ + + + +M M M M^0 0 0 0d   2  <  4  2  2:L :L :Lx      r   r   )r   pathlibr   cmf.include#modules.jira.fields.cmf_plugin_jirar'  modules.jira.apir   r	   rD   r(  r   r;   r   r   <module>r2     s    + + + + + +           * * * * $ $ $ $ $ $V V V V VGL'7E V V V V Vr   