U
    ic'                     @   s8   d dl mZ d dlT d dlZedZG dd dZdS )    )HTTPBasicAuth)*Nzatlassian.rest_clientc                   @   s   e Zd ZdZdZe dZdZdZeeeee	e	dddd	Z
eddejfd
dZdd Zdd Zdd ZeeedddZeeedddZeeedddZdd Zedd Zdd Zd d! Zd"d# Zd,d$d%Zd&d' Zd(d) Zd*d+ Z dS )-ConfluenceApiuK    Подключение по API к учетной записи Confluence z/rest/api/3z/user   z"/wiki/rest/api/user/bulk/migrationN)urllogintokenpasswordcloud
verify_sslreturnc                 C   sj   ddl m} |r|r"|s"|}n|}|||||||d| _dd| i| _|| _|| _|| _|| _|| _d S )Nr   )
Confluence)r   usernamer	   r   r
   r   ZAuthorizationzBearer )	Z	atlassianr   connheadersr   r   r	   r   r   )selfr   r   r   r	   r
   r   r    r   ./modules/confluence/api.py__init__   s&    zConfluenceApi.__init__c                 C   s^   ddd}|p|}dj | ddd | D |s6dnd t||d	}tj||d
 dS )z

        :param method:
        :param url:
        :param data:
        :param headers:
        :param level:
        :return:
        application/json)zContent-TypeAcceptz5curl --silent -X {method} -H {headers} {data} '{url}'z -H c                 S   s   g | ]\}}d  ||qS )z
'{0}: {1}')format).0keyvaluer   r   r   
<listcomp>4   s     z0ConfluenceApi.log_curl_debug.<locals>.<listcomp> z--data '{0}')methodr   datar   )levelmsgN)r   joinitemsjsondumpsloggerlog)r   r   r   r   r   Zdefault_headersmessager   r   r   log_curl_debug%   s    
zConfluenceApi.log_curl_debugc                 O   sd   | j |d d|dd | jrF| jrFtj|| j| jf| jd|S tj|| j| jd|S d S )Nr   ZGETparams)r   r   r   )authverify)r   r+   )r(   getr   r	   requestsr   r   )r   argskwargsr   r   r   confluence_request:   s     z ConfluenceApi.confluence_requestc                 c   sL   d}d}| j jd||d}|rH|ds*qH|d D ]
}|V  q2||7 }qdS )u   
        Получим все пространства из Confluence

        :return: Список всех пространств
        r   d   global)Z
