B
    f                 @   sz   d dl mZmZmZmZ d dlZd dlmZ d dlm	Z	 d dl
Z
d dlmZ d dlT edZdddZG dd dZdS )    )DictListOptionalIteratorN)wraps)sleep)HTTPBasicAuth)*zatlassian.rest_client皙?         c                s    fdd}|S )u-  
    Декоратор для повторного выполнения функции через некоторое время, при возникновении ошибки.
    Использует экспоненциальный рост времени повтора(factor) до граничного времени ожидания(border_sleep_time)

    :param exception: исключения, которые отлавливаются
    :param start_sleep_time: начальное время повтора
    :param factor: во сколько раз нужно увеличить время ожидания
    :param border_sleep_time: граничное время ожидания
    :param max_attempts: максимальное количество попыток выполнения
    c                sN   t   fdd}t   fdd}t rJ|S |S )Nc           
   ?   s   d}}xr|d7 }y| |E d H S  k
rv } z6|kr@|| krN }n|d  7 }t | W d d }~X Y q
X q
W d S )Nr      r   )r   )argskwargsattempttime_outerror)border_sleep_time	exceptionfactorfuncmax_attemptsstart_sleep_time ./modules/jira/api.py	gen_retry   s    z3backoff.<locals>.retry_exception.<locals>.gen_retryc           
      sz   d}}xl|d7 }y
| |S  k
rp } z6|kr:|| krH }n|d  7 }t | W d d }~X Y q
X q
W d S )Nr   r   r   )r   )r   r   r   r   r   )r   r   r   r   r   r   r   r   retry-   s    
z/backoff.<locals>.retry_exception.<locals>.retry)r   inspectZisgeneratorfunction)r   r   r   )r   r   r   r   r   )r   r   retry_exception   s
    
z backoff.<locals>.retry_exceptionr   )r   r   r   r   r   r   r   )r   r   r   r   r   r   backoff   s    -r    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< dddZdddejdddZdeee edddZde e dd d!Z!dd"d#Z"e#e$d$d% Z%e#e$d&d' Z&de e dd(d)Z'de e dd*d+Z(d,d- Z)d.d/ Z*d0d1 Z+dd2d3Z,e-d4d5d6Z.e/d7d8d9Z0d:d; Z1ee-d<d=d>Z2d?d@ Z3dAdB Z4dCdD Z5dEdF Z6ddGdHZ7edIdJdKZ8de e ddLdMZ9ddNdOZ:ddPdQZ;dRdS Z<dTdU Z=dVdW Z>e?eef ddXdYZ@dZd[ ZAdd\d]ZBdd^d_ZCe/dd`daZDde/ddbdcZEe e ddddeZFe?ee?f e e dfdgdhZGeeHe d<didjZIdkdl ZJdmdn ZKdodp ZLdqdr ZMdsdt ZNdudv ZOdwdx ZPdydz ZQd{d| ZRd}d~ ZSdd ZTdd ZUdd ZVdd ZWdd ZXdd ZYdd ZZdd Z[dd Z\de/e/e-dddZ]deeedddZ^dd Z_dd Z`dd Zadd Zbdd Zcdd ZddddZedd Zfdd Zgdd ZhdS )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$   r2   r(   r'   r#   r)   projectr4   r%   r   r   r   __init__b   s4    
zJiraApi.__init__F<   )attachr*   )returnc            O   s   ddl m} | jrH| jrHt j|f|t| j| j| j|d|}n&t j|f|| j	| j|d|}|dr| d||d  }| j
jd||di tjd	 |sd
|j	ddkrd| krt| d |S )Nr   )	urlencode)Zauthverifyr*   )r/   r=   r*   params?ZGETdata)r@   levelzapplication/jsonzContent-type errorMessages)Zsix.moves.urllib.parser<   r2   r'   r,   r-   getr   r)   r/   r.   Zlog_curl_debugloggingINFOjson	Exception)r6   r$   r:   r*   r   r   r<   resr   r   r   jira_request   s    0&
"zJiraApi.jira_request)urir>   r;   c       	   
   C   s  |r| d| dn| d}| | jd}tdd|}| jr| jjrxX| jjD ]L}|jj|rRt	|j
