U
    ^ho                     @   sT   d dl m Z  d dlmZmZ d dlmZ d dlT d dlZG dd dej	j
jjZdS )    )cached_property)urlparse
urlunsplit)Path)*Nc                       sZ  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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ed.d/ Z ed0d1 Z!d>d3d4Z"d?d5d6Z#d7d8 Z$d9d: Z%d;d< 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   ==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/   r0   )r   r+   r   r   r   r   '   s(    


	zCmfPluginConfluence.confluencec                 O   s  g }zr| j `}dd ||dD }dd |j|dddD }|rh| dd	d
dd|iid}|| W 5 Q R X W nT tk
r }	 z2t|	 tjj	|dddgd}
|

 d}| rt||d}t|}|d D ]@}||d|d}| rt|}|t| W 5 Q R X qg }|	dg D ]D}||d|d}| r:t|}|t| W 5 Q R X q:|r| 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objr   r   r   
<listcomp>E   s     z7CmfPluginConfluence.get_space_pages.<locals>.<listcomp>children.pagec                 S   s   g | ]}|qS r   r   r4   r   r   r   r7   G   s     r   Zarchived)statusZ_archived_pagesarchiveu!   Архивные страницыZpageresults)r   r   titlechildrenr   plugin.*plugin.plugin.*r   r(   projects	info.jsonZ
root_pages	documentsarchived_pages)r   Zget_root_pages_from_spaceZget_all_pages_from_spaceappend	Exceptiongdebugr   	CmfImportr)   get_download_pathjoinpathexistsopenjsonload)r   keycmf_import_idr!   r   resr   r:   rD   e
cmf_importdump_dirfprojectZroot_page_idZdoc_filef2Zarchived_page_idr   r   r   r
   A   sN    







z#CmfPluginConfluence.get_space_pages)rQ   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>   r?   r@   rA   c                 s   s   | ]}|  rd V  qdS )   N)is_dir)r5   pr   r   r   	<genexpr>{   s      z7CmfPluginConfluence.get_total_spaces.<locals>.<genexpr>N)r   rY   rF   rG   rH   r   rI   r)   rJ   rK   rL   sumiterdir)
r   rQ   r!   r   totalr   ZresponserS   rT   rU   r   r   r   r   n   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 (rP   )::r   ext_idZLIKE%T--)r'   Zinclude_deletedr(   u    [импортирован]r   r>   r?   r@   rA   rB   )r2   r   r	   strupperr   source_hashr   
CmfProjectsgetrE   rF   rG   rH   rI   r)   rJ   rK   rL   oslistdirrM   rN   rO   )r   rQ   rb   r!   r   rR   r   spaceZ
space_nameZproject_ext_idrW   rS   rT   rU   rP   rV   r   r   r   r	      s<    


 z"CmfPluginConfluence.get_all_spacesc                 O   s   z.| j }|j|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 )Nr8   )expandr   r>   r?   r@   rA   rC   rB   u,   Документ не попал в дамп)r   r   rF   rG   rH   r   rI   r)   rJ   rK   rL   rn   ro   rM   rN   rO   )r   Zpage_idrQ   r!   r   r   rS   rT   rU   rP   doc_dirrV   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_importru   r   calc_import_settingsr   rT   ru   r   r   r   rw      s    z(CmfPluginConfluence.calc_import_settingsc                 C   s   ddl m} || j| S )u   
        Предварительный просмотр данных
        :param models.CmfImport cmf_import: Объект импорта.
        r   rt   )rv   ru   r   previewrx   r   r   r   ry      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   rt   u)   Импорт данных из ConfluenceN)rv   ru   r   r   process_importr   rT   ru   r   r   r   r   rz      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   rt   )rv   ru   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}   )rv   ru   r   download_filesr{   r   r   r   r      s    z"CmfPluginConfluence.download_filesc                    s   | dg |jr|jd dr|jd ddd  }|jd drbtj|jd d |S t|jd d }t|j|j	|ddfS t
 |S )Nimport_raw_jsonZ_linksZwebuir[   baser    )r2   r   r)   rn   pathjoinr   r   schemenetlocr    calc_ext_href)r   r6   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   )rl   CmfDocumentr   )r2   r   r   r    calc_dump_path)r   r6   r"   r   r   r      s    
z"CmfPluginConfluence.calc_dump_pathc                 C   s  dd l }ddlm} ddlm} d}t  t  tj	j
| ddgd}||jj|}	|	  tjj
|ddd	gd}
|
}|
jjd
krtjj
dd|
jgdddggdgd}|jj}||	_g }|	jjdd}|	j }tjj
d|
d}|jd |j  }t|	jD ]P}|	jj|	j d| |||
|dd}|!| |"  |	j#jd|  q
d}|
d}|szt$d d}|	%|d ||D ]n}|d |	j&krq|d dkrq|d7 }|d |d  t'|d (d!|d |d kd"}|)| q|D ]}|)d# q |	j#jd$ |D ]}|*  ~q$|	j#+ rnt,  |	j#j-d% W 5 Q R  W 5 Q R  d S |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   cmf_contextrt   r   r   r@   
logic_typer   Zdescr_documentproject.agile:defaulttree_parent_idr%   r      Документыr&      maxsizer:   )Zsys_typeZtree_parentuD   Грузим документы в несколько потоков_process_document_fork)	obj_queue
done_queuerW   archive_foldertargetr   r   .   Параллельный обработчик homepage)r   r   r   r9   trashedr[   r<   rC   )r   r<   rr   Zis_homepageDONEu0   Ждем обработки документов   Импорт прерван*   ------------------------ скорость '    документов в секундуuI   Закончили обработку документов, ошибок )0datetimecmf.appr   rv   ru   cmfutildisable_acldisable_notifyr   rI   r)   r   r   _load_selected_objsrl   r   r   r   r   r   r3   root_parentqueueQueueZ	CmfFolderloggerinfonowrangethreading_max_forks	threadingThreadr   rE   startrT   dict_get_documents_selected_objsr   rK   putr   	is_cancelcommit_with_eventwarningtotal_secondsempty)rQ   
project_idoffsetrZ   dtr   ru   errorsrT   
api_importrW   r   rp   obj_processr   r   r   siproccntr   docdoc_datadiff
has_errorsr   r   r   process_document_fork   s    






z)CmfPluginConfluence.process_document_forkc              
   C   s  dd l }ddlm} ddlm} d}t p t Z tj	j
| ddgd}||jj|}	|	  tjj
|ddgd}
|
}|
jjd	krtjj
d
d|
jgdddggdgd}|jj}||	_g }|	jjdd}|	j }|jd |j  }t|	jD ]J}|	jj|	jd| ||dd}| | |!  |	j"jd|  qd}|	#|d ||D ]V}|d |	j$krrqZ|d dkrqZ|d7 }|d |d |d d}|%| qZ|D ]}|%d q|	j"jd |D ]}|&  ~q|	j"' r$t(  |	j"j)d W 5 Q R  W 5 Q R  d S |j  | }||*  }|	j"jd |d!d" d}|+ st||
 7 }qZ|	j"jd#|  ||7 }W 5 Q R X W 5 Q R X |S )$Nr   r   rt   r   r   r@   r   r   r   r   r%   r   r   r&   r   r   u_   Обрабатываем версии документов в несколько потоковZ_process_doc_versions_fork_)r   r   r   r   r   r   r9   r   r[   r<   )r   r<   r   r   u=   Ждем обработки версий документовr   r   z.3fr   uW   Закончили обработку версий документов. Ошибок: ),r   r   r   rv   ru   r   r   r   r   rI   r)   r   r   r   rl   r   r   r   r   r   r3   r   r   r   r   r   r   r   r   r   r   Z_process_doc_versions_forkrE   r   rT   r   r   r   r   r   r   r   r   r   )rQ   r   r   rZ   r   r   ru   r   rT   r   rW   r   rp   r   r   r   r   r   r   r   r   r   r   Zspeedr   r   r   r   process_doc_versions_fork[  s    



z-CmfPluginConfluence.process_doc_versions_forkr   c              
      s  dt  d}dt  d d}t  }t|jjd}||}| rt|d<}	|	D ]0}
t	|
|
td  f |d7 }qVW 5 Q R X n6| r| D ] }| sq|d}| sqt|d2}	t|	|
td  f |d7 }W 5 Q R X |dkr|d	}t|dJ}	t|	}|D ]4}|d
 
 t|d f |d  d7  < q:W 5 Q R X |d}t|d6}	|	D ]*}
t	|
} fdd| 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   countobjsr   zr+r   r[   rB   rC   zattachments.jsonr   r<   r   zcomments.jsonc                    sH    d   t| d f  d  d7  < | d D ]}| q6d S )Nr   r   r   r[   r=   )addri   )ZcommentZchild_commentZcomment_statsdump_stats_commentfieldZobj_datar   r   r     s    zICmfPluginConfluence._get_dump_stats_by_entity.<locals>.dump_stats_commentattachmentscomments)setr   r   r3   r)   rK   is_filerM   rN   loadsr   ri   r\   r`   rL   rO   )r   rW   entityr   Zattachment_statsZdumped_countZdumped_objsZproject_dirZ	objs_pathrV   rowZobj_dirZobj_data_fileZattach_filer   ZattZ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}t }|j|ddd	d
dgd}	|	D ]}
|
jrt|
jdd nd}|
j}|
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_
        rW   =rT   z!=N)r'   rh   rf   r   zparent.namer   r&   re   r[   r   CmfAttachment
