U
    Ef<                     @   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}}|d7 }z| |E d H W S  k
rv } z6|kr@|| krN }n|d  7 }t | W 5 d }~X Y qX qd S Nr      r   r   argskwargsZattemptZ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               
      sx   d}}|d7 }z| |W S  k
rp } z6|kr:|| krH }n|d  7 }t | W 5 d }~X Y qX qd S 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   backoff   s    -r#   c                   @   sp  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Z9dNdO Z:dPdQ Z;dRdS Z<e=eef ddTdUZ>dVdW Z?ddXdYZ@ddZd[ZAe/dd\d]ZBde/dd^d_ZCe e dd`daZDe=ee=f e e dbdcddZEeeFe d<dedfZGdgdh ZHdidj ZIdkdl ZJdmdn ZKdodp ZLdqdr ZMdsdt ZNdudv ZOdwdx ZPdydz ZQd{d| ZRd}d~ ZSdd ZTdd ZUdd ZVdd ZWdd ZXdd ZYdd ZZde/e/e-dddZ[deeed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   )Jira,  )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'   r6   r,   r+   r&   r-   projectr8   r(   r   r   r   __init__`   s6    	
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.   )r3   rA   r.   params?ZGETdata)rD   levelzapplication/jsonzContent-type errorMessages)Zsix.moves.urllib.parser@   r6   r+   r0   r1   getr	   r-   r3   r2   Zlog_curl_debugZloggingINFOjson	Exception)r:   r'   r>   r.   r   r   r@   resr   r   r   jira_request~   s    0&
"zJiraApi.jira_request)urirB   r?   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.jsonrF   z[/ '"{}]rrD   
   )rB   r.      u   Код ошибки - ,  -    , адрес запроса: )r8   parentname) replaceAPI_VERSIONresubr8   attachmentsrW   valuer4   openZfull_path_filerJ   loadsread
isinstancedictr9   gdebugr'   rM   status_codereasontextloggerr   CmfErrorZmodelsZCmfAttachmentZupload_fileencodeZsave)	r:   rN   rB   rW   
attachmentfresultresponse
error_textr   r   r   call   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)r7   startlimitexpandN)MAX_ISSUES_RESULT_PER_REQUESTr2   Zjql_get_list_of_ticketsr7   len)r:   rr   start_attotalmax_resultsissuesr   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   changelog,renderedFields)rq   rr   rs   ry   u    из rw   )rt   r2   get_issues_for_boardr7   rc   rd   ru   )r:   board_idrr   rv   rw   rx   ry   r   r   r   r|      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   )r}   rq   rr   values)r2   Zget_all_sprintrH   )r:   r}   rq   rr   rL   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   r~   )	sprint_idrq   rr   ry   )r2   get_sprint_issuesrH   )r:   r   rq   rr   rL   r   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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,operationsr~   uG   Больше 50 за раз запросить не получится!r   startAt
maxResultsrs   ZworkflowNamerB   rG   r   Nr   )
AssertionErrorr2   r&   rM   r'   WORKFLOW_SEARCH_URIrJ   rK   ru   Zget_all_workflows)r:   namesrr   rs   rB   rL   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usagesr   	projectIdr   r   Nr   )
r2   r&   rt   rM   r'   STATUS_SEARCH_URIrJ   ru   Zget_status_for_projectZget_all_statuses)r:   rr   
project_idrB   rL   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   rG   r   )rM   r'   WORKFLOW_PROJECT_URIrJ   rK   )r:   project_idsrB   rL   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'   rM   rJ   r:   idrN   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   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   r   r   z/rest/api/3/workflowschemer   rG   r   r   )rt   r'   rM   rJ   rK   ru   )r:   rr   rB   rN   rL   r   r   r   get_workflow_scheme%  s    zJiraApi.get_workflow_scheme)r   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   r~   )r   r   r   z#/rest/api/3/issuetypescheme/projectr   r   r   )r'   rM   rJ   ru   )r:   r   rB   rN   rL   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/projectr   r   )r:   r   rB   rN   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)r2   r&   r'   rM   rJ   get_issue_typesr:   rN   r   r   r   r   B  s    zJiraApi.get_issue_types)	issue_keyr?   c                 c   s   t dddd}| jjrB| jtj| j| j j	|d|d
 }n*| jtj| j| j j	|d|d
 }|dszdS |d E dH  |d	  t|d 7  < qdS )