jd&}t| }t|tr|S d|iS Q R X qRW || jkrt	| j| d&}t| }t|tr|S d|iS Q R X t| j|  | j| j| |dd	}| jr`|jd
kr`d|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.jsonrB   z[/ '"{}]rr@   N
   )r>   r*      u   Код ошибки - z, z - u   , адрес запроса: )r4   parentname) replaceAPI_VERSIONresubr4   attachmentsrQ   valuer0   openZfull_path_filerG   loadsread
isinstancedictr5   gdebugr$   rJ   status_codereasontextloggerr   CmfErrorZmodelsZCmfAttachmentZupload_fileencodeZsave)	r6   rK   r>   rQ   
attachmentfresultresponse
error_textr   r   r   call   s4     
(zJiraApi.callr   c             c   st   d}d}|p| j }x\| jj| j||dd}|s2dS ||7 }|E dH  |t|7 }d|  k rd|krn qdS qW dS )u(    Получение всех задач r   ZrenderedFields)r3   startlimitexpandN)MAX_ISSUES_RESULT_PER_REQUESTr.   Zjql_get_list_of_ticketsr3   len)r6   rl   start_attotalmax_resultsissuesr   r   r   
get_issues   s    

zJiraApi.get_issuesc             c   s   d}d}|p| j }x| jj|| j||dd}|d s8d S ||7 }t| d|d   |d E d H  |t|d 7 }d|  k r|ksn ||d krd S qW d S )Nr   zchangelog,renderedFields)rk   rl   rm   rs   u    из rq   )rn   r.   get_issues_for_boardr3   r]   r^   ro   )r6   board_idrl   rp   rq   rr   rs   r   r   r   ru      s    
"zJiraApi.get_issues_for_boardc             c   sR   d}d}xD| j j|||d}|dg s*P ||7 }x|d D ]
}|V  q<W q
W d S )Nr   2   )rv   rk   rl   values)r.   Zget_all_sprintrD   )r6   rv   rk   rl   rI   rowr   r   r   get_sprints   s    zJiraApi.get_sprintsc             c   sR   d}d}xD| j j|||d}|dg s*P ||7 }x|d D ]
}|V  q<W q
W d S )Nr   rw   )	sprint_idrk   rl   rs   )r.   get_sprint_issuesrD   )r6   r{   rk   rl   rI   ry   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rx| j| j | j |d }d|krlt|d |d	 sxd
S |d	 E d
H  |d  t|d	 7  < |r:|d |kr:d
S q:W n| 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,operationsrw   uG   Больше 50 за раз запросить не получится!r   )startAt
maxResultsrm   ZworkflowName)r>   rC   rx   Nr}   )
AssertionErrorr.   r#   rJ   r$   WORKFLOW_SEARCH_URIrG   rH   ro   Zget_all_workflows)r6   namesrl   rm   r>   rI   r   r   r   get_workflows   s$    
zJiraApi.get_workflowsc             c   s   | j jrd|p| jdd}|r&||d< x| j| j | j |d }|d sRdS |d E dH  |d  t|d 7  < |r(|d |kr(dS q(W n&|r| j |E dH  | j 	 E dH  dS )	u.    Получение всех statuses
        r   Zusages)r}   r~   rm   	projectId)r>   rx   Nr}   )
r.   r#   rn   rJ   r$   STATUS_SEARCH_URIrG   ro   Zget_status_for_projectZget_all_statuses)r6   rl   
project_idr>   rI   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 )Nr   )r>   rC   rx   )rJ   r$   WORKFLOW_PROJECT_URIrG   rH   )r6   project_idsr>   rI   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$   rJ   rG   )r6   idrK   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/)r$   rJ   rG   )r6   r   rK   r   r   r   get_issue_type#  s    zJiraApi.get_issue_typec             c   s   d|p
| j d}| j d}xp| j||d }d|krDt|d |d sPd S |d E d H  |d  t|d 7  < |r|d |krd S qW d S )Nr   )r}   r~   z/rest/api/3/workflowscheme)r>   rC   rx   r}   )rn   r$   rJ   rG   rH   ro   )r6   rl   r>   rK   rI   r   r   r   get_workflow_scheme'  s    zJiraApi.get_workflow_scheme)r   c             c   sf   dd|d}| j  d}xH| j||d }|d s8d S |d E d H  |d  t|d 7  < qW d S )Nr   rw   )r}   r~   r   z#/rest/api/3/issuetypescheme/project)r>   rx   r}   )r$   rJ   rG   ro   )r6   r   r>   rK   rI   r   r   r   get_issue_type_schemes5  s    zJiraApi.get_issue_type_schemes)r   c             C   s&   d|i}| j  d}| j||d S )Nr   z/rest/api/3/issuetype/project)r>   )r$   rJ   rG   )r6   r   r>   rK   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$   rJ   rG   get_issue_types)r6   rK   r   r   r   r   D  s    zJiraApi.get_issue_types)	issue_keyr;   c             c   s   t dddd}x| jjrD| jtj| j| j j	|d|d
 }n*| jtj| j| j j	|d|d
 }|ds|dS |d E dH  |d	  t|d 7  < qW dS )
