U
    g                     @   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                   @   s2  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 Zgdd Zhdd ZiedddZjee/e-dddZkedddZleedddZmedddZnd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 /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'   r7   r,   r+   r&   r-   projectr9   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.   )r4   rB   r.   params?ZGETdata)rE   levelzapplication/jsonzContent-type errorMessages)Zsix.moves.urllib.parserA   r7   r+   r1   r2   getr	   r-   r4   r3   Zlog_curl_debugloggingINFOjson	Exception)r;   r'   r?   r.   r   r   rA   resr   r   r   jira_request   s    0&
"zJiraApi.jira_request)urirC   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.jsonrG   z[/ '"{}]rrE   
   )rC   r.      u   Код ошибки - ,  -    , адрес запроса: )r9   parentname) replaceAPI_VERSIONresubr9   attachmentsrY   valuer5   openZfull_path_filerL   loadsread
isinstancedictr:   gdebugr'   rO   status_codereasontextloggerr   CmfErrorZmodelsZCmfAttachmentZupload_fileencodeZsave)	r;   rP   rC   rY   
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)r8   startlimitexpandN)MAX_ISSUES_RESULT_PER_REQUESTr3   Zjql_get_list_of_ticketsr8   len)r;   rt   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)rs   rt   ru   r{   u    из ry   )rv   r3   get_issues_for_boardr8   re   rf   rw   )r;   board_idrt   rx   ry   rz   r{   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   rs   rt   values)r3   Zget_all_sprintrI   )r;   r   rs   rt   rN   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_idrs   rt   r{   )r3   get_sprint_issuesrI   )r;   r   rs   rt   rN   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
maxResultsru   ZworkflowNamerC   rH   r   Nr   )
AssertionErrorr3   r&   rO   r'   WORKFLOW_SEARCH_URIrL   rM   rw   Zget_all_workflows)r;   namesrt   ru   rC   rN   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  n| j 	 E dH  dS )	u.    Получение всех statuses
        r   Zusagesr   	projectIdr   r   Nr   )
r3   r&   rv   rO   r'   STATUS_SEARCH_URIrL   rw   Zget_status_for_projectZget_all_statuses)r;   rt   
project_idrC   rN   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   rH   r   )rO   r'   WORKFLOW_PROJECT_URIrL   rM   )r;   project_idsrC   rN   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'   rO   rL   r;   idrP   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   rH   r   r   )rv   r'   rO   rL   rM   rw   )r;   rt   rC   rP   rN   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'   rO   rL   rw   )r;   r   rC   rP   rN   r   r   r   get_issue_type_schemes6  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   rC   rP   r   r   r   get_issue_for_project@  s    zJiraApi.get_issue_for_projectc                 #   s   | j jr*| j d}| | E d H  n~| j  }| d}| dd | j  }|rf| d| n
| d |D ]2 t	t
 fdd|d }|r|d  d<  V  qtd S )Nz/rest/api/3/issuetypezjira.user.localeZen_UKc                    s   | d  d kS Nr   r   )ZituZ
