
    <ip                     ~    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!   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   s    999999#mDIz::;// 	Q[.99FFHHHHH##$O~$O$O$OPPPP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 }|                                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        |	_        |	                    |j                   d |	j        t          j        j                 d         D             |	_        g }|	j                                        }|	j                                        }t1          |	j        |          }|j                            d|            |j                                        }t;          |          D ]v}|	j                            |	j         d| |||d          }|!                    |           |"                                 |	j#        j                            d|            wd}|	$                    |||tJ          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 c                      i | ]}|d          |S )titler;   )rG   fields     r   
<dictcomp>z4CmfPluginJira.process_issue_fork.<locals>.<dictcomp>   s.     * * * g* * *r   rD   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   _cache_prioritiessettingsCmfTaskverbose_namejira_map_fieldsqueueQueueminthreading_max_forksr4   infonowrange	threadingThreadrn   rL   startr)   get_project_tasksconfigIMPORT_ONLY_NEW_OR_UPDATED	is_cancelputjointotal_secondsempty)r>   
project_idr   limitr"   rc   rv   errorsr)   
api_importproject_ext_idrU   issue_processro   rp   thread_countsiproccntissuediff
has_errorss                          r   process_issue_forkz CmfPluginJira.process_issue_forku   s   999999''''''  "" D	! D	!G$:$:$<$< D	! D	!)--LgGh-iiJ&z'8'=zJJJ * 1 8 DTT
TTN'++ &*C*C*C*CD,% ,  G  ][>[[\\\070NJ-(()GHHH* *'01LMhW* * *J&
 M$*0022K!+!1!7!7!9!9 z=uEEL""#tfr#t#tuuu!%%''A<(( 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 FID	! D	! D	! D	! D	! D	! D	! D	! D	! D	! D	! D	! D	! D	! D	! D	! D	! D	! D	! D	! D	! D	! D	! D	! D	! D	! D	! D	! D	! D	!J s6   N>MN'N>'N+	+N>.N+	/N>>OOc                    |                     ddg           |j        rF|j        dk    r;t          j                            | j        j        j        d|j        d                   S t                      
                    |          S )Nrh   r   r   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   nD|
                                r/|
                                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    rY|                    d
          }|                                r|                                D ]x}|                                s|j                                        rH|j        |j        k    r8|d                             ||         |j        f           |dxx         dz  cc<   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@   rs   z	info.jsontasksattachmentsr   r   zcomments.jsoncomments)zipfilesetr   rh   r   rK   joinpathis_fileopenjsonloadsaddstris_diriterdirexistsloadstemisdigitr/   )r   rU   entityrl   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   sL   " 	 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$$&-&6&6}&E&EO&--// ?$3$;$;$=$= ? ?D#'<<>> ) (#y0022 ?tyDI7M7M 0 8 < <huoty=Y Z Z Z 0 9 9 9Q > 9 9 9(/(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*s9   AC>>DDAG""G&	)G&	A&MM		M	c                 f   dd|gg dg}|r|                     |           t                              |          }|                    |d          }t	                      }d}	t          d||	          D ]7}
|                    |g d|
|
|	z   gd	          }|D ]}|j        r3|j                            d
          d         	                    d          nd}|rt          ||d          nd}|j        r4t          |j        d                   }|j                            |          }|dk    r$|r"|                    |j        j        |f           |dk    r"|                    |j        j        |f           |r|                    ||f           |                    |           9||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)   !=NT)ri   include_archivedd   r   )z--re   r/   zparent.coderh   )ri   rD   slicer   rd   rs   zversion:Nr@   CmfAttachment
CmfCommentr   )rL   rw   get_model_by_namer   r   r   slistre   splitlstripr3   rh   r   rK   r   parentcode)r   rU   r   	filter_byrl   filter_modelprocessed_countprocessed_objsstepr   r   rH   obj_id	obj_fieldr   s                   r   _get_process_stats_by_entityz*CmfPluginJira._get_process_stats_by_entity  s     W%&&&
  	&NN9%%%))&11++Wt+LL1ot44 	/ 	/E;;QQQedl+!%	   D  / /IL]))$//299*EEEY]9>HGC555D	& ? !4T!:;;F # 3 7 7 > >I_,,,"&&
