
    Qz>jg                     v    d dl mZ d dlmZmZ d dlZd dlT  G d dej        j	        j
        j                  ZdS )    )Path)urlparse
urlunsplitN)*c                       e Zd Zej        j        j        j        j        dz   ZdZ	dZ
ej        j        j        j        j        g dz   Zd Zddddd fd
Zd	d
 fd
Zed             Zd Zd ZdefdZd"defdZdefdZdefdZdefdZdefdZdefdZd Zd Z fdZ fdZd#dZ d$dZ!d%dZ"d  Z#d! Z$ xZ%S )&CmfPluginConfluence)
confluenceNT)get_all_spacesget_space_pagesget_total_spacesget_page_by_idc           
          | j         rd S 	 t          j        d| 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   s         4./modules/confluence/models/cmf_plugin_confluence.py_init_secretz CmfPluginConfluence._init_secret   si    ; 	F1! gtytdg*1YR[g g_eg g    r   )depthr   r   r   c                v    | j         r|                     |||            t                      j        |d|i|S )Nr"   )is_newr    superr   )r   r"   r   r   r   argsr   	__class__s          r   r   zCmfPluginConfluence.save   sE    ; 	=gy)<<<uww|T99&999r!   F)forcec                    t           j                            dd| j        gg d          }|                                  t                      j        |d|i|S )Nr   z==)r   r   r   r   )filterfieldsr(   )r   r   getr   deleter%   )r   r(   r&   r   r   r'   s        r   r-   zCmfPluginConfluence.delete!   sc    !%%gtTW-E-[-[-[ & ] ]uww~t;5;F;;;r!   c                 l   | j         sddlm} |                     g d            || j        j        j        | j        j        j        | j        j        	                                | j        j
        	                                | j        j        j        | j        j        j                  | _         | j         S )Nr   )ConfluenceApi)r   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__confluencemodules.confluence.apir/   load_fieldsr   r   valuer   ext_passworddecryptr   r3   r4   )r   r/   s     r   r	   zCmfPluginConfluence.confluence'   s      	<<<<<<       !.K'-.4199;;k+3355;17k'-! ! !D   r!   c                    | j         5 }|j        j                                         |                    d          5  |                                }|                                }d d d            n# 1 swxY w Y   |d         }|j                            d          |k    rt          d| d           d d d            d S # 1 swxY w Y   d S )N   )timeoutr0   /u   Указанный адрес отличается от основного URL-адреса Confluence.<br />Пожалуйста, используйте основной URL для корректной работы.<br />Основной URL: <strong>z	</strong>)
r	   _sessioncookiesclearwithout_retryget_current_userget_system_infor0   rstrip	cmf_alert)r   r	   current_usersystem_infobase_urls        r   check_connectionz$CmfPluginConfluence.check_connectionA   se   _ 	
'--///))!)44 ; ;)::<<(88::; ; ; ; ; ; ; ; ; ; ; ; ; ; ; #5)H~$$S))X55I5=I I I  	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	s4   5C)A2&C2A6	6C9A6	:<CC
Cc           	      <   g }	 | j         5 }d |                    |dd          D             }t                      }g }|                    |d          D ]o}	t	          |	                    dg                     r|	d         d         n|	}
|
d         |vr0|                    |
d                    |                    |
           p|r#| d	d
ddd|iid}|                    |           d d d            n# 1 swxY w Y   n# t          $ r}t          
                    |           t          j                            |g d          }|                                                    d          }|                                rt!          |                    |d                    5 }t"                              |          }|d         D ]}|                    |d|d          }|                                rTt!          |          5 }|                    t"                              |                     d d d            n# 1 swxY w Y   t                      }g }|                    dg           D ]}|                    |d|d          }|                                rt!          |          5 }t"                              |          }
d d d            n# 1 swxY w Y   t	          |
                    dg                     r|
d         d         }
|
d         |vr0|                    |
d                    |                    |
           |r#| d	d
