U
    VcG                     @   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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dZdGddZdd ZdHeee edddZdIee dddZdJddZdd Zd d! ZdKee dd"d#ZdLee dd$d%Zd&d' Zd(d) Z d*d+ Z!dMd,d-Z"d.d/ Z#ee$d0d1d2Z%d3d4 Z&dNd5d6Z'ed7d8d9Z(dOee dd:d;Z)e*eef dd<d=Z+ee dd>d?Z,e*ee*f ee d@dAdBZ-ee.e d0dCdDZ/dEdF Z0dS )PJiraApid   z/rest/api/3z/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/projectNc	           
      C   s   ddl m}	 |	||||||d| _dd| i| _|dr@|nd| | _|| _|| _|| _|| _	d| _
|| _|rd	| d
| j
 | _
i | _d S )Nr   )Jira)urlusernamepasswordtokencloud
verify_sslAuthorizationzBearer httpzhttps://zorder by created ASCzproject = 'z' )Z	atlassianr
   connheaders
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__   s(    zJiraApi.__init__c                 O   sL   | j r.| jr.tj|t| j | j| jd|S tj|| j| jd|S d S )N)authverify)r   r    )r   r   requestsgetr   r   r   )r   argskwargsr   r   r   jira_request2   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.json z[/ '"{}]rdata
   )r'   timeout   u   Код ошибки - z, z - u   , адрес запроса: )r   parentname) replaceAPI_VERSIONresubr   attachmentsr1   valueendswithopenfull_path_filejsonloadsread
isinstancedictr   gdebugr   r%   status_codereasontextlogger	exceptionCmfErrormodelsCmfAttachmentupload_fileencodesave)	r   r&   r'   r1   
attachmentfresultresponse
error_textr   r   r   call8   s4    .((zJiraApi.callr   )r(   c                 c   s   d}d}|p| j }| j| j||| jddd}|d s:d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 )	u(    Получение всех задач r   ZrenderedFields)startAt
maxResultsr   expandr'   issuesN    из total)MAX_ISSUES_RESULT_PER_REQUESTrR   ISSUES_SEARCH_URIr   r@   rA   len)r   limitstart_atrY   max_resultsrW   r   r   r   
get_issues[   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   zchangelog,renderedFields)startr]   rU   rW   rX   rY   )rZ   r   get_issues_for_boardr   r@   rA   r\   )r   board_idr]   r^   rY   r_   rW   r   r   r   rb   w   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   )rc   ra   r]   values)r   Zget_all_sprintr"   )r   rc   ra   r]   res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   rd   )	sprint_idra   r]   rW   )r   get_sprint_issuesr"   )r   ri   ra   r]   rf   rg   r   r   r   rj      s    zJiraApi.get_sprint_issuesc                 c   s   d|p
| j dd}|r||d< | j| j | j |d }|d sHdS |d E dH  |d  |d	 7  < |d |krdS qdS )
u    Получение всех workflow
        https://developer.atlassian.com/cloud/jira/platform/rest/v3/api-group-workflows/#api-rest-api-3-workflow-search-get
        r   ztransitions,transitions.rules,transitions.properties,statuses,statuses.properties,default,schemes,projects,hasDraftWorkflow,operationsrS   rT   rU   ZworkflowNamerV   re   NrS   rT   )rZ   r%   r   WORKFLOW_SEARCH_URIr;   )r   namesr]   r'   rf   r   r   r   get_workflows   s    
zJiraApi.get_workflowsc                 c   s   d|p
| j dd}|r||d< | j| j | j |d }|d sHdS |d E dH  |d  |d	 7  < |d |krdS qdS )
u.    Получение всех statuses
        r   Zusagesrk   	projectIdrV   re   NrS   rT   )rZ   r%   r   STATUS_SEARCH_URIr;   )r   r]   
