U
    ^hZ                     @   sP   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 dejj	j
jZdS )    )cached_property)Path)*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edd Z fddZ fddZd4d!d"Zd5d#d$Zd6d&d'Zd(d) Zd*d+ Zd,d- Zd.d/ Z d0d1 Z!d2d3 Z"  Z#S )7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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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                 C   sL   ddl m} || j|}t||r4t||}|  n|jd| d d S )Nr   r   u   Метод 'u   ' не существует)r   r   r   hasattrgetattrloggererror)r   r!   Zprocess_methodr   Zjira_importmethodr   r   r   process_entity0   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} g }z`g }| jL}| D ]<}|d |d |d d}|drX|d |d< || q&W 5 Q R X W n` tk
r }	 zBt|	 t	j
j|dd	gd
}
dd || j|
 D }|s W 5 d }	~	X Y nX |S )Nr   r   idkeyr$   )r/   r0   r$   Z	isPrivater   zplugin.plugin.*r/   fieldsc                 S   s   g | ]}|qS r   r   .0objr   r   r   
<listcomp>_   s     z2CmfPluginJira.get_all_projects.<locals>.<listcomp>)r   r   r   get_projectsgetappend	Exceptiongdebugmodels	CmfImportZ_get_projects)r   r.   argskwargsr   r,   r   projectZproject_dataer!   r   r   r   r	   J   s(    

zCmfPluginJira.get_all_projectsc              
   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   r3   r   r   r   r6   i   s     z&CmfPluginJira.test.<locals>.<listcomp>N)r   boolr7   )r   r?   r@   r   r   r   r   r   d   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   rE   k   s    zCmfPluginJira.download_datac              
   C   s8   ddl m} | j}||| W  5 Q R  S Q R X d S rD   )r   r   r   download_filesrF   r   r   r   rG   p   s    zCmfPluginJira.download_filesc              
   C   s6  ddl m} ddlm} dd l}d}t  t  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|	_g }|	j }|	j }|jd|	j  |j }t|	jD ]L}|	jj|	jd| |||dd}|| |  |	jjd|  qd}|	j|||tj dD ]*}|	j! rj q|d7 }|"| qT|D ]}|"d q|	jjd |D ]}|#  q|j | }|	jjd||$   d d}|% s||
 7 }q|	jjd|  ||7 }W 5 Q R X W 5 Q R X |S )Nr   r   )cmf_contextr   zplugin.plugin.source_hashr1   ::ext_idZLIKEz%::z::%cust_field_conf_schemeimport_raw_jsonfilterr2   u)   Не найден проект с ext_id u@   Грузим задачи в несколько потоков: _process_issue_thread)issue_queueissue_queue_errorsrA   )targetr$   r@   u.   Параллельный обработчик )Zonly_processing   ZDONEu&   Ждем обработки задачu*   ------------------------ скорость u    задач в секундуu?   Закончили обработку задач, ошибок )&r   r   Zcmf.apprH   datetimecmfutilZdisable_aclZdisable_notifyr=   r>   r8   r
   r   source_hashZ
CmfProjectZCmfErrorrK   ZqueueZQueuer(   infoZthreading_max_forksZnowrange	threadingThreadrO   r9   startr!   Zget_project_tasksZconfigZIMPORT_ONLY_NEW_OR_UPDATEDZ	is_cancelZputjoinZtotal_secondsempty)r.   Z
project_idr[   limitr   rH   rT   errorsr!   Z
api_importZproject_ext_idrA   Zissue_processrP   rQ   siprocZcntZissueZdiffZ
has_errorsr   r   r   process_issue_forku   st    


	


z CmfPluginJira.process_issue_forkc                    sF   | ddg |jr:|jdkr:tj| jjjd|jd S t	 
|S )NrL   r   CmfTaskZbrowser0   )r   rL   
class_nameospathr\   r
   r   r   supercalc_ext_hrefr   r5   	__class__r   r   ri      s    zCmfPluginJira.calc_ext_hrefc                    s2   | dg |jdkr&|jr&|jd S t |S )NrL   rd   Z
issue_path)r   re   rL   rh   calc_dump_pathrj   rk   r   r   rm      s    
zCmfPluginJira.calc_dump_pathr$   c              
   C   s  ddl }dt 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 nX|
 r|
 D ]B}| sq|d}| sqt|d2}t	|}|t|d || f |d7 }W 5 Q R X |d	kr|d
