
    3ip                         d dl m Z  d dlmZ d dl d dlZd dlmZ  G d dej                  j                  j                  j                        Zy)    )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                    | j                   s| j                  g d       t        | j                  j                  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 Y!dkk&9&9&?&?$++J_J_JeJe"kk33;;=H`H`HhHhHj#';;#9#9#?#?t{{GXGXG^G^`DK {{    c                     ddl m} ddlm} | j                  5 } |||      j                         cd d d        S # 1 sw Y   y xY w)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YY 	K$ z2HHJ	K 	K 	Ks	   :Ac                     ddl m} ddlm} |j                  dk(  r-| j
                  5 } |||      j                         cd d d        S  ||      j                         S # 1 sw Y   xY w)Nr   r!   r#   api)r%   r"   r&   r$   typer	   previewr(   s        r   r-   zCmfPluginJira.preview!   sc    99??e# Ad$T:6>>@A AZ(0022A As   AA(c                     ddl m} ddlm} d|_        | j
                  5 } |||      j                         cd d d        S # 1 sw Y   y xY w)Nr   r!   r#   u#   Импорт данных из Jira)r%   r"   r&   r$   namer	   process_importr(   s        r   r0   zCmfPluginJira.process_import)   sD    99?
YY 	D$ z2AAC	D 	D 	Ds   AA
c                     ddl m}  || j                  |      }t        ||      rt	        ||      } |        y |j
                  j                  d| d       y )Nr   r!   zMethod 'z' does not exist)r%   r"   r	   hasattrgetattrloggererror)r   r)   process_methodr"   jira_importmethods         r   process_entityzCmfPluginJira.process_entity0   sO    9#DIIz:;/[.9FH##h~.>>N$OPr   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 }|j                         D ];  }|d   |d   |d   d}|j	                  d      r|d   |d<   |j                  |       = 	 d d d        |S # 1 sw Y   |S xY w# t        $ rz}	t        j                  |	       t        j                  j	                  |dd	g
      }
 || j                  |
      j                         D cg c]  }| nc c}w }}|s Y d }	~	|S d }	~	ww xY w)Nr   r!   idkeyr/   )r@   rA   r/   	isPrivater   zplugin.plugin.*r@   fields)r%   r"   r	   get_projectsgetappend	Exceptiongdebugmodels	CmfImport_get_projects)r   r>   argskwargsr"   r<   r	   projectproject_dataer)   objs               r   r   zCmfPluginJira.get_all_projectsJ   s   9	C -d#002 
