U
    j                     @   sT   d dl mZ d dlmZmZ d dlT d dlZd dlm	Z	 G dd dej
jjjZdS )    )Path)urlparse
urlunsplit)*N)JiraApic                       s  e Zd Zejjjjjd ZdZ	ejjjjj
ddg Z
edd Zdd Zd	d
 Zdd Zdd Zedd ZedddZdd Zdd Zdd Zdd Zedd Z fddZ fd d!Zd6d#d$Zd7d%d&Zd8d(d)Zd*d+ Zd,d- Zd.d/ Z d0d1 Z!d2d3 Z"d4d5 Z#  Z$S )9CmfPluginJira)jiraNtestget_all_projectsc              	   C   sb   | j s\| dddddddg t| jjj| jjj| jj | jj	 | jj
j| jjjd| _ | j S )	Npluginz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   Zext_urlvalueZ	ext_loginZ	ext_tokenZdecryptZext_passwordr   r   )self r   (./modules/jira/models/cmf_plugin_jira.pyr      s      
 
 zCmfPluginJira.jirac              
   C   sD   ddl m} ddlm} | j}||| W  5 Q R  S Q R X d S )Nr   JiraAPIImportJiraCSVImport)modules.jira.api_importr   modules.jira.csv_importr   r   tmplt_import_settingsr   
cmf_importr   r   r   r   r   r   r      s    z#CmfPluginJira.tmplt_import_settingsc              
   C   sV   ddl m} ddlm} |jdkrJ| j}||| W  5 Q R  S Q R X || S )Nr   r   r   Zapi)r   r   r   r   typer   previewr   r   r   r   r"   #   s    
 zCmfPluginJira.previewc              
   C   sJ   ddl m} ddlm} d|_| j}||| W  5 Q R  S Q R X d S )Nr   r   r   u#   Импорт данных из Jira)r   r   r   r   namer   process_importr   r   r   r   r$   +   s
    zCmfPluginJira.process_importc                 K   sP   ddl m} || j|}t||r8t||}|f | n|jd| d d S )Nr   r   u   Метод 'u   ' не существует)r   r   r   hasattrgetattrloggererror)r   r    Zprocess_methodkwargsr   Zjira_importmethodr   r   r   process_entity2   s    

zCmfPluginJira.process_entityc                  C   s   g } | S )uR   Собственный магазин при выборе импорта из Jirar   )resr   r   r   calc_models_settings<   s    	z"CmfPluginJira.calc_models_settings)cmf_import_idc             
   O   s  ddl m} | dg g }zg }t }tjjddd| jj dgdgdd	}|D ]}t	
d
|j}	||	 qR| j}
|
 D ]}|d }|d }|d }|d| d7 }|||d d}|dr|d |d< d| jj d| d}||kr|d7 }||d< || qW 5 Q R X W nd tk
r| } zDt| tjj|ddgd}dd || j| D }|sl W 5 d }~X Y nX |S )Nr   r   zplugin.source_hashext_idLIKE%::::%T)filterfieldsZinclude_deletedz::[^:]+::[^:]+::idkeyr#   z ())r5   r6   original_nameZ	isPrivate::u    [импортирован]r   zplugin.plugin.*r5   r4   c                 S   s   g | ]}|qS r   r   .0objr   r   r   
<listcomp>{   s     z2CmfPluginJira.get_all_projects.<locals>.<listcomp>)r   r   r   setmodels
CmfProjectslistr   source_hashrefindallr/   updater   get_projectsgetappend	Exceptiongdebug	CmfImportZ_get_projects)r   r.   argsr)   r   r,   Zimported_project_ext_idsZimported_projectsZimported_projectZext_idsr   project
project_idZproject_keyZproject_nameproject_dataproject_ext_ider    r   r   r   r
   L   sL    

zCmfPluginJira.get_all_projectsc              
   C   sj   | j Z}|jdd | }|jdd}W 5 Q R X |d }|jd|kr\td| d W 5 Q R X d S )	N   )timeoutT)Zdo_health_checkZbaseUrl/u   Указанный адрес отличается от основного URL-адреса Jira.<br />Пожалуйста, используйте основной URL для корректной работы.<br />Основной URL: <strong>z	</strong>)r   Zwithout_retryZ
