U
    >jg                     @   sH   d dl mZ d dlmZmZ d dlZd dlT G dd dejj	j
jZdS )    )Path)urlparse
urlunsplitN)*c                       sL  e Zd Zejjjjjd ZdZ	dZ
ejjjjjddddg Zdd	 Zd
dddd fdd
Zdd fdd
Zedd Zdd Zdd ZedddZd;edddZedddZedd d!Zedd"d#Zedd$d%Zedd&d'Zd(d) Zd*d+ Z fd,d-Z fd.d/Zd<d1d2Z d=d3d4Z!d>d5d6Z"d7d8 Z#d9d: Z$  Z%S )?CmfPluginConfluence)
confluenceNTget_all_spacesget_space_pagesget_total_spacesget_page_by_idc              	   K   s@   | j r
d S tjf | j| j| j|||d|}|  || _ d S )N)nametypetokenext_url	ext_login	ext_token)pluginmodels	CmfPlugincode
class_nameidsave)selfr   r   r   kwargsr    r   4./modules/confluence/models/cmf_plugin_confluence.py_init_secret   s      z CmfPluginConfluence._init_secretr   )depthr   r   r   c                   s*   | j r| ||| t j|d|i|S )Nr   )Zis_newr   superr   )r   r   r   r   r   argsr   	__class__r   r   r      s    zCmfPluginConfluence.saveF)forcec                   s>   t jjdd| jgddddgd}|  t j|d|i|S )Nr   z==r   r   r   )filterfieldsr#   )r   r   getr   deleter   )r   r#   r    r   r   r!   r   r   r'   !   s
    
zCmfPluginConfluence.deletec              	   C   sn   | j shddlm} | ddddddd	g || jjj| jjj| jj	 | jj
	 | jjj| jjjd
| _ | j S )Nr   )ConfluenceApir   zplugin.ext_urlzplugin.ext_loginzplugin.ext_tokenzplugin.verify_sslzplugin.cloudzplugin.ext_password)urlusernamepasswordr   
verify_sslcloud) _CmfPluginConfluence__confluenceZmodules.confluence.apir(   load_fieldsr   r   valuer   Zext_passwordZdecryptr   r,   r-   )r   r(   r   r   r   r   '   s(    


	zCmfPluginConfluence.confluencec              
   C   sr   | j b}|jj  |jdd | }| }W 5 Q R X |d }|jd|krdt	d| d W 5 Q R X d S )N   )timeoutr)   /u   Указанный адрес отличается от основного URL-адреса Confluence.<br />Пожалуйста, используйте основной URL для корректной работы.<br />Основной URL: <strong>z	</strong>)
r   Z_sessionZcookiesclearZwithout_retryZget_current_userZget_system_infor)   rstripZ	cmf_alert)r   r   Zcurrent_userZsystem_infoZbase_urlr   r   r   check_connectionA   s    
z$CmfPluginConfluence.check_connectionc                 O   sf  g }z| j }dd |j|dddD }t }g }|j|ddD ]H}	t|	dg r`|	d d n|	}
|
d	 |kr@||
d	  ||
 q@|r| d
dddd|iid}|| W 5 Q R X W n tk
r` } z|t	
| tjj|dddgd}| d}| rNt||d$}t|}|d D ]D}||d|d}| r6t|}|t| W 5 Q R X q6t }g }|dg D ]}||d|d}| rt|}t|}
W 5 Q R X t|
dg r|
d d }
|
d	 |kr||
d	  ||
 q|rB| d