-G &dm&u~ '$L
 {{;/4;K4H[1JJ|,
--& 
'-& 
  	GGAJ))--M^G_-`J"/		:"F"T"T"VW33WWCW 
	sB   A? AA2(A? 2A<7A? <A? ?	DAC=#	C-,C==Dc                     | j                   5 }t        |j                         D cg c]  }| c}      cddd       S c c}w # 1 sw Y   yxY w)uE   
        Проверяем подключение к апи
        N)r	   boolrE   )r   rN   rO   r	   rS   s        r   r
   zCmfPluginJira.testd   sF     YY 	>$(9(9(;<<=	> 	><	> 	>s   A	>
AAAc                     ddl m} | j                  5 } |||      j                         cd d d        S # 1 sw Y   y xY wNr   r!   )r%   r"   r	   download_datar   r)   r"   r	   s       r   rX   zCmfPluginJira.download_datak   s:    9YY 	C$ z2@@B	C 	C 	C   4=c                     ddl m} | j                  5 } |||      j                         cd d d        S # 1 sw Y   y xY wrW   )r%   r"   r	   download_filesrY   s       r   r\   zCmfPluginJira.download_filesp   s:    9YY 	D$ z2AAC	D 	D 	DrZ   c                    ddl m} ddlm} dd l}d}t
        j                         5  t
        j                         5  t        j                  j                  | ddg      } ||j                  j                  |      }	|j                  j                  j                   d| }
t        j                  j                  dd	d
|
 dgddg      }|st        d|
       |j                   |	_        |	j#                  |j                          |	j$                  t        j&                  j(                     d   D ci c]  }|d   |
 c}|	_        g }|	j,                  j/                         }|	j,                  j/                         }t1        |	j2                  |      }|j4                  j7                  d|        |j                  j9                         }t;        |      D ]z  }|	j<                  j?                  |	j@                  d| |||d      }|jC                  |       |jE                          |	jF                  j4                  j7                  d|        | d}|	jI                  |||tJ        jL                        D ]4  }|	jF                  jO                         r n|dz  }|jQ                  |       6 |D ]  }|jQ                  d        |	jF                  j4                  j7                  d       |D ]  }|jS                           |j                  j9                         |z
  }|	jF                  j4                  j7                  d||jU                         z   d       d}|jW                         s$||j                         z  }|jW                         s$|	jF                  j4                  j7                  d|        ||z  }d d d        d d d        |S c c}w # 1 sw Y   xY w# 1 sw Y   |S xY w)Nr   r!   )cmf_contextr   zplugin.plugin.source_hashrC   ::ext_idLIKEz%::z::%cust_field_conf_schemeimport_raw_json)filterrD   u)   Не найден проект с ext_id rD   titleu@   Грузим задачи в несколько потоков: _process_issue_thread)issue_queueissue_queue_errorsrP   )targetr/   rO   u.   Параллельный обработчик )only_processing   DONEu&   Ждем обработки задачu*   ------------------------ скорость u    задач в секундуu?   Закончили обработку задач, ошибок ),r%   r"   cmf.appr^   datetimecmfutildisable_acldisable_notifyrK   rL   rF   r   r	   source_hash
CmfProjectCmfErrorrb   _cache_prioritiessettingsCmfTaskverbose_namejira_map_fieldsqueueQueueminthreading_max_forksr4   infonowrange	threadingThreadrf   rG   startr)   get_project_tasksconfigIMPORT_ONLY_NEW_OR_UPDATED	is_cancelputjointotal_secondsempty)r>   
project_idr   limitr"   r^   rn   errorsr)   
api_importproject_ext_idrP   fieldissue_processrg   rh   thread_countsiproccntissuediff
has_errorss                           r   process_issue_forkz CmfPluginJira.process_issue_forku   s   9'  " D	!G$:$:$< D	!))--LgGh-iJ&z'8'8'='=zJJ * 1 1 8 8 D DER
|TN''++ &C/?s*CD,% , G !J>JZ[\\070N0NJ-(()G)GH (001L1LMhW* g%*J&
 M$**002K!+!1!1!7!7!9 z==uEL""%efres#tu!!%%'A<( k!++22%;;04'2.@#* 3  $$T*

%%,,114bcgbh2ijk C#55 & A A	 6  	' ((224q&	' & ('(!!((--0VX% 		$$((*Q.D!!((--0Z[^aeasasau[uZv  wT  /U  VJ(..004466
 )..0!!((--0opzo{.|}j FID	! D	!J g*%D	! D	! D	!J s<   O"C8O4OIO-O?O"OO	O""O,c                    |j                  ddg       |j                  r[|j                  dk(  rLt        j                  j                  | j                  j                  j                  d|j                  d         S t        | )  |      S )Nrc   r   rw   browserA   )r   rc   
class_nameospathr   r   r   r   supercalc_ext_hrefr   rS   	__class__s     r   r   zCmfPluginJira.calc_ext_href   sm    *,<=>3>>Y#>77<< 3 3 9 9(3CVCVW\C]^^w$S))r   c                     |j                  dg       |j                  dk(  r|j                  r|j                  d   S t        |   |      S )Nrc   rw   
issue_path)r   r   rc   r   calc_dump_pathr   s     r   r   zCmfPluginJira.calc_dump_path   sH    *+,>>Y&3+>+>&&|44w%c**r   c           
         ddl }dt               d}dt               d}d}t               }t        |j                  j                  j                  d            }	|	j                  |      }
|
j                         r[t        |
d      5 }|D ]>  }t        j                  |      }|j                  t        |d         ||   f       |dz  }@ 	 ddd       n|
j                         r|
j                         D ]  }|j                         s|j                  d      }|j                         s7t        |d      5 }t        j!                  |      }|j                  t        |d         ||   f       |dz  }ddd       |d	k(  s|j                  d
      }|j                         r|j                         D ]x  }|j                         s|j"                  j%                         s/|j"                  |j&                  k(  sI|d   j                  |   |j&                  f       |dxx   dz  cc<   z |j                  d      }t        |d      5 }|D ]I  }t        j                  |      }|d   j                  |   t        |d         f       |dxx   dz  cc<   K 	 ddd        ||d}|d	k(  r
||d
<   ||d<   |S # 1 sw Y   xY w# 1 sw Y   VxY w# 1 sw Y   xY w)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@   rk   z	info.jsontasksattachmentsr   r   zcomments.jsoncomments)zipfilesetr   rc   r   rF   joinpathis_fileopenjsonloadsaddstris_diriterdirexistsloadstemisdigitr/   )r   rP   entityr   r   attachment_statscomment_statsdumped_countdumped_objsr   	objs_pathfrowobj_dataobj_dirobj_data_fileattachments_diritemcomment_data_filecomment_datastatss                        r   _get_dump_stats_by_entityz'CmfPluginJira._get_dump_stats_by_entity   s   " 	 E

 E

 e72288<<]KL((0	i& &! &C#zz#HOOS$%8(5/$JK A%L&& &
 $,,. 8~~' ' 0 0 =$++--. &!#yy|HOOS$%8(5/$JK A%L& W$&-&6&6}&EO&--/$3$;$;$= ?D#'<<> (#yy002tyyDII7M 0 8 < <huotyy=Y Z 0 9Q > 9? )0(8(8(I%/6 8!#$ 8C+/::c?L)&155xLY]L^H_6`a)'2a7288 8/8< "
 W#3E-  -E*W& && &"8 8s&   AJ>9=K
