U
    H|cRQ                     @   sF   d dl mZmZmZmZ d dlZd dlmZ d dlT G dd dZ	dS )    )DictListOptionalIteratorN)HTTPBasicAuth)*c                   @   s$  e Zd ZdZdZdZe dZe dZe dZe dZ	e dZ
e dZe d	Ze d	Ze d
Ze dZe dZe dZe dZe dZe dZdZdPddZdd ZdQeee edddZdRee dddZdSddZdd  Zd!d" Z dTee dd#d$Z!dUee dd%d&Z"d'd( Z#d)d* Z$d+d, Z%dVd-d.Z&e'd/d0d1Z(e)d2d3d4Z*d5d6 Z+ee'd7d8d9Z,d:d; Z-dWd<d=Z.ed>d?d@Z/dXee ddAdBZ0e1eef ddCdDZ2dEdF Z3ee ddGdHZ4e1ee1f ee dIdJdKZ5ee6e d7dLdMZ7dNdO Z8dS )YJiraApid   z/rest/api/3z
rest/api/2z/searchz/workflow/searchz/statuses/searchz/issue/{issue_key}z/issue/{issue_key}/commentz/issue/{issue_key}/watchersz/users/searchz/fieldz/projectz/project/{project_key}z$/project/{project_id}/role/{role_id}z/auditing/recordz"/rest/api/3/workflowscheme/projectNc	           
      C   s   ddl m}	 |r|}n|}|	||||||d| _dd| i| _|drN|nd| | _|| _|| _|| _|| _	d| _
|| _|rd	| d
| j
 | _
i | _d S )Nr   )Jira)urlusernamepasswordtokencloud
verify_sslZAuthorizationzBearer Zhttpzhttps://zorder by created ASCzproject = 'z' )Z	atlassianr
   connheaders
startswithr   loginr   r   r   jql
cmf_importsaved_files)
selfr   r   r   r   r   r   projectr   r
    r   ./modules/jira/api.py__init__    s.    zJiraApi.__init__c                 O   s|   | j r0| jr0tj|t| j | j| jd|}ntj|| j| jd|}d|jddkrxd| krxt| d |S )N)Zauthverify)r   r   zapplication/jsonzContent-type errorMessages)	r   r   requestsgetr   r   r   json	Exception)r   argskwargsresr   r   r   jira_request:   s    $zJiraApi.jira_request)uriparamsreturnc           	      C   s  |r| d| dn| d}| | jd}tdd|}| jr| jjr| jjD ]\}|jj|rPt	|j
jd6}t| }t|tr|nd|iW  5 Q R    S Q R X qP|| jkrt	| j| d2}t| }t|tr|nd|iW  5 Q R  S Q R X t| j|  | j| j| |dd}| jrz|jd	krzd
|j d|j d|j d| j|  }| jj| t|| }| jrtj| j| j|d}||j  |  |j
| j|< t|tr|S d|iS )u    Запрос по API _z.jsonr   z[/ '"{}]rdata
   )r)   timeout   u   Код ошибки - z, z - u   , адрес запроса: )r   parentname) replaceAPI_VERSIONresubr   attachmentsr2   valueendswithopenZfull_path_filer"   loadsread
isinstancedictr   gdebugr   r'   Zstatus_codereasontextloggerZ	exceptionCmfErrorZmodelsZCmfAttachmentZupload_fileencodeZsave)	r   r(   r)   r2   
attachmentfresultresponseZ
error_textr   r   r   callC   s4    .((zJiraApi.callr   )r*   c                 c   sp   d}d}|p| j }| jj| j||dd}|s0dS ||7 }|E dH  |t|7 }d|  k rb|krn qdS qdS )u(    Получение всех задач r   ZrenderedFields)r   startlimitexpandN)MAX_ISSUES_RESULT_PER_REQUESTr   Zjql_get_list_of_ticketsr   len)r   rL   start_attotalmax_resultsissuesr   r   r   
get_issuesf   s    

