U
    ~4i                     @   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                       sd  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e d0d1 Z!e d2d3 Z"d@d5d6Z#dAd7d8Z$dBd9d:Z%d;d< Z&d=d> Z'  Z(S )C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.   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   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>T   s     z7CmfPluginConfluence.get_space_pages.<locals>.<listcomp>zchildren.pagec                 S   s   g | ]}|qS r   r   r9   r   r   r   r<   V   s     r   Zarchived)statusZ_archived_pagesarchiveu!   Архивные страницы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>   rI   e
cmf_importdump_dirfprojectZroot_page_idZdoc_filef2Zarchived_page_idr   r   r   r	   P   sN    







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   rC   rD   rE   rF   c                 s   s   | ]}|  rd V  qdS )r3   N)is_dir)r:   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   rC   rD   rE   rF   rG   )r1   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 )NFT)ZdetailedZwith_childrenr   rC   rD   rE   rF   rH   rG   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   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_importry   r   calc_import_settingsr   rY   ry   r   r   r   r{      s    z(CmfPluginConfluence.calc_import_settingsc                 C   s   ddl m} || j| S )u   
        Предварительный просмотр данных
        :param models.CmfImport cmf_import: Объект импорта.
        r   rx   )rz   ry   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   rx   u)   Импорт данных из ConfluenceN)rz   ry   r   r   process_importr   rY   ry   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   rx   )rz   ry   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   )rz   ry   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_json_linksZwebuir3   baser    )r1   r   r(   rs   pathjoinr   r   schemenetlocr   calc_ext_href)r   r;   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   )r1   r   r   r   calc_dump_path)r   r;   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  t	j
j| ddgd}||jj|}	|	  t	jj|d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}|st%d d}|	&|d ||D ]t}|d |	j'krq|d dkrĐq|d 7 }|d |d! |d" t(|d )d#|d |d kd$}|*| q|D ]}|*d% q|	j$jd& |D ]}|+  ~q8|	j$, rt-  |	j$j.d' W 5 Q R  W 5 Q R  W 5 Q R  d S |j  | }|	j$jd(||/   d) d}|0 s|| 7 }q|	j$jd*|  ||7 }W 5 Q R X W 5 Q R X W 5 Q R X |S )+Nr   cmf_contextrx   r   r   rE   
logic_typer   Zdescr_documentz#scheme_wf.default_document_workflowproject.agile:defaulttree_parent_idr$   r      Документыr%      maxsizer>   )Zsys_typeZtree_parentuD   Грузим документы в несколько потоков_process_document_fork)	obj_queue
done_queuer\   archive_foldertargetr   r   .   Параллельный обработчик homepage)r   r   r   r=   trashedr3   rA   r   rH   )r   rA   r   rv   Zis_homepageDONEu0   Ждем обработки документов   Импорт прерван*   ------------------------ скорость '    документов в секундуuI   Закончили обработку документов, ошибок )1datetimecmf.appr   rz   ry   cmfutildisable_acldisable_notifyensure_recursion_limitr   rN   r(   r   r   _load_selected_objsrq   r   r   r   r   r   r2   root_parentqueueQueueZ	CmfFolderloggerinfonowrangethreading_max_forks	threadingThreadr   rJ   startrY   dict_get_documents_selected_objsr   rP   putr   	is_cancelcommit_with_eventwarningtotal_secondsempty)rV   
project_idoffsetr_   dtr   ry   errorsrY   
api_importr\   r   ru   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  t  t x 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 ]L}|	jj|	j d| ||dd}|!| |"  |	j#jd|  qd}|	$|d ||D ]h}|d dkr~qh|d |	j%krqh|d dkrqh|d7 }|d |d |d d}|&| qh|D ]}|&d q|	j#jd  |D ]}|'  ~q|	j#( rNt)  |	j#j*d! W 5 Q R  W 5 Q R  W 5 Q R  d S |j  | }||+  }|	j#jd"|d#d$ d}|, s|| 7 }q|	j#jd%|  ||7 }W 5 Q R X W 5 Q R X W 5 Q R X |S )&Nr   r   rx   r   r   rE   r   r   r   r   r$   r   r   r%   r   r   u_   Обрабатываем версии документов в несколько потоковZ_process_doc_versions_fork_)r   r   r   r   r   r   r?   r   r=   r   r3   rA   )r   rA   r   r   u=   Ждем обработки версий документовr   r   z.3fr   uW   Закончили обработку версий документов. Ошибок: )-r   r   r   rz   ry   r   r   r   r   r   rN   r(   r   r   r   rq   r   r   r   r   r   r2   r   r   r   r   r   r   r   r   r   r   Z_process_doc_versions_forkrJ   r   rY   r   r   r   r   r   r   r   r   r   )rV   r   r   r_   r   r   ry   r   rY   r   r\   r   ru   r   r   r   r   r   r   r   r   r   r   Zspeedr   r   r   r   process_doc_versions_forkn  s    


"
&z-CmfPluginConfluence.process_doc_versions_forkr   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   rx   )countobjsundownloadedr   r   r   zr+r   r3   rG   r   r?   rH   zattachments.jsonr   Zdownloadversionnumberz[?&]version=(\d+)rA   .attachmentsr   r   r   z, c                    sH    d   t| d f  d  d7  < | d D ]}| q6d S )Nr   r   r   r3   rB   )addrn   )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_commentzcomments.jsoncomments)rz   ry   setr   r   r2   r(   rP   is_filerR   rS   loadsr   rn   r`   rd   r   endswithZexcluded_doc_dir_endingsrQ   rT   researchgrouppoprJ   r   values)r   r\   entityr   ry   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   r3   r   CmfAttachment
CmfCommentr   )rJ   r   Zget_model_by_namer   r   r   Zslistrj   splitr   r   rn   r(   r   parent)r   r\   r   	filter_byr   Zfilter_ZmodelZprocessed_countZprocessed_objsstepr   r   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)r=   unprocessed)intersectionlist)r   Z	dump_objsZprocess_objshas_undownloadedr   r   resultr   r   r   _check_consistencyv  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   Сбор информации о сдампенных документах, вложениях и комментарияхrH   rA   )r   u)   Сдамплено документов: r   u%   Сдамплено вложений: r   u-   Сдамплено комментариев: r   uP   Сбор информации об обработанных документахr   u+   Обработано документов: r   )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   Комментарии: )r   rM   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_stats  s
    
z!CmfPluginConfluence.project_stats)N)r   )NN)F))__name__
__module____qualname__modulesr   r'   cmf_plugin_confluencer   Zui_meta_skipr0   Z	api_allowZapi_methodsr   r   r)   propertyr8   r	   rn   r
   r   r   r   r{   r}   r   r~   r   r   r   r   r   staticmethodr   r   r   r   r   r  r  __classcell__r   r   r!   r   r      sH   	
-$

n
`
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   