get_myselfZget_server_infor   rstripZ	cmf_alert)r   r   ZmyselfZserver_infoZbase_urlr   r   r   check_connection   s    
zCmfPluginJira.check_connectionc              
   O   s4   | j $}tdd | D W  5 Q R  S Q R X dS )uE   
        Проверяем подключение к апи
        c                 S   s   g | ]}|qS r   r   r;   r   r   r   r>      s     z&CmfPluginJira.test.<locals>.<listcomp>N)r   boolrG   )r   rN   r)   r   r   r   r   r	      s    zCmfPluginJira.testc              
   C   s8   ddl m} | j}||| W  5 Q R  S Q R X d S Nr   r   )r   r   r   download_datar   r    r   r   r   r   r   r[      s    zCmfPluginJira.download_datac              
   C   s8   ddl m} | j}||| W  5 Q R  S Q R X d S rZ   )r   r   r   download_filesr\   r   r   r   r]      s    zCmfPluginJira.download_filesc              
   C   s  ddl m} ddlm} dd l}d}t Z t D tj	j
| ddgd}||jj|}	|jjj d| }
tjj
dd	d
|
 dgddgd}|std|
 |jj}|
dr|d |d f|	_|j|	_|	|j dd |	jtjj d D |	_g }|	j }|	j }t|	j|}|jd|  |j }t |D ]N}|	j!j"|	j#d| |||dd}|$| |%  |	j&jd|  qDd}|	j'|||t(j)dD ].}|	j&* r q|d7 }|+|d  q|D ]}|+d q|	j&jd |D ]}|,  q|j | }|	j&jd||-   d  d}|. s^||
 7 }qD|	j&jd!|  ||7 }W 5 Q R X W 5 Q R X |S )"Nr   r   )cmf_contextr   zplugin.plugin.source_hashr:   r9   r/   r0   r1   r2   cust_field_conf_schemeimport_raw_json)r3   r4   u)   Не найден проект с ext_id Znormalized_keyr6   c                 S   s   i | ]}|d  |qS )titler   )r<   fieldr   r   r   
<dictcomp>   s    z4CmfPluginJira.process_issue_fork.<locals>.<dictcomp>r4   u@   Грузим задачи в несколько потоков: _process_issue_thread)issue_queueissue_queue_errorsrO   )targetr#   r)   u.   Параллельный обработчик )Zonly_processingrT   
issue_pathZDONEu&   Ждем обработки задачu*   ------------------------ скорость u    задач в секундуu?   Закончили обработку задач, ошибок )/r   r   Zcmf.appr^   datetimecmfutilZdisable_aclZdisable_notifyr@   rM   rH   r   r   rC   rA   ZCmfErrorr`   r   Zkey_pairr_   Z_cache_prioritiesZsettingsCmfTaskZverbose_nameZjira_map_fieldsZqueueZQueueminZthreading_max_forksr'   infoZnowrange	threadingThreadrd   rI   startr    Zget_project_tasksZconfigZIMPORT_ONLY_NEW_OR_UPDATEDZ	is_cancelZputjoinZtotal_secondsempty)r.   rP   rq   limitr   r^   ri   errorsr    Z
api_importrR   rO   rQ   Zissue_processre   rf   Zthread_countsiprocZcntZissueZdiffZ
has_errorsr   r   r   process_issue_fork   s    



	


z CmfPluginJira.process_issue_forkc                    s\   | dg |jrP|jdkrPt|jd }|jd }t|j|jd| ddfS t |S )Nr`   rk   r   r6   zbrowse/ )	r   r`   
class_namer   r   schemenetlocsupercalc_ext_href)r   r=   Zself_urlr6   	__class__r   r   r      s    
zCmfPluginJira.calc_ext_hrefc                    s2   | dg |jdkr&|jr&|jd S t |S )Nr`   rk   rh   )r   r{   r`   r~   calc_dump_path)r   r=   r   r   r   r      s    
zCmfPluginJira.calc_dump_pathr#   c              
   C   sv  ddl }dt g d}dt d}d}t }t|jjd}	|	|}
|
 rt|
d<}|D ]0}t	
|}|t|d || f |d7 }q`W 5 Q R X n|
 rN|
 D ]}| sq|d	}| sqt|d2}t	|}|t|d || f |d7 }W 5 Q R X |d