d}| r||L}| D ]<}|dr\qH|d || |f |d  d7  < qHW 5 Q R X |d}t|dJ}|D ]>}t	
|}|d || t|d f |d  d7  < qW 5 Q R X q||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attachmentszall_attachments.zip/rp   ro   zcomments.jsoncomments)zipfilesetr   rL   r   r8   joinpathis_fileopenZjsonloadsaddstris_diriterdirexistsloadZipFileZnamelistendswith)r   rA   entityfieldrv   Zattachment_statsZcomment_statsZdumped_countZdumped_objsrq   Z	objs_pathfrowZobj_dataZobj_dirZobj_data_fileZattach_fileZzip_fileZattach_nameZcomment_data_fileZcomment_datastatsr   r   r   _get_dump_stats_by_entity   sd    







 
z'CmfPluginJira._get_dump_stats_by_entityc                 C   s  dd|gdddgg}|r"| | t|}|j|d}t }|j|ddd	d
dgd}	|	D ]}
|
jrz|
jdd dnd}|rt	|
|dnd}|
j
rt|
j
d }|
j
|}|dkr||
jj|
jf qZ|dkr||
jj|f qZ|r|||f qZ|| qZ||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_
        rA   =r!   z!=N)rN   z--rJ   r$   zparent.coderL   rM   rI   rS   zversion:r/   CmfAttachment
CmfCommentrn   )r9   rU   Zget_model_by_namero   rw   ZslistrJ   splitlstripr'   rL   r}   r8   r|   parentcoder$   )r   rA   r   	filter_byr   Zfilter_ZmodelZprocessed_countZprocessed_objsrp   r5   Zobj_idZ	obj_fieldr   r   r   r   _get_process_stats_by_entity  s:    

 z*CmfPluginJira._get_process_stats_by_entityFc           	         s   |r^dd |D  dd |D }t   t | }t   | } fdd|D }n||}|| }|sxdndt|d}|S )	u  
        Возвращает результат проверки сдампленных и обработанных объектов
        в виде статуса и множества кортежей необработанных объектов

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

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

        Returns:
            dict: данные статистики
        ZsprintsCmfListlogic_type.coder   zlist.agile_sprint:defaultr$   r   r   u   Спринтыro   r   ZdumpedZ	processedrp   T)r   r   r   r   updater   rA   
dump_statsprocess_stats
stats_datar   r   r   r   _get_project_sprint_stats^  s$    

z'CmfPluginJira._get_project_sprint_statsc                 C   sZ   |  |d}| j|ddddgdd}d|d	 |d	 d
}| |d |d }|| |S )u   
        Возвращает статистику по релизам (версиям) проекта

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

        Returns:
            dict: данные статистики
        zversions.jsonr   r   r   zlist.release:defaultr$   r   u   Релизыro   r   rp   r   r   r   r   r   _get_project_version_stats|  s    

z(CmfPluginJira._get_project_version_statsc                 C   sR   |  |d}| j|ddd}d|d |d d}| |d |d }|| |S )	u   
        Возвращает статистику по компонентам проекта

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

        Returns:
            dict: данные статистики
        zcomponents.jsonZCmfComponentr$   r   u   Компонентыro   r   rp   r   r   r   r   r   _get_project_component_stats  s    

z*CmfPluginJira._get_project_component_statsc                 C   sR   |  |d}| j|ddd}d|d |d d}| |d |d }|| |S )	u   
        Возвращает статистику по доскам проекта

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

        Returns:
            dict: данные статистики
        ZboardsZCmfKanbanBoardr$   r   u
   Доскиro   r   rp   r   r   r   r   r   _get_project_board_stats  s    

z&CmfPluginJira._get_project_board_statsc                 C   s   | j |ddd}| j|ddd}d|d |d d}| |d |d }|| | j|d	d
d}d|d d |d d}| |d d |d }|| | j|ddddgd}	d|d d |	d d}
| |d d |	d }|
| |||
gS )u  
        Возвращает статистику по задачам проекта, их вложениям и комментариям

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

        Returns:
            dict: данные статистики
        rr   r0   r   rd   u   Задачиro   r   rp   r   r$   u   Вложенияrs   r   Z	log_levelr   r   )r   u   Комментарииru   r   )r   rA   r   r   task_stats_dataZtask_resultZattach_process_statsZattachment_stats_dataZattachment_resultZcomment_process_statsZcomment_stats_dataZcomment_resultr   r   r   _get_project_task_stats  sX    







z%CmfPluginJira._get_project_task_statsc           	      C   sv   g }|  |}|| | |}|| | |}|| | |}|| | |}|D ]}|| qb|S )u   
        Возвращает отчет сдампленных и обработанных объектов

        Args:
            project (object): объект CmfProject
        )r   r9   r   r   r   r   )	r   rA   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)F)$__name__
__module____qualname__modulesr   r2   cmf_plugin_jirar   Zui_meta_skipr   Zapi_methodspropertyr   r#   r%   r+   staticmethodr-   r}   r	   r   rE   rG   rc   ri   rm   r   r   r   r   r   r   r   r   r   __classcell__r   r   rk   r   r      s>   
	


B
O
2
<r   )r   pathlibr   Zcmf.includeZ#modules.jira.fields.cmf_plugin_jirar   Zmodules.jira.apir   r   r2   r   r   r   r   r   r   <module>   s
   