U
    `XfdC                     @   sH   d dl mZ d dlmZmZ d dlT d dlZedZ	G dd dZ
dS )    )HTTPBasicAuth)urlparse	parse_qsl)*Nzatlassian.rest_clientc                   @   sL  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dCd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dDeeed$d%d&ZdEd(d)Zed*d+ ZdFd,d-ZdGd.d/Z dHd0d1Z!dId2d3Z"d4d5 Z#d6d7 Z$d8d9 Z%d:d; Z&dJee'e'eed=d>d?Z(dKdAdBZ)dS )L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|}n|}|ds,|d }|dr:|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>6   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   r2   )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_spacesr3   )r   r9   r:   resrowr   r   r   r<   C   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}   
        Получим все документы из пространства со списком потомков
        r7   )r9   r:   statusN)r   get_all_pages_from_space)r   r    r9   maxr?   expandr:   r=   r   r   r   r@   T   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"   d   s     z<ConfluenceApi.get_count_pages_from_space.<locals>.<listcomp>r   )lenr@   )r   r    r   r   r   get_count_pages_from_spacec   s    z(ConfluenceApi.get_count_pages_from_spacec              
   c   s   t ddd}|||< | j}| jjr0tj|d}z^| jtj|d|d}|  |	 }|
dsjW d S |d E d H  |d  |d	 7  < W q0 tjk
r } z td
| d|  W Y d S d }~X Y q0X q0d S )Nr      r9   r:   Zwikizrest/api/user/memberofr0   r;   r9   r:   uL   Не удалось получить группы пользователя "". )dictr   r   r   ospathr(   r6   raise_for_statusr*   r3   requestsZ	HTTPErrorr,   warning)r   r    r!   r0   r   r=   Zhttp_errr   r   r   user_member_off   s     
zConfluenceApi.user_member_ofc              
   C   s   t j| jd|}| jjr,t j| jd|}z| |}|  | }W n> t	k
r } z t
d| d|  t }W 5 d }~X Y nX |S )Nzrest/mobile/1.0/profile/zwiki/rest/mobile/1.0/profile/uL   Не удалось получить данные пользователя "rK   )rM   rN   r(   r   r   r   r6   rO   r*   	Exceptionr,   rQ   rL   )r   r   r   r=   infoerrorr   r   r   get_user_detaily   s    
zConfluenceApi.get_user_detailc                 #   s  | j jrtddddd}| jtj| jd|d }|d sBd S |d D ]\}|d	  | j	 d
 d} 
 fd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 ]~}|d	 d dkrtd q|d	  | j	|d	 d d} 
 fdd| D  dd | d d D  d<  V  q|d  |d 7  < qd S )Nr   rH   zuser=""zoperations,personalSpace)r9   r:   cqlrB   zwiki/rest/api/search/userrJ   r;   user	accountIdr   c                 3   s*   | ]"\}}| ks|d kr||fV  qdS r#   Nr   r   kvrX   r   r   	<genexpr>   s     z.ConfluenceApi.get_all_users.<locals>.<genexpr>c                 S   s   g | ]}|qS r   r   r   gr   r   r   r"      s     z/ConfluenceApi.get_all_users.<locals>.<listcomp>groupsr9   r:   z	type=userz&user.operations,user.status,user.emailr   Zrecovery_adminu   В вашем Confluence включен режим восстановления! Не оставляйте Confluence в режиме восстановления и не используйте учетную запись recovery_admin!c                 3   s*   | ]"\}}| ks|d kr||fV  qdS r[   r   r\   r_   r   r   r`      s     c                 S   s   g | ]}|qS r   r   ra   r   r   r   r"      s     )r   r   rL   r6   rM   rN   r(   r   r*   rV   updater)   rR   rW   r,   rQ   )r   r0   r=   r>   Z	user_infor   r_   r   get_all_users   s4    
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   rH   rI   r9   r:   )rL   r   get_all_groups)r   r0   r=   r   r   r   rf      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   rH   zoperations,status)r9   r:   
group_namerB   r9   r:   )rL   r   get_group_members)r   rg   r0   r=   r>   r   r   r   rh      s    zConfluenceApi.get_group_members)id_docsrB   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   rH   )r9   r:   rB   /wiki/rest/api/content/z/child/commentrJ   r;   c                 S   s   g | ]}|qS r   r   rD   r   r   r   r"      s     z3ConfluenceApi.get_page_comments.<locals>.<listcomp>idrB   childrenr9   r:   N)rL   r   r   r6   r   r*   get_page_commentsr3   )r   ri   rB   r0   r=   r>   r   r   r   rn      s    	 zConfluenceApi.get_page_comments)	key_spacerB   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)depthrB   r9   r:   Zcontent_typer;   rm   c                 S   s   g | ]}|qS r   r   rD   r   r   r   r"      s     z;ConfluenceApi.get_root_pages_from_space.<locals>.<listcomp>rk   sizeN)r   Zget_space_contentr3   get_childrenrF   )r   ro   rB   r9   r:   r=   r>   r   r   r   get_root_pages_from_space   s    	
$ z'ConfluenceApi.get_root_pages_from_spacerH   c                 c   s   t ||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 )NrI   rj   z/child/attachmentrJ   r;   r9   r:   )rL   r   r   r6   r   r*   Zget_attachments_from_contentr3   )r   page_idr9   r:   r0   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   
   )r1   r0   r   timeout   )r   rangeRETRY_COUNTr   r   r3   Zstatus_code)	clsr	   r
   r   r0   r1   r   ir=   r   r   r   call   s    
   