'@AAAA|++"&&
'@AAAA /"&&	':;;;;"&&v..../  %"
 
 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   rs   r;   rG   r   s     r   rm   z4CmfPluginJira._check_consistency.<locals>.<dictcomp>`  s"    7771qt777r   c                 ,    i | ]}|d          |d         S r   r;   r   s     r   rm   z4CmfPluginJira._check_consistency.<locals>.<dictcomp>a  s"    ===1AaD!A$===r   c                 $    h | ]}||         fS r;   r;   )rG   id_	dump_dicts     r   	<setcomp>z3CmfPluginJira._check_consistency.<locals>.<setcomp>d  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_consistencyU  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                 l   | j                             d           |                     |d          }| j                             d|d                     | j                             d           |                     |dg dd	          }| j                             d
|d                     d|d         |d         d}| j                             d           |                     |d         |d         d          }| j                             d|d                     |                    |           |S )u   
        Возвращает статистику по спринтам проекта

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

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

 	 S	
 	
 	
 ((v&! ) 
 

 	?VH-=??@@@&!!!r   c                 h   | j                             d           |                     |d          }| j                             d|d                     | j                             d           |                     |dg dd	          }| j                             d
|d                     d|d         |d         d}| j                             d           |                     |d         |d                   }| j                             d|d                     |                    |           |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  sb    	pqqq33G_MM
cjY`Naccdddvwww99FFF	 : 
 
 	hP]^ePfhhiii % )&w/
 

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

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

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

 	 Y	
 	
 	
 ((F);]6=RSSE6(3CEEFFF&!!!r   c                 b   | j                             d           |                     |d          }| j                             d|d                     | j                             d           |                     |dd          }| j                             d	|d                     d
|d         |d         d}| j                             d           |                     |d         |d                   }| j                             d|d                     |                    |           |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  sV    	^___33GXFF
QJw<OQQRRRdeee99 : 
 

 	VmG>TVVWWW # )&w/
 

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

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

        Returns:
            dict: данные статистики
        ut   Сбор информации о сдампенных задачах, вложениях и комментарияхr   rA   r  u   Сдамплено задач: r   u%   Сдамплено вложений: r   u-   Сдамплено комментариев: r   uJ   Сбор информации об обработанных задачахr   u!   Обработано задач: u   Задачиr  uN   Сбор информации об обработанных вложенияхr   )rh   r   N)r   u'   Обработано вложений: u   ВложенияuT   Сбор информации об обработанных комментарияхr   )	log_levelr   r   u/   Обработано комментариев: u   Комментарииu   Проверка консистентности между сдампленными и обработанными задачамиr   u   Задачи: r   u   Проверка консистентности между сдампленными и обработанными вложениямиu   Вложения: u   Проверка консистентности между сдампленными и обработанными комментариямиu   Комментарии: r  )r   rU   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  	R  	R33GWE3RR
QJw<OQQRRRf*]B[\cBdffgggk*U_J`ahJikklllfggg99 : 
 

 	VmG>TVVWWW$ )&w/
 
 	jkkk#@@555  A  
  

 	cDXY`Daccddd( /8-g6!
 !
 	pqqq $ A A+++ !B !
 !

 	lLabiLjllmmm. ,W5.w7
 
 	 Q	
 	
 	
 --v&!
 
 	B;x+@BBCCC{+++ U	
 	
 	
 !33}%f- (
 
 	L/@/JLLMMM$$%6777 [	
 	
 	
 00z"6*!&)
 
 	O^H5MOOPPP!!.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_statsZ  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Q Q Q   \S    4> > >C C C
D D D
 J J \JX* * * * *+ + + + +N N N N`5 5 5 5n   2' ' 'R# # #J" " "H" " "HTL TL TLl      r   r   )r   pathlibr   cmf.include#modules.jira.fields.cmf_plugin_jirar0  modules.jira.apir   r	   rD   r1  r   r;   r   r   <module>r;     s    + + + + + +           * * * * $ $ $ $ $ $l	 l	 l	 l	 l	GL'7E l	 l	 l	 l	 l	r   