u@    Получим все комментарии по задаче r   rw   renderedBody)r}   r~   rm   )r   )r>   ZcommentsNr}   )r\   r.   r#   rJ   ospathjoinr$   COMMENTS_URI_FORMATformatrG   COMMENTS_URI_FORMAT_BOXrD   ro   )r6   r   r>   rI   r   r   r   get_commentsK  s    ,*
zJiraApi.get_commentsc             c   sR   d}d}xD| j j|||d}|dg s*P ||7 }x|d D ]
}|V  q<W q
W d S )Nr   rw   )project_keyrk   rl   rx   )r.   get_all_agile_boardsrD   )r6   r   rk   rl   rI   ry   r   r   r   r   X  s    zJiraApi.get_all_agile_boardsc             C   s&   | j  d}| j|d|id }|S )Nz3rest/greenhopper/1.0/rapidviewconfig/editmodel.jsonZrapidViewId)r>   )r$   rJ   rG   )r6   rv   rK   rh   r   r   r   get_advanced_board_settingsc  s    z#JiraApi.get_advanced_board_settingsc             c   sR   d}d}xD| j j|||d}|dg s*P ||7 }x|d D ]
}|V  q<W q
W d S )Nr   rw   )keyrk   rl   rx   )r.   get_project_versions_paginatedrD   )r6   r   rk   rl   rI   ry   r   r   r   r   i  s    z&JiraApi.get_project_versions_paginatedc             C   s   | j |S )N)r.   get_project_components)r6   r   r   r   r   r   t  s    zJiraApi.get_project_componentsc             c   s~   d}d}t  }|r||d< x^||d< ||d< | | j | j | }||d krVP ||7 }x|d D ]
}|V  qhW qW d S )Nr   i  Z
projectIdsoffsetrl   rq   Zrecords)r\   rJ   r$   	AUDIT_URIrG   )r6   r   rk   rl   r>   rI   ry   r   r   r   get_audit_recordsw  s    zJiraApi.get_audit_records)r   c             C   sP   | j jr| | jj|d}n"| | j | jj|d  }|sHg S |d S )u(   Наблюдатели по задаче)r   watchers)	r.   r#   rj   WATCHERS_URI_FORMATr   rJ   r$   WATCHERS_URI_FORMAT_BOXrG   )r6   r   r   r   r   r   get_watchers  s    "zJiraApi.get_watchersc             c   s^  | j jr| j d}dddd}|r8|d |kr8||d< xj| j||d }|sRP x&|D ]}|| |d  |V  qXW |d	  t|7  < |r:|d	 |kr:P q:W ntj	
| jd
}dddd}|r|d |kr||d< d|d< d|d< xn| j||d }|sP x(|D ] }|| |d  |V  qW |d	  t|7  < |r|d	 |krP qW dS )u   Возвращает список всех пользователей, включая активных,
            неактивных и ранее удаленных, у которых есть учетная запись Atlassian.
            в старых версиях невозможно получить больше 1000 учеток
            https://jira.atlassian.com/browse/JRASERVER-65089
            исправлено в 8.7.0, 8.6.1 и выше
            z/rest/api/3/users/searchr   r"   z"operations,groups,applicationRoles)r}   r~   rm   r~   )r>   	accountIdr}   zrest/api/2/user/search.r&   TZincludeInactiver   N)r.   r#   r$   rJ   rG   updateget_user_inforo   r   r   r   )r6   Z	limit_endrK   r>   Zusers	user_infor   r   r   	get_users  s>    


zJiraApi.get_usersc          
   C   sN   y| j j||dS  tjk
rH } z|jjdkr4d S |W d d }~X Y nX d S )N)r   rm   i  )r.   userrequests	HTTPErrorrh   r_   )r6   r   rm   excr   r   r   get_user_info_by_key  s    zJiraApi.get_user_info_by_keyc          
   C   sN   y| j j||dS  tjk