zConfluenceApi.callc                 C   s   | j j||dS )N)userkeyrB   )r   Zget_user_details_by_userkey)r   r   rB   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 )Nrl   )r   r   get_user_details_by_accountid)r   rY   rB   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 )NrZ   rY   )Z	accountidrB   )r   rB   )r   r   get_account_idr   Zget_user_details_by_username)r   r   rB   rX   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   r   r;   r   )r6   r   USER_ACCOUNTS_ID_URIr*   )r   r   r   r0   r=   r   r   r   r     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.pagerB   r#   c                 S   s   g | ]}|qS r   r   rD   r   r   r   r"   +  s     z0ConfluenceApi.get_page_by_id.<locals>.<listcomp>rm   rr   r;   rt   )r   get_page_by_idr3   ru   rF   )r   rk   r4   r5   rr   rm   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   rp   rI   )r   Zget_page_child_by_type)r   Z	parent_idr9   r:   r=   r   r   r   ru   0  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   r7   rI   wiki/rest/api/content/z/restrictionrJ   r;   r9   r:   rt   zrest/api/content/z/restriction/byOperation)rL   r   r   r6   r   r*   listrM   rN   r(   valuesr   rw   r0   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   r7   )r9   r:   rw   r;   r9   r:   rt   )rL   r   Zget_page_labelsr   r   r   r   get_all_page_labelsJ  s    z!ConfluenceApi.get_all_page_labelsry   )
content_idr9   r:   rB   r   c                 c   s  | j jr"tj| jd| d}ntj| jd| d}i }|dk	rRt||d< |dk	rft||d< |dk	rv||d< | j||d }|d	 D ]
}|V  q|d
 }	|		d}
|
sq
t
|
}tt|j}|d |d< |	dr|	d|d< |	drv|	d|d< qvdS )u  
        Получает версии страницы (историю документа)

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

        Yields:
            Iterator[list]: элемент
        r   z/versionzrest/experimental/content/Nr9   r:   rB   rJ   r;   _linksnextcursorr   r   rM   rN   r(   r   intr6   r*   r3   r   rL   r   query)r   r   r9   r:   rB   r   r0   r=   resultlinksnext_
next_parser   r   r   r   get_page_versionsT  s0    


zConfluenceApi.get_page_versionsrp   c                 c   s  | j jrtj| jd}ntj| jd}i }|d k	r>||d< |d k	rRt||d< |d k	rft||d< |d k	rv||d< | j||d }|d D ]
}|V  q|d	 }	|		d
}
|
sq
t
|
}tt|j}|d |d< |	dr|	d|d< |	d
rv|	d
|d
< qvd S )Nzwiki/rest/api/content/searchzrest/api/content/searchrW   r9   r:   rB   rJ   r;   r   r   r   r   )r   rW   r9   r:   rB   r   r0   r=   Zcontentr   r   r   r   r   r   r   content_cql  s4    


zConfluenceApi.content_cql)r   NNN)N)r   rH   )N)N)N)NN)r   ry   N)r   rp   N)*__name__
__module____qualname____doc__ZAPI_VERSIONZUSER_URIr}   r   strboolr   staticmethodloggingDEBUGr/   r6   r<   r@   rG   rR   rV   re   rf   rh   r   rn   rL   rv   rx   classmethodr   r   r   r   r   r   ru   r   r   r   r   r   r   r   r   r   r      s@   

#	







-r   )Zrequests.authr   Zurllib.parser   r   Zcmf.includerP   r   Z	getLoggerr,   r   r   r   r   r   <module>   s
   