u@    Получим все комментарии по задаче r   r~   renderedBodyr   r   r   ZcommentsNr   )rb   r2   r&   rM   ospathjoinr'   COMMENTS_URI_FORMATformatrJ   COMMENTS_URI_FORMAT_BOXrH   ru   )r:   r   rB   rL   r   r   r   get_commentsI  s    ,*
zJiraApi.get_commentsc                 c   sJ   d}d}| j j|||d}|dg s(qF||7 }|d D ]
}|V  q8qd S )Nr   r~   )project_keyrq   rr   r   )r2   get_all_agile_boardsrH   r:   r   rq   rr   rL   r   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rapidViewIdr   r   )r:   r}   rN   rn   r   r   r   get_advanced_board_settingsa  s    z#JiraApi.get_advanced_board_settingsc                 c   sJ   d}d}| j j|||d}|dg s(qF||7 }|d D ]
}|V  q8qd S )Nr   r~   )keyrq   rr   r   )r2   get_project_versions_paginatedrH   r   r   r   r   r   g  s    z&JiraApi.get_project_versions_paginatedc                 C   s   | j |S N)r2   get_project_components)r:   r   r   r   r   r   r  s    zJiraApi.get_project_componentsc                 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offsetrr   rw   Zrecords)rb   rM   r'   	AUDIT_URIrJ   )r:   r   rq   rr   rB   rL   r   r   r   r   get_audit_recordsu  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)	r2   r&   rp   WATCHERS_URI_FORMATr   rM   r'   WATCHERS_URI_FORMAT_BOXrJ   )r:   r   r   r   r   r   get_watchers  s    "zJiraApi.get_watchersc                 c   sP  | j jr| j d}dddd}|r8|d |kr8||d< | j||d }|sPq|D ]}|| |d  |V  qT|d	  t|7  < |r8|d	 |kr8qq8ntj	
| jd
}dddd}|r|d |kr||d< d|d< d|d< | j||d }|sqL|D ] }|| |d  |V  q |d	  t|7  < |r|d	 |krqLqdS )u   Возвращает список всех пользователей, включая активных,
            неактивных и ранее удаленных, у которых есть учетная запись Atlassian.
            в старых версиях невозможно получить больше 1000 учеток
            https://jira.atlassian.com/browse/JRASERVER-65089
            исправлено в 8.7.0, 8.6.1 и выше
            z/rest/api/3/users/searchr   r%   "operations,groups,applicationRolesr   r   r   	accountIdr   zrest/api/2/user/search.r*   TZincludeInactiver   N)r2   r&   r'   rM   rJ   updateget_user_inforu   r   r   r   )r:   Z	limit_endrN   rB   Zusers	user_infor   r   r   	get_users  s:    
zJiraApi.get_usersc                 C   s   | j jr| j j|dd}n| j j|dd}dtj }tjjjt	| }|
dsvt|d d |  | |d< n(d|d kr|d d |  | |d< |S )Nr   )Z
account_idrs   zgroups,applicationRoles)r   rs   @emailAddressZdisplayName)r2   r&   userZconfigZ
ORG_DOMAINZcmffieldsZCmfEmailZ
max_lengthru   rH   r0   Ztranslit_strip)r:   r   r   ZpostfixZmax_lenr   r   r   r     s    
$zJiraApi.get_user_infoc                 C   sn   ddd}g }| j tj| jd| d|d }||d  t||d krTqj|d	  |d
 7  < q|S )Nr   r~   r   rest/api/2/field/z/contextr   r   rw   r   r   )rM   r   r   r   r'   rJ   extendru   )r:   r   rB   rL   rn   r   r   r   _get_field_context  s    
&zJiraApi._get_field_contextc                 C   sx   t j| jd| d| d}ddd}g }| j||d }||d  t||d	 kr^qt|d
  |d 7  < q,|S )Nr   z	/context/z/optionr   r~   r   r   r   rw   r   r   )r   r   r   r'   rM   rJ   r   ru   )r:   ZfieldIdZ	contextIdr'   rB   rL   rn   r   r   r   _get_field_options  s    
zJiraApi._get_field_optionsc              	   C   s   | j  }t }|D ]}d|kr.|||d < n|||d < | j jr|d rg |d< zT| |d |d< |d D ]4}z"|d | |d |d  W qn   Y qnX qnW q   Y qX qg |d< q|S )u]    Возвращает системные и настраиваемые поля задачи r   r   Zcustomoptionscontext)r2   Zget_all_fieldsrb   r&   r   r   r   )r:   r   rL   Zfieldr   r   r   r   
get_fields  s&    
"
zJiraApi.get_fieldsc                 C   s   | j |S r   )r2   Zissue_editmeta)r:   r   r   r   r   get_issue_meta  s    zJiraApi.get_issue_metac                 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;   *allr{   r   rq   rr   rs   ry   )r   r2   r7   advanced_mode)r:   r   rq   maxrr   r7   rn   rL   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 }|rX|| |krX|| }| j j|d||dd	}| j jr||}	n|d
 }	|	sd S |	E d H  ||7 }||kr@qq@d S )Nr%   project = "" AND updated >= " AND updated <= " ORDER BY updatedr   r{   r   ry   )r2   r7   r   )