dddd|iid}|| W 5 Q R X n W 5 d }~X Y nX |S )Nc                 S   s   g | ]}|qS r   r   ).0pager   r   r   
<listcomp>T   s    z7CmfPluginConfluence.get_space_pages.<locals>.<listcomp>FTZdetailedZinclude_childrenZ	ancestors)expandr   r   Z_archived_pagesarchiveu!   Архивные страницыr8   results)r   r   titlechildrenr   plugin.*plugin.plugin.*r   r%   projects	info.jsonZ
root_pages	documentsarchived_pages)r   Zget_root_pages_from_spacesetZ get_all_pages_from_space_archivelenr&   addappend	Exceptiongdebugr   	CmfImportget_download_pathjoinpathexistsopenjsonload)r   keycmf_import_idr    r   resr   Zcontent_idsr<   r8   ZcontentrF   e
cmf_importdump_dirfprojectZroot_page_idZdoc_filef2Zarchived_page_idr   r   r   r	   P   sr    	 








z#CmfPluginConfluence.get_space_pages)rV   c           
   
   O   s   d}z.| j }|jdddd}W 5 Q R X |d }W nr tk
r } zTt| tjj|dddgd	}| 	d
}	|	
 rtdd |	 D }n W 5 d}~X Y nX |S )uI    Получает общее количество пространств r   z
type=spaceT)cqllimitZinclude_archived_spacesZ	totalSizer   r@   rA   rB   rC   c                 s   s   | ]}|  rd V  qdS )r1   N)is_dir)r7   pr   r   r   	<genexpr>   s      z7CmfPluginConfluence.get_total_spaces.<locals>.<genexpr>N)r   r^   rK   rL   rM   r   rN   r&   rO   rP   rQ   sumiterdir)
r   rV   r    r   totalr   ZresponserX   rY   rZ   r   r   r   r
      s    
z$CmfPluginConfluence.get_total_spacesc                 O   s|  |  dg g }z| j}|j|dD ]}|d |d< |d }|d dkrT|d7 }n|dt|d	   d
7 }d| jj d|d  d}	tjj	ddd|	 dgddgd}
|
r|d7 }||d< |
| q&W 5 Q R X W n tk
rv } z~t| tjj|dddgd}| d}| rdt|D ]2}t||d}|
t| W 5 Q R X q.n W 5 d }~X Y nX |S )Nzplugin.source_hash)slicer   original_namer   Zpersonalu(    (Личное пространство)z (rU   )::r   ext_idLIKE%T--)r$   Zinclude_deletedr%   u    [импортирован]r   r@   rA   rB   rC   rD   )r/   r   r   strupperr   source_hashr   
CmfProjectsgetrJ   rK   rL   rM   rN   r&   rO   rP   rQ   oslistdirrR   rS   rT   )r   rV   rf   r    r   rW   r   spaceZ
space_nameZproject_ext_idr\   rX   rY   rZ   rU   r[   r   r   r   r      s<    


 z"CmfPluginConfluence.get_all_spacesc                 O   s   z0| j  }|j|dddW  5 Q R  W S Q R X W n tk
r } zt| tjj|dddgd}| 	d}|
 rt|D ]R}	|	|	d	|}
|

 rt|
	d
$}t|W  5 Q R     W Y S Q R X qn tdW 5 d }~X Y nX d S )NFTr:   r   r@   rA   rB   rC   rE   rD   u,   Документ не попал в дамп)r   r   rK   rL   rM   r   rN   r&   rO   rP   rQ   rs   rt   rR   rS   rT   )r   Zpage_idrV   r    r   r   rX   rY   rZ   rU   Zdoc_dirr[   r   r   r   r      s    (
,z"CmfPluginConfluence.get_page_by_id)returnc                 C   s   ddl m} || j| S )u   
        Инициализация настроек
        :param models.CmfImport cmf_import: Объект импорта.
        r   ConfluenceAPIImport)modules.confluence.api_importrx   r   calc_import_settingsr   rY   rx   r   r   r   rz      s    z(CmfPluginConfluence.calc_import_settingsc                 C   s   ddl m} || j| S )u   
        Предварительный просмотр данных
        :param models.CmfImport cmf_import: Объект импорта.
        r   rw   )ry   rx   r   previewr{   r   r   r   r|      s    zCmfPluginConfluence.previewc              
   C   s>   ddl m} d|_| j}||| W  5 Q R  S Q R X dS )ux   
        Процесс импорта
        :param models.CmfImport cmf_import: Объект импорта.
        r   rw   u)   Импорт данных из ConfluenceN)ry   rx   r   r   process_importr   rY   rx   r   r   r   r   r}      s    z"CmfPluginConfluence.process_importc                 C   s   g S )Nr   )r   r   r   r   calc_models_settings   s    z(CmfPluginConfluence.calc_models_settingsc              
   C   s8   ddl m} | j}||| W  5 Q R  S Q R X d S Nr   rw   )ry   rx   r   download_datar~   r   r   r   r      s    z!CmfPluginConfluence.download_datac              
   C   s8   ddl m} | j}||| W  5 Q R  S Q R X d S r   )ry   rx   r   download_filesr~   r   r   r   r      s    z"CmfPluginConfluence.download_filesc                    s   | dg |jr|jjdi dr|jd d dd  }|jd drftj|jd d |S t|jd d }t|j	|j