rH } z|jjdkr4d S |W d d }~X Y nX d S )N)r&   rm   i  )r.   r   r   r   rh   r_   )r6   r&   rm   r   r   r   r   get_user_info_by_username  s    z!JiraApi.get_user_info_by_usernamec             C   s   d}| j jr$| j j|| dd}n4| j||d}|sD| j||d}|sXtd| ddtj }tj	j
jt| }|d	st|d
 d |  | |d	< n(d|d	 kr|d	 d |  | |d	< |S )Nzgroups,applicationRolesz,operations)Z
account_idrm   )r   rm   )r&   rm   u   Пользователь u    не найден@emailAddressZdisplayName)r.   r#   r   r   r   rH   ZconfigZ
ORG_DOMAINZcmffieldsZCmfEmailZ
max_lengthro   rD   r,   Ztranslit_strip)r6   r   rm   r   ZpostfixZmax_lenr   r   r   r     s    
$zJiraApi.get_user_infoc             C   sr   ddd}g }x^| j tj| jd| d|d }||d  t||d krVP |d	  |d
 7  < qW |S )Nr   rw   )r}   r~   zrest/api/2/field/z/context)r>   rx   rq   r}   r~   )rJ   r   r   r   r$   rG   extendro   )r6   r   r>   rI   rh   r   r   r   _get_field_context  s    
