
    >jt~                         d dl mZmZ d dlT d dlZd dlZd dlmZ d dlm	Z	 d dl
mZ d dlmZ d dlmZmZmZ e                    d	          Z G d
 de          ZdS )    )urlparse	parse_qsl)*N)contextmanager)HTTPAdapter)Retry)
Confluence)ApiNotFoundErrorApiPermissionErrorApiErrorzatlassian.rest_clientc                       e Zd ZdZddej        de                                ddf fd	Zd Z	e
d>d            Zd Zd	 Zd
 Z fdZd?dZd>dZd@ fd	ZdAdZdBdZd Zd Zd Z fdZ fdZ	 	 dCdedededed ef
d!ZdDd"eded#ed$ed ef
d%Z dEdefd&Z!d>d'Z"d>d(Z#d>d)Z$d@d*Z%	 	 	 	 	 dF fd+	Z&dGd,ed#efd-Z'dHd.Z(dId,efd0Z) fd1Z*d2 Z+d>ded3eded efd4Z,	 	 	 	 dJded7ededed8eded efd9Z-d: Z.d efd;Z/d< Z0d= Z1 xZ2S )KConfluenceApiuK    Подключение по API к учетной записи Confluence NTFc	                    |                     d          r|nd| }|                    d          s|dz  }|r|}nd } t                      j        |f|||||||d|	 |                                  t
          j        j        | _        dt          |          j	         | _
        d | _        |                                  d S )Nhttphttps:///)usernamepasswordtimeout
verify_sslsessioncloudtokenzCONFLUENCE:COOKIE:)
startswithendswithsuper__init___set_session_retriesAPPREDIS_DBredisr   netloc	redis_keycookies_dict_init_cookies)selfurlr   r   r   r   r   r   r   kwargs	__class__s             ./modules/confluence/api.pyr   zConfluenceApi.__init__   s     ^^F++Acc1AC1A1A||C   	3JC 	HHE
	
!
	
 
	
 
	
 
	
 
	
 	!!###\'
Dhsmm.BDD     c                     t          t          j        t          j        t          j        d          }t	          |          }| j                            d|           | j                            d|           dS )u   
        Конфигурирует стратегию повторных попыток
        и ассоциирует ее с сессией
           )totalstatusstatus_forcelistbackoff_factormax_retrieshttp://r   N)r   configIMPORT_REQUEST_RETRY_TOTAL!IMPORT_REQUEST_RETRY_STATUS_CODESr   _sessionmount)r&   retrieshttp_adapters      r*   r   z"ConfluenceApi._set_session_retries;   su    
 34#E	
 
 
 #w777I|444J55555r+   c              #   n  K   i }t          d          }dD ]?}| j        j                            |          ||<   | j                            ||           @| j        }|r|| _        	 | V  |                                D ]C\  }}|r| j                            ||           #| j        j                            |d           D|r	|| _        dS dS # |                                D ]C\  }}|r| j                            ||           #| j        j                            |d           D|r|| _        w xY w)u<   
        Временно отключает Retry.
        r   r2   )r4   r   N)r   r8   adaptersgetr9   r   itemspop)r&   r   old_adaptersno_retry_adapterprefixold_timeoutadapters          r*   without_retryzConfluenceApi.without_retryJ   s     
 &1555 . 	: 	:F#'=#9#=#=f#E#EL M(89999l 	#"DL	+JJJ $0#5#5#7#7 = = =M''8888M*..vt<<<<  +*+ + $0#5#5#7#7 = = =M''8888M*..vt<<<<  +*****s   (C A#D4c                 &   | j                             | j                  }|ro	 t          j        |          }| j        j                            |           | j        j                                        | _	        dS # t          j
        $ r Y dS w xY wdS )u  
        Добавляет cookie в сессию при инициализации,
        что бы не выполнять повторную авторизацию, если cookie еще действуют.
        При недействительных cookie, выполнится авторизация,
        а cookie обновятся в сессии и кеше
        N)r!   r>   r#   pickleloadsr8   cookiesupdateget_dictr$   PickleError)r&   cookies_picklerJ   s      r*   r%   zConfluenceApi._init_cookiesj   s     77 	 ,~66%,,W555$(M$9$B$B$D$D!!!%   	 	s   AA; ;BBc                     t          j        | j        j                  }| j                            | j        |d           dS )u   
        Сохраняет cookie в кеш (Redis) для последующего использования
        без выполнения повторной авторизации
        i`T  )exN)rH   dumpsr8   rJ   r!   setr#   )r&   rN   s     r*   _save_cookieszConfluenceApi._save_cookiesz   s:    
  dm&;<<
t~~+FFFFFr+   c                     | j         j                                        }| j        |k    r|| _        |                                  dS dS )u   
        Проверяет изменение cookie и обновляет их в кеше при необходимости
        N)r8   rJ   rL   r$   rS   )r&   current_cookies_dicts     r*   _check_cookieszConfluenceApi._check_cookies   sR      $}4==?? 444 4D      54r+   c                 b     t                      j        |i |}|                                  |S N)r   requestrV   )r&   argsr(   responser)   s       r*   rY   zConfluenceApi.request   s4    "577?D3F33r+      c           	         | j         }|p| j        }|                     d||           | j                            |d||| j        | j                  5 }t                              d| d|j	         d|j
                    |                                 t          |d          5 }|                    |	          D ]}|                    |           	 d
d
d
           n# 1 swxY w Y   d
d
d
           d
S # 1 swxY w Y   d
S )us  
        Скачивает файл

        Args:
            download_url (_type_): url файла для скачивания
            save_path (_type_): путь для сохранения файла
            timeout (_type_, optional): Таймаут. Defaults to None.
            chunk_size (_type_, optional): _description_. Defaults to 64*1024.
        GET)methodr'   headersT)streamr`   r   verifyproxiesz