AK>K
K	K!	c                 @   dd|gg dg}|r|j                  |       t        j                  |      }|j                  |d      }t	               }d}	t        d||	      D ]7  }
|j                  |g d|
|
|	z   gd	      }|D ]  }|j                  r-|j                  j                  d
      d   j                  d      nd}|rt        ||d      nd}|j                  r3t        |j                  d         }|j                  j                  |      }|dk(  r*|r(|j                  |j                  j                   |f       |dk(  r(|j                  |j                  j                   |f       |r|j                  ||f       |j                  |        : ||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_
        rP   =)r)   !=NT)rd   include_archivedd   r   )z--r`   r/   zparent.coderc   )rd   rD   slicer   r_   rk   zversion:Nr@   CmfAttachment
CmfCommentr   )rG   ro   get_model_by_namer   r   r   slistr`   splitlstripr3   rc   r   rF   r   parentcode)r   rP   r   	filter_byr   filter_modelprocessed_countprocessed_objsstepr   r   rS   obj_id	obj_fieldr   s                   r   _get_process_stats_by_entityz*CmfPluginJira._get_process_stats_by_entity  s     W%&
 NN9%))&1++Wt+L1ot4 	/E;;Qedl+!%	  D  /IL))$/299*EY]9>GC5D	&& !4!4T!:;F # 3 3 7 7 >I_,"&&

'@A|+"&&

'@A"&&	':;"&&v./	/. %"
 r   c                    |r|D ci c]  }|d   |d    }}|D ci c]  }|d   |d    }}t        |j                               j                  t        |j                                     }t        |j                               |z
  }|D 	ch c]	  }	|	||	   f }
}	n|j                  |      }||z
  }
|
sdndt        |
      d}|S c c}w c c}w c c}	w )u  
        Возвращает результат проверки сдампленных и обработанных объектов
        в виде статуса и множества кортежей необработанных объектов

        Args:
            dump_objs (set): сдампленные объекты
            process_objs (set): обработанные объекты
            check_by_id (bool, optional): осуществлять проверку только по id. Defaults to False.
        r   rk   u   ОКu   НЕКОРРЕКТНО)statusunprocessed)r   keysintersectionlist)r   	dump_objsprocess_objscheck_by_idr   	dump_dictprocess_dictr   diff_idsid_r   results               r   _check_consistencyz CmfPluginJira._check_consistencyU  s     -671qt7I70<=1AaD!A$J=L=y~~/0==c,BSBSBU>VWL9>>+,|;H<DESC30EKE$11,?L#l2K$/f5M,
  8= Fs   C	CCc                 .   | j                   j                  d       | j                  |d      }| j                   j                  d|d           | j                   j                  d       | j                  |dg dd	      }| j                   j                  d
|d           d|d   |d   d}| j                   j                  d       | j	                  |d   |d   d      }| j                   j                  d|d           |j                  |       |S )u   
        Возвращает статистику по спринтам проекта

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

        Returns:
            dict: данные статистики
        uF   Сбор информации о сдампенных спринтахsprintsu%   Сдамплено спринтов: r   uL   Сбор информации об обработанных спринтахCmfList)logic_type.coder   zlist.agile_sprint:defaultr/   r   r   u'   Обработано спринтов: u   Спринтыr   dumped	processedu   Проверка консистентности между сдампленными и обработанными спринтамиr   T)r   u   Спринты: r   r4   rJ   r   r   r   updater   rP   
dump_statsprocess_stats
stats_datar   s         r   _get_project_sprint_statsz'CmfPluginJira._get_project_sprint_statsn  s6    	bc33GYG
A*WBUAVWXhi99K	 : 
 	CMRYDZC[\] ' )&w/

 	 S	
 ((v&! ) 

 	,VH-=,>?@&!r   c                 *   | j                   j                  d       | j                  |d      }| j                   j                  d|d           | j                   j                  d       | j                  |dg dd	      }| j                   j                  d