r:   r;   rq   r   
start_dateend_daterr   r7   rn   rL   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 )Nr   r   r   r   rq   rr   rw   )r   r2   r7   int)r:   r   r7   rn   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 )
Nr   r   r   r   r   r   r   r   rw   )r2   r7   r   )r:   r   r   r   r7   rn   r   r   r   get_project_issues_count_during-  s    z'JiraApi.get_project_issues_count_duringc                 c   s$   | j  }|std|E dH  dS )u*   Возвращает все проектыuE   Не удалось получить ни одного проектаN)r2   Zget_all_projectsrK   )r:   rL   r   r   r   get_projects7  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   Возвращает участников проектаrD   rW   r   )r   Zrolesz\d+$r   )r   role_idZactorsZ	actorUserr   u+   Не найден пользователь u*    участвующий в проекте r   )project_nameproject_member_emailN)rp   PROJECTS_URIrH   setPROJECT_URI_FORMATr   r   rZ   searchgroupPROJECT_ROLES_URI_FORMATri   add)r:   r   r;   Zadded_users_to_projectr   Zproject_infoZ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   rk   r   )rp   ISSUE_URI_FORMATr   )r:   r   r\   r   r   r   get_attachmentsS  s    zJiraApi.get_attachmentsc                 C   s.   |j dddd }| | j d| }|jS )uJ   
        Скачиваем содержимое вложения
        r/   r   )maxsplit)splitrM   r'   Zcontent)r:   r'   rN   rn   r   r   r   get_attachment_contentZ  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   r~   r   r   r   r   r   )r'   rb   rM   rJ   rH   ru   )r:   r}   rN   rB   rL   r   r   r   get_board_quick_filtersc  s    
zJiraApi.get_board_quick_filtersc                 C   s$   | j |}| j j|d dd}|S )Nr   all)rs   )r2   get_project_permission_schemeZget_permissionscheme)r:   r   schemer   r   r   r   m  s    z%JiraApi.get_project_permission_schemec                 C   sP   t j| jd|d}g }| | }|d D ]}|| |d   q.|S )Nzrest/api/2/issue
propertieskeysr:   )r   r   r   r'   rM   rJ   append)r:   issue_idrN   r   rL   r   r   r   r   get_issue_propertiesr  s    zJiraApi.get_issue_propertiesc                 C   s   | j |}|d S )NZworklogs)r2   issue_get_worklog)r:   r   rL   r   r   r   r   z  s    zJiraApi.issue_get_worklogc                 C   s   t j| jd}| | S )Nzrest/api/2/configurationr   r   r   r'   rM   rJ   r   r   r   r   get_jira_global_settings~  s    z JiraApi.get_jira_global_settingsc                 C   s"   z| j |W S    Y dS X d S )NrF   )r2   !get_project_issue_security_scheme)r:   r   r   r   r   r     s    z)JiraApi.get_project_issue_security_schemec                 c   s&   | j  D ]}| j |d V  q
d S )Nr   )r2   get_issue_security_schemesZget_issue_security_scheme)r:   Zschr   r   r   r     s    z"JiraApi.get_issue_security_schemesc                 C   s   t j| jd}ddd}g }| j||d }| jjs>|}qt||d  t	||d kr^qt|d  |d	 7  < q|D ]}| 
|d
 |d< qx|S )Nzrest/api/2/screensr   r~   r   r   r   rw   r   r   r   Ztabs)r   r   r   r'   rM   rJ   r2   r&   r   ru   get_screen_tabs)r:   rN   rB   rL   rn   Zscrr   r   r   get_all_screens  s    