HTTP: GET z ->  zwb+)
chunk_sizeN)no_check_headersr   log_curl_debugr8   r>   r   rc   loggerdebugstatus_codereasonraise_for_statusopeniter_contentwrite)	r&   download_url	save_pathr   re   r`   resfchunks	            r*   download_filezConfluenceApi.download_file   s    ')T\5lGLLL]?L  
 
 	# LLVlVVVV#*VVWWW  """i'' #1 ---DD # #EGGENNNN## # # # # # # # # # # # # # #	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	#s7   AC9%/C!C9!C%	%C9(C%	)C99C= C=c              #      K   |i }	 |                      ||          }d|vrdS |                     dg           D ]}|V  |                     di                                d          }|ngdS )ue  
        Используется для получения постраничных данных

        Args:
            url (str): URL для получения
            params (dict, optional): Параметры. Defaults to None.

        Yields:
            _type_: Объект-генератор для элементов данных
        NTparamsresults_linksnextr>   )r&   r'   rx   r[   values        r*   
_get_pagedzConfluenceApi._get_paged   s       >F
	xxFx33H((!i44  ,,x,,0088C{
	 	r+   c              #      K   |r|d         }|d         |d         z
  }nd}d}	 t                                          |||          }|r|                    d          sdS |d         D ]}|V  |rdS ||z  }V)u   
        Получим все пространства из Confluence

        :return: Список всех пространств
        r   r-   d   T)
space_typestartlimitry   N)r   get_all_spacesr>   )r&   r   slicer   r   rr   rowr)   s          r*   r   zConfluenceApi.get_all_spaces   s        	!HE!HuQx'EEEE
	''((JeSX(YYC cggi00 9~  				 UNE
	r+   pagec                 |   d}i }|r||d<   |r||d<   |r||d<   |r||d<   |r||d<   |r||d<   	 | j         s||                     ||	          S |                     ||	          }	| j         r|	S |	                    d
          S # t          j        $ r'}
|
j        j        dk    rt          d|
           d}
~
ww xY w)u  
        Получает все страницы пространства

        Переопределенный метод

        Args:
            space (str): Ключ пространства
            start (int, optional): Начальная позиция коллекции для возврата . Defaults to None.
            limit (int, optional): Ограничение на количество возвращаемых страниц. Defaults to None.
            status (str, optional): Статус страниц. Defaults to None.
            expand (str, optional): Список свойств для расширения данных страниц. Defaults to None.
            content_type (str, optional): Тип страниц. Defaults to "page".

        Raises:
            ApiPermissionError: _description_

        Returns:
            _type_: _description_
        zrest/api/contentspaceKeyr   r   r/   expandtypeNrw   ry     z=The calling user does not have permission to view the contentrk   )advanced_moder~   r>   requests	HTTPErrorr[   rj   r   )r&   spacer   r   r/   r   content_typer'   rx   r[   es              r*   get_all_pages_from_spacez&ConfluenceApi.get_all_pages_from_space   s,   ( ! 	'!&F: 	$#F7O 	$#F7O 	&%F8 	&%F8 	*)F6N	% /%-s6:::88C877% $#O||I...! 	 	 	z%,,(S   
 	s#   B B 0B B;"B66B;   archivedc              #   L   K   |                      ||||||          E d{V  dS )ud   
        Получает архивные документы из пространства
        )r   r   r/   r   r   N)r   )r&   r   r   r   r/   r   r   s          r*    get_all_pages_from_space_archivez.ConfluenceApi.get_all_pages_from_space_archive  s_       00% 1 
 
 	
 	
 	
 	
 	
 	
 	
 	
 	
r+   c              #   \  K   t          dd          }|||<   d}	 	 |                     ||          }|                    d          sd S |d         E d {V  |dxx         |d	         z  cc<   n=# t          j        $ r+}t                              d
| d|            Y d }~d S d }~ww xY w)Nr      r   r   zrest/api/user/memberofTrw   ry   r   r   uL   Не удалось получить группы пользователя "". )dictr>   r   r   rh   warning)r&   keyr}   rx   r'   rr   http_errs          r*   user_member_ofzConfluenceApi.user_member_of"  s     AR(((s&		hhs6h22wwy)) Fy>)))))))w6'?2%      Cns   C   C  yA   C   C  D  D  D		s   ,A0 $A0 0B*? B%%B*c                     	 |                      |          }nE# t          $ r8}t                              d| d|            t	                      }Y d }~nd }~ww xY w|S )NuL   Не удалось получить данные пользователя "r   )get_mobile_parameters	Exceptionrh   r   r   )r&   r   infoerrors       r*   get_user_detailzConfluenceApi.get_user_detail2  sz    	--h77DD 	 	 	NN~jr~~w|~~66DDDDDD	 s    
A.AAc              #     K   | j         rt          dddd          }	 |                     d|          }|d	         sd S |d	         D ]}|d
         |                     d                   }                    fd|                                D                        d |                     dd                   D             d<   V  |dxx         |d         z  cc<   t          dddd          }	  | j        di |}|d	         sd S |d	         D ]}|d
         d         dk    rt          	                    d           /|d
         |                     |d
         d                   }                    fd|                                D                        d |                     dd                   D             d<   V  |dxx         |d         z  cc<   )Nr   r   zuser=""zoperations,personalSpace)r   r   cqlr   Tzrest/api/search/userrw   ry   user	accountIdr   c              3   :   K   | ]\  }}|vs|d k    ||fV  dS  N .0kvr   s      r*   	<genexpr>z.ConfluenceApi.get_all_users.<locals>.<genexpr>E  D        =  =41a#$D==AGG "#A4;GGG =  =r+   c                     g | ]}|S r   r   r   gs     r*   
<listcomp>z/ConfluenceApi.get_all_users.<locals>.<listcomp>G  s    %e%e%eAa%e%e%er+   groupsr   r   z	type=userz&user.operations,user.status,user.emailr   recovery_adminu   В вашем Confluence включен режим восстановления! Не оставляйте Confluence в режиме восстановления и не используйте учетную запись recovery_admin!c              3   :   K   | ]\  }}|vs|d k    ||fV  dS r   r   r   s      r*   r   z.ConfluenceApi.get_all_users.<locals>.<genexpr>X  r   r+   c                     g | ]}|S r   r   r   s     r*   r   z/ConfluenceApi.get_all_users.<locals>.<listcomp>Z  s    %c%c%cAa%c%c%cr+   r   )
r   r   r>   r   rK   r?   r   r   rh   r   )r&   rx   rr   r   	user_infor   s        @r*   get_all_userszConfluenceApi.get_all_users;  s     :  	3C]^^^F3hh5fhEE9~ Fy>  Cv;D $ 4 4d;>O 4 P PIKK  =  =  =  =9??3D3D  =  =  = = = =%e%e1D1D[RVWbRc1d1d%e%e%eDNJJJJw6'?23 EmnnnF3dh((((9~ Fy>  C6{:.2BBB (t u u u !v;D $ 4 4c&k*>U 4 V VIKK  =  =  =  =9??3D3D  =  =  = = = =%c%c1D1DZQUV`Qa1b1b%c%c%cDNJJJJw6'?2!3r+   c              #      K   t          dd          }	  t                      j        di |}|sd S |E d {V  |dxx         |d         z  cc<   <)Nr   r   r   Tr   r   r   )r   r   get_all_groups)r&   rx   rr   r)   s      r*   r   zConfluenceApi.get_all_groups^  sw      AR(((	/(%''(22622C NNNNNNN7OOOvg.OOO	/r+   c              #      K   t          dd|d          }	  t                      j        di |}|sd S |D ]}|V  |dxx         |d         z  cc<   =)	Nr   r   zoperations,status)r   r   
group_namer   Tr   r   r   )r   r   get_group_members)r&   r   rx   rr   r   r)   s        r*   r   zConfluenceApi.get_group_membersg  s      ARJGZ[[[	/+%''+55f55C   				7OOOvg.OOO	/r+   r   r   
content_idr   r   r   returnc              #     K   d| d}i }|t          |          |d<   |t          |          |d<   |||d<   |sd|d<   	 |                     ||
          }|d         D ]E}	|r8|	d         dk    r,d |                     |	d         ||          D             |	d<   ng |	d<   |	V  F|d         }