&zJiraApi._get_field_contextc             C   s|   t j| jd| d| d}ddd}g }xJ| j||d }||d  t||d	 kr`P |d
  |d 7  < q.W |S )Nzrest/api/2/field/z	/context/z/optionr   rw   )r}   r~   )r>   rx   rq   r}   r~   )r   r   r   r$   rJ   rG   r   ro   )r6   ZfieldId	contextIdr$   r>   rI   rh   r   r   r   _get_field_options  s    
zJiraApi._get_field_optionsc             C   s   | j  }t }x|D ]}d|kr0|||d < n|||d < | j jr|d rg |d< g |d< yd| |d |d< xL|d D ]@}y.| |d |d }||d< |d | W qz   Y qzX qzW W q   Y qX qg |d< g |d< qW |S )u]    Возвращает системные и настраиваемые поля задачи r   r   Zcustomcontextoptions)r.   Zget_all_fieldsr\   r#   r   r   r   )r6   r   rI   fieldr   r   r   r   r   
get_fields  s.    

zJiraApi.get_fieldsc             C   s   | j |S )N)r.   Zissue_editmeta)r6   r   r   r   r   get_issue_meta  s    zJiraApi.get_issue_metac             c   s   d}xx|r|| |kr|| }dj |d}| jj|d||dd}| jjrN|}n|d }|s^d S |E d H  ||7 }||krP qW d S )Nr"   z"project = "{project}" ORDER BY key)r7   z*allzchangelog,renderedFields)r   rk   rl   rm   rs   )r   r.   r3   advanced_mode)r6   r   rk   maxrl   r3   rh   rI   r   r   r   get_all_project_issues  s    
zJiraApi.get_all_project_issuesc       
      c   s   d}d| d}|r$|d| d7 }|r8|d| d7 }|d7 }xl|rZ|| |krZ|| }| j j|d||dd	}| j jr~|}	n|d
 }	|	sd S |	E d H  ||7 }||krBP qBW d S )Nr"   zproject = ""z AND updated >= "z AND updated <= "z ORDER BY updatedz*allzchangelog,renderedFields)r   rk   rl   rm   rs   )r.   r3   r   )
r6   r7   rk   r   
start_dateend_daterl   r3   rh   rI   r   r   r   get_all_project_issues_during(  s(    
z%JiraApi.get_all_project_issues_duringc             C   s*   dj |d}| jj|ddd}t|d S )Nz"project = "{project}" ORDER BY key)r7   r   r   )rk   rl   rq   )r   r.   r3   int)r6   r   r3   rh   r   r   r   get_project_issues_countC  s    z JiraApi.get_project_issues_countc             C   sZ   d| d}|r |d| d7 }|r4|d| d7 }|d7 }| j j|ddd}t|d	 S )
Nzproject = "r   z AND updated >= "z AND updated <= "z ORDER BY updatedr   r   )rk   rl   rq   )r.   r3   r   )r6   r   r   r   r3   rh   r   r   r   get_project_issues_count_duringH  s    z'JiraApi.get_project_issues_count_duringc             c   s$   | j  }|std|E dH  dS )u*   Возвращает все проектыuE   Не удалось получить ни одного проектаN)r.   Zget_all_projectsrH   )r6   rI   r   r   r   get_projectsR  s    
zJiraApi.get_projects)settings_usersr;   c             c   s   x|  | jdg D ]}t }|d }|  | jj|d d}x|di  D ]}td|}|shqR|	 }|  | j
j|d |d}xb|d	g D ]R}	|	d
 d |krtd|	 d| ||	d
 d  d }
||
 ||
dV  qW qRW qW dS )u8   Возвращает участников проектаr@   rQ   r   )r   Zrolesz\d+$r   )r   role_idZactorsZ	actorUserr   u+   Не найден пользователь u*    участвующий в проекте r   )project_nameproject_member_emailN)rj   PROJECTS_URIrD   setPROJECT_URI_FORMATr   rx   rT   searchgroupPROJECT_ROLES_URI_FORMATrc   add)r6   r   r7   Zadded_users_to_projectr   Zproject_infoZroler   Z	role_infoZactorr   r   r   r   get_project_membersY  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   re   )r>   )rj   ISSUE_URI_FORMATr   )r6   r   rV   r   r   r   get_attachmentsn  s    zJiraApi.get_attachmentsc             C   s.   |j dddd }| | j d| }|jS )uJ   
        Скачиваем содержимое вложения
        r+   r   )maxsplit)splitrJ   r$   Zcontent)r6   r$   rK   rh   r   r   r   get_attachment_contentu  s    zJiraApi.get_attachment_contentc             c   sp   | j  d| d}tdddd}xJ| j||d }|dsBd S |d E d H  |d	  t|d 7  < q"W d S )
Nzrest/agile/1.0/board/z/quickfilterr   rw   r   )r}   r~   rm   )r>   rx   r}   )r$   r\   rJ   rG   rD   ro   )r6   rv   rK   r>   rI   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)rm   )r.   get_project_permission_schemeZget_permissionscheme)r6   r   schemer   r   r   r     s    z%JiraApi.get_project_permission_schemec             C   sT   t j| jd|d}g }| | }x(|d D ]}|| |d   q0W |S )Nzrest/api/2/issue
propertieskeysr6   )r   r   r   r$   rJ   rG   append)r6   issue_idrK   r   rI   ry   r   r   r   get_issue_properties  s    zJiraApi.get_issue_propertiesc             C   s   | j |}|d S )NZworklogs)r.   issue_get_worklog)r6   r   rI   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$   rJ   rG   )r6   rK   r   r   r   get_jira_global_settings  s    z JiraApi.get_jira_global_settingsc             C   s   y| j |S    i S d S )N)r.   !get_project_issue_security_scheme)r6   r   r   r   r   r     s    z)JiraApi.get_project_issue_security_schemec             c   s*   x$| j  D ]}| j |d V  qW d S )Nr   )r.   get_issue_security_schemesZget_issue_security_scheme)r6   Zschr   r   r   r     s    z"JiraApi.get_issue_security_schemesc             C   s   t j| jd}ddd}g }xb| jjs8| | }P | j||d }||d  t	||d krjP |d  |d	 7  < q W x|D ]}| 
|d
 |d< qW |S )Nzrest/api/2/screensr   rw   )r}   r~   )r>   rx   rq   r}   r~   r   Ztabs)r   r   r   r$   r.   r#   rJ   rG   r   ro   get_screen_tabs)r6   rK   r>   rI   rh   Zscrr   r   r   get_all_screens  s    

zJiraApi.get_all_screensc             C   s^   yNt j| jd| d}| | }x"|D ]}| j||d d|d< q.W |S    g S d S )Nzrest/api/2/screens/z/tabsr   )	screen_idtab_idr   )r   r   r   r$   rJ   rG   get_tab_fields)r6   r   rK   rh   Ztabr   r   r   r     s    
zJiraApi.get_screen_tabsc             C   s@   y0t j| jd| d| d}| | }|S    g S d S )Nzrest/api/2/screens/z/tabs/z/fields)r   r   r   r$   rJ   rG   )r6   r   r   rK   rh   r   r   r   r     s    zJiraApi.get_tab_fieldsc             C   s   g }| j jrd| jd}tj| jd}xZ| j||d }d|krPt	|d |
dg s^P ||d  |d  |d 7  < q*W |S )	Nr   )r}   r~   z rest/api/2/issuetypescreenscheme)r>   rC   rx   r}   r~   )r.   r#   rn   r   r   r   r$   rJ   rG   rH   rD   r   )r6   resultsr>   rK   rh   r   r   r   get_screen_scheme  s    
zJiraApi.get_screen_schemec             C   sd   t j| jd}d|i}| j||d }d|kr>t|d |d d d }| |d |d	< |S )
Nz(rest/api/3/issuetypescreenscheme/projectr   )r>   rC   rx   r   ZissueTypeScreenSchemer   Zissue_types)r   r   r   r$   rJ   rG   rH   get_screen_scheme_issuetypes)r6   r   r$   r>   rh   Zscreen_schemer   r   r   get_project_screen_scheme  s    z!JiraApi.get_project_screen_schemec             C   s   yt j| jd}d| j|d}g }xZ| j||d }d|krLt|d |dg sZP |	|d  |d  |d 7  < q&W x|D ]}| 
|d	 |d
< qW |S    g S d S )Nz(rest/api/3/issuetypescreenscheme/mappingr   )r}   r~   ZissueTypeScreenSchemeId)r>   rC   rx   r}   r~   ZscreenSchemeIdactions)r   r   r   r$   rn   rJ   rG   rH   rD   r   get_screen_scheme_actions)r6   screen_scheme_idr$   r>   r   rh   rg   r   r   r   r     s&    
z$JiraApi.get_screen_scheme_issuetypesc             C   s^   yNt j| jd}d|i}| j||d }d|kr@t|d |d d d S    i S d S )Nzrest/api/3/screenschemer   )r>   rC   rx   r   Zscreens)r   r   r   r$   rJ   rG   rH   )r6   r   r$   r>   rh   r   r   r   r     s    z!JiraApi.get_screen_scheme_actionsc             C   s   y
| j  S    g S d S )N)r.   get_all_priorities)r6   r   r   r   r     s    
zJiraApi.get_all_prioritiesc             C   s   t j| jd| d}ddd}g }xl| j||d }d|krNt|d |dg s\P x|d D ]}||d	  qfW |d
  |d 7  < q(W |S )Nzrest/api/2/priorityscheme/z	/projectsr   i,  )r}   r~   )r>   rC   rx   r   r}   r~   )	r   r   r   r$   rJ   rG   rH   rD   r   )r6   	scheme_idr$   r>   Zproject_keysrh   r7   r   r   r   get_priority_scheme_projects#  s    
z$JiraApi.get_priority_scheme_projectsc             C   s   t j| jd| d}ddd}g }xZ| j||d }d|krNt|d |dg s\P ||d  |d	  |d
 7  < q(W |S )Nzrest/api/2/priorityscheme/z/prioritiesr   i,  )r}   r~   )r>   rC   rx   r}   r~   )	r   r   r   r$   rJ   rG   rH   rD   r   )r6   r   r$   r>   
prioritiesrh   r   r   r   get_priority_scheme_priorities8  s    
z&JiraApi.get_priority_scheme_prioritiesc             C   s<   t j| jd| }| | }d|kr8t|d |S )Nzrest/api/2/priority/rC   )r   r   r   r$   rJ   rG   rH   )r6   priority_idr$   rh   r   r   r   get_priorityL  s
    zJiraApi.get_priority)rk   rl   r;   c             C   s,  | j jr"tj| jd}d }d}ntj| jd}d}d}i }|d k	rRt||d< |d k	rft||d< |rr||d< g }x| j||d	 }|	|g sP xv|| D ]j}	| j jr| 
|	d
 |	d< | |	d
 |	d< n.g |	d< x$|	d D ]}
|	d | |
 qW ||	 qW |d  |d 7  < qxW |S )Nzrest/api/2/priorityschemerx   zrest/api/2/priorityschemeszschemes.projectKeysschemesr}   r~   rm   )r>   r   ZprojectKeysr   Z	optionIds)r.   r#   r   r   r   r$   r   rJ   rG   rD   r   r   r   r   )r6   rk   rl   r$   rm   r   r>   r   rh   r   r   r   r   r   get_priority_schemesU  s:    zJiraApi.get_priority_schemes)r   r   
issuetypesc             C   s   t j| jd}| |}|jdkrNd|j d|j d|j d| }t||	 }|
d}|dkr|d	| d
}t|t j| jd}	d|i}
|r||
d< |r||
d< | j|	|
d}|jdkrd| d|j d|j d|j }t||	 S )Nz1rest/plugins/1.0/com.eis.jira.plugins.jiradoc-keyrO   u  Плагин "Smart Jira Configuration" не установлен.Для получения полной конфигурации проекта установите плагин версии 4.8.9, 4.8.7, 4.7.3 или 4.5.1 по ссылке https://marketplace.atlassian.com/apps/1221996/smart-jira-configuration-formerly-smart-project-config-docs/version-history Код ошибки - z, z - u   , адрес запроса: version)z4.8.9z4.8.7z4.7.3z4.5.1u.   Неверная версия плагина (u   ). Установите плагин "Smart Jira Configuration" версии 4.8.9, 4.8.7, 4.7.3 или 4.5.1. https://marketplace.atlassian.com/apps/1221996/smart-jira-configuration-formerly-smart-project-config-docs/version-historyz-rest/smart-configuration/1.0/getProjectConfigZ
projectKeyr   r   )r>   uN   Не удалось получить конфигурацию проекта "uL   " через плагин "Smart Jira Configuration". Код ошибки - )r   r   r   r$   rJ   r_   r`   ra   rc   rG   rD   )r6   r   r   r   Z
plugin_urlrh   ri   Zplugin_dataZplugin_versionr$   r>   r   r   r   get_project_smart_config}  s*    

"

"z JiraApi.get_project_smart_configc             C   s   t j| jd| d}ddd}i }x| j||d }d|krNt|d |dg s\P x2|d D ]&}|t	|d	 g }|
|d
  qfW |d  |d 7  < q(W |S )Nz rest/api/2/issuesecurityschemes/z/membersr   rw   )r}   r~   )r>   rC   rx   ZissueSecurityLevelIdZholderr}   r~   )r   r   r   r$   rJ   rG   rH   rD   
setdefaultstrr   )r6   Zsecurity_scheme_idr$   r>   Zsecurity_level_membersrh   membermembersr   r   r    get_issue_security_level_members  s    z(JiraApi.get_issue_security_level_membersc             C   sF   d| d}|d| j d}| jj||d}|dg s:dS |d d S )uR    Возвращает контекст пользовательского поляzrest/api/3/field/z/contextr   )r   r}   r~   )r>   rx   N)rn   r.   rD   )r6   field_id
context_idr$   r>   rh   r   r   r   get_field_context  s    
zJiraApi.get_field_contextc       
   
   C   s   d| d| d}d| j d}i }xy| jj||d}W n6 tjk
rn } z|jjdkr\dS  W dd}~X Y nX |d	g }|sP x|D ]}	|	||	d
 < qW |d  |d 7  < q$W |S )u`    Возвращает опции контекста пользовательского поля zrest/api/3/field/z	/context/z/optionr   )r}   r~   )r>   i  Nrx   r   r}   r~   )rn   r.   rD   r   r   rh   r_   )
r6   r  r  r$   r>   r   rh   r   rx   rW   r   r   r   get_field_context_option  s$    

z JiraApi.get_field_context_optionc             C   s   d| d}|d| j d}g }xd| jj||d}|dg s>P x,|d D ] }|drH|t|d  qHW |d  |d	 7  < q W |S )
u    Возвращает сопоставленный список типов задач и контекста пользователького поля zrest/api/3/field/z/context/issuetypemappingr   )r   r}   r~   )r>   rx   issueTypeIdr}   r~   )rn   r.   rD   r   r  )r6   r  r  r$   r>   r   rh   rW   r   r   r   #get_field_context_issuetype_mapping  s    

z+JiraApi.get_field_context_issuetype_mappingc       
   
   C   s   d| d}d| j d}g }xy| jj||d}W nH tjk
rz } z(|jjdkrftd| d P |W d	d	}~X Y nX |d
g sP |	|d
  |d  |d 7  < qW d	}x4|D ],}	|	d|kr|	d S |	dr|	d }qW |S )uz    Возвращает список контекстов пользовательского поля для проекта zrest/api/3/field/z/context/projectmappingr   )r}   r~   )r>   i  uA   Не удалось получить контексты поля u@   . Пользовательское поле не найдено.Nrx   r}   r~   r   r   ZisGlobalContext)
rn   r.   rD   r   r   rh   r_   rb   Zwarningr   )
r6   r  r   r$   r>   Zcontextsrh   r   Zglobal_contextr   r   r   r   !get_field_context_project_mapping  s.    


z)JiraApi.get_field_context_project_mappingc             c   sl   d| d}d| j d}xN| jj||d}|dg }|s<P x|D ]
}|V  qBW |d  |d 7  < qW d	S )
u8    Возвращает поля конфигурации zrest/api/3/fieldconfiguration/z/fieldsr   )r}   r~   )r>   rx   r}   r~   N)rn   r.   rD   )r6   field_configuration_idr$   r>   rh   r   r   r   r   r   get_field_config_fields)  s    


zJiraApi.get_field_config_fieldsc             C   st   d}d| j |d}g }xD| jj||d}|dg s6P ||d  |d  |d 7  < qW |rl|rl|d S |S dS )	u    Возвращает список конфигураций или конфигурацию по умолчанию при is_default=Truezrest/api/3/fieldconfigurationr   )r}   r~   Z	isDefault)r>   rx   r}   r~   N)rn   r.   rD   r   )r6   
is_defaultr$   r>   Zfield_configurationsrh   r   r   r   get_field_config=  s    zJiraApi.get_field_configc             C   s.  dd | j |dD }g }|rDd}d|i}| jj||d}|d }n$| jdd	}|d
t|d d dd |D }	i }
x|D ]}t|d }t|d }x| |D ]z}|
|d |d i d}|d
krxP|D ]*}||	krq||d |d d|d |< qW q||d |d d|d |< qW qW |
S )Nc             S   s   g | ]}t |d  qS )r   )r  ).0
issue_typer   r   r   
<listcomp>Y  s   z7JiraApi.get_field_config_issue_type.<locals>.<listcomp>)r   z+rest/api/3/fieldconfigurationscheme/mappingZfieldConfigurationSchemeId)r>   rx   T)r  defaultr   )r	  fieldConfigurationIdc             S   s$   g | ]}|d  dkrt |d  qS )r	  r  )r  )r  field_configurationr   r   r   r  o  s   r	  r  )r   r   isHidden
isRequired)ZissuetypeIdr  r  r   )r   r.   rD   r  r   r  r  r   )r6   field_configuration_scheme_idr   Zissue_types_projectZfield_configuration_mappingr$   r>   rh   Zfield_config_defaultZissue_types_schemefields_usedr  issue_type_idr  r   
field_usedr  r   r   r   get_field_config_issue_typeV  sD    




z#JiraApi.get_field_config_issue_typec             C   sF   d}d|i}| j j||d}|d d }d}|drB|d d }|S )	uR    Возвращает схему конфигурации полей прокта z+rest/api/3/fieldconfigurationscheme/projectr   )r>   rx   r   NZfieldConfigurationSchemer   )r.   rD   )r6   r   r$   r>   rh   rg   r  r   r   r   &get_project_field_configuration_scheme  s    
z.JiraApi.get_project_field_configuration_schemec             C   s   |  |}| ||}x| D ]}|d }|ds8q | ||}|sJq | ||}| ||}| ||}	|drxl|d 	 D ]"\}
}|
| |dk	r||d< qW q x6|	D ].}
|d |
 
| |dk	r||d |
 d< qW q W |S )u   
        Возвращает список используемых полей в проекте
        в виде сруктуры как через плагин "Smart Jira Configuration" в box версии
        r   Zcustomfield_ZisAnyIssueTyper   Nr   )r  r  rx   r1   r  r  r  r
  rD   itemsr   )r6   r   r  r  r  Zfield_used_idr  r   Zcontext_optionZcontext_issuetypesr  Zcontext_issue_typer   r   r   get_project_fields_used  s,    




zJiraApi.get_project_fields_used)NN)N)r   )r   )Nr   )r   N)r   )N)N)N)N)r   N)r   NNN)NN)r   r"   )NN)F)i__name__
__module____qualname__rn   rS   ZAPI_BOX_VERSIONZISSUES_SEARCH_URIr   r   r   r   r   r   r   Z	USERS_URIZ
FIELDS_URIZFIELDS_BOX_URIr   r   r   r   r   bool__annotations__r  r8   r   ZResponserJ   r   r\   rj   r   rt   ru   r    rH   rz   r|   r   r   r   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   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  r
  r  r  r  r  r  r  r   r   r   r   r!   H   s   
















#




*


 

	

	(-"
?r!   )r
   r   r   r   )typingr   r   r   r   r   	functoolsr   Ztimer   r   Zrequests.authr   Zcmf.includerE   Z	getLoggerrb   r    r!   r   r   r   r   <module>   s   

;