U
    ؃fQ                     @   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}}|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                   @   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Zeee-dddZfdd Zgd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__b   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_debug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   attachmentsrX   valuer4   openZfull_path_filerK   loadsread
isinstancedictr9   gdebugr'   rN   status_codereasontextloggerr   CmfErrorZmodelsZCmfAttachmentZupload_fileencodeZsave)	r:   rO   rB   rX   
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:   rs   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)rr   rs   rt   rz   u    из rx   )ru   r2   get_issues_for_boardr7   rd   re   rv   )r:   board_idrs   rw   rx   ry   rz   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~   rr   rs   values)r2   Zget_all_sprintrH   )r:   r~   rr   rs   rM   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_idrr   rs   rz   )r2   get_sprint_issuesrH   )r:   r   rr   rs   rM   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
maxResultsrt   ZworkflowNamerB   rG   r   Nr   )
AssertionErrorr2   r&   rN   r'   WORKFLOW_SEARCH_URIrK   rL   rv   Zget_all_workflows)r:   namesrs   rt   rB   rM   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&   ru   rN   r'   STATUS_SEARCH_URIrK   rv   Zget_status_for_projectZget_all_statuses)r:   rs   
project_idrB   rM   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   )rN   r'   WORKFLOW_PROJECT_URIrK   rL   )r:   project_idsrB   rM   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'   rN   rK   r:   idrO   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   )ru   r'   rN   rK   rL   rv   )r:   rs   rB   rO   rM   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'   rN   rK   rv   )r:   r   rB   rO   rM   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/projectr   r   )r:   r   rB   rO   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'   rN   rK   get_issue_typesr:   rO   r   r   r   r   D  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   )rc   r2   r&   rN   ospathjoinr'   COMMENTS_URI_FORMATformatrK   COMMENTS_URI_FORMAT_BOXrH   rv   )r:   r   rB   rM   r   r   r   get_commentsK  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_keyrr   rs   r   )r2   get_all_agile_boardsrH   r:   r   rr   rs   rM   r   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rapidViewIdr   r   )r:   r~   rO   ro   r   r   r   get_advanced_board_settingsc  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   )keyrr   rs   r   )r2   get_project_versions_paginatedrH   r   r   r   r   r   i  s    z&JiraApi.get_project_versions_paginatedc                 C   s   | j |S N)r2   get_project_components)r:   r   r   r   r   r   t  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offsetrs   rx   Zrecords)rc   rN   r'   	AUDIT_URIrK   )r:   r   rr   rs   rB   rM   r   r   r   r   get_audit_recordsw  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&   rq   WATCHERS_URI_FORMATr   rN   r'   WATCHERS_URI_FORMAT_BOXrK   )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%   z"operations,groups,applicationRolesr   r   r   	accountIdr   zrest/api/2/user/search.r*   TZincludeInactiver   N)r2   r&   r'   rN   rK   updateget_user_inforv   r   r   r   )r:   Z	limit_endrO   rB   Zusers	user_infor   r   r   	get_users  s:    
zJiraApi.get_usersc              
   C   sV   z| j j||dW S  tjk
rP } z|jjdkr<W Y d S |W 5 d }~X Y nX d S )Nr   rt     r2   userrequests	HTTPErrorro   rf   )r:   r   rt   excr   r   r   get_user_info_by_key  s    
zJiraApi.get_user_info_by_keyc              
   C   sV   z| j j||dW S  tjk