CmfCommentr   )rE   r   Zget_model_by_namer   r   Zslistrf   splitr   r   ri   r)   r   parent)r   rW   r   	filter_byr   Zfilter_ZmodelZprocessed_countZprocessed_objsr   r6   Zobj_idZ	obj_fieldr   r   r   r   _get_process_stats_by_entity  s:    

z0CmfPluginConfluence._get_process_stats_by_entityc                 C   s,   | |}|| }|sdndt|d}|S )u  
        Возвращает результат проверки сдампленных и обработанных объектов
        в виде статуса и множества необработанных объектов в виде кортежей

        Args:
            dump_objs (set): сдампленные объекты
            process_objs (set): обработанные объекты
        u   ОКu   НЕКОРРЕКТНО)r9   unprocessed)intersectionlist)r   Z	dump_objsZprocess_objsr   r   resultr   r   r   _check_consistency8  s    	

z&CmfPluginConfluence._check_consistencyc                 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: данные статистики
        rC   r<   )r   r   r   r   )r   ZdumpedZ	processedr   r   r   u   Вложенияr   r   Z	log_levelr   r   )r   u   Комментарииr   )r   r   r   update)r   rW   Z
dump_statsZprocess_statspage_stats_dataZpage_resultZattach_process_statsZattachment_stats_dataZattachment_resultZcomment_process_statsZcomment_stats_dataZcomment_resultr   r   r   _get_project_page_statsI  s`    







z+CmfPluginConfluence._get_project_page_statsc                 C   s&   g }|  |}|D ]}|| q|S )u   
        Возвращает отчет сдампленных и обработанных объектов

        Args:
            project (object): объект CmfProject
        )r   rE   )r   rW   r   r   Z
stats_datar   r   r   project_stats  s
    
z!CmfPluginConfluence.project_stats)N)r   )NN)(__name__
__module____qualname__modulesr   r(   cmf_plugin_confluencer   Zui_meta_skipr1   Z	api_allowZapi_methodsr   r   r*   propertyr
   ri   r   r	   r   r   rw   ry   boolrz   r|   r~   r   r   r   staticmethodr   r   r   r   r   r   r   __classcell__r   r   r"   r   r      sF   	
-$

j
[
O
2@r   )r   urllib.parser   r   pathlibr   Zcmf.includeZ/modules.confluence.fields.cmf_plugin_confluencer   r   r(   r   r   r   r   r   r   <module>   s
   