|
                    d          }|sdS t          |          }t	          t          |j                            }|d         |d<   |                    d          r|                    d          |d<   |                    d          r|                    d          |d<   )u  
        Получает все комментарии к документу

        Args:
            content_id (str): ID страницы(документа) в Confluence
            expand (str): Cвойства элемента, которые нужно расширить, например, expand='body,version,history'
            children (bool): Создать иерархическую структуру с дочерними элементами

        Yields:
            Iterator[list]: элемент
        rest/api/content/z/child/commentNr   r   r   alldepthTrw   ry   r/   currentc                     g | ]}|S r   r   )r   objs     r*   r   z3ConfluenceApi.get_page_comments.<locals>.<listcomp>  s%     * * * #* * *r+   id)r   childrenr   rz   r{   cursor)intr>   get_page_commentsr   r   r   query)r&   r   r   r   r   r   r'   rx   rr   resultlinksnext_
next_parser   s                 r*   r   zConfluenceApi.get_page_commentsq  s      =*<<<!%jjF7O!%jjF7O%F8 	$#F7O	3((3v(..Ci.   	,x 0I = =* *'+'='="4L#)%- (> ( (* * *F:&& *,F:&MEIIf%%E !%J:#34455E#GnF7Oyy"" 7#(99X#6#6x yy   3!&6!2!2v9	3r+   	key_spacedetailedinclude_childrenc              #   |  K   h d}d}d}|ri|rd |                     d          D             ng }|                    d           | j        r|                    d           d                    |          }	 |                     |d	|||d
          }d|vrdS |                    dg           D ]ڊd         d         d<   |rd         d
         d         }	d                             di                               d          }