ddd|iid}|                    |           d d d            n# 1 swxY w Y   n Y d }~nd }~ww xY w|S )Nc                     g | ]}|S r   r   ).0pages     r   
<listcomp>z7CmfPluginConfluence.get_space_pages.<locals>.<listcomp>T   s%       !D  r!   FTdetailedinclude_children	ancestors)expandr   r   _archived_pagesarchiveu!   Архивные страницыrN   results)r   r   titlechildrenr   zplugin.*zplugin.plugin.*r   r+   projects	info.json
root_pages	documentsarchived_pages)r	   get_root_pages_from_spaceset 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	   content_idsrV   rN   contentr`   e
cmf_importdump_dirfprojectroot_page_iddoc_filef2archived_page_ids                        r   r   z#CmfPluginConfluence.get_space_pagesP   s   ;	 /J %/%I%I!&)- &J & &   "ee&GGT_G`` 0 0D69$((;PR:S:S6T6T^d;/22Z^Gt}K77#666w/// /!$555 )!D%+i-A$B	& &N JJ~...1/ / / / / / / / / / / / / / /2  !	 !	 !	GGAJJJ)--GkGkGk-llJ!3355>>zJJH   (++C==>> 3!"iillG(/(= : :#+#4#4S+|U`#a#a#??,, :!%h :2 #

499R== 9 9 9: : : : : : : : : : : : : : :"%%%K G,3KK8H",M,M 	8 	8(#+#4#4S+GWYd#e#e#??,, 8!%h 82*.))B--8 8 8 8 8 8 8 8 8 8 8 8 8 8 8"7;;{B#?#?@@ B*1+*>q*A&t}K?? + > > > 'w 7 7 7 3%("9"9"9$-%H)/)W1E(F	* * 

>22253 3 3 3 3 3 3 3 3 3 3 3 3 3 38 C!	D 
s   D CC6*D 6C::D =C:>D NBN*A N
.I	8NINIA'N3K	NKN!K"BN6NN	N	N	
NNrr   c                    d}	 | j         5 }|                    ddd          }ddd           n# 1 swxY w Y   |d         }n# t          $ r}t                              |           t
          j                            |g d          }|                                	                    d	          }	|	
                                r,t          d
 |	                                D                       }n Y d}~nd}~ww xY w|S )uI    Получает общее количество пространств r   z
type=spaceT)cqllimitinclude_archived_spacesN	totalSizerZ   r[   r\   c              3   B   K   | ]}|                                 d V  dS )r<   N)is_dir)rM   ps     r   	<genexpr>z7CmfPluginConfluence.get_total_spaces.<locals>.<genexpr>   s/      HH!QXXZZHAHHHHHHr!   )r	   r   rg   rh   ri   r   rj   r,   rk   rl   rm   sumiterdir)
r   rr   r&   r   totalr	   responserv   rw   rx   s
             r   r   z$CmfPluginConfluence.get_total_spaces   s\   	 cJ%>>l!]a>bbc c c c c c c c c c c c c c c[)EE 	 	 	GGAJJJ)--GkGkGk-llJ!3355>>zJJH   HHx'7'7'9'9HHHHH 	 s3   A 0A 4A 4A 
C=B%C88C=c           	      J   |                      dg           g }	 | j        5 }|                    |          D ]}|d         |d<   |d         }|d         dk    r|dz  }n.|dt          |d	                                                    d
z  }d| j        j         d|d          d}	t          j        	                    ddd|	 dgddg          }
|
r|dz  }||d<   |
                    |           	 d d d            n# 1 swxY w Y   n# t          $ r	}t                              |           t          j                            |g d          }|                                                    d          }|                                rt&                              |          D ]j}t+          |                    |d                    5 }|
                    t,                              |                     d d d            n# 1 swxY w Y   kn Y d }~nd }~ww xY w|S )Nzplugin.source_hash)slicer   original_namer   personalu(    (Личное пространство)z (rq   )::r   ext_idLIKE%T--)r*   include_deletedr+   u    [импортирован]rZ   r[   r\   r]   )r7   r	   r
   strupperr   source_hashr   