issue_typer   r   <lambda>d      z)JiraApi.get_issue_types.<locals>.<lambda>rY   ZuntranslatedName)r3   r&   r'   rO   rL   get_issue_typesget_mypreferencesset_mypreferencesdelete_mypreferencesnextfilter)r;   rP   issue_typesZcurrent_user_localeZissue_types_untranslatedZissue_type_untranslatedr   r   r   r   E  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   zrenderedBody,propertiesr   r   r   ZcommentsNr   )rd   r3   r&   rO   ospathjoinr'   COMMENTS_URI_FORMATformatrL   COMMENTS_URI_FORMAT_BOXrI   rw   )r;   r   rC   rN   r   r   r   get_commentsn  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_keyrs   rt   r   )r3   get_all_agile_boardsrI   r;   r   rs   rt   rN   r   r   r   r   r   {  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   rP   rp   r   r   r   get_advanced_board_settings  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   )keyrs   rt   r   )r3   get_project_versions_paginatedrI   r   r   r   r   r     s    z&JiraApi.get_project_versions_paginatedc                 C   s   | j |S N)r3   get_project_components)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offsetrt   ry   Zrecords)rd   rO   r'   	AUDIT_URIrL   )r;   r   rs   rt   rC   rN   r   r   r   r   get_audit_records  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)	r3   r&   rr   WATCHERS_URI_FORMATr   rO   r'   WATCHERS_URI_FORMAT_BOXrL   )r;   r   r   r   r   r   get_watchers  s    "zJiraApi.get_watchersc                 c   sV  | 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< |pd|d< d|d< | j||d }|sqR|D ] }|| |d  |V  q|d	  t|7  < |r|d	 |krqRqd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)r3   r&   r'   rO   rL   updateget_user_inforw   r   r   r   )r;   r*   Z	limit_endrP   rC   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   ru     r3   userrequests	HTTPErrorrp   rg   )r;   r   ru   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*   ru   r   r   )r;   r*   ru   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_idru   r   r   u   Пользователь u    не найден@emailAddressZdisplayName)r3   r&   r   r   r   rM   ZconfigZ
ORG_DOMAINZcmffieldsZCmfEmailZ
max_lengthrw   rI   r1   Ztranslit_strip)r;   r   ru   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   ry   r   r   )rO   r   r   r   r'   rL   extendrw   )r;   r   rC   rN   rp   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   ry   r   r   )r   r   r   r'   rO   rL   r   rw   )r;   ZfieldId	contextIdr'   rC   rN   rp   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)r3   Zget_all_fieldsrd   r&   r   r   r   )r;   r   rN   fieldr   r   r   r   r   
get_fields  s.    

zJiraApi.get_fieldsc                 C   s   | j |S r   )r3   Zissue_editmeta)r;   r   r   r   r   get_issue_meta6  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   rs   rt   ru   r{   )r   r3   r8   advanced_mode)r;   r   rs   maxrt   r8   rp   rN   r   r   r   get_all_project_issues9  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   r{   )r3   r8   r   )
r;   r<   rs   r   
start_dateend_datert   r8   rp   rN   r   r   r   get_all_project_issues_duringK  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   rs   rt   ry   )r   r3   r8   int)r;   r   r8   rp   r   r   r   get_project_issues_countf  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   ry   )r3   r8   r   )r;   r   r   r   r8   rp   r   r   r   get_project_issues_count_duringk  s    z'JiraApi.get_project_issues_count_duringc                 c   s$   | j  }|std|E dH  dS )u*   Возвращает все проектыuE   Не удалось получить ни одного проектаN)r3   Zget_all_projectsrM   )r;   rN   r   r   r   get_projectsu  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   Возвращает участников проектаrE   rY   r   r   Zrolesz\d+$r   )r   role_idZactorsZ	actorUserr   u+   Не найден пользователь u*    участвующий в проекте r   )project_nameproject_member_emailN)rr   PROJECTS_URIrI   setPROJECT_URI_FORMATr   r   r\   searchgroupPROJECT_ROLES_URI_FORMATrk   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   rm   r   )rr   ISSUE_URI_FORMATr   )r;   r   r^   r   r   r   get_attachments  s    zJiraApi.get_attachmentsc                 C   s.   |j dddd }| | j d| }|jS )uJ   
        Скачиваем содержимое вложения
        r/   r   )maxsplit)splitrO   r'   Zcontent)r;   r'   rP   rp   r   r   r   get_attachment_content  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   ZrenderedBodyr   r   r   r   )r'   rd   rO   rL   rI   rw   )r;   r   rP   rC   rN   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)ru   )r3   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'   rO   rL   append)r;   issue_idrP   r  rN   r   r   r   r   get_issue_properties  s    zJiraApi.get_issue_propertiesc                 C   s   | j |}|d S )NZworklogs)r3   issue_get_worklog)r;   r  rN   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'   rO   rL   )r;   rP   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   )r3   !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 r   )r3   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   ry   r   r   r   Ztabs)r   r   r   r'   r3   r&   rO   rL   r   rw   get_screen_tabs)r;   rP   rC   rN   rp   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'   rO   rL   get_tab_fields)r;   r  rP   rp   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  rP   rp   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   rH   r   r   r   )r3   r&   rv   r   r   r   r'   rO   rL   rM   rI   r   )r;   resultsrC   rP   rp   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   rH   r   r   ZissueTypeScreenSchemer   r   )r   r   r   r'   rO   rL   rM   get_screen_scheme_issuetypes)r;   r   r'   rC   rp   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   rH   r   r   r   ZscreenSchemeIdactions)r   r   r   r'   rv   rO   rL   rM   rI   r   get_screen_scheme_actions)r;   screen_scheme_idr'   rC   r  rp   ro   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   rH   r   r   Zscreensr   r   r   r'   rO   rL   rM   )r;   r"  r'   rC   rp   r   r   r   r!  2  s    z!JiraApi.get_screen_scheme_actionsc                 C   s"   z| j  W S    g  Y S X d S r   )r3   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   rH   r   r   r   r   )	r   r   r   r'   rO   rL   rM   rI   r  )r;   	scheme_idr'   rC   Zproject_keysrp   r<   r   r   r   get_priority_scheme_projectsF  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   rH   r   r   r   )	r   r   r   r'   rO   rL   rM   rI   r   )r;   r&  r'   rC   
