
    ki6u                         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 ]7  }|	jF                  jO                         r n|dz  }|jQ                  |d          9 |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   
issue_path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^   ro   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  	5 ((224ql 34	5 & ('(!!((--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   rx   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   rx   rl   )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               g 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       nJ|
j                         r9|
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d   d   }|D ch c]  }t        |d          }}|j                  d      }|j                         r|j                         D ]  }|j                         s|j"                  j%                         s/|j"                  |j&                  k(  sI|j&                  |v sX|d   j                  ||   |j&                  f       |dxx   dz  cc<   |j)                  |j&                          |r(|d   j+                  ||   dj-                  |      f       |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   xY wc c}w # 1 sw Y   gx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undownloadedr   r   project_dirzr+r@   rk   z	info.jsontasksrD   
attachmentattachmentsr   r   r   z, zcomments.jsoncomments)zipfilesetr   rc   r   rF   joinpathis_fileopenjsonloadsaddstris_diriterdirexistsloadstemisdigitr/   removerG   r   )r   rP   entityr   r   attachment_statscomment_statsdumped_countdumped_objsr   	objs_pathfrowobj_dataobj_dirobj_data_filer   r   attachment_idsattachments_diritemcomment_data_filecomment_datastatss                           r   _get_dump_stats_by_entityz'CmfPluginJira._get_dump_stats_by_entity   si   " 	 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$"*8"4\"BKNY%Z
c*T*:&;%ZN%Z&-&6&6}&EO&--/$3$;$;$= AD#'<<> ( !%		 1 1 3$(II$:$(II$? 0 8 < <huotyy=Y Z 0 9Q > 9 . 5 5dii @A &(8??$UOTYY~-FA  )0(8(8(I%/6 8!#$ 8C+/::c?L)&155xLY]L^H_6`a)'2a7288 8G'8T "
 W#3E-  -E*o& && & &[,8 8s,   AL6:=MMAM6L?M	M	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   rp   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|rdndt        |      d}|S c c}w c c}w c c}
w )u  
        Возвращает результат проверки сдампленных и обработанных объектов
        в виде статуса и множества кортежей необработанных объектов

        Args:
            dump_objs (set): сдампленные объекты
            process_objs (set): обработанные объекты
            has_undownloaded (bool, optional): есть незагруженные вложения
            check_by_id (bool, optional): осуществлять проверку только по id. Defaults to False.
        r   rk   u   НЕКОРРЕКТНОOK)statusunprocessed)r   keysintersectionlist)r   	dump_objsprocess_objshas_undownloadedcheck_by_idr   	dump_dictprocess_dictr   diff_idsid_r   results                r   _check_consistencyz CmfPluginJira._check_consistencyb  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2K2=AQ.W[,
  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_stats  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}g d}| j                   j                  d       | j                  |dg d|g      }| j                   j                  d|d           d|d   d   |d   d   |d   d}| j                   j                  d       | j                  |dg d|g      }| 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   t        |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   Сбор информации об обработанных задачахrx   u!   Обработано задач: u   Задачиr  )	parent_idra   z	CmfTask:%uN   Сбор информации об обработанных вложенияхr   )rc   r   N)r   u'   Обработано вложений: u   Вложенияr   )r   r  r   r  uT   Сбор информации об обработанных комментарияхr   )	log_levelr   r   u/   Обработано комментариев: u   Комментарииu   Проверка консистентности между сдампленными и обработанными задачамиr   u   Задачи: r   u   Проверка консистентности между сдампленными и обработанными вложениями)r   u   Вложения: u   Проверка консистентности между сдампленными и обработанными комментариямиu   Комментарии: )r4   rJ   r   r   r   r  rU   )r   rP   r  r  task_stats_dataparent_filter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#@@/  A  
 	CDXY`DaCbcd( /8&}5nE-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- (!*]";N"KL 4 

 	./@/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_statsy  s      !::7C&'!<<WE'(#@@I)*88A%&66w?) 	%JLL$	% r   )r/   )NN)FF)$__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*+[z5v @'R#J"H"H_LBr   r   )r   pathlibr   cmf.include#modules.jira.fields.cmf_plugin_jirar+  modules.jira.apir   r	   rD   r,  r   r;   r   r   <module>r6     s8    +   * $K
GLL''77EE K
r   