CmfProjectsgetrf   rg   rh   ri   rj   r,   rk   rl   rm   oslistdirrn   ro   rp   )r   rr   r   r&   r   rs   r	   space
space_nameproject_ext_idrz   rv   rw   rx   rq   ry   s                   r   r
   z"CmfPluginConfluence.get_all_spaces   s   ./000	 &J'66U6CC & &E-26]E/*!&vJV}
22"&PP

 #&G3uU|+<+<+B+B+D+D&G&G&GG
%T$+*A%T%TU4[%T%T%TN$/44 (&2Gn2G2G2GH(, $v 5  G
  D"&CC
$.E&MJJu%%%%#&& & & & & & & & & & & & & & &&  
	 
	 
	GGAJJJ)--GkGkGk-llJ!3355>>zJJH   ::h// 1 1Ch//[AABB 1a

499Q<<0001 1 1 1 1 1 1 1 1 1 1 1 1 1 11 	1 1 1 1 1
	 
s`   D CC?3D ?DD DD H B7H.H<HHHHHH c                    	 | j         5 }|                    |dd          cd d d            S # 1 swxY w Y   d S # t          $ r1}t                              |           t
          j                            |g d          }|                                	                    d          }|
                                rt                              |          D ]}	|	                    |	d|          }
|

                                r[t          |
	                    d                    5 }t                              |          cd d d            c cY d }~S # 1 swxY w Y   n t          d	          d }~ww xY w)
NFTrP   rZ   r[   r\   r_   r]   u,   Документ не попал в дамп)r	   r   rg   rh   ri   r   rj   r,   rk   rl   rm   r   r   rn   ro   rp   )r   page_idrr   r&   r   r	   rv   rw   rx   rq   doc_dirry   s               r   r   z"CmfPluginConfluence.get_page_by_id   s#   	L aJ!005[_0``a a a a a a a a a a a a a a a a a a 	L 	L 	LGGAJJJ)--GkGkGk-llJ!3355>>zJJH   ::h// 0 0C&//['JJG~~'' 0!'"2"2;"?"?@@ 0A#'99Q<<0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 00 JKKK	LsX   ; .; 2; 2; E7C!E2'EE2E7EE2EE22E7returnc                 T    ddl m}  || j        |                                          S )u   
        Инициализация настроек
        :param models.CmfImport cmf_import: Объект импорта.
        r   ConfluenceAPIImport)modules.confluence.api_importr   r	   calc_import_settingsr   rw   r   s      r   r   z(CmfPluginConfluence.calc_import_settings   s8    
 	FEEEEE""4?J??TTVVVr!   c                 T    ddl m}  || j        |                                          S )u   
        Предварительный просмотр данных
        :param models.CmfImport cmf_import: Объект импорта.
        r   r   )r   r   r	   previewr   s      r   r   zCmfPluginConfluence.preview   s8    
 	FEEEEE""4?J??GGIIIr!   c                     ddl m} d|_        | j        5 } |||                                          cddd           S # 1 swxY w Y   dS )ux   
        Процесс импорта
        :param models.CmfImport cmf_import: Объект импорта.
        r   r   u)   Импорт данных из ConfluenceN)r   r   r   r	   process_importr   rw   r   r	   s       r   r   z"CmfPluginConfluence.process_import   s    
 	FEEEEEE
_ 	P
&&z:>>MMOO	P 	P 	P 	P 	P 	P 	P 	P 	P 	P 	P 	P 	P 	P 	P 	P 	P 	Ps   A  AAc                     g S Nr   )r   s    r   calc_models_settingsz(CmfPluginConfluence.calc_models_settings   s    	r!   c                     ddl m} | j        5 } |||                                          cd d d            S # 1 swxY w Y   d S Nr   r   )r   r   r	   download_datar   s       r   r   z!CmfPluginConfluence.download_data   s    EEEEEE_ 	O
&&z:>>LLNN	O 	O 	O 	O 	O 	O 	O 	O 	O 	O 	O 	O 	O 	O 	O 	O 	O 	O   9= =c                     ddl m} | j        5 } |||                                          cd d d            S # 1 swxY w Y   d S r   )r   r   r	   download_filesr   s       r   r   z"CmfPluginConfluence.download_files   s    EEEEEE_ 	P
&&z:>>MMOO	P 	P 	P 	P 	P 	P 	P 	P 	P 	P 	P 	P 	P 	P 	P 	P 	P 	Pr   c                 :   |                     dg           |j        r|j        j                            di                               d          r|j        d         d         dd          }|j        d                             d          r1t          j                            |j        d         d         |          S t          |j        d         d                   }t          |j	        |j
        |ddf          S t                                          |          S )Nimport_raw_json_linkswebuir<   baser    )r7   r   r8   r,   r   pathjoinr   r   schemenetlocr%   calc_ext_href)r   objlinkself_urlr'   s       r   r   z!CmfPluginConfluence.calc_ext_href   s    *+,,, 	T3#6#<#@#@2#N#N#R#RSZ#[#[ 	T&x09!""=D"8,0088 Tw||C$7$A&$I4PPP#C$7$A&$IJJ!8?HOT2r"RSSSww$$S)))r!   c                     |                     dg           |j        dv r|j        r|j        d         S t                                          |          S )Nr   )r   CmfDocumentr   )r7   r   r   r%   calc_dump_path)r   r   r'   s     r   r   z"CmfPluginConfluence.calc_dump_path  sU    *+,,,>:::s?R:&v..ww%%c***r!   r   c                 P	   ddl m} dt                      g d}dt                      dd}t                      }t          |j        j                            d                    }|                    |          }	|	                                rt          |	d          5 }
|
D ]Q}t                              |          |                    t          d                            f           |dz  }R	 d	d	d	           n# 1 swxY w Y   n|	                                rj|	                                D ]T}|                                s|j                            |j                  r8|                    d
          }|                                sbt          |d          5 }
t                              |
          d	d	d	           n# 1 swxY w Y   d         dk    r|                    t          d                            f           |dz  }|dk    rgg }|                    d          }|                                rBt          |d          5 }
t                              |
          }d	d	d	           n# 1 swxY w Y   i }|D ]|}|d         }|d         d         }d|v r|d         d         }n4t*                              d|          }|r|                    d          nd}t          |d                   || d| <   }|                    d          }|                                r|                                D ]m}|                                s|j        |v rM|                    |j                  }|d                                      |f           |dxx         dz  cc<   n|rH|d                                      d                    |                                          f           fd|                    d          }|                                rSt          |d          5 }
|
D ]'}t                              |          } |           (	 d	d	d	           n# 1 swxY w Y   V||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   r   )countobjsundownloadedr   r   r   zr+r   r<   Nr]   r   rN   r_   zattachments.jsonr   downloadversionnumberz[?&]version=(\d+)rX   .attachmentsr   r   r   z, c                     d                                       t          | d                   f           dxx         dz  cc<   | d         D ]} |           d S )Nr   r   r   r<   rY   )re   r   )commentchild_commentcomment_statsdump_stats_commentfieldobj_datas     r   r   zICmfPluginConfluence._get_dump_stats_by_entity.<locals>.dump_stats_commentm  s    %f-118E?CPTDVDV2WXXX%g...!3...-4Z-@ > >M..}====> >r!   zcomments.jsoncomments)r   r   rb   r   r   r8   r,   rl   is_filern   ro   loadsre   r   r   r   r   endswithEXCLUDED_DIR_SUFFIXESrm   rp   researchgrouppoprf   r   values)r   rz   entityr   r   attachment_statsdumped_countdumped_objsproject_dir	objs_pathry   rowobj_dirobj_data_filer   attach_fileattachment_idsattatt_iddownload_linkr   attachments_diritem	att_titlecomment_data_filecomment_datastatsr   r   r   s      `                       @@@r   _get_dump_stats_by_entityz-CmfPluginConfluence._get_dump_stats_by_entity  s-   " 	FEEEEE EE
 
 EE
 

 ee728<<VDDEE((00	 C	Ai&& &! & &C#zz#HOOS$%8%8(5/$JKKK A%LL&& & & & & & & & & & & & & & &
  <	A$,,.. :A :A~~'' <(()<)RSS  ' 0 0 = =$++-- -.. ,!#yy||H, , , , , , , , , , , , , , ,F#v--Xd^!4!4huo FGGG![(("$K")"2"23E"F"FK"))++ 7!+t44 7*.))A,,K7 7 7 7 7 7 7 7 7 7 7 7 7 7 7%'N* R R!$T(+Hj(A$++&))nX&>GG&(ii0Dm&T&TG:A&HgmmA&6&6&6qG@CCL@Q@Q&'<'<7'<'<==&-&6&6}&E&EO&--// ?$3$;$;$=$= ? ?D#'<<>> ) (#yN::,:,>,>ty,I,I	 0 8 < <huoy=Y Z Z Z 0 9 9 9Q > 9 9 9% (8??$UOTYY~7L7L7N7N-O-OA   > > > > > > > >
 )0(8(8(I(I%(//11 A!"3T:: Aa'( A A/3zz# 2 2< @ @ @ @AA A A A A A A A A A A A A A A "
 
 [  #3E-  -E*sI   #ADD	D	-GG	G	#J

J	J	+RR	R	c           	      &   dd|gg dg}|r|                     |           t                              |          }|                    |d          }t	                      }d}	t          d||	          D ]}
|                    |g dd|
|
|	z   g	          }|D ]}|j        r |j                            d
          d         nd}|j	        }|j
        r4t          |j
        d                   }|j
                            |          }|dk    r'|                    |j        j	        |j	        f           |dk    r"|                    |j        j	        |f           |r|                    ||f           |                    |           ||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_
        rz   =)rw   !=NT)r*   include_archivedd   r   )r   r   r   zparent.namer   )r*   r+   r   r   r   r<   Nr   CmfAttachment