zJiraApi.get_all_screensc                 C   sb   zLt j| jd| d}| | }|D ]}| j||d d|d< q,|W S    g  Y S X d S )Nrest/api/2/screens/z/tabsr   )	screen_idtab_idr   )r   r   r   r'   rM   rJ   get_tab_fields)r:   r   rN   rn   Ztabr   r   r   r     s    zJiraApi.get_screen_tabsc                 C   sH   z2t j| jd| d| d}| | }|W S    g  Y S X d S )Nr   z/tabs/z/fieldsr   )r:   r   r  rN   rn   r   r   r   r    s    zJiraApi.get_tab_fieldsc                 C   s   g }| j jrd| jd}tj| jd}| j||d }d|krNt	|d |
|d  t||d krnq|d  |d	 7  < q(|S )
Nr   r   z rest/api/2/issuetypescreenschemer   rG   r   rw   r   r   )r2   r&   rt   r   r   r   r'   rM   rJ   rK   r   ru   )r:   resultsrB   rN   rn   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   rG   r   r   ZissueTypeScreenSchemer   Zissue_types)r   r   r   r'   rM   rJ   rK   get_screen_scheme_issuetypes)r:   r   r'   rB   rn   Zscreen_schemer   r   r   get_project_screen_scheme  s    z!JiraApi.get_project_screen_schemec                 C   s   zt j| jd}d| j|d}g }| j||d }d|krJt|d ||d  t	||d krjq|d  |d	 7  < q$|D ]}| 
|d
 |d< q|W S    g  Y S X d S )Nz(rest/api/3/issuetypescreenscheme/mappingr   )r   r   ZissueTypeScreenSchemeIdr   rG   r   rw   r   r   ZscreenSchemeIdactions)r   r   r   r'   rt   rM   rJ   rK   r   ru   get_screen_scheme_actions)r:   screen_scheme_idr'   rB   r  rn   rm   r   r   r   r    s&    z$JiraApi.get_screen_scheme_issuetypesc                 C   sf   zPt j| jd}d|i}| j||d }d|kr@t|d |d d d W S    i  Y S X d S )Nzrest/api/3/screenschemer   r   rG   r   r   Zscreensr   r   r   r'   rM   rJ   rK   )r:   r	  r'   rB   rn   r   r   r   r    s    z!JiraApi.get_screen_scheme_actionsc                 C   s"   z| j  W S    g  Y S X d S r   )r2   get_all_priorities)r:   r   r   r   r    s    zJiraApi.get_all_prioritiesc                 C   s   t j| jd| d}ddd}g }| j||d }d|krLt|d |d D ]}||d	  qTt||d
 krzq|d  |d 7  < q&|S )Nrest/api/2/priorityscheme/z	/projectsr   r)   r   r   rG   r   r   rw   r   r   )	r   r   r   r'   rM   rJ   rK   r   ru   )r:   	scheme_idr'   rB   Zproject_keysrn   r;   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 }| j||d }d|krLt|d ||d  t||d	 krlq|d
  |d 7  < q&|S )Nr  z/prioritiesr   r)   r   r   rG   r   rw   r   r   )	r   r   r   r'   rM   rJ   rK   r   ru   )r:   r  r'   rB   
prioritiesrn   r   r   r   get_priority_scheme_priorities  s    
z&JiraApi.get_priority_scheme_prioritiesc                 C   s<   t j| jd| }| | }d|kr8t|d |S )Nzrest/api/2/priority/rG   r
  )r:   priority_idr'   rn   r   r   r   get_priority*  s
    zJiraApi.get_priority)rq   rr   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 }| j||d	 }|| D ]f}	| j jr| 	|	d
 |	d< | 
|	d
 |	d< n*g |	d< |	d D ]}
|	d | |
 q||	 qt||d krq$|d  |d 7  < qv|S )Nzrest/api/2/priorityschemer   zrest/api/2/priorityschemeszschemes.projectKeysschemesr   r   rs   r   r   ZprojectKeysr  Z	optionIdsrw   )r2   r&   r   r   r   r'   r   rM   rJ   r  r  r   r  ru   )r:   rq   rr   r'   rs   r   rB   r  rn   r   r  r   r   r   get_priority_schemes3  s8    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|t j| jd}d|i}|rr||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-keyrR   uF  Плагин "Smart Jira Configuration" не установлен.Для получения полной конфигурации проекта установите плагин по ссылке https://marketplace.atlassian.com/apps/1221996/smart-jira-configuration-formerly-smart-project-config-docs Код ошибки - rS   rT   rU   z-rest/smart-configuration/1.0/getProjectConfigZ
projectKeyr   r  r   uN   Не удалось получить конфигурацию проекта "uL   " через плагин "Smart Jira Configuration". Код ошибки - )
r   r   r   r'   rM   re   rf   rg   ri   rJ   )	r:   r   r   r  Z
plugin_urlrn   ro   r'   rB   r   r   r   get_project_smart_config[  s$    

 
 z JiraApi.get_project_smart_config)NN)N)r   )r   )Nr   )r   N)r   )N)N)r   N)r   NNN)NN)r   r%   )NN)]__name__
__module____qualname__rt   rY   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__strr<   requestsZResponserM   r   rb   rp   r   rz   r|   r#   rK   r   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$   F   s   
















#






*
      

	

	(r$   )r   r   r   r   )typingr   r   r   r   r    	functoolsr   timer   r  Zrequests.authr	   Zcmf.includer#   r$   r   r   r   r   <module>   s   
;