|d           d|d   |d   d}| j                   j                  d       | j	                  |d   |d         }| j                   j                  d|d           |j                  |       |S )u   
        Возвращает статистику по релизам (версиям) проекта

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

        Returns:
            dict: данные статистики
        uT   Сбор информации о сдампенных релизах(версиях)zversions.jsonu1   Сдамплено релизов(версий): r   uZ   Сбор информации об обработанных релизах(версиях)r   )r   r   zlist.release:defaultr/   r   u3   Обработано релизов(версий): u   Релизыr   u   Проверка консистентности между сдампленными и обработанными релизами(версиями)r   u   Релизы(версии): r   r   r   s         r   _get_project_version_statsz(CmfPluginJira._get_project_version_stats  s*    	pq33G_M
MjY`NaMbcdvw99F	 : 
 	OP]^ePfOghi % )&w/

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

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

        Returns:
            dict: данные статистики
        uL   Сбор информации о сдампенных компонентахzcomponents.jsonu+   Сдамплено компонентов: r   uR   Сбор информации об обработанных компонентахCmfComponentr/   r   u-   Обработано компонентов: u   Компонентыr   u   Проверка консистентности между сдампленными и обработанными компонентамиr   u   Компоненты: r   r   r   s         r   _get_project_component_statsz*CmfPluginJira._get_project_component_stats  s'    	hi33G=NO
G
SZH[G\]^no99 : 

 	I-X_J`Iabc - )&w/

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

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

        Returns:
            dict: данные статистики
        uB   Сбор информации о сдампенных доскахboardsu   Сдамплено досок: r   uH   Сбор информации об обработанных доскахCmfKanbanBoardr/   r	  u!   Обработано досок: u
   Доскиr   u   Проверка консистентности между сдампленными и обработанными доскамиr   u   Доски: r   r   r   s         r   _get_project_board_statsz&CmfPluginJira._get_project_board_stats  s#    	^_33GXF
;Jw<O;PQRde99 : 

 	=mG>T=UVW # )&w/

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

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

        Returns:
            dict: данные статистики
        ut   Сбор информации о сдампенных задачах, вложениях и комментарияхr   rA   r	  u   Сдамплено задач: r   u%   Сдамплено вложений: r   u-   Сдамплено комментариев: r   uJ   Сбор информации об обработанных задачахrw   u!   Обработано задач: u   Задачиr   uN   Сбор информации об обработанных вложенияхr   )rc   r   N)r   u'   Обработано вложений: u   ВложенияuT   Сбор информации об обработанных комментарияхr   )	log_levelr   r   u/   Обработано комментариев: u   Комментарииu   Проверка консистентности между сдампленными и обработанными задачамиr   u   Задачи: r   u   Проверка консистентности между сдампленными и обработанными вложениямиu   Вложения: u   Проверка консистентности между сдампленными и обработанными комментариямиu   Комментарии: r   )r   rP   r  r  task_stats_dataattach_process_statsattachment_stats_datacomment_process_statscomment_stats_datatask_resultattachment_resultcomment_results               r   _get_project_task_statsz%CmfPluginJira._get_project_task_stats  s[    	  Q  	R33GWE3R
;Jw<O;PQRA*]B[\cBdAefgI*U_J`ahJiIjklfg99 : 

 	=mG>T=UVW$ )&w/
 	jk#@@5  A  

 	CDXY`DaCbcd( /8-g6!
 	pq $ A A+ !B !

 	KLabiLjKklm. ,W5.w7
 	 Q	
 --v&!
 	N;x+@*ABC{+ U	
 !33}%f- (
 	./@/J.KLM$$%67 [	
 00z"6*!&)
 	4^H5M4NOP!!.1!68JKKr   c                 l   g }| j                  |      }|j                  |       | j                  |      }|j                  |       | j                  |      }|j                  |       | j	                  |      }|j                  |       | j                  |      }|D ]  }|j                  |        |S )u   
        Возвращает отчет сдампленных и обработанных объектов

        Args:
            project (object): объект CmfProject
        )r  rG   r  r
  r  r  )	r   rP   r   sprint_stats_dataversion_stats_datacomponent_stats_databoard_stats_datar  r  s	            r   project_statszCmfPluginJira.project_statsZ  s      !::7C&'!<<WE'(#@@I)*88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
   rX   r\   r   r   r   r   r   r   r  r  r
  r  r  r  __classcell__)r   s   @r   r   r      s   <<&&66DDQQT^^LF,,%%55CCOOS
 
K
  K3DQ  S 4>C
D
 J JX*+N`5n2'R#J"H"HTLlr   r   )r   pathlibr   cmf.include#modules.jira.fields.cmf_plugin_jirar#  modules.jira.apir   r	   rD   r$  r   r;   r   r   <module>r.     s8    +   * $l	GLL''77EE l	r   