CmfCommentr   )rf   cmfutilget_model_by_namer   rb   rangeslistr   splitr   r   r   r,   re   parent)r   rz   r   	filter_byr   filter_modelprocessed_countprocessed_objsstepstartr   r   obj_id	obj_fieldr   s                   r   _get_process_stats_by_entityz0CmfPluginConfluence._get_process_stats_by_entity  s     W%&&&
  	&NN9%%%))&11++Wt+LL1ot44 	/ 	/E;;QQQ!%edl+	   D  / /69jJ))$//22dH	& ? !4T!:;;F # 3 7 7 > >I_,,"&&
'BCCCC|++"&&
'@AAAA /"&&	':;;;;"&&v..../  %"
 
 r!   c                 j    |                     |          }||z
  }|s|rdndt          |          d}|S )u  
        Возвращает результат проверки сдампленных и обработанных объектов
        в виде статуса и множества необработанных объектов в виде кортежей

        Args:
            dump_objs (set): сдампленные объекты
            process_objs (set): обработанные объекты
            has_undownloaded (bool, optional): есть незагруженные вложения
        u   НЕКОРРЕКТНОOK)statusunprocessed)intersectionlist)r   	dump_objsprocess_objshas_undownloadedr  r  results          r   _check_consistencyz&CmfPluginConfluence._check_consistency  sT     !--l;;,.2=[AQ[..W[,,
 
 r!   c                    | j                             d           |                     |dd          }| j                             d|d                     | j                             d|d         d                     | j                             d	|d
         d                     | j                             d           |                     |dd          }| j                             d|d                     d|d         |d         d}g d}| j                             d           |                     |dg d|gd          }| j                             d|d                     d|d         d         |d         d         |d         d}| j                             d           |                     |dg d|g          }| j                             d|d                     d|d
         d         |d         d}	| j                             d            |                     |d!         |d!                   }
