U
    ӀcV                     @   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                   @   sZ  e Zd ZU 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eed< eed< dZddZddddZd[eee edddZd\ee ddd Zd]d!d"Z d#d$ Z!d%d& Z"d^ee dd'd(Z#d_ee dd)d*Z$d+d, Z%d-d. Z&d/d0 Z'd`d1d2Z(e)d3d4d5Z*e+d6d7d8Z,d9d: Z-ee)d;d<d=Z.d>d? Z/d@dA Z0dadBdCZ1edDdEdFZ2dbee ddGdHZ3e4eef ddIdJZ5dKdL Z6e+ddMdNZ7ee ddOdPZ8e4ee4f ee dQdRdSZ9ee:e d;dTdUZ;dVdW Z<dXdY Z=dS )c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/projectcloudurlNc	           
      C   s   ddl m}	 |r|}n|}|	||||||d| _dd| i| _|dsR|d }|dr`|nd| | _|| _|| _|| _	|| _
d	| _|| _|rd
| d| j | _i | _d S )Nr   )Jira)r   usernamepasswordtokenr
   
verify_sslZAuthorizationzBearer /Zhttpzhttps://zorder by created ASCzproject = 'z' )Z	atlassianr   connheadersendswith
startswithr   loginr   r   r   jql
cmf_importsaved_files)
selfr   r   r   r   r
   r   projectr   r    r   ./modules/jira/api.py__init__"   s2    
zJiraApi.__init__F)attachc                O   s   | j r0| jr0tj|t| j | j| jd|}ntj|| j| jd|}|s|d|jddkr|d| kr|t| d |S )N)Zauthverify)r   r    zapplication/jsonzContent-type errorMessages)	r   r   requestsgetr   r   r   json	Exception)r   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   attachmentsr5   valuer   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,   r5   
attachmentfresultresponseZ
error_textr   r   r   callG   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   rN   start_attotalmax_resultsissuesr   r   r   
get_issuesj   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)rM   rN   rO   rU   u    из rS   )rP   r   get_issues_for_boardr   rA   rB   rQ   )r   board_idrN   rR   rS   rT   rU   r   r   r   rX   z   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   )rY   rM   rN   values)r   Zget_all_sprintr$   )r   rY   rM   rN   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   rZ   )	sprint_idrM   rN   rU   )r   get_sprint_issuesr$   )r   r^   rM   rN   r)   r\   r   r   r   r_      s    zJiraApi.get_sprint_issuesc                 c   s   d}|dkst dd|pd|d}|r0||d< | jjr| j| j | j |d }d|krjt|d |d	 svd
S |d	 E d
H  |d  t|d	 7  < |r8|d |kr8d
S q8n| 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,operationsrZ   uG   Больше 50 за раз запросить не получится!r   startAt
maxResultsrO   ZworkflowNamer,   r"   r[   Nra   )
AssertionErrorr   r
   r*   r   WORKFLOW_SEARCH_URIr%   r&   rQ   Zget_all_workflows)r   namesrN   rO   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  t|d 7  < |r&|d |kr&dS q&n&|r| j |E dH  | j 	 E dH  dS )	u.    Получение всех statuses
        r   Zusagesr`   	projectIdrc   r[   Nra   )
r   r
   rP   r*   r   STATUS_SEARCH_URIr%   rQ   Zget_status_for_projectZget_all_statuses)r   rN   
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 )Nrh   rc   r"   r[   )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/ro   rp   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  t|d 7  < |r|d |krd S qd S )Nr   )ra   rb   z/rest/api/3/workflowschemerc   r"   r[   ra   )rP   r   r*   r%   r&   rQ   )r   rN   r,   r+   r)   r   r   r   get_workflow_scheme   s    zJiraApi.get_workflow_scheme)rm   c                 c   sb   dd|d}| j  d}| j||d }|d s6d S |d E d H  |d  t|d 7  < qd S )Nr   rZ   )ra   rb   rh   z#/rest/api/3/issuetypescheme/projectrc   r[   ra   )r   r*   r%   rQ   )r   rm   r,   r+   r)   r   r   r   get_issue_type_schemes   s    zJiraApi.get_issue_type_schemes)rj   c                 C   s&   d|i}| j  d}| j||d S )Nrh   z/rest/api/3/issuetype/projectrc   ro   )r   rj   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   rw      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 E dH  |d	  t
|d 7  < qdS )
u@    Получим все комментарии по задаче r   rZ   renderedBodyr`   rx   rc   ZcommentsNra   )r@   r   r
   r*   r   COMMENTS_URI_FORMATformatr%   COMMENTS_URI_FORMAT_BOXr$   rQ   )r   rx   r,   r)   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   rZ   )project_keyrM   rN   r[   )r   get_all_agile_boardsr$   r   r   rM   rN   r)   r\   r   r   r   r     s    zJiraApi.get_all_agile_boardsc                 c   sJ   d}d}| j j|||d}|dg s(qF||7 }|d D ]
}|V  q8qd S )Nr   rZ   )keyrM   rN   r[   )r   get_project_versions_paginatedr$   r   r   r   r   r     s    z&JiraApi.get_project_versions_paginatedc                 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offsetrN   rS   Zrecords)r@   r*   r   	AUDIT_URIr%   )r   rm   rM   rN   r,   r)   r\   r   r   r   get_audit_records&  s    zJiraApi.get_audit_recordsrz   c                 C   sP   | j jr| | jj|d}n"| | j | jj|d  }|sHg S |d S )u(   Наблюдатели по задачеrz   watchers)	r   r
   rL   WATCHERS_URI_FORMATr|   r*   r   WATCHERS_URI_FORMAT_BOXr%   )r   rx   r   r   r   r   get_watchers6  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  t