|ddfS t |S )Nimport_raw_json_linksZwebuir1   baser    )r/   r   r0   r&   rs   pathjoinr   r   schemenetlocr   calc_ext_href)r   objlinkZself_urlr!   r   r   r      s    z!CmfPluginConfluence.calc_ext_hrefc                    s2   | dg |jdkr&|jr&|jd S t |S )Nr   )rq   CmfDocumentr   )r/   r   r   r   calc_dump_path)r   r   r!   r   r   r     s    
z"CmfPluginConfluence.calc_dump_pathr   c              
      s
  ddl m} dt g d}dt d d}t }t|jjd}||}	|	 rt	|	d<}
|
D ]0}t
||td  f |d7 }qdW 5 Q R X n>|	 r|	 D ](}| sq|j|jrq|d	}| sqt	|d}
t
|
W 5 Q R X d
 dkrq|td  f |d7 }|dkrg }|d}| r|t	|d}
t
|
}W 5 Q R X i }|D ]l}|d }|d d }d|kr|d d }n td|}|r|dnd}t|d || d| < q|d}| rb| D ]R}| s q|j|kr||j}|d  |f |d  d7  < q|r|d  d| f  fdd|d}| rt	|d$}
|
D ]}t
|}| qW 5 Q R X q||d}|dkr||d<  |d< |S )u  
        Возвращает информацию о дампе сущности,
        общее количество объектов и множество объектов в виде кортежей (id, name/key).
        Для документов дополнительно добавляется информация об их вложениях
        и комментариях с множеством кортежей вида (key, id/name)

        Args:
            project (object): объект CmfProject
            entity (str): название сущности (название каталога или файла)
            field (str, optional): дополнительное поле сущности 
                                   для добавления в кортеж объекта вместе c id.
                                   Defaults to "name".

        Returns:
            dict: _description_
        r   rw   )countobjsundownloadedr   r   r   zr+r   r1   rD   r   r8   rE   zattachments.jsonr   Zdownloadversionnumberz[?&]version=(\d+)r>   .attachmentsr   r   r   z, c                    sH    d   t| d f  d  d7  < | d D ]}| q6d S )Nr   r   r   r1   r?   )rI   rn   )ZcommentZchild_commentZcomment_statsdump_stats_commentfieldZobj_datar   r   r   m  s    zICmfPluginConfluence._get_dump_stats_by_entity.<locals>.dump_stats_commentzcomments.jsoncomments)ry   rx   rG   r   r   r0   r&   rP   is_filerR   rS   loadsrI   rn   r`   rd   r   endswithZEXCLUDED_DIR_SUFFIXESrQ   rT   researchgrouppoprJ   r   values)r   r\   entityr   rx   Zattachment_statsZdumped_countZdumped_objsZproject_dirZ	objs_pathr[   rowZobj_dirZobj_data_filer   Zattach_fileZattachment_idsZattZatt_idZdownload_linkr   Zattachments_diritemZ	att_titleZcomment_data_fileZcomment_datastatsr   r   r   _get_dump_stats_by_entity  s    









 


z-CmfPluginConfluence._get_dump_stats_by_entityc                 C   s,  dd|gdddgg}|r"| | t|}|j|dd}t }d}	td	||	D ]}
|j|d
ddddgd|
|
|	 gd}|D ]}|jr|jdd nd}|j	}|j
rt|j
d }|j
|}|dkr||jj	|j	f q||dkr||jj	|f q||r|||f q||| q|qP||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_
        r\   =rY   !=NT)r$   include_archivedd   r   rm   rj   r   zparent.namer   )r$   r%   r   rf   ri   r1   r   CmfAttachment
CmfCommentr   )rJ   ZcmfutilZget_model_by_namer   rG   rangeZslistrj   splitr   r   rn   r&   rI   parent)r   r\   r   	filter_byr   Zfilter_ZmodelZprocessed_countZprocessed_objsstepstartr   r   Zobj_idZ	obj_fieldr   r   r   r   _get_process_stats_by_entity  sB    


z0CmfPluginConfluence._get_process_stats_by_entityc                 C   s0   | |}|| }|s|rdndt|d}|S )u  
        Возвращает результат проверки сдампленных и обработанных объектов
        в виде статуса и множества необработанных объектов в виде кортежей

        Args:
            dump_objs (set): сдампленные объекты
            process_objs (set): обработанные объекты
            has_undownloaded (bool, optional): есть незагруженные вложения
        u   НЕКОРРЕКТНОZOK)statusunprocessed)intersectionlist)r   Z	dump_objsZprocess_objshas_undownloadedr   r   resultr   r   r   _check_consistency  s    

z&CmfPluginConfluence._check_consistencyc                 C   sL  | 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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: данные статистики
        uz   Сбор информации о сдампенных документах, вложениях и комментарияхrE   r>   )r   u)   Сдамплено документов: r   u%   Сдамплено вложений: r   u-   Сдамплено комментариев: r   uP   Сбор информации об обработанных документахr   u+   Обработано документов: u   Документы)r   dumped	processedZ	parent_idrk   zCmfDocument:%uN   Сбор информации об обработанных вложенияхr   r   r   Nr   )r   r   u'   Обработано вложений: u   Вложенияr   )r   r   r   r   uT   Сбор информации об обработанных комментарияхr   Z	log_levelr   r   )r   u/   Обработано комментариев: u   Комментарииu   Проверка консистентности между сдампленными и обработанными документамиr   u   Документы: r   u   Проверка консистентности между сдампленными и обработанными вложениями)r   u   Вложения: u   Проверка консистентности между сдампленными и обработанными комментариямиu   Комментарии: )loggerrM   r   r   r   updatebool)r   r\   Z
dump_statsZprocess_statspage_stats_dataZparent_filterZattach_process_statsZattachment_stats_dataZcomment_process_statsZcomment_stats_dataZpage_resultZattachment_resultZcomment_resultr   r   r   _get_project_page_stats  s    

	







z+CmfPluginConfluence._get_project_page_statsc                 C   s&   g }|  |}|D ]}|| q|S )u   
        Возвращает отчет сдампленных и обработанных объектов

        Args:
            project (object): объект CmfProject
        )r   rJ   )r   r\   r   r   Z
stats_datar   r   r   project_stats1  s
    
z!CmfPluginConfluence.project_stats)N)r   )NN)F)&__name__
__module____qualname__modulesr   r%   cmf_plugin_confluencer   Zui_meta_skipr.   Z	api_allowZapi_methodsr   r   r'   propertyr6   r	   rn   r
   r   r   r   rz   r|   r   r}   r   r   r   r   r   r   r   r   r   r   __classcell__r   r   r!   r   r      s@   	
@$

p
7
fr   )pathlibr   urllib.parser   r   Z/modules.confluence.fields.cmf_plugin_confluencer   Zcmf.includer   r%   r   r   r   r   r   r   <module>   s   