project_idr'   rf   r   r   r   get_statuses   s    
zJiraApi.get_statusesc                 C   s*   d|i}| j | j | j |d d S )Nro   rV   re   )r%   r   WORKFLOW_PROJECT_URIr;   )r   project_idsr'   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/rv   rw   r   r   r   get_issue_type   s    zJiraApi.get_issue_typec                 c   sr   d|p
| j d}| j d}| j||d }|d s:d S |d E d H  |d  |d 7  < |d |krd S qd S )Nr   rS   rT   z/rest/api/3/workflowschemerV   re   rS   rT   )rZ   r   r%   r;   )r   r]   r'   r&   rf   r   r   r   get_workflow_scheme   s    zJiraApi.get_workflow_schemec                 C   s   | j  d}| | S )Nz/rest/api/3/issuetyperv   )r   r&   r   r   r   get_issue_types   s    zJiraApi.get_issue_types)	issue_keyr(   c                 C   s,   | j | jj|dddid}|s$g S |d S )u@    Получим все комментарии по задаче r~   rU   ZrenderedBodyrV   comments)rR   COMMENTS_URI_FORMATformat)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   rd   )project_keyra   r]   re   )r   get_all_agile_boardsr"   )r   r   ra   r]   rf   rg   r   r   r   r      s    zJiraApi.get_all_agile_boardsc                 c   sh   d}d}t  }|r||d< ||d< ||d< | | j|}||d krFqd||7 }|d D ]
}|V  qVqd S )Nr   i  Z
projectIdsoffsetr]   rY   records)r?   rR   	AUDIT_URI)r   rt   ra   r]   r'   rf   rg   r   r   r   get_audit_records   s    zJiraApi.get_audit_recordsr   c                 C   s$   |  | jj|d}|sg S |d S )u(   Наблюдатели по задачеr   watchers)rR   WATCHERS_URI_FORMATr   )r   r~   r   r   r   r   get_watchers   s    zJiraApi.get_watchersc           
      c   sF  | j jr| j d}ddd}| j||d }|s6q|D ]J}|ds~dtj }t	|d d	d
t
|   | |d< |V  q:|d  |d 7  < |r|d |krqqnd}d}d}	| j j|||	d}|s֐qB|D ]L}|ds dtj }t	|d d	d
t
|   | |d< |V  q||	7 }|r||krqBqd	S )u    Возвращает список всех пользователей, включая активных,
            неактивных и ранее удаленных, у которых есть учетная запись Atlassian.z/rest/api/3/users/searchr   r	   r{   rV   emailAddress@displayNameN@   rS   rT   .rd   )r   ra   r]   )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   ra   r]   r   r   r   	get_users  s>    

*$zJiraApi.get_usersc                 C   sF   |  | j}t }|d D ]&}d|kr4|||d < q|||d < q|S )u]    Возвращает системные и настраиваемые поля задачи r,   keyrx   )rR   
FIELDS_URIr?   )r   fieldsrf   fieldr   r   r   
get_fields.  s    zJiraApi.get_fieldsc              	   c   s6  | j  D ]$}|d }|d }| j |}|di }|r| |d  }|d }|drh|d }|d| d|dd	d
}n
ddd
}|d dkrtjjdd}	nL|d dkrtjjdd}	n0|d dkrtjjdd}	ntd|d  d||	j	j
|d tjjddj	j
|||d d}
|
V  q
dS )u*   Возвращает все проектыr1   r   leadr   	accountIdr   z@evateam.comr   r*   )emailr1   zdefault_import_jira@evateam.comZdefault_import_jiraZprojectTypeKeybusinesszproject.base:default)codeZsoftwarezproject.agile:defaultZservice_deskzproject.servicedesk:defaultu$   ERROR! Поректы с типом u3    временно не поддерживаютсяdescriptionsoftdevrx   )r1   
logic_typerD   activitytask_code_prefix	cmf_ownerext_idN)r   get_all_projectsget_projectr"   r%   r;   rH   CmfLogicType	Exceptionrx   r7   CmfActivity)r   r   project_namer   project_infoZproject_leadZ	jira_userZjira_usernamer   r   Zproject_structr   r   r   get_projects9  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   Возвращает участников проектаr,   r1   r   )r   rolesz\d+$rx   )rq   role_idZactorsZ	actorUserr   u+   Не найден пользователь u*    участвующий в проекте r   )r   project_member_emailN)rR   PROJECTS_URIr"   setPROJECT_URI_FORMATr   re   r4   searchgroupPROJECT_ROLES_URI_FORMATrG   add)r   r   r   Zadded_users_to_projectr   r   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   rM   rV   )rR   ISSUE_URI_FORMATr   )r   r~   r6   r   r   r   get_attachmentst  s    zJiraApi.get_attachmentsc                 C   s.   |j dddd }| | j d| }|jS )uJ   
        Скачиваем содержимое вложения
        /   )maxsplit)splitr%   r   content)r   r   r&   rP   r   r   r   get_attachment_content{  s
    zJiraApi.get_attachment_content)NN)N)r   )r   )Nr   )r   N)r   )N)N)1__name__
__module____qualname__rZ   r3   r[   rl   rp   r   r   r   Z	USERS_URIr   r   r   r   r   rs   r   r%   strr   r?   rR   r   r`   rb   rh   rj   rn   rr   ru   ry   rz   r|   r}   listr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r      sN   












#


(&r   )
typingr   r   r   r   r!   Zrequests.authr   cmf.includer   r   r   r   r   <module>   s   