space_typestartlimitresultsN)r   get_all_spacesr,   )r   r3   r4   resrowr   r   r   r6   A   s    zConfluenceApi.get_all_spacesc                 c   st   | j jstd d S | j d}tdddd}| j||d }|d sLd S |d E d H  |d	  |d
 7  < q.d S )Nup   Для серверной версии недоступна выгрузка всех пользователейz/wiki/rest/api/search/userr      z	type=user)r3   r4   Zcqlr)   r5   r3   r4   )r   r
   printr   dictr0   r#   )r   Zurir)   r7   r   r   r   get_all_usersR   s    zConfluenceApi.get_all_users)id_docsexpandr   c                 c   s   t dd|d}| jjr8| j| j d| d|d }n| jj|f|}|r|dsXq|d D ]
}|V  q`|d  |d	 7  < qd
S )u  
        Получим все комментарии к документу.

        :param id_docs: Идентификатор документа.
        :param expand: Расширить свойствами.

        :return: Список всех комментариев.
        r   r9   )r3   r4   r?   /wiki/rest/api/content/z/child/commentr:   r5   r3   r4   N)r<   r   r
   r0   r   r#   get_page_commentsr,   )r   r>   r?   r)   r7   r8   r   r   r   rA   _   s    	zConfluenceApi.get_page_comments)	key_spacer?   r   c                 c   s@   d}d}| j j||||d}|D ]
}|V  q |s2q<||7 }qdS )u^  
        Получим все документы из пространства.

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

        :return: Соответствие id документа и его данных.
        r   2   )r?   r3   r4   N)r   get_all_pages_from_spacer   rB   r?   r3   r4   r7   r8   r   r   r   rD   w   s    	z&ConfluenceApi.get_all_pages_from_spacec                 c   s   d}d}| j j|d|||dd}|d D ]X}|drzdd	 | |d
 D |d d d< t|d d d |d d d< |V  q(|d sq||7 }qdS )ui  
        Получим все документы из корня пространства.

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

        :return: Соответствие id документа и его данных.
        r   rC   rootpage)depthr?   r3   r4   Zcontent_typer5   childrenc                 S   s   g | ]}|qS r   r   )r   objr   r   r   r      s     z;ConfluenceApi.get_root_pages_from_space.<locals>.<listcomp>idsizeN)r   Zget_space_contentr,   get_childrenlenrE   r   r   r   get_root_pages_from_space   s    	
$ z'ConfluenceApi.get_root_pages_from_spacec                 c   s   t ddd}| jjr6| j| j d| d|d }n| jj|f|}|r|dsVq|d D ]
}|V  q^|d  |d	 7  < qd S )
Nr      r3   r4   r@   z/child/attachmentr:   r5   r3   r4   )r<   r   r
   r0   r   r#   Zget_attachments_from_contentr,   )r   page_idr)   r7   r8   r   r   r   get_all_attachment   s    z ConfluenceApi.get_all_attachmentc           	      C   sH   t ||}ddi}t| jD ]&}tj||||dd}|jdkr qDq|S )Nr   r   
   )r*   r)   r   timeout   )r   rangeRETRY_COUNTr-   r,   Zstatus_code)	clsr   r   r   r)   r*   r   ir7   r   r   r   call   s    
   
zConfluenceApi.callc                 C   s   | j j|dS )N)userkey)r   Zget_user_details_by_userkey)r   r\   r   r   r   get_user_info_by_key   s    z"ConfluenceApi.get_user_info_by_keyc                 C   s   | j j|ddS )NZ
operations)r?   )r   get_user_details_by_accountid)r   	accountIdr   r   r   get_user_info   s    zConfluenceApi.get_user_infoc                 C   s4   | j jr&| j|d}| j j|d dS | j j|dS )N)r   r_   )Z	accountid)r   r
   get_account_idr^   Zget_user_details_by_username)r   r   userr   r   r   get_user_info_by_username   s    z'ConfluenceApi.get_user_info_by_usernamec                 C   s>   |rd|i}nd|i}|  | j | j |}| d d S )Nr   r\   r5   r   )r0   r   USER_ACCOUNTS_ID_URIr#   )r   r   r\   r)   r7   r   r   r   ra      s    
zConfluenceApi.get_account_idc           	      O   s   | j j|f||}d|ddkrg }d}| j j||dd}|d7 }|sLqb|D ]}|| qPq,||d d d	< t||d d d
< |S )Nzchildren.pager?   r   r   r9   rQ   rI   rG   r5   rL   )r   get_page_by_idr,   get_page_child_by_typeappendrN   )	r   rK   r.   r/   rG   rI   r3   Zchildren_iterZchr   r   r   re      s    zConfluenceApi.get_page_by_idc                 c   s8   d}d}| j j|||d}|s q4|E d H  ||7 }qd S )Nr   rC   rQ   )r   rf   )r   Z	parent_idr3   r4   r7   r   r   r   rM      s    
zConfluenceApi.get_childrenc                 c   sf   t ddd}| j| j d| d|d }|d E d H  |d  |d	 7  < |d
 |d k rqbqd S )Nr   r1   rQ   r@   z/restrictionr:   r5   r3   r4   rL   )r<   r0   r   r#   )r   rR   r)   r7   r   r   r    get_all_restrictions_for_content   s    
z.ConfluenceApi.get_all_restrictions_for_content)NN)!__name__
__module____qualname____doc__ZAPI_VERSIONZUSER_URIrX   rd   strboolr   staticmethodloggingDEBUGr(   r0   r6   r=   listrA   r<   rD   rO   rS   classmethodr[   r]   r`   rc   ra   re   rM   rh   r   r   r   r   r      s0   



r   )Zrequests.authr   Zcmf.includer-   rp   Z	getLoggerr%   r   r   r   r   r   <module>   s   