zJiraApi.get_issuesc                 c   s   d}d}|p| j }| jj|| j||dd}|d s6d S ||7 }t| d|d   |d E d H  |t|d 7 }d|  k r|ksn ||d krd S qd S )Nr   changelog,renderedFields)rK   rL   rM   rS   u    из rQ   )rN   r   get_issues_for_boardr   r?   r@   rO   )r   board_idrL   rP   rQ   rR   rS   r   r   r   rV   v   s    
"zJiraApi.get_issues_for_boardc                 c   sJ   d}d}| j j|||d}|dg s(qF||7 }|d D ]
}|V  q8qd S )Nr   2   )rW   rK   rL   values)r   Zget_all_sprintr!   )r   rW   rK   rL   r&   rowr   r   r   get_sprints   s    zJiraApi.get_sprintsc                 c   sJ   d}d}| j j|||d}|dg s(qF||7 }|d D ]
}|V  q8qd S )Nr   rX   )	sprint_idrK   rL   rS   )r   get_sprint_issuesr!   )r   r\   rK   rL   r&   rZ   r   r   r   r]      s    zJiraApi.get_sprint_issuesc                 c   s   d}d|p| j |d}|r"||d< | jjr| j| j | j |d }d|kr\t|d |d shdS |d E dH  |d	  |d
 7  < |d	 |kr*dS q*n| j E dH  dS )u    Получение всех workflow
        https://developer.atlassian.com/cloud/jira/platform/rest/v3/api-group-workflows/#api-rest-api-3-workflow-search-get
        ztransitions,transitions.rules,transitions.properties,statuses,statuses.properties,default,schemes,projects,hasDraftWorkflow,operationsr   startAt
maxResultsrM   ZworkflowNamer)   r   rY   Nr_   r`   )	rN   r   r   r'   r   WORKFLOW_SEARCH_URIr"   r#   Zget_all_workflows)r   namesrL   rM   r)   r&   r   r   r   get_workflows   s"    
zJiraApi.get_workflowsc                 c   s   | j jrd|p| jdd}|r&||d< | j| j | j |d }|d sPdS |d E dH  |d  |d	 7  < |d |kr&dS q&n&|r| j |E dH  | j  E dH  dS )
u.    Получение всех statuses
        r   Zusagesr^   	projectIdra   rY   Nr_   r`   )	r   r   rN   r'   r   STATUS_SEARCH_URIr"   Zget_status_for_projectZget_all_statuses)r   rL   
project_idr)   r&   r   r   r   get_statuses   s     
zJiraApi.get_statusesc                 C   sB   d|i}| j | j | j |d }d|kr:t|d |d S )Nre   ra   r   rY   )r'   r   WORKFLOW_PROJECT_URIr"   r#   )r   project_idsr)   r&   r   r   r   get_project_scheme   s
    zJiraApi.get_project_schemec                 C   s    | j  d| d}| | S )Nz/rest/api/3/workflowscheme/z	/workflowr   r'   r"   r   idr(   r   r   r   get_issue_type_workflow_scheme   s    z&JiraApi.get_issue_type_workflow_schemec                 C   s   | j  d| }| | S )Nz/rest/api/3/issuetype/rl   rm   r   r   r   get_issue_type   s    zJiraApi.get_issue_typec                 c   s   d|p