rP } z|jjdkr<W Y d S |W 5 d }~X Y nX d S )Nr*   rt   r   r   )r:   r*   rt   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_idrt   r   r   u   Пользователь u    не найден@emailAddressZdisplayName)r2   r&   r   r   r   rL   ZconfigZ
ORG_DOMAINZcmffieldsZCmfEmailZ
max_lengthrv   rH   r0   Ztranslit_strip)r:   r   rt   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//contextr   r   rx   r   r   )rN   r   r   r   r'   rK   extendrv   )r:   r   rB   rM   ro   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   	/context//optionr   r   r   r   r   rx   r   r   )r   r   r   r'   rN   rK   r   rv   )r:   ZfieldId	contextIdr'   rB   rM   ro   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< g |d< z`| |d |d< |d D ]@}z.| |d |d }||d< |d | W qv   Y qvX qvW q   Y qX qg |d< g |d< q|S )u]    Возвращает системные и настраиваемые поля задачи r   r   Zcustomcontextoptions)r2   Zget_all_fieldsrc   r&   r   r   r   )r:   r   rM   fieldr   r   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   rr   rs   rt   rz   )r   r2   r7   advanced_mode)r:   r   rr   maxrs   r7   ro   rM   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   rz   )r2   r7   r   )
r:   r;   rr   r   
start_dateend_daters   r7   ro   rM   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   rr   rs   rx   )r   r2   r7   int)r:   r   r7   ro   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 )
Nr   r   r   r   r   r   r   r   rx   )r2   r7   r   )r:   r   r   r   r7   ro   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)r2   Zget_all_projectsrL   )r:   rM   r   r   r   get_projectsR  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   rX   r   )r   Zrolesz\d+$r   )r   role_idZactorsZ	actorUserr   u+   Не найден пользователь u*    участвующий в проекте r   )project_nameproject_member_emailN)rq   PROJECTS_URIrH   setPROJECT_URI_FORMATr   r   r[   searchgroupPROJECT_ROLES_URI_FORMATrj   add)r:   r   r;   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   rl   r   )rq   ISSUE_URI_FORMATr   )r:   r   r]   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)splitrN   r'   Zcontent)r:   r'   rO   ro   r   r   r   get_attachment_contentu  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'   rc   rN   rK   rH   rv   )r:   r~   rO   rB   rM   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)rt   )r2   get_project_permission_schemeZget_permissionscheme)r:   r   schemer   r   r   r     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'   rN   rK   append)r:   issue_idrO   r  rM   r   r   r   r   get_issue_properties  s    zJiraApi.get_issue_propertiesc                 C   s   | j |}|d S )NZworklogs)r2   issue_get_worklog)r:   r  rM   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'   rN   rK   r   r   r   r   get_jira_global_settings  s    z JiraApi.get_jira_global_settingsc                 C   s$   z| j |W S    i  Y S X d S r   )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js6| | }q~| j||d }||d  t	||d krhq~|d  |d	 7  < q|D ]}| 
|d
 |d< q|S )Nzrest/api/2/screensr   r   r   r   r   rx   r   r   r   Ztabs)r   r   r   r'   r2   r&   rN   rK   r   rv   get_screen_tabs)r:   rO   rB   rM   ro   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'   rN   rK   get_tab_fields)r:   r  rO   ro   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//fieldsr  )r:   r  r  rO   ro   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g s\q||d  |d  |d 7  < q(|S )	Nr   r   z rest/api/2/issuetypescreenschemer   rG   r   r   r   )r2   r&   ru   r   r   r   r'   rN   rK   rL   rH   r   )r:   resultsrB   rO   ro   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'   rN   rK   rL   get_screen_scheme_issuetypes)r:   r   r'   rB   ro   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g sXq||	|d  |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   r   r   ZscreenSchemeIdactions)r   r   r   r'   ru   rN   rK   rL   rH   r   get_screen_scheme_actions)r:   screen_scheme_idr'   rB   r  ro   rn   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'   rN   rK   rL   )r:   r  r'   rB   ro   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g sZq|d D ]}||d	  qb|d
  |d 7  < q&|S )Nrest/api/2/priorityscheme/z	/projectsr   r)   r   r   rG   r   r   r   r   )	r   r   r   r'   rN   rK   rL   rH   r  )r:   	scheme_idr'   rB   Zproject_keysro   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g sZq~||d  |d	  |d
 7  < q&|S )Nr  z/prioritiesr   r)   r   r   rG   r   r   r   )	r   r   r   r'   rN   rK   rL   rH   r   )r:   r  r'   rB   
prioritiesro   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/rG   r  )r:   priority_idr'   ro   r   r   r   get_priorityL  s
    zJiraApi.get_priority)rr   rs   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	 }|	|g sq|| D ]f}	| j jr| 
|	d
 |	d< | |	d
 |	d< n*g |	d< |	d D ]}
|	d | |
 q||	 q|d  |d 7  < qv|S )Nzrest/api/2/priorityschemer   zrest/api/2/priorityschemeszschemes.projectKeysschemesr   r   rt   r   r   ZprojectKeysr  Z	optionIds)r2   r&   r   r   r   r'   r   rN   rK   rH   r  r  r  r!  )r:   rr   rs   r'   rt   r   rB   r"  ro   r   r   r   r   r   get_priority_schemesU  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||	 }|
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-keyrS   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 Код ошибки - rT   rU   rV   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'   rN   rf   rg   rh   rj   rK   rH   )r:   r   r   r$  Z
plugin_urlro   rp   Zplugin_dataZplugin_versionr'   rB   r   r   r   get_project_smart_config}  s0    

 


 z JiraApi.get_project_smart_configc                 C   s   t j| jd| d}ddd}i }| j||d }d|krLt|d |dg sZq|d D ]&}|t	|d	 g }|
|d
  qb|d  |d 7  < q&|S )Nz rest/api/2/issuesecurityschemes/z/membersr   r   r   r   rG   r   ZissueSecurityLevelIdZholderr   r   )r   r   r   r'   rN   rK   rL   rH   