kr|d d }dd |D }|d}| r| D ]n}| shqV|j rV|j|jkrV|j|krV|d || |jf |d  d7  < ||j qV|r|d || d|f |d}t|dJ}|D ]>}t	
|}|d || t|d f |d  d7  < qW 5 Q R X q||d}|d
krr||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undownloadedr   r   project_dirzr+r5   rT   z	info.jsontasksr4   
attachmentc                 S   s   h | ]}t |d  qS )r5   )str)r<   r   r   r   r   	<setcomp>4  s     z:CmfPluginJira._get_dump_stats_by_entity.<locals>.<setcomp>attachmentsr   r   r   z, zcomments.jsoncomments)zipfiler?   r   r`   r   rH   joinpathis_fileopenZjsonloadsaddr   is_diriterdirexistsloadstemisdigitr#   removerI   rr   )r   rO   entityrb   r   Zattachment_statsZcomment_statsZdumped_countZdumped_objsr   Z	objs_pathfrowZobj_dataZobj_dirZobj_data_filer   Zattachment_idsZattachments_diritemZcomment_data_fileZcomment_datastatsr   r   r   _get_dump_stats_by_entity   s    








 

 
z'CmfPluginJira._get_dump_stats_by_entityc                 C   s  dd|gdddgg}|r"| | dddd	g}|d
krD|ddg t|}|j|dd}t }	d}
td||
D ] }|j||d|||
 gd}|D ]}|jr|j	dd 
dnd}|rt||dnd}|jrt|jd }|j|}|d
kr|jjr|jjd }n|jj}|dkr8|r8|	||f q|dkrR|	||f q|rh|	||f q|	| qqr||	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_
        rO   =r    !=Nz--r/   r#   r`   )CmfAttachment
