U
    EdT                     @   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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< deddZdddejdddZdfeee edddZdge e dd d!Z!dhd"d#Z"d$d% Z#d&d' Z$die e dd(d)Z%dje e dd*d+Z&d,d- Z'd.d/ Z(d0d1 Z)dkd2d3Z*e+d4d5d6Z,e-d7d8d9Z.d:d; Z/ee+d<d=d>Z0d?d@ Z1dAdB Z2dCdD Z3dldEdFZ4edGdHdIZ5dme e ddJdKZ6e7eef ddLdMZ8dndNdOZ9e-ddPdQZ:e e ddRdSZ;e7ee7f e e dTdUdVZ<ee=e d<dWdXZ>dYdZ Z?d[d\ Z@d]d^ ZAd_d` ZBdadb ZCdcdd ZDdS )o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d| i| _|dsT|d }|drb|nd	| | _|| _|| _|| _	|| _
d
| _|| _|rd| d| j | _i | _d S )Nr   )Jirai,  )r   usernamepasswordtokenr
   
verify_ssltimeoutZ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__"   s4    
zJiraApi.__init__F<   )attachr   )returnc                O   s   | j r2| jr2tj|t| j | j| j|d|}ntj|| j| j|d|}|sd|jddkrd| krt| d |S )N)Zauthverifyr   )r   r#   r   zapplication/jsonzContent-type errorMessages)	r   r   requestsgetr   r   r   json	Exception)r   r!   r   argskwargsresr   r   r   jira_request?   s    &"zJiraApi.jira_request)uriparamsr"   c           	      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/   r      u   Код ошибки - z, z - u   , адрес запроса: )r   parentname) replaceAPI_VERSIONresubr   attachmentsr6   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/   r6   
attachmentfresultresponseZ
error_textr   r   r   callH   s4    .((zJiraApi.callr   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   rO   start_attotalmax_resultsissuesr   r   r   
get_issuesk   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)rN   rO   rP   rV   u    из rT   )rQ   r   get_issues_for_boardr   rB   rC   rR   )r   board_idrO   rS   rT   rU   rV   r   r   r   rY   {   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   )rZ   rN   rO   values)r   Zget_all_sprintr'   )r   rZ   rN   rO   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   r[   )	sprint_idrN   rO   rV   )r   get_sprint_issuesr'   )r   r_   rN   rO   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,operationsr[   uG   Больше 50 за раз запросить не получится!r   startAt
maxResultsrP   ZworkflowNamer/   r%   r\   Nrb   )
AssertionErrorr   r
   r-   r   WORKFLOW_SEARCH_URIr(   r)   rR   Zget_all_workflows)r   namesrO   rP   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usagesra   	projectIdrd   r\   Nrb   )
r   r
   rQ   r-   r   STATUS_SEARCH_URIr(   rR   Zget_status_for_projectZget_all_statuses)r   rO   
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 )Nri   rd   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/rp   rq   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   )rb   rc   z/rest/api/3/workflowschemerd   r%   r\   rb   )rQ   r   r-   r(   r)   rR   )r   rO   r/   r.   r,   r   r   r   get_workflow_scheme   s    zJiraApi.get_workflow_scheme)rn   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   r[   )rb   rc   ri   z#/rest/api/3/issuetypescheme/projectrd   r\   rb   )r   r-   r(   rR   )r   rn   r/   r.   r,   r   r   r   get_issue_type_schemes   s    zJiraApi.get_issue_type_schemes)rk   c                 C   s&   d|i}| j  d}| j||d S )Nri   z/rest/api/3/issuetype/projectrd   rp   )r   rk   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   rx      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   r[   renderedBodyra   rz   rd   ZcommentsNrb   )rA   r   r
   r-   r   COMMENTS_URI_FORMATformatr(   COMMENTS_URI_FORMAT_BOXr'   rR   )r   rz   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   r[   )project_keyrN   rO   r\   )r   get_all_agile_boardsr'   r   r   rN   rO   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   r[   )keyrN   rO   r\   )r   get_project_versions_paginatedr'   r   r   r   r   r     s    z&JiraApi.get_project_versions_paginatedc                 C   s   | j |S )N)r   get_project_components)r   r   r   r   r   r   '  s    zJiraApi.get_project_componentsc                 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offsetrO   rT   Zrecords)rA   r-   r   	AUDIT_URIr(   )r   rn   rN   rO   r/   r,   r]   r   r   r   get_audit_records*  s    zJiraApi.get_audit_recordsr|   c                 C   sP   | j jr| | jj|d}n"| | j | jj|d  }|sHg S |d S )u(   Наблюдатели по задачеr|   watchers)	r   r
   rM   WATCHERS_URI_FORMATr~   r-   r   WATCHERS_URI_FORMAT_BOXr(   )r   rz   r   r   r   r   get_watchers:  s    "zJiraApi.get_watchersc                 c   s  | j jr| j d}dddd}|r:|d |kr:||d< | j||d }|sTq|D ]}| j j|d d	d
}dtj }tj	j
jt| }|dst|d d|  | |d< n(d|d kr|d d|  | |d< |V  qX|d  t|7  < |r:|d |kr:qq:nd}d}	d}
| j j||	|
dd}|sBq|D ]}| j j|d d	d}dtj }|dst|d ddt|   | |d< n2d|d kr|d ddt|   | |d< |V  qF|	|
7 }	|r$|	|kr$qq$dS )u    Возвращает список всех пользователей, включая активных,
            неактивных и ранее удаленных, у которых есть учетная запись Atlassian.z/rest/api/3/users/searchr   r	   z"operations,groups,applicationRolesra   rc   rd   	accountIdzgroups,applicationRoles)Z
