U
    cc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_sslAuthorizationzBearer /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   /opt/crm/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)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   attachmentsr8   valuer   openfull_path_filer(   loadsread
isinstancedictr   gdebugr   r-   status_codereasontextlogger	exceptionCmfErrormodelsCmfAttachmentupload_fileencodesave)	r   r.   r/   r8   
attachmentfresultresponse
error_textr   r   r   callG   s4    .((zJiraApi.callr   )r0   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   rY   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)rX   rY   rZ   r`   u    из r^   )r[   r   get_issues_for_boardr   rE   rF   r\   )r   board_idrY   r]   r^   r_   r`   r   r   r   rc   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   )rd   rX   rY   values)r   Zget_all_sprintr'   )r   rd   rX   rY   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   re   )	sprint_idrX   rY   r`   )r   get_sprint_issuesr'   )r   ri   rX   rY   r,   rg   r   r   r   rj      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,operationsre   uG   Больше 50 за раз запросить не получится!r   startAt
maxResultsrZ   ZworkflowNamer/   r%   rf   Nrl   )
AssertionErrorr   r
   r-   r   WORKFLOW_SEARCH_URIr(   r)   r\   Zget_all_workflows)r   namesrY   rZ   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usagesrk   	projectIdrn   rf   Nrl   )
r   r
   r[   r-   r   STATUS_SEARCH_URIr(   r\   Zget_status_for_projectZget_all_statuses)r   rY   
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 )Nrs   rn   r%   rf   )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/rz   r{   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   )rl   rm   z/rest/api/3/workflowschemern   r%   rf   rl   )r[   r   r-   r(   r)   r\   )r   rY   r/   r.   r,   r   r   r   get_workflow_scheme   s    zJiraApi.get_workflow_scheme)rx   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   re   )rl   rm   rs   z#/rest/api/3/issuetypescheme/projectrn   rf   rl   )r   r-   r(   r\   )r   rx   r/   r.   r,   r   r   r   get_issue_type_schemes   s    zJiraApi.get_issue_type_schemes)ru   c                 C   s&   d|i}| j  d}| j||d S )Nrs   z/rest/api/3/issuetype/projectrn   rz   )r   ru   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   r      s    zJiraApi.get_issue_types)	issue_keyr0   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   re   renderedBodyrk   r   rn   commentsNrl   )rD   r   r
   r-   r   COMMENTS_URI_FORMATformatr(   COMMENTS_URI_FORMAT_BOXr'   r\   )r   r   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   re   )project_keyrX   rY   rf   )r   get_all_agile_boardsr'   r   r   rX   rY   r,   rg   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   re   )keyrX   rY   rf   )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offsetrY   r^   records)rD   r-   r   	AUDIT_URIr(   )r   rx   rX   rY   r/   r,   rg   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
   rW   WATCHERS_URI_FORMATr   r-   r   WATCHERS_URI_FORMAT_BOXr(   )r   r   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	   
operationsrk   rn   emailAddress@displayNameN@   rl   .re   )r   rX   rY   )r   r
   r   r-   r(   r'   config
ORG_DOMAINcmfutiltranslit_stripr\   Zuser_find_by_user_string)
r   Z	limit_endr.   r/   usersZ	user_infopostfixr   rX   rY   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   r|   )r   Zget_all_fieldsrD   )r   fieldsr,   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*allrb   )r   rX   rY   rZ   r`   )r   r   r   Zadvanced_mode)r   r   rX   rY   r   rU   r,   rg   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      )rX   rY   r^   )r   r   r   int)r   r   r   rU   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   get_all_projects)r   r   r   r   get_projects  s    zJiraApi.get_projects)settings_usersr0   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   r8   r   )r   rolesz\d+$r|   )ru   role_idZactorsZ	actorUserZ	accountIdu+   Не найден пользователь u*    участвующий в проекте r   )project_nameproject_member_emailN)rW   PROJECTS_URIr'   setPROJECT_URI_FORMATr   rf   r;   searchgroupPROJECT_ROLES_URI_FORMATrL   add)r   r   r   Zadded_users_to_projectr   Zproject_info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   rR   rn   )rW   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   content)r   r   r.   rU   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   re   r   rk   rn   rf   rl   )r   rD   r-   r(   r'   r\   )r   rd   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__r[   r:   ZAPI_BOX_VERSIONZISSUES_SEARCH_URIrp   rt   r   r   r   r   r   Z	USERS_URIZ
FIELDS_URIZFIELDS_BOX_URIr   r   r   r   rw   bool__annotations__strr    r-   r   rD   rW   r   ra   rc   rh   rj   rr   rv   ry   r}   r~   r   listr   r   r   r   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   cmf.includer   r   r   r   r   <module>   s   