U
    dMY                     @   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                   @   sl  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< d\ddZddej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%dae e dd)d*Z&d+d, Z'd-d. Z(d/d0 Z)dbd1d2Z*e+d3d4d5Z,e-d6d7d8Z.d9d: Z/ee+d;d<d=Z0d>d? Z1d@dA Z2dcdBdCZ3edDdEdFZ4dde e ddGdHZ5e6eef ddIdJZ7dedKdLZ8e-ddMdNZ9e e ddOdPZ:e6ee6f e e dQdRdSZ;ee<e d;dTdUZ=dVdW Z>dXdY Z?dZd[ Z@dS )f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timeout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__"   s4    
zJiraApi.__init__F)attach)returnc                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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
   )r1   r      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   r0   r1   r8   
attachmentfresultresponse
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   rY   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)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   {   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r1   r'   rf   Nrl   )
AssertionErrorr   r
   r/   r   WORKFLOW_SEARCH_URIr*   r+   r\   Zget_all_workflows)r   namesrY   rZ   r1   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_idr1   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_idsr1   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   idr0   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   r1   r0   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   r1   r0   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   r1   r0   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   r0   r   r   r    r      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   re   renderedBodyrk   r   rn   commentsNrl   )rD   r   r
   r/   r   COMMENTS_URI_FORMATformatr*   COMMENTS_URI_FORMAT_BOXr)   r\   )r   r   r1   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   r1   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_watchers7  s    "zJiraApi.get_watchersc           
      c   s  | j jr| j d}dddd}|r8|d |kr8||d< | j||d }|sPq|D ]^}| j j|d d	d
}|dsdtj }t	
|d ddt|   | |d< |V  qT|d  t|7  < |r8|d |kr8qq8nd}d}d}	| j j|||	dd}|sq|D ]b}| j j|d d	d}|dsfdtj }t	
|d ddt|   | |d< |V  q||	7 }|r||krqqdS )u    Возвращает список всех пользователей, включая активных,
            неактивных и ранее удаленных, у которых есть учетная запись Atlassian.z/rest/api/3/users/searchr   r	   z"operations,groups,applicationRolesrk   rm   rn   	accountIdzgroups,applicationRoles)Z
account_idrZ   emailAddress@displayNameN@   rl   .re   T)r   rX   rY   Zinclude_inactive_usersr   )r   rZ   )r   r
   r   r/   r*   userr)   config
ORG_DOMAINcmfutiltranslit_stripr\   Zuser_find_by_user_string)
r   Z	limit_endr0   r1   usersZ	user_infopostfixr   rX   rY   r   r   r    	get_usersA  sJ    
*$
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_fieldsn  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*allrb   )r   rX   rY   rZ   r`   )r   r   r   Zadvanced_mode)r   r   rX   maxrY   r   rU   r.   r   r   r    get_all_project_issuesy  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_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   Возвращает участников проектаr4   r8   r   )r   rolesz\d+$r|   )ru   role_idZactorsZ	actorUserr   u+   Не найден пользователь 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   r0   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   r0   r1   r.   r   r   r    get_board_quick_filters  s    
zJiraApi.get_board_quick_filtersc                 C   s$   | j |}| j j|d dd}|S )Nr|   all)rZ   )r   get_project_permission_schemeZget_permissionscheme)r   ru   schemer   r   r    r     s    z%JiraApi.get_project_permission_scheme)NN)N)r   )r   )Nr   )r   N)r   )N)N)r   N)A__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(   Responser/   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    r      sh   
















	#




-
+	
r   )
typingr   r   r   r   r(   Zrequests.authr   cmf.includer   r   r   r   r    <module>   s   