prioritiesrp   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/rH   r#  )r;   priority_idr'   rp   r   r   r   get_priorityo  s
    zJiraApi.get_priority)rs   rt   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   ru   r   r   ZprojectKeysr(  Z	optionIds)r3   r&   r   r   r   r'   r   rO   rL   rI   r'  r)  r  r+  )r;   rs   rt   r'   ru   r   rC   r,  rp   r
  r*  r   r   r   get_priority_schemesx  s8    zJiraApi.get_priority_schemes)r   r   
issuetypesc              
   C   s  d}t j| jd}| |}|jdkrXd| d|j d|j d|j d| 
}t||	 }|
d	}|d
krd| 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 )Nu   Установите плагин "Smart Jira Configuration" версии 4.8.12, 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-historyz1rest/plugins/1.0/com.eis.jira.plugins.jiradoc-keyrT   u   Для получения полной конфигурации проекта не установлен плагин "Smart Jira Configuration". u    Код ошибки - rU   rV   rW   version)z4.8.12z4.8.9z4.8.7z4.7.3z4.5.1u.   Неверная версия плагина (z). z-rest/smart-configuration/1.0/getProjectConfigZ
projectKeyr   r.  r   uN   Не удалось получить конфигурацию проекта "uL   " через плагин "Smart Jira Configuration". Код ошибки - )r   r   r   r'   rO   rg   rh   ri   rk   rL   rI   )r;   r   r   r.  rq   Z
plugin_urlrp   Zplugin_dataZplugin_versionr'   rC   r   r   r   get_project_smart_config  s4    

&

 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   rH   r   ZissueSecurityLevelIdZholderr   r   )r   r   r   r'   rO   rL   rM   rI   
setdefaultstrr  )r;   Zsecurity_scheme_idr'   rC   Zsecurity_level_membersrp   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rv   r3   rI   )r;   field_id
context_idr'   rC   rp   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`    Возвращает опции контекста пользовательского поля r6  r   r   r   r   r   i  Nr   r   r   r   )rv   r3   rI   r   r   rp   rg   )
r;   r9  r:  r'   rC   r   rp   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    Возвращает сопоставленный список типов задач и контекста пользователького поля r6  z/context/issuetypemappingr   r7  r   r   issueTypeIdr   r   )rv   r3   rI   r  r2  )r;   r9  r:  r'   rC   r.  rp   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    Возвращает список контекстов пользовательского поля для проекта r6  z/context/projectmappingr   r   r   r   uA   Не удалось получить контексты поля u@   . Пользовательское поле не найдено.Nr   r   r   r   r   ZisGlobalContext)
rv   r3   rI   r   r   rp   rg   rj   Zwarningr   )
r;   r9  r   r'   rC   Zcontextsrp   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   Nr8  )r;   Zfield_configuration_idr'   rC   rp   r   r   r   r   r   get_field_config_fieldsO  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)rv   r3   rI   r   )r;   Z
is_defaultr'   rC   Zfield_configurationsrp   r   r   r   get_field_configc  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   r3   rI   )r;   rB  r'   rC   rp   r   r   r   "get_field_configuration_issue_type|  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   rC  )r;   r   r'   rC   rp   ro   rB  r   r   r   &get_project_field_configuration_scheme  s    
z.JiraApi.get_project_field_configuration_schemec                 C   s:   d}d| }| j |d}| jj|| jj|i dd}|jS )u   
        Получает бизнес-процесс как XML

        Args:
            name (str): название бизнес-процесса

        Returns:
            str: содержимое в формате XML
        z%secure/admin/WebSudoAuthenticate.jspazL/secure/admin/workflows/ViewWorkflowXml.jspa?workflowMode=live&workflowName=)ZwebSudoPasswordZwebSudoDestinationT)r4   rE   filesr   )r+   r3   postZno_check_headersri   )r;   rY   r'   ZdestinationrE   rp   r   r   r   get_workflow_as_xml  s    