t          |	p|
          }|r?d |                     d         d          D             }|                    d            ng }d
|t          |          did<   |rV  ʈfd|D             V  |                    di                               d          }|dS ||z  }F)ui  
        Получим все документы из корня пространства.

        :param key_space: Идентификатор пространства.
        :param expand: Дополнительные данные по документам.

        :return: Соответствие id документа и его данных.
        >   r   r   titler/   r   positionr   2   c                 :    g | ]}|                                 |S r   stripr   _s     r*   r   z;ConfluenceApi.get_root_pages_from_space.<locals>.<listcomp>  %    @@@Aaggii@a@@@r+   ,children.pagechildren.folderTrootr   )r   r   r   r   r   ry   N
extensionsr   r   sizefolderc                     g | ]}|S r   r   r   childs     r*   r   z;ConfluenceApi.get_root_pages_from_space.<locals>.<listcomp>  s    #e#e#eeE#e#e#er+   r   Fr   c                     | d         S Nr   r   ps    r*   <lambda>z9ConfluenceApi.get_root_pages_from_space.<locals>.<lambda>  s
    AjM r+   r   ry   r   c                 *    i | ]}|v ||         S r   r   r   r   r   s     r*   
<dictcomp>z;ConfluenceApi.get_root_pages_from_space.<locals>.<dictcomp>  s$    RRRccTkk3S	kkkr+   rz   r{   )
splitappendr   joinget_space_contentr>   boolget_childrensortlen)r&   r   r   r   r   key_for_briefr   r   r[   has_page
has_folderhas_childrenr   has_nextr   s                 @r*   get_root_pages_from_spacez'ConfluenceApi.get_root_pages_from_space  sO     
 
 
  	&DJR@@c!2!2@@@@PRFMM/***z 1/000XXf%%F'	--# .  H (( Y33 S S#'#5j#AZ # #J/7?H!%j!1!5!5h!C!C!G!G!O!OJ#'(>J#?#?L# &#e#et7H7Hd^c7H7d7d#e#e#e *A*ABBBB#%'/$'MM! !(D$  SJJJJRRRR]RRRRRRR||Hb1155f==HUNEO'	r+   c              #      K   t          |||          }	  | j        |fi |}|r|                    d          sd S |d         D ]}|V  |                    di                               d          }|d S |dxx         |d         z  cc<   z)N)r   r   r   Try   rz   r{   r   r   )r   get_attachments_from_contentr>   )	r&   page_idr   r   r   rx   rr   r   r  s	            r*   get_all_attachmentz ConfluenceApi.get_all_attachment  s      Ev>>>		/3$3GFFvFFC cggi00 9~  				wwx,,0088H7OOOvg.OOO		/r+   c                 T    	 |                      ||          S # t          $ r Y d S w xY w)N)userkeyr   )get_user_details_by_userkeyr
   )r&   r  r   s      r*   get_user_info_by_keyz"ConfluenceApi.get_user_info_by_key  sB    	33GF3SSS 	 	 	44	s    
''c                 B    | j         r|                     ||          S d S )N)r   )r   get_user_details_by_accountid)r&   r   r   s      r*   get_user_infozConfluenceApi.get_user_info  s2    : 	P55i5OOO	P 	Pr+   c                     	 | j         r3|                     |          }|                     |d         |          S |                     ||          S # t          $ r Y d S w xY w)Nr   r   )	accountidr   )r   r   )r   get_account_idr  get_user_details_by_usernamer
   )r&   r   r   r   s       r*   get_user_info_by_usernamez'ConfluenceApi.get_user_info_by_username  s    	z f**H*==99DDU^d9eee44hv4VVV 	 	 	44	s   9A A 
A! A!c                 f    d}|rd|i}nd|i}|                      ||          }|d         d         S )Nzrest/api/user/bulk/migrationr   r  rw   ry   r   r|   )r&   r   r  r'   rx   rr   s         r*   r  zConfluenceApi.get_account_id  sI    , 	* (+FF)Fhhs6h**9~a  r+   c                    h d}|ri|rd |                     d          D             ng }|                    d           | j        r|                    d           d                    |          }t	                                          ||||          d         d         d<   |rd	         d
         d         }d	                             di                               d          }	t          |p|	          }
|
r9d |                     ||          D             }|	                    d            ng }d
|t          |          did	<   |rS fd|D             S )u  
        Возвращает данные контента

        Николай1: expand='children.page' имеет лимит 25 элементов, запрашиваем детей вручную
        https://jira.atlassian.com/browse/CONFSERVER-52558?src=confmacro

        Bспользуется в двух местах, поэтому вынес в глобальный API

        Args:
            page_id (str, int): ID контента
            detailed (bool, optional): Вернуть подробные данные. Defaults to True.
            include_children (bool, optional): Запросить дочерние объекты. Defaults to False.

        Returns:
            page (dict): данные контента
        >   r   r   r   r/   r   r   c                 :    g | ]}|                                 |S r   r   r   s     r*   r   z0ConfluenceApi.get_page_by_id.<locals>.<listcomp>=  r   r+   r   r   r   )r   r/   versionr   r   r   r   r   r   c                     g | ]}|S r   r   r   s     r*   r   z0ConfluenceApi.get_page_by_id.<locals>.<listcomp>K  s    ]]]eE]]]r+   r   c                     | d         S r   r   r   s    r*   r   z.ConfluenceApi.get_page_by_id.<locals>.<lambda>L  s
    AjM r+   r   r   c                 *    i | ]}|v ||         S r   r   r   s     r*   r   z0ConfluenceApi.get_page_by_id.<locals>.<dictcomp>Y  s$    KKKssd{{Cc{{{r+   )r   r   r   r   r   get_page_by_idr>   r   r   r  r  )r&   r  r   r/   r  r   r   r  r  r  r  r   r   r)   s               @r*   r   zConfluenceApi.get_page_by_id  s   4
 
 
  	&DJR@@c!2!2@@@@PRFMM/***z 1/000XXf%%Fww%%gfVU\%]]-j9Z 	J'/7Hj)--h;;??GGJ 6J77L ]]t/@/@S[/@/\/\]]]"9"9::::'MM  D  	LKKKKKmKKKKr+   typesc              #      K   h d}|| j         sdgnddg}|D ]E}|                     |||          D ]*d         d         d<   |rV  fd|D             V  +FdS )	u  
        Возвращает дочерние объекты(контент)

        Args:
            parent_id (_type_): ID родительского контента
            types (list, optional): Список типов дочерних объектов. Defaults to None.
            detailed (bool, optional): Вернуть подробные данные. Defaults to True.

        Yields:
            dict: данные дочернего объекта(контента)
        >   r   r   r   r/   r   Nr   r   )r   r   r   r   c                 *    i | ]}|v ||         S r   r   )r   r   r   s     r*   r   z.ConfluenceApi.get_children.<locals>.<dictcomp>z  s$    TTTsse||3c
|||r+   )r   get_page_child_by_type)r&   	parent_idr!  r   r   r  type_r   s          @r*   r   zConfluenceApi.get_children[  s      
 
 
 =$(JFVHHVX4FE 	U 	UE44YUSY4ZZ U U$),$7
$Cj! UKKKKTTTTmTTTTTTTU	U 	Ur+   c                    i }|t          |          |d<   |t          |          |d<   |||d<   d| d| }	 | j        s||                     ||          S |                     ||          }| j        r|S |                    d          S # t          j        $ r'}	|	j        j        dk    rt          d	|	
           d }	~	ww xY w)Nr   r   r   r   z/descendant/rw   ry   r   zgThere is no content with the given id, or the calling user does not have permission to view the contentr   )	r   r   r~   r>   r   r   r[   rj   r   )
r&   r  r   r   r   r   rx   r'   r[   r   s
             r*   get_page_descendant_by_typez)ConfluenceApi.get_page_descendant_by_type|  s   !%jjF7O!%jjF7O%F8E'EE|EE	% /%-s6:::88C877% $#O||I...! 		 		 		z%,,W    		s#   B B ;B C"CCr   c              #   `   K   |ddg}|D ]"}|                      |||||          E d{V  #dS )u  
        Возвращает потомков в контента для заданной страницы

        Args:
            page_id (int): ID страницы
            types (list, optional): типы потомков. Defaults to None.
            start (int, optional): Начальная позиция коллекции для возврата . Defaults to None.
            limit (int, optional): Ограничение на количество возвращаемых потомков. Defaults to 100.
            expand (str, optional): Список свойств для расширения данных. Defaults to None.

        Yields:
            _type_: _description_
        Nr   r   )r   r   r   r   )r(  )r&   r  r!  r   r   r   r&  s          r*   get_descendantszConfluenceApi.get_descendants  s       =E
  	 	E77" 8          	 	r+   c              #      K   t          t                                          |                                                    d d         E d {V  d S )N)listr    get_all_restrictions_for_contentvalues)r&   r  r)   s     r*   r.  z.ConfluenceApi.get_all_restrictions_for_content  sW      @@IIPPRRSSTWUWTWXXXXXXXXXXr+   c              #      K   t          dd|          }	  | j        d	i |}|d         E d {V  |dxx         |d         z  cc<   |d         |d         k     rd S F)
Nr   r   )r   r   r  Try   r   r   r   r   )r   get_page_labels)r&   r  rx   rr   s       r*   get_all_page_labelsz!ConfluenceApi.get_all_page_labels  s      AS':::	&$&0000C9~%%%%%%%7OOOvg.OOO6{VG_,,	r+   version_numberc                 r    | j         r	d| d| }nd| d| }i }|||d<   |                     ||          S )u  
        Получает определенную версию документа

        Args:
            content_id (str): ID страницы(документа) в Confluence
            version_number (int): номер версии страницы(документа)
            expand (str): Cвойства элемента, которые нужно расширить, например, expand='body,version,history'

        Return:
            dict: данные версии документа
        r   z	/version/rest/experimental/content/Nr   rw   )r   r>   )r&   r   r3  r   r'   rx   s         r*   get_page_versionzConfluenceApi.get_page_version  sf     : 	UKjKK>KKCCTzTTNTTC%F8xxFx+++r+      r,  current_versionlast_versionsc           	   #     K   |sdS | j         rd| d}nd| d}i }|t          |          |d<   |t          |          |d<   |||d<   d}		 	 |                     ||
          }
|
d         }|                    d          }|
d         D ]*}|	dz  }	d|cxk    r|	k     rn nd} n|d         dz
  }|V  +n|#  t          |dd          D ]a}|	dz  }	d|cxk    r|	k     rn n nI	 |                     |||          V  4# t
          $ r!}t          d| d|           V  Y d}~Zd}~ww xY wd}Y nxY w|sdS t          |          }t          t          |j	                            }|d         |d<   |                    d          r|                    d          |d<   |                    d          r|                    d          |d<   )u  
        Получает версии страницы (историю документа)
        При большом количестве данных в версиях, limit > 5 может не работать,
        зависает, либо падает с ошибкой по таймауту.
        Получение версий списком может упасть с ошибкой 500 "Internal Server Error", если в ответе будет кривая версия.
        При получении ошибки при запросе списков, пытаемся получить версии по одной.

        Args:
            content_id (str): ID страницы(документа) в Confluence
            current_version (int): номер текущй версии страницы(документа)
            last_versions (int): колчество послених версий для получения, при "-1" - получение всех версий
            expand (str): Cвойства элемента, которые нужно расширить, например, expand='body,version,history'

        Yields:
            Iterator[list]: элемент
        Nr   z/versionr5  r   r   r   r   Trw   rz   r{   ry   r-   Fnumberr,  u   версия z. r   )
r   r   r>   ranger6  r   r   r   r   r   )r&   r   r8  r   r   r9  r   r'   rx   version_countrr   r   r   r  r3  excr   r   s                     r*   get_page_versionszConfluenceApi.get_page_versions  s     2  	4: 	D:j:::CCCzCCCC!%jjF7O!%jjF7O%F8'	3hhs6h22H		&))"9~ " "G!Q&MM9999M99999 %&-h&7!&;O!MMMM&+OQ&C&C Q QN!Q&MM9999M99999Q"33JPVWWWWWW$ Q Q Q'(O(O(O#(O(OPPPPPPPPPPQ  !%J:#34455E#GnF7Oyy"" 7#(99X#6#6x yy   3!&6!2!2vO'	3s7   A'B8 8,D1%C?>D1?
D*	D% D1%D**D1c                    | j         r-|                     |d          }|                    dg           S |dk    rd| d}|                     |          S d}ddd	|gd
}|                     ||                              dg           S )Npermissions)	space_keyr   
   zrest/api/space/z/permissionsz!rpc/json-rpc/confluenceservice-v2z2.0getSpacePermissionSets   )jsonrpcr_   r   rx   )datar   )r   	get_spacer>   post)r&   rB  r  
space_datar'   rG  s         r*   get_space_permissionsz#ConfluenceApi.get_space_permissions.  s    : 	?)MRRJ>>-444]];I;;;C88C==  6C 2$+	 D 99St9,,002>>>r+   c                 0    d}|                      |          S )u   
        Получает связи с другими системами

        Return:
            applinks (dict): данные связей с другими системами
        zrest/applinks/3.0/applinksr|   r&   r'   s     r*   get_applinkszConfluenceApi.get_applinks@  s     ,xx}}r+   c                 0    d}|                      |          S )u7   Получить информацию о системеzrest/applinks/1.0/manifestr|   rM  s     r*   get_system_infozConfluenceApi.get_system_infoK  s    *xx}}r+   c                 0    d}|                      |          S )u^   
        Возвращает данные о текущем пользователе
        zrest/api/user/currentr|   rM  s     r*   get_current_userzConfluenceApi.get_current_userP  s     &xx}}r+   rX   )Nr\   )NN)NNNNr   )Nr   r   Nr   )r   r   NT)NTF)r   r   N)NNNTF)NNT)r   NNN)NNr   N)r   r7  r,  N)3__name__
__module____qualname____doc__r5   !IMPORT_CONFLUENCE_REQUEST_TIMEOUTcmfutilrequests_sessionr   r   r   rF   r%   rS   rV   rY   ru   r~   r   r   r   r   r   r   r   r   strr   r-  r   r   r   r  r  r  r  r  r  r   r   r(  r*  r.  r2  r6  r?  rK  rN  rP  rR  __classcell__)r)   s   @r*   r   r      s       UU 8((**' ' ' ' ' 'R6 6 6 + + + ^+>   G G G! ! !    
# # # #:   8     02 2 2 2h
 
 
 
     !3 !3 !3F/ / / / // / / / / 8:7;53 53C 53!$531453"%53@D53 53 53 53nD D3 D DVZ Duy D  GK D D D DL/ /S / / / /   P P P P   ! ! ! ! @L @L @L @L @L @LDU UT UQU U U U UB   < d    :Y Y Y Y Y  , ,3 , ,S ,\` , , , ,6 Q3 Q3Q3 Q3 	Q3
 Q3 Q3 Q3 
Q3 Q3 Q3 Q3f? ? ?$	d 	 	 	 	  
      r+   r   )urllib.parser   r   cmf.includerH   r   
contextlibr   requests.adaptersr   urllib3.util.retryr   	atlassianr	   atlassian.errorsr
   r   r   logging	getLoggerrh   r   r   r+   r*   <module>re     s    , , , , , , , ,       % % % % % % ) ) ) ) ) ) $ $ $ $ $ $             K K K K K K K K K K			2	3	3E E E E EJ E E E E Er+   