CmfCommentzparent.codezparent.import_raw_jsonT)r3   include_archivedd   r   )r3   r4   r   slicer9   rT   zversion:r5   r6   r   r   r   )rI   extendrj   Zget_model_by_namer   r?   rn   rB   r/   splitlstripr&   r`   r   rH   parentcoder   )r   rO   r   	filter_byrb   Zfilter_r4   ZmodelZprocessed_countZprocessed_objssteprq   r   r=   Zobj_idZ	obj_fieldZparent_coder   r   r   r   _get_process_stats_by_entityY  s^    


 


z*CmfPluginJira._get_process_stats_by_entityFc           
         s   |r^dd |D  dd |D }t   t | }t   | } fdd|D }n||}|| }|sx|r|dndt|d}	|	S )	u  
        Возвращает результат проверки сдампленных и обработанных объектов
        в виде статуса и множества кортежей необработанных объектов

        Args:
            dump_objs (set): сдампленные объекты
            process_objs (set): обработанные объекты
            has_undownloaded (bool, optional): есть незагруженные вложения
            check_by_id (bool, optional): осуществлять проверку только по id. Defaults to False.
        c                 S   s   i | ]}|d  |d qS r   rT   r   r<   rw   r   r   r   rc     s      z4CmfPluginJira._check_consistency.<locals>.<dictcomp>c                 S   s   i | ]}|d  |d qS r   r   r   r   r   r   rc     s      c                    s   h | ]}| | fqS r   r   )r<   Zid_Z	dump_dictr   r   r     s     z3CmfPluginJira._check_consistency.<locals>.<setcomp>u   НЕКОРРЕКТНОZOK)statusunprocessed)r?   keysintersectionlist)
r   Z	dump_objsZprocess_objshas_undownloadedcheck_by_idZprocess_dictr   Zdiff_idsr   resultr   r   r   _check_consistency  s    
z CmfPluginJira._check_consistencyc                 C   s   | j d | |d}| j d|d   | j d | j|dddd	gd
d}| j d|d   d|d |d d}| j d | j|d |d dd}| j d|d   || |S )u   
        Возвращает статистику по спринтам проекта

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

        Returns:
            dict: данные статистики
        uF   Сбор информации о сдампенных спринтахZsprintsu%   Сдамплено спринтов: r   uL   Сбор информации об обработанных спринтахCmfListlogic_type.coder   zlist.agile_sprint:defaultr#   r   rb   u'   Обработано спринтов: u   Спринтыr   dumped	processedu   Проверка консистентности между сдампленными и обработанными спринтамиr   T)r   u   Спринты: r   r'   rL   r   r   r   rF   r   rO   
dump_statsprocess_stats
stats_datar   r   r   r   _get_project_sprint_stats  s4    

z'CmfPluginJira._get_project_sprint_statsc                 C   s   | j d | |d}| j d|d   | j d | j|dd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   r   r   r   _get_project_version_stats  s,    

z(CmfPluginJira._get_project_version_statsc                 C   s   | j d | |d}| j d|d   | j 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   Сбор информации об обработанных компонентахZCmfComponentr#   rb   u-   Обработано компонентов: u   Компонентыr   u   Проверка консистентности между сдампленными и обработанными компонентамиr   u   Компоненты: r   r   r   r   r   r   _get_project_component_stats  s*    

z*CmfPluginJira._get_project_component_statsc                 C   s   | j d | |d}| j d|d   | j 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   Сбор информации о сдампенных доскахZboardsu   Сдамплено досок: r   uH   Сбор информации об обработанных доскахZCmfKanbanBoardr#   r   u!   Обработано досок: u
   Доскиr   u   Проверка консистентности между сдампленными и обработанными доскамиr   u   Доски: r   r   r   r   r   r   _get_project_board_stats3  s*    

z&CmfPluginJira._get_project_board_statsc                 C   sJ  | j d | j|ddd}| j d|d   | j d|d d   | j d	|d
 d   | j d | j|ddd}| j d|d   d|d |d d}dddg}| j d | j|ddddg|gd}| j d|d   d|d d |d d |d d}| j d | j|ddd d!g|gd}| j d"|d   d#|d
 d |d d}	| j d$ | |d% |d% }
| j d&|
d'   ||
 | j d( | j|d d% |d% t|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   r6   r   u   Сдамплено задач: r   u%   Сдамплено вложений: r   u-   Сдамплено комментариев: r   uJ   Сбор информации об обработанных задачахrk   u!   Обработано задач: u   Задачиr   Z	parent_idr0   z	CmfTask:%uN   Сбор информации об обработанных вложенияхr   r`   r   N)r   u'   Обработано вложений: u   Вложенияr   )r   r   r   r   uT   Сбор информации об обработанных комментарияхr   Z	log_levelr   r   u/   Обработано комментариев: u   Комментарииu   Проверка консистентности между сдампленными и обработанными задачамиr   u   Задачи: r   u   Проверка консистентности между сдампленными и обработанными вложениями)r   u   Вложения: u   Проверка консистентности между сдампленными и обработанными комментариямиu   Комментарии: )r'   rL   r   r   r   rF   rY   )r   rO   r   r   task_stats_dataZparent_filterZattach_process_statsZattachment_stats_dataZcomment_process_statsZcomment_stats_dataZtask_resultZattachment_resultZcomment_resultr   r   r   _get_project_task_statsW  s    









z%CmfPluginJira._get_project_task_statsc           	      C   sv   g }|  |}|| | |}|| | |}|| | |}|| | |}|D ]}|| qb|S )u   
        Возвращает отчет сдампленных и обработанных объектов

        Args:
            project (object): объект CmfProject
        )r   rI   r   r   r   r   )	r   rO   r   Zsprint_stats_dataZversion_stats_dataZcomponent_stats_dataZboard_stats_datar   r   r   r   r   project_stats  s    








zCmfPluginJira.project_stats)r#   )NN)FF)%__name__
__module____qualname__modulesr   r4   cmf_plugin_jirar   Zui_meta_skipr   Zapi_methodspropertyr   r"   r$   r+   staticmethodr-   r   r
   rX   r	   r[   r]   ry   r   r   r   r   r   r   r   r   r   r   r   __classcell__r   r   r   r   r   
   sD   
	

4
O
]
L  
 )%$$ar   )pathlibr   urllib.parser   r   Zcmf.includeZ#modules.jira.fields.cmf_plugin_jirar   Zmodules.jira.apir   r   r4   r   r   r   r   r   r   <module>   s
   