account_idrP   @emailAddressZdisplayNameNrb   .r[   T)r   rN   rO   Zinclude_inactive_usersr   )r   rP   @   )r   r
   r   r-   r(   userZconfigZ
ORG_DOMAINZcmffieldsZCmfEmailZ
max_lengthrR   r'   ZcmfutilZtranslit_stripZuser_find_by_user_string)r   Z	limit_endr.   r/   ZusersZ	user_infoZpostfixZmax_lenr   rN   rO   r   r   r   	get_usersD  sN    

$,$
zJiraApi.get_usersc                 C   s@   | j  }t }|D ]&}d|kr.|||d < q|||d < q|S )u]    Возвращает системные и настраиваемые поля задачи r   rr   )r   Zget_all_fieldsrA   )r   r   r,   Zfieldr   r   r   
get_fieldsu  s    
zJiraApi.get_fieldsc                 c   s~   d}|r|| |kr|| }dj |d}| jj|d||dd}| jjrL|}n|d }|s\d S |E d H  ||7 }||krqzqd S )Nr	   "project = "{project}" ORDER BY keyr   z*allrX   )r   rN   rO   rP   rV   )r~   r   r   Zadvanced_mode)r   r   rN   maxrO   r   rL   r,   r   r   r   get_all_project_issues  s    
zJiraApi.get_all_project_issuesc                 C   s*   dj |d}| jj|ddd}t|d S )Nr   r   r      )rN   rO   rT   )r~   r   r   int)r   r   r   rL   r   r   r   get_project_issues_count  s    z JiraApi.get_project_issues_countc                 c   s$   | j  }|std|E dH  dS )u*   Возвращает все проектыuE   Не удалось получить ни одного проектаN)r   Zget_all_projectsr)   )r   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   Возвращает участников проектаr2   r6   r   )r   Zrolesz\d+$rr   )rk   role_idZactorsZ	actorUserr   u+   Не найден пользователь u*    участвующий в проекте r   )project_nameproject_member_emailN)rM   PROJECTS_URIr'   setPROJECT_URI_FORMATr~   r\   r9   searchgroupPROJECT_ROLES_URI_FORMATrG   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   Возвращает вложения задачиr|   r   rI   rd   )rM   ISSUE_URI_FORMATr~   )r   rz   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.   rL   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   r[   r{   ra   rd   r\   rb   )r   rA   r-   r(   r'   rR   )r   rZ   r.   r/   r,   r   r   r   get_board_quick_filters  s    
zJiraApi.get_board_quick_filtersc                 C   s$   | j |}| j j|d dd}|S )Nrr   all)rP   )r   get_project_permission_schemeZget_permissionscheme)r   rk   Zschemer   r   r   r     s    z%JiraApi.get_project_permission_schemec                 C   sP   t j| jd|d}g }| | }|d D ]}|| |d   q.|S )Nzrest/api/2/issue
propertieskeysr   )ospathjoinr   r-   r(   append)r   issue_idr.   r   r,   r]   r   r   r   get_issue_properties  s    zJiraApi.get_issue_propertiesc                 C   s   | j |}|d S )NZworklogs)r   issue_get_worklog)r   r   r,   r   r   r   r     s    zJiraApi.issue_get_worklogc                 C   s   t j| jd}| | S )Nzrest/api/2/configuration)r   r   r   r   r-   r(   ry   r   r   r   get_jira_global_settings  s    z JiraApi.get_jira_global_settings)NN)N)r   )r   )Nr   )r   N)r   )N)N)r   N)E__name__
__module____qualname__rQ   r8   ZAPI_BOX_VERSIONZISSUES_SEARCH_URIrf   rj   r   r}   r   r   r   Z	USERS_URIZ
FIELDS_URIZFIELDS_BOX_URIr   r   r   r   rm   bool__annotations__strr   r&   ZResponser-   r   rA   rM   r   rW   rY   r^   r`   rh   rl   ro   rs   rt   ru   listrv   r   rw   rx   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r      sp   
















	#




1
	
r   )
typingr   r   r   r   r&   Zrequests.authr   Zcmf.includer   r   r   r   r   <module>   s   