setdefaultstrr  )r:   Zsecurity_scheme_idr'   rB   Zsecurity_level_membersro   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    Возвращает контекст пользовательского поляrest/api/3/field/r   r   r   r   r   r   r   Nru   r2   rH   )r:   field_id
context_idr'   rB   ro   r   r   r   get_field_context  s    zJiraApi.get_field_contextc           
   
   C   s   d| d| d}d| j d}i }z| jj||d}W n< tjk
rr } z|jjdkr`W Y 
dS  W 5 d}~X Y nX |d	g }|sq|D ]}	|	||	d
 < q|d  |d 7  < q"|S )u`    Возвращает опции контекста пользовательского поля r,  r   r   r   r   r   i  Nr   r   r   r   )ru   r2   rH   r   r   ro   rf   )
r:   r/  r0  r'   rB   r   ro   r   r   r^   r   r   r   get_field_context_option  s$    
z JiraApi.get_field_context_optionc                 C   s   d| d}|d| j d}g }| jj||d}|dg s<q||d D ] }|drD|t|d  qD|d  |d	 7  < q|S )
u    Возвращает сопоставленный список типов задач и контекста пользователького поля r,  z/context/issuetypemappingr   r-  r   r   ZissueTypeIdr   r   )ru   r2   rH   r  r(  )r:   r/  r0  r'   rB   r$  ro   r^   r   r   r   #get_field_context_issuetype_mapping  s    
z+JiraApi.get_field_context_issuetype_mappingc           
   
   C   s   d| d}d| j d}g }z| jj||d}W nN tjk
r~ } z.|jjdkrjtd| d W Y 
q|W 5 d	}~X Y nX |d
g sq|	|d
  |d  |d 7  < qd	}|D ]0}	|	d|kr|	d   S |	dr|	d }q|S )uz    Возвращает список контекстов пользовательского поля для проекта r,  z/context/projectmappingr   r   r   r   uA   Не удалось получить контексты поля u@   . Пользовательское поле не найдено.Nr   r   r   r   r   ZisGlobalContext)
ru   r2   rH   r   r   ro   rf   ri   Zwarningr   )
r:   r/  r   r'   rB   Zcontextsro   r   Zglobal_contextr   r   r   r   !get_field_context_project_mapping  s.    

z)JiraApi.get_field_context_project_mappingc                 c   sd   d| d}d| j d}| jj||d}|dg }|s:q`|D ]
}|V  q>|d  |d 7  < qd	S )
u8    Возвращает поля конфигурации zrest/api/3/fieldconfiguration/r  r   r   r   r   r   r   Nr.  )r:   Zfield_configuration_idr'   rB   ro   r   r   r   r   r   get_field_config_fields)  s    zJiraApi.get_field_config_fieldsc                 C   sp   d}d| j |d}g }| jj||d}|dg s4qX||d  |d  |d 7  < q|rh|rh|d S |S dS )	u    Возвращает список конфигураций или конфигурацию по умолчанию при is_default=Truezrest/api/3/fieldconfigurationr   )r   r   Z	isDefaultr   r   r   r   N)ru   r2   rH   r   )r:   Z
is_defaultr'   rB   Zfield_configurationsro   r   r   r   get_field_config=  s    zJiraApi.get_field_config)field_configuration_scheme_idr?   c                 C   s$   d}d|i}| j j||d}|d S )u  
        Возвращает список сопоставления типа задачи и конфигурации поля

        Args:
            field_configuration_scheme_id (str): ID схемы конфигурации полей

        Returns:
            list: список сопоставления типа задачи и конфигурации поля
        z+rest/api/3/fieldconfigurationscheme/mappingZfieldConfigurationSchemeIdr   r   r2   rH   )r:   r7  r'   rB   ro   r   r   r   "get_field_configuration_issue_typeV  s    
z*JiraApi.get_field_configuration_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   r   r   NZfieldConfigurationSchemer   r8  )r:   r   r'   rB   ro   rn   r7  r   r   r   &get_project_field_configuration_schemeg  s    
z.JiraApi.get_project_field_configuration_scheme)NN)N)r   )r   )Nr   )r   N)r   )N)N)N)N)r   N)r   NNN)NN)r   r%   )NN)F)h__name__
__module____qualname__ru   rZ   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(  r<   r   ZResponserN   r   rc   rq   r   r{   r}   r#   rL   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+  r1  r2  r3  r4  r5  r6  r9  r:  r   r   r   r   r$   H   s   
















#






*


      

	

	(-"
r$   )r   r   r   r   )typingr   r   r   r   r    	functoolsr   timer   r   Zrequests.authr	   Zcmf.includerI   Z	getLoggerri   r#   r$   r   r   r   r   <module>   s   

;