U
    d.U                     @   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t d| _dd| i| _|dsZ|d }|drh|nd	| | _|| _	|| _
|| _|| _d
| _|| _|rd| d| j | _i | _d S )Nr   )Jirai,  )r   usernamepasswordtokenr
   
verify_ssltimeoutZsessionZAuthorizationzBearer /Zhttpzhttps://zorder by created ASCzproject = 'z' )Z	atlassianr   cmfutilrequests_session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__"   s6    	
zJiraApi.__init__F<   )attachr   )returnc                O   s   | j r6| jr6t 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   r   r   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
   )r0   r      u   Код ошибки - z, z - u   , адрес запроса: )r   parentname) replaceAPI_VERSIONresubr   attachmentsr7   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/   r0   r7   
attachmentfresultresponseZ
error_textr   r   r    callI   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   rP   start_attotalmax_resultsissuesr   r   r    
get_issuesl   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)rO   rP   rQ   rW   u    из rU   )rR   r   get_issues_for_boardr   rC   rD   rS   )r   board_idrP   rT   rU   rV   rW   r   r   r    rZ   |   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   )r[   rO   rP   values)r   Zget_all_sprintr(   )r   r[   rO   rP   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_idrO   rP   rW   )r   get_sprint_issuesr(   )r   r`   rO   rP   r-   r^   r   r   r    ra      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
maxResultsrQ   ZworkflowNamer0   r'   r]   Nrc   )
AssertionErrorr   r
   r.   r   WORKFLOW_SEARCH_URIr)   r*   rS   Zget_all_workflows)r   namesrP   rQ   r0   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usagesrb   	projectIdre   r]   Nrc   )
r   r
   rR   r.   r   STATUS_SEARCH_URIr)   rS   Zget_status_for_projectZget_all_statuses)r   rP   
project_idr0   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 )Nrj   re   r'   r]   )r.   r   WORKFLOW_PROJECT_URIr)   r*   )r   project_idsr0   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/rq   rr   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   )rc   rd   z/rest/api/3/workflowschemere   r'   r]   rc   )rR   r   r.   r)   r*   rS   )r   rP   r0   r/   r-   r   r   r    get_workflow_scheme   s    zJiraApi.get_workflow_scheme)ro   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\   )rc   rd   rj   z#/rest/api/3/issuetypescheme/projectre   r]   rc   )r   r.   r)   rS   )r   ro   r0   r/   r-   r   r   r    get_issue_type_schemes   s    zJiraApi.get_issue_type_schemes)rl   c                 C   s&   d|i}| j  d}| j||d S )Nrj   z/rest/api/3/issuetype/projectre   rq   )r   rl   r0   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    ry      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\   renderedBodyrb   r{   re   ZcommentsNrc   )rB   r   r
   r.   r   COMMENTS_URI_FORMATformatr)   COMMENTS_URI_FORMAT_BOXr(   rS   )r   r{   r0   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_keyrO   rP   r]   )r   get_all_agile_boardsr(   r   r   rO   rP   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\   )keyrO   rP   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offsetrP   rU   Zrecords)rB   r.   r   	AUDIT_URIr)   )r   ro   rO   rP   r0   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
   rN   WATCHERS_URI_FORMATr   r.   r   WATCHERS_URI_FORMAT_BOXr)   )r   r{   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,applicationRolesrb   rd   re   	accountIdzgroups,applicationRoles)Z
account_idrQ   @emailAddressZdisplayNameNrc   .r\   T)r   rO   rP   Zinclude_inactive_usersr   )r   rQ   @   )r   r
   r   r.   r)   userZconfigZ
ORG_DOMAINZcmffieldsZCmfEmailZ
max_lengthrS   r(   r   Ztranslit_stripZuser_find_by_user_string)r   Z	limit_endr/   r0   ZusersZ	user_infoZpostfixZmax_lenr   rO   rP   r   r   r    	get_usersE  sN    

$,$
zJiraApi.get_usersc                 C   s@   | j  }t }|D ]&}d|kr.|||d < q|||d < q|S )u]    Возвращает системные и настраиваемые поля задачи r   rs   )r   Zget_all_fieldsrB   )r   r   r-   Zfieldr   r   r    
get_fieldsv  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*allrY   )r   rO   rP   rQ   rW   )r   r   r   Zadvanced_mode)r   r   rO   maxrP   r   rM   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      )rO   rP   rU   )r   r   r   int)r   r   r   rM   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   Возвращает участников проектаr3   r7   r   )r   Zrolesz\d+$rs   )rl   role_idZactorsZ	actorUserr   u+   Не найден пользователь u*    участвующий в проекте r   )project_nameproject_member_emailN)rN   PROJECTS_URIr(   setPROJECT_URI_FORMATr   r]   r:   searchgroupPROJECT_ROLES_URI_FORMATrH   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   rJ   re   )rN   ISSUE_URI_FORMATr   )r   r{   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/   rM   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|   rb   re   r]   rc   )r   rB   r.   r)   r(   rS   )r   r[   r/   r0   r-   r   r   r    get_board_quick_filters  s    
zJiraApi.get_board_quick_filtersc                 C   s$   | j |}| j j|d dd}|S )Nrs   all)rQ   )r   get_project_permission_schemeZget_permissionscheme)r   rl   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)   rz   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__rR   r9   ZAPI_BOX_VERSIONZISSUES_SEARCH_URIrg   rk   r   r~   r   r   r   Z	USERS_URIZ
FIELDS_URIZFIELDS_BOX_URIr   r   r   r   rn   bool__annotations__strr!   requestsZResponser.   r   rB   rN   r   rX   rZ   r_   ra   ri   rm   rp   rt   ru   rv   listrw   r   rx   ry   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   