| j d}| j d}| j||d }d|krBt|d |d sNd S |d E d H  |d  |d 7  < |d |krd S qd S )	Nr   )r_   r`   z/rest/api/3/workflowschemera   r   rY   r_   r`   )rN   r   r'   r"   r#   )r   rL   r)   r(   r&   r   r   r   get_workflow_scheme   s    zJiraApi.get_workflow_scheme)rj   c                 c   s^   dd|d}| j  d}| j||d }|d s6d S |d E d H  |d  |d 7  < qd S )	Nr   rX   )r_   r`   re   z#/rest/api/3/issuetypescheme/projectra   rY   r_   r`   rl   )r   rj   r)   r(   r&   r   r   r   get_issue_type_schemes   s    zJiraApi.get_issue_type_schemes)rg   c                 C   s&   d|i}| j  d}| j||d S )Nre   z/rest/api/3/issuetype/projectra   rl   )r   rg   r)   r(   r   r   r   get_issue_for_project   s    zJiraApi.get_issue_for_projectc                 c   s>   | j jr*| j d}| | E d H  n| j  E d H  d S )Nz/rest/api/3/issuetype)r   r   r   r'   r"   get_issue_types)r   r(   r   r   r   rt      s    zJiraApi.get_issue_types)	issue_keyr*   c                 c   s   t dddd}| jjr>| j| j | j j|d|d }n&| j| j | j j|d|d }|	dsrdS |d	  |d
 7  < |d D ]
}|V  qqdS )u@    Получим все комментарии по задаче r   rX   ZrenderedBodyr^   ru   ra   ZcommentsNr_   r`   )
r>   r   r   r'   r   COMMENTS_URI_FORMATformatr"   COMMENTS_URI_FORMAT_BOXr!   )r   ru   r)   r&   rZ   r   r   r   get_comments   s    (&
zJiraApi.get_commentsc                 c   sJ   d}d}| j j|||d}|dg s(qF||7 }|d D ]
}|V  q8qd S )Nr   rX   )project_keyrK   rL   rY   )r   get_all_agile_boardsr!   )r   r{   rK   rL   r&   rZ   r   r   r   r|     s    zJiraApi.get_all_agile_boardsc                 c   sv   d}d}t  }|r||d< ||d< ||d< | | j | j | }||d krTqr||7 }|d D ]
}|V  qdqd S )Nr   i  Z
projectIdsoffsetrL   rQ   Zrecords)r>   r'   r   	AUDIT_URIr"   )r   rj   rK   rL   r)   r&   rZ   r   r   r   get_audit_records  s    zJiraApi.get_audit_recordsrv   c                 C   sP   | j jr| | jj|d}n"| | j | jj|d  }|sHg S |d S )u(   Наблюдатели по задачеrv   watchers)	r   r   rJ   WATCHERS_URI_FORMATrx   r'   r   WATCHERS_URI_FORMAT_BOXr"   )r   ru   r   r   r   r   get_watchers'  s    "zJiraApi.get_watchersc           
      c   sH  | j jr| j d}dddd}| j||d }|s8q|D ]J}|dsdtj }t	|d	 d
dt
|   | |d< |V  q<|d  |d 7  < |r |d |kr qq nd}d}d}	| j j|||	d}|sؐqD|D ]L}|ds"dtj }t	|d	 d
dt
|   | |d< |V  q||	7 }|r||krqDqd
S )u    Возвращает список всех пользователей, включая активных,
            неактивных и ранее удаленных, у которых есть учетная запись Atlassian.z/rest/api/3/users/searchr   r	   Z
operationsr^   ra   emailAddress@ZdisplayNameN@   r_   r`   .rX   )r   rK   rL   )r   r   r   r'   r"   r!   ZconfigZ
ORG_DOMAINZcmfutilZtranslit_striprO   Zuser_find_by_user_string)
r   Z	limit_endr(   r)   ZusersZ	user_infoZpostfixr   rK   rL   r   r   r   	get_users1  s>    
*$zJiraApi.get_usersc                 C   s@   | j  }t }|D ]&}d|kr.|||d < q|||d < q|S )u]    Возвращает системные и настраиваемые поля задачи keyrn   )r   Zget_all_fieldsr>   )r   fieldsr&   Zfieldr   r   r   
get_fieldsY  s    
zJiraApi.get_fieldsc                 c   sf   d}d}dj |d}| jj|d||dd}| jjr8|}n|d }|sHd S |D ]
}|V  qL||7 }qd S )	Nr      z"project = "{project}" ORDER BY key)r   z*allrU   )r   rK   rL   rM   rS   )rx   r   r   Zadvanced_mode)r   r{   rK   rL   r   rI   r&   rZ   r   r   r   get_all_project_issuesd  s    zJiraApi.get_all_project_issuesc                 c   s   | j  E dH  dS )u*   Возвращает все проектыN)r   Zget_all_projects)r   r   r   r   get_projectst  s    zJiraApi.get_projects)settings_usersr*   c                 c   s   |  | jdg D ]}t }|d }|  | jj|d d}|di  D ]}td|}|sdqN|	 }|  | j
j|d |d}|d	g D ]R}	|	d
 d |krtd|	 d| ||	d
 d  d }
||
 ||
dV  qqNqdS )u8   Возвращает участников проектаr-   r2   r   )r{   Zrolesz\d+$rn   )rg   role_idZactorsZ	actorUserZ	accountIdu+   Не найден пользователь u*    участвующий в проекте r   )project_nameproject_member_emailN)rJ   PROJECTS_URIr!   setPROJECT_URI_FORMATrx   rY   r5   searchgroupPROJECT_ROLES_URI_FORMATrD   add)r   r   r   Zadded_users_to_projectr   Zproject_infoZroler   Z	role_infoZactorr   r   r   r   get_project_members  s$    
zJiraApi.get_project_membersc                 C   s0   | j | jj|dddid}|s$g S |d d S )u2   Возвращает вложения задачиrv   r   rF   ra   )rJ   ISSUE_URI_FORMATrx   )r   ru   r7   r   r   r   get_attachments  s    zJiraApi.get_attachmentsc                 C   s.   |j dddd }| | j d| }|jS )uJ   
        Скачиваем содержимое вложения
        /   )maxsplit)splitr'   r   Zcontent)r   r   r(   rI   r   r   r   get_attachment_content  s
    zJiraApi.get_attachment_content)NN)N)r   )r   )Nr   )r   N)r   )N)N)9__name__
__module____qualname__rN   r4   ZAPI_BOX_VERSIONZISSUES_SEARCH_URIrb   rf   r   rw   ry   r   r   Z	USERS_URIZ
FIELDS_URIZFIELDS_BOX_URIr   r   r   r~   ri   r   r'   strr   r>   rJ   r   rT   rV   r[   r]   rd   rh   rk   ro   rp   rq   listrr   intrs   rt   rz   r|   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r      s\   















	#




(+r   )
typingr   r   r   r   r    Zrequests.authr   Zcmf.includer   r   r   r   r   <module>   s   