|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`   rc   emailAddress@ZdisplayNameN@   ra   .rZ   )r   rM   rN   )r   r
   r   r*   r%   r$   ZconfigZ
ORG_DOMAINZcmfutilZtranslit_striprQ   Zuser_find_by_user_string)
r   Z	limit_endr+   r,   ZusersZ	user_infoZpostfixr   rM   rN   r   r   r   	get_users@  s>    
*$zJiraApi.get_usersc                 C   s@   | j  }t }|D ]&}d|kr.|||d < q|||d < q|S )u]    Возвращает системные и настраиваемые поля задачи r   rq   )r   Zget_all_fieldsr@   )r   fieldsr)   Zfieldr   r   r   
get_fieldsh  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   r	   "project = "{project}" ORDER BY keyr   z*allrW   )r   rM   rN   rO   rU   )r|   r   r   Zadvanced_mode)r   r   rM   rN   r   rK   r)   r\   r   r   r   get_all_project_issuess  s    zJiraApi.get_all_project_issuesc                 C   s*   dj |d}| jj|ddd}t|d S )Nr   r   r      )rM   rN   rS   )r|   r   r   int)r   r   r   rK   r   r   r   get_project_issues_count  s    z JiraApi.get_project_issues_countc                 c   s   | j  E dH  dS )u*   Возвращает все проектыN)r   Zget_all_projects)r   r   r   r   get_projects  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   Возвращает участников проектаr0   r5   r   )r   Zrolesz\d+$rq   )rj   role_idZactorsZ	actorUserZ	accountIdu+   Не найден пользователь u*    участвующий в проекте r   )project_nameproject_member_emailN)rL   PROJECTS_URIr$   setPROJECT_URI_FORMATr|   r[   r8   searchgroupPROJECT_ROLES_URI_FORMATrF   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   Возвращает вложения задачиrz   r   rH   rc   )rL   ISSUE_URI_FORMATr|   )r   rx   r:   r   r   r   get_attachments  s    zJiraApi.get_attachmentsc                 C   s.   |j dddd }| | j d| }|jS )uJ   
        Скачиваем содержимое вложения
        r      )maxsplit)splitr*   r   Zcontent)r   r   r+   rK   r   r   r   get_attachment_content  s
    zJiraApi.get_attachment_contentc                 c   sl   | j  d| d}tdddd}| j||d }|ds@d S |d E d H  |d	  t|d 7  < q d S )
Nzrest/agile/1.0/board/z/quickfilterr   rZ   ry   r`   rc   r[   ra   )r   r@   r*   r%   r$   rQ   )r   rY   r+   r,   r)   r   r   r   get_board_quick_filters  s    
zJiraApi.get_board_quick_filters)NN)N)r   )r   )Nr   )r   N)r   )N)N)>__name__
__module____qualname__rP   r7   ZAPI_BOX_VERSIONZISSUES_SEARCH_URIre   ri   r   r{   r}   r   r   Z	USERS_URIZ
FIELDS_URIZFIELDS_BOX_URIr   r   r   r   rl   bool__annotations__strr   r*   r   r@   rL   r   rV   rX   r]   r_   rg   rk   rn   rr   rs   rt   listru   r   rv   rw   r~   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r      sf   
















	#




(+	r   )
typingr   r   r   r   r#   Zrequests.authr   Zcmf.includer   r   r   r   r   <module>   s   