| j                             d"|
d#                     |                    |
           | j                             d$           |                     |d         d!         |d!         t          |d         d                   %          }| j                             d&|d#                     |                    |           | j                             d'           |                     |d
         d!         |d!                   }| j                             d(|d#                     |	                    |           |||	gS ))u$  
        Возвращает статистику по документам проекта, их вложениям и комментариям

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

        Returns:
            dict: данные статистики
        uz   Сбор информации о сдампенных документах, вложениях и комментарияхr_   rX   )r   u)   Сдамплено документов: r   u%   Сдамплено вложений: r   u-   Сдамплено комментариев: r   uP   Сбор информации об обработанных документахr   u+   Обработано документов: u   Документы)r   dumped	processed)	parent_idr   zCmfDocument:%uN   Сбор информации об обработанных вложенияхr   )r   r   Nr   )r  r   u'   Обработано вложений: u   Вложенияr   )r   r  r   r  uT   Сбор информации об обработанных комментарияхr   )	log_levelr   r   )r  u/   Обработано комментариев: u   Комментарииu   Проверка консистентности между сдампленными и обработанными документамиr   u   Документы: r  u   Проверка консистентности между сдампленными и обработанными вложениями)r  u   Вложения: u   Проверка консистентности между сдампленными и обработанными комментариямиu   Комментарии: )loggerri   r   r  r  updatebool)r   rz   
