U
    d4                     @   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ddZdd Zd;ddZdd Zdd Zdd Zdd Zdd Zdd  Zeeed!d"d#Zd<eeed$d%d&Zd'd( Zed)d* Zd=d+d,Zd>d-d.Z d?d/d0Z!d@d1d2Z"d3d4 Z#d5d6 Z$d7d8 Z%d9d: Z&dS )AConfluenceApiuK    Подключение по API к учетной записи Confluence z/rest/api/3z/user   z"/wiki/rest/api/user/bulk/migrationN)urllogintokenpasswordcloud
verify_sslreturnc              	   C   s   ddl m} |r|r"|s"|}n|}|ds4|d }|drB|nd| | _|||||||t d| _dd| i| _|| _	|| _
|| _|| _|| _d S )	Nr   )
Confluence/Zhttpzhttps://)r   usernamer	   r   r
   r   ZsessionZAuthorizationzBearer )Z	atlassianr   endswith
startswithr   cmfutilrequests_sessionconnheadersr   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>7   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_debugZGET)r"   c                O   sl   | j |d ||dd | jrJ| jrJt j|| j| jf| jd|S t j|| j| jd|S d S )Nr   params)r   r"   r#   )authverify)r   r0   )r-   getr   r	   r   r   r   r   )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_spacesr1   )r   r7   r8   resrowr   r   r   r:   D   s    zConfluenceApi.get_all_spacesr   c                 c   sZ   d}|r|| |kr|| }| j j||||d}|E dH  ||7 }|rN||ksV|sqVqdS )u}   
        Получим все документы из пространства со списком потомков
        r5   )r7   r8   statusN)r   get_all_pages_from_space)r   r   r7   maxr=   expandr8   r;   r   r   r   r>   U   s    
z&ConfluenceApi.get_all_pages_from_spacec                 C   s   t dd | |dD S )Nc                 S   s   g | ]}d qS )   r   r   objr   r   r   r    e   s     z<ConfluenceApi.get_count_pages_from_space.<locals>.<listcomp>r   )lenr>   )r   r   r   r   r   get_count_pages_from_spaced   s    z(ConfluenceApi.get_count_pages_from_spacec                 c   s   t ddd}|||< | j}| jjr0tj|d}| jtj|d|d }|d sXd S |d E d H  |d  |d	 7  < q0d S )
Nr      r7   r8   Zwikizrest/api/user/memberofr.   r9   r7   r8   )	dictr   r   r
   ospathr&   r4   r(   )r   r   r   r.   r   r;   r   r   r   user_member_ofg   s    
zConfluenceApi.user_member_ofc                 C   sr   t j| jd|}| jjr,t j| jd|}| |}|jdkrFt S |	  z|
 }W n   t }Y nX |S )Nzrest/mobile/1.0/profile/zwiki/rest/mobile/1.0/profile/i  )rJ   rK   r&   r   r   r
   r4   status_coderI   Zraise_for_statusr(   )r   r   r   r;   infor   r   r   get_user_detailu   s    

zConfluenceApi.get_user_detailc                 c   sJ  | j jrtddddd}| jtj| jd|d }|d sBd S |d D ]J}|d	 }| j	|d
 d}|
| dd | d
|d
 D |d< |V  qJ|d  |d 7  < qntddddd}| j jf |}|d sd S |d D ]N}|d	 }| j	|d	 d d}|
| dd | d|d D |d< |V  q|d  |d 7  < qd S )Nr   rF   zuser=""zoperations,personalSpace)r7   r8   cqlr@   zwiki/rest/api/search/userrH   r9   user	accountIdr   c                 S   s   g | ]}|qS r   r   r   gr   r   r   r       s     z/ConfluenceApi.get_all_users.<locals>.<listcomp>groupsr7   r8   z	type=userz&user.operations,user.status,user.emailr   c                 S   s   g | ]}|qS r   r   rT   r   r   r   r       s     )r   r
   rI   r4   rJ   rK   r&   r   r(   rO   updaterL   rP   )r   r.   r;   r<   rQ   Z	user_infor   r   r   get_all_users   s.    

zConfluenceApi.get_all_usersc                 c   sF   t ddd}| jjf |}|s"d S |E d H  |d  |d 7  < qd S )Nr   rF   rG   r7   r8   )rI   r   get_all_groups)r   r.   r;   r   r   r   rY      s    
zConfluenceApi.get_all_groupsc                 c   sP   t dd|dd}| jjf |}|s&d S |D ]
}|V  q*|d  |d 7  < qd S )Nr   rF   zoperations,status)r7   r8   
group_namer@   r7   r8   )rI   r   get_group_members)r   rZ   r.   r;   r<   r   r   r   r[      s    zConfluenceApi.get_group_members)id_docsr@   r   c                 c   s   t dd|d}| jjr8| j| j d| d|d }n| jj|f|}|r|dsXq|d D ]*}dd	 | j|d
 |dD |d< |V  q`|d  |d 7  < qdS )u  
        Получим все комментарии к документу.

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

        :return: Список всех комментариев.
        r   rF   )r7   r8   r@   /wiki/rest/api/content/z/child/commentrH   r9   c                 S   s   g | ]}|qS r   r   rB   r   r   r   r       s     z3ConfluenceApi.get_page_comments.<locals>.<listcomp>idr@   childrenr7   r8   N)rI   r   r
   r4   r   r(   get_page_commentsr1   )r   r\   r@   r.   r;   r<   r   r   r   ra      s    	 zConfluenceApi.get_page_comments)	key_spacer@   r   c                 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   2   rootpage)depthr@   r7   r8   Zcontent_typer9   r`   c                 S   s   g | ]}|qS r   r   rB   r   r   r   r       s     z;ConfluenceApi.get_root_pages_from_space.<locals>.<listcomp>r^   sizeN)r   Zget_space_contentr1   get_childrenrD   )r   rb   r@   r7   r8   r;   r<   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      rG   r]   z/child/attachmentrH   r9   r7   r8   )rI   r   r
   r4   r   r(   Zget_attachments_from_contentr1   )r   page_idr.   r;   r<   r   r   r   get_all_attachment   s    z ConfluenceApi.get_all_attachmentc           	      C   sL   t ||}ddi}t| jD ]*}t j||||dd}|jdkr qHq|S )Nr   r   
   )r/   r.   r   timeout   )r   rangeRETRY_COUNTr   r   r1   rM   )	clsr   r   r   r.   r/   r   ir;   r   r   r   call   s    
   
zConfluenceApi.callc                 C   s   | j j||dS )N)userkeyr@   )r   Zget_user_details_by_userkey)r   ru   r@   r   r   r   get_user_info_by_key   s    z"ConfluenceApi.get_user_info_by_keyc                 C   s   | j jr| j j||dS d S )Nr_   )r   r
   get_user_details_by_accountid)r   rR   r@   r   r   r   get_user_info  s    zConfluenceApi.get_user_infoc                 C   s8   | j jr(| j|d}| j j|d |dS | j j||dS )NrS   rR   )Z	accountidr@   )r   r@   )r   r
   get_account_idrw   Zget_user_details_by_username)r   r   r@   rQ   r   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   ru   r9   r   )r4   r   USER_ACCOUNTS_ID_URIr(   )r   r   ru   r.   r;   r   r   r   ry     s    
zConfluenceApi.get_account_idc                 O   s`   | j j|f||}d|ddkr\dd | |D }||d d d< t||d d d	< |S )
Nzchildren.pager@   r!   c                 S   s   g | ]}|qS r   r   rB   r   r   r   r      s     z0ConfluenceApi.get_page_by_id.<locals>.<listcomp>r`   re   r9   rg   )r   get_page_by_idr1   rh   rD   )r   r^   r2   r3   re   r`   r   r   r   r|     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   rG   )r   Zget_page_child_by_type)r   Z	parent_idr7   r8   r;   r   r   r   rh   $  s    
zConfluenceApi.get_childrenc                 c   s   t ddd}| jjrl| j| j d| d|d }|d E d H  |d  |d	 7  < |d
 |d k rqqn<t| jtj	| jd| d|d 
 d d E d H  d S )Nr   r5   rG   zwiki/rest/api/content/z/restrictionrH   r9   r7   r8   rg   zrest/api/content/z/restriction/byOperation)rI   r   r
   r4   r   r(   listrJ   rK   r&   valuesr   rk   r.   r;   r   r   r    get_all_restrictions_for_content.  s    
z.ConfluenceApi.get_all_restrictions_for_contentc                 c   sV   t dd|d}| jjf |}|d E d H  |d  |d 7  < |d |d k rqRqd S )Nr   r5   )r7   r8   rk   r9   r7   r8   rg   )rI   r   Zget_page_labelsr   r   r   r   get_all_page_labels>  s    z!ConfluenceApi.get_all_page_labels)r   NNN)N)N)N)N)NN)'__name__
__module____qualname____doc__ZAPI_VERSIONZUSER_URIrq   r{   strboolr   staticmethodloggingDEBUGr-   r4   r:   r>   rE   rL   rO   rX   rY   r[   r~   ra   rI   ri   rl   classmethodrt   rv   rx   rz   ry   r|   rh   r   r   r   r   r   r   r      s<   

	





r   )Zrequests.authr   Zcmf.includeZrequestsr   Z	getLoggerr*   r   r   r   r   r   <module>   s   
