B
    afP                 @   sp   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 dddZG dd dZdS )    )DictListOptionalIteratorN)wraps)sleep)HTTPBasicAuth)*皙?         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_d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__`   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_debugZ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   attachmentsrP   valuer0   openZfull_path_filerF   loadsread
isinstancedictr5   gdebugr$   rI   status_codereasontextZloggerr   CmfErrorZmodelsZCmfAttachmentZupload_fileencodeZsave)	r6   rJ   r>   rP   
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   rj   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)ri   rj   rk   rq   u    из ro   )rl   r.   get_issues_for_boardr3   r\   r]   rm   )r6   board_idrj   rn   ro   rp   rq   r   r   r   rs      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   )rt   ri   rj   values)r.   Zget_all_sprintrD   )r6   rt   ri   rj   rH   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   ru   )	sprint_idri   rj   rq   )r.   get_sprint_issuesrD   )r6   ry   ri   rj   rH   rw   r   r   r   rz      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,operationsru   uG   Больше 50 за раз запросить не получится!r   )startAt
maxResultsrk   ZworkflowName)r>   rC   rv   Nr{   )
AssertionErrorr.   r#   rI   r$   WORKFLOW_SEARCH_URIrF   rG   rm   Zget_all_workflows)r6   namesrj   rk   r>   rH   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|   rk   	projectId)r>   rv   Nr{   )
r.   r#   rl   rI   r$   STATUS_SEARCH_URIrF   rm   Zget_status_for_projectZget_all_statuses)r6   rj   
project_idr>   rH   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   rv   )rI   r$   WORKFLOW_PROJECT_URIrF   rG   )r6   project_idsr>   rH   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$   rI   rF   )r6   idrJ   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$   rI   rF   )r6   r   rJ   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   rv   r{   )rl   r$   rI   rF   rG   rm   )r6   rj   r>   rJ   rH   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   ru   )r{   r|   r   z#/rest/api/3/issuetypescheme/project)r>   rv   r{   )r$   rI   rF   rm   )r6   r   r>   rJ   rH   r   r   r   get_issue_type_schemes3  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$   rI   rF   )r6   r   r>   rJ   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$   rI   rF   get_issue_types)r6   rJ   r   r   r   r   B  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   ru   renderedBody)r{   r|   rk   )r   )r>   ZcommentsNr{   )r[   r.   r#   rI   ospathjoinr$   COMMENTS_URI_FORMATformatrF   COMMENTS_URI_FORMAT_BOXrD   rm   )r6   r   r>   rH   r   r   r   get_commentsI  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   ru   )project_keyri   rj   rv   )r.   get_all_agile_boardsrD   )r6   r   ri   rj   rH   rw   r   r   r   r   V  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$   rI   rF   )r6   rt   rJ   rf   r   r   r   get_advanced_board_settingsa  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   ru   )keyri   rj   rv   )r.   get_project_versions_paginatedrD   )r6   r   ri   rj   rH   rw   r   r   r   r   g  s    z&JiraApi.get_project_versions_paginatedc             C   s   | j |S )N)r.   get_project_components)r6   r   r   r   r   r   r  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offsetrj   ro   Zrecords)r[   rI   r$   	AUDIT_URIrF   )r6   r   ri   rj   r>   rH   rw   r   r   r   get_audit_recordsu  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#   rh   WATCHERS_URI_FORMATr   rI   r$   WATCHERS_URI_FORMAT_BOXrF   )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|   rk   r|   )r>   	accountIdr{   zrest/api/2/user/search.r&   TZincludeInactiver   N)r.   r#   r$   rI   rF   updateget_user_inform   r   r   r   )r6   Z	limit_endrJ   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   rk   i  )r.   userrequests	HTTPErrorrf   r^   )r6   r   rk   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&   rk   i  )r.   r   r   r   rf   r^   )r6   r&   rk   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_idrk   )r   rk   )r&   rk   u   Пользователь u    не найден@emailAddressZdisplayName)r.   r#   r   r   r   rG   ZconfigZ
ORG_DOMAINZcmffieldsZCmfEmailZ
max_lengthrm   rD   r,   Ztranslit_strip)r6   r   rk   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   ru   )r{   r|   zrest/api/2/field/z/context)r>   rv   ro   r{   r|   )rI   r   r   r   r$   rF   extendrm   )r6   r   r>   rH   rf   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   ru   )r{   r|   )r>   rv   ro   r{   r|   )r   r   r   r$   rI   rF   r   rm   )r6   ZfieldIdZ	contextIdr$   r>   rH   rf   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< yX| |d |d< x@|d D ]4}y"|d | |d |d  W qr   Y qrX qrW W q   Y qX qg |d< qW |S )u]    Возвращает системные и настраиваемые поля задачи r   r   Zcustomoptionscontext)r.   Zget_all_fieldsr[   r#   r   r   r   )r6   r   rH   Zfieldr   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   ri   rj   rk   rq   )r   r.   r3   advanced_mode)r6   r   ri   maxrj   r3   rf   rH   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   ri   rj   rk   rq   )r.   r3   r   )
r6   r7   ri   r   
start_dateend_daterj   r3   rf   rH   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   )ri   rj   ro   )r   r.   r3   int)r6   r   r3   rf   r   r   r   get_project_issues_count=  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   )ri   rj   ro   )r.   r3   r   )r6   r   r   r   r3   rf   r   r   r   get_project_issues_count_duringB  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_projectsrG   )r6   rH   r   r   r   get_projectsL  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@   rP   r   )r   Zrolesz\d+$r   )r   role_idZactorsZ	actorUserr   u+   Не найден пользователь u*    участвующий в проекте r   )project_nameproject_member_emailN)rh   PROJECTS_URIrD   setPROJECT_URI_FORMATr   rv   rS   searchgroupPROJECT_ROLES_URI_FORMATra   add)r6   r   r7   Zadded_users_to_projectr   Zproject_infoZroler   Z	role_infoZactorr   r   r   r   get_project_membersS  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   rc   )r>   )rh   ISSUE_URI_FORMATr   )r6   r   rU   r   r   r   get_attachmentsh  s    zJiraApi.get_attachmentsc             C   s.   |j dddd }| | j d| }|jS )uJ   
        Скачиваем содержимое вложения
        r+   r   )maxsplit)splitrI   r$   Zcontent)r6   r$   rJ   rf   r   r   r   get_attachment_contento  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   ru   r   )r{   r|   rk   )r>   rv   r{   )r$   r[   rI   rF   rD   rm   )r6   rt   rJ   r>   rH   r   r   r   get_board_quick_filtersx  s    
zJiraApi.get_board_quick_filtersc             C   s$   | j |}| j j|d dd}|S )Nr   all)rk   )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$   rI   rF   append)r6   issue_idrJ   r   rH   rw   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   rH   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$   rI   rF   )r6   rJ   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   ru   )r{   r|   )r>   rv   ro   r{   r|   r   Ztabs)r   r   r   r$   r.   r#   rI   rF   r   rm   get_screen_tabs)r6   rJ   r>   rH   rf   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$   rI   rF   get_tab_fields)r6   r   rJ   rf   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$   rI   rF   )r6   r   r   rJ   rf   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   rv   r{   r|   )r.   r#   rl   r   r   r   r$   rI   rF   rG   rD   r   )r6   resultsr>   rJ   rf   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   rv   r   ZissueTypeScreenSchemer   Zissue_types)r   r   r   r$   rI   rF   rG   get_screen_scheme_issuetypes)r6   r   r$   r>   rf   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   rv   r{   r|   ZscreenSchemeIdactions)r   r   r   r$   rl   rI   rF   rG   rD   r   get_screen_scheme_actions)r6   screen_scheme_idr$   r>   r   rf   re   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   rv   r   Zscreens)r   r   r   r$   rI   rF   rG   )r6   r   r$   r>   rf   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   rv   r   r{   r|   )	r   r   r   r$   rI   rF   rG   rD   r   )r6   	scheme_idr$   r>   Zproject_keysrf   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   rv   r{   r|   )	r   r   r   r$   rI   rF   rG   rD   r   )r6   r   r$   r>   
prioritiesrf   r   r   r   get_priority_scheme_priorities2  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$   rI   rF   rG   )r6   priority_idr$   rf   r   r   r   get_priorityF  s
    zJiraApi.get_priority)ri   rj   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/priorityschemerv   zrest/api/2/priorityschemeszschemes.projectKeysschemesr{   r|   rk   )r>   r   ZprojectKeysr   Z	optionIds)r.   r#   r   r   r   r$   r   rI   rF   rD   r   r   r   r   )r6   ri   rj   r$   rk   r   r>   r   rf   r   r   r   r   r   get_priority_schemesO  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-keyrN   uv  Плагин "Smart Jira Configuration" не установлен.Для получения полной конфигурации проекта установите плагин версии 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.7.3z4.5.1u.   Неверная версия плагина (u   ). Установите плагин "Smart Jira Configuration" версии 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$   rI   r^   r_   r`   ra   rF   rD   )r6   r   r   r   Z
plugin_urlrf   rg   Zplugin_dataZplugin_versionr$   r>   r   r   r   get_project_smart_configw  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   ru   )r{   r|   )r>   rC   rv   ZissueSecurityLevelIdZholderr{   r|   )r   r   r   r$   rI   rF   rG   rD   
setdefaultstrr   )r6   Zsecurity_scheme_idr$   r>   Zsecurity_level_membersrf   membermembersr   r   r    get_issue_security_level_members  s    z(JiraApi.get_issue_security_level_members)NN)N)r   )r   )Nr   )r   N)r   )N)N)N)N)r   N)r   NNN)NN)r   r"   )NN)`__name__
__module____qualname__rl   rR   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ResponserI   r   r[   rh   r   rr   rs   r    rG   rx   rz   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!   F   s   
















#




*


 

	

	(-r!   )r
   r   r   r   )typingr   r   r   r   r   	functoolsr   Ztimer   r   Zrequests.authr   Zcmf.includer    r!   r   r   r   r   <module>   s   
;