dump_statsprocess_statspage_stats_dataparent_filterattach_process_statsattachment_stats_datacomment_process_statscomment_stats_datapage_resultattachment_resultcomment_results                r   _get_project_page_statsz+CmfPluginConfluence._get_project_page_stats  sP    	  W  	X  	X  	X33 4 
 


 	[jQXFY[[\\\f*]B[\cBdffgggk*U_J`ahJikkllllmmm99 : 
 

 	`V]H^``aaa* )&w/
 
 ?>>jkkk#@@///   A  
  
 	cDXY`Daccddd( /8&}5nE-g6	!
 !
 	pqqq $ A A%%% !B !
 !
 	lLabiLjllmmm. ,W5.w7
 
 	 W	
 	
 	
 --v&!
 
 	HX1FHHIII{+++ U	
 	
 	
 !33}%f- (!*]";N"KLL 4 
 

 	L/@/JLLMMM$$%6777 [	
 	
 	
 00z"6*!&)
 
 	O^H5MOOPPP!!.111!68JKKr!   c                 h    g }|                      |          }|D ]}|                    |           |S )u   
        Возвращает отчет сдампленных и обработанных объектов

        Args:
            project (object): объект CmfProject
        )r/  rf   )r   rz   r   r&  
stats_datas        r   project_statsz!CmfPluginConfluence.project_stats1  sG      66w??) 	% 	%JLL$$$$r!   r   )r   )NN)F)&__name__
__module____qualname__modulesr	   r+   cmf_plugin_confluencer   ui_meta_skipr5   	api_allowapi_methodsr    r   r-   propertyrJ   r   r   r   r
   r   r  r   r   r#  r   r   r   r   r   r   r   r  r  r/  r2  __classcell__)r'   s   @r   r   r      s       %,BVcfuuLLI$+AUa e e e K   !"444 : : : : : : :
 #( < < < < < < < ! ! X!2  > > >@c    $" "C " " " "HLS L L L L&W$ W W W WJT J J J JPD P P P Pd    O O O
P P P

* 
* 
* 
* 
*+ + + + +n n n n`5 5 5 5n   $dL dL dLL      r!   r   )pathlibr   urllib.parser   r   /modules.confluence.fields.cmf_plugin_confluencer6  cmf.includer	   r+   r7  r   r   r!   r   <module>rA     s          - - - - - - - - 6 6 6 6    w w w w w',3I] w w w w wr!   