zJiraApi.get_workflow_as_xmlc                 C   s   d}| j |S )u   
        Получает cloudId для Jira
        https://developer.atlassian.com/cloud/jira/software/rest/intro/#base-url-differences

        Returns:
            dict: результат ответа
        z_edge/tenant_inforC  )r;   r'   r   r   r   get_cloud_id  s    zJiraApi.get_cloud_idr   c                 C   s   d| }| j |S )u   
        Получает информацию о схеме бизнес-процессов проекта

        Args:
            project_key (str): Ключ проекта

        Returns:
            dict: результат ответа
        z$rest/projectconfig/1/workflowscheme/rC  )r;   r   r'   r   r   r   get_project_workflow_scheme  s    

z#JiraApi.get_project_workflow_scheme)cloud_idr   issue_type_idsc                    s   d| d}ddi}g }|D ]}| ||d qd|i}| jj|||d}	|	d }
|	d	 }|D ]8}|d D ]* tt fd
d|
d}|rl | qlq`|S )u  
        Получает информацию бизнес-процессов
        для проектов с упрощенной конфигурацией (simplified) 

        Args:
            cloud_id (str): ID облака
            project_id (int): ID проекта
            issue_type_ids (list): список ID типов задачи

        Returns:
            list: данные бизнес-процессов
        z-gateway/api/jira/project-configuration/query/z/2/workflowZuseTransitionLinksFormatT)r=  r   ZprojectAndIssueTypes)rC   rE   statuses	workflowsc                    s   | d  d kS )NZstatusReferencer   )sZworkflow_statusr   r   r     r   z:JiraApi.get_simplified_project_workflows.<locals>.<lambda>N)r  r3   rG  r   r   r   )r;   rK  r   rL  r'   rC   Zproject_and_issue_typesZissue_type_idrE   rp   rM  rN  Zworkflowstatusr   rP  r    get_simplified_project_workflows  s2    
z(JiraApi.get_simplified_project_workflows)r   c              
   C   sh   d}d|i}z| j j||dd}W n> tjk
r` } z|jjdkrLW Y dS |W 5 d}~X Y nX |jS )u   
        Возвращает значение настройки текущего пользователя

        Args:
            key (str): ключ настройки

        Returns:
            _type_: значение
        rest/api/2/mypreferencesr   T)rC   r   r   N)r3   rI   r   r   rp   rg   ri   )r;   r   r'   rC   rp   r   r   r   r   r      s    


zJiraApi.get_mypreferences)r   rE   c                 C   s$   d}d|i}| j j||i |d dS )u   
        Устанавливает значение настройки текущего пользователя

        Args:
            key (str): ключ настройки
            data (str): значение настройки
        rS  r   )rE   rF  rC   N)r3   Zput)r;   r   rE   r'   rC   r   r   r   r     s    zJiraApi.set_mypreferencesc                 C   s<   d}d|i}z| j j||d W n tjk
r6   Y nX dS )u   
        Удаляет значение настройки текущего пользователя

        Args:
            key (str): ключ настройки
        rS  r   r   N)r3   deleter   r   )r;   r   r'   rC   r   r   r   r   ,  s    zJiraApi.delete_mypreferences)NN)N)r   )r   )Nr   )r   N)r   )N)NN)N)N)r   N)r   NNN)NN)r   r%   )NN)F)o__name__
__module____qualname__rv   r[   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__r2  r=   r   ZResponserO   r   rd   rr   r   r|   r~   r#   rM   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-  r0  r5  r;  r<  r>  r?  r@  rA  rD  rE  rH  rI  rJ  rR  r   r   r   r   r   r   r   r$   H   s   
















#




)

*


      

	

	(0"
2r$   )r   r   r   r   )typingr   r   r   r   r    	functoolsr   timer   r   Zrequests.authr	   Zcmf.includerJ   Z	getLoggerrj   r#   r$   r   r   r   r   <module>   s   

;