
     @i                    (   d dl Z 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mZ d dlmZ d dlmZ d d	lmZ d d
l  G d dej0                        Zej5                  d      Zej9                   e              ddZ G d de      Zy)    N)DictListOptionalIterator)wrapssleep)HTTPAdapter)Retry)
HTTPStatus)Path)Jira)*c                       e Zd Zd Zy)SensitiveDataFilterc                     t        |d      rd}|j                  j                  dd      }t        j                  d||      }t        j                  d||      }t        j                  d||      }t        j                  d||      }||_        y	y )
Nmsgz\1***\2z\""z("username":\s*")[^"]*(")z("password":\s*")[^"]*(")z ("webSudoPassword":\s*")[^"]*(")z("atl_token":\s*")[^"]*(")T)hasattrr   replaceresub)selfrecordrepl	clean_msgs       ./modules/jira/api.pyfilterzSensitiveDataFilter.filter   s    65!D

**5#6I;T9MI;T9MIBD)TI<dINI"FJ "    N)__name__
__module____qualname__r    r   r   r   r      s    
r   r   zatlassian.rest_clientc                 "      fd}|S )u-  
    Декоратор для повторного выполнения функции через некоторое время, при возникновении ошибки.
    Использует экспоненциальный рост времени повтора(factor) до граничного времени ожидания(border_sleep_time)

    :param exception: исключения, которые отлавливаются
    :param start_sleep_time: начальное время повтора
    :param factor: во сколько раз нужно увеличить время ожидания
    :param border_sleep_time: граничное время ожидания
    :param max_attempts: максимальное количество попыток выполнения
    c                      t                fd       }t                fd       }t        j                         r|S |S )Nc               ?      K   d}
}	 |dz  }	  | i |E d {   S 7 # $ r/}|	k(  r||k\  r}n|
dz  z  z  }t        |       Y d }~nd }~ww xY wPwNr         r   argskwargsattempttime_outerrorborder_sleep_time	exceptionfactorfuncmax_attemptsstart_sleep_times        r   	gen_retryz3backoff.<locals>.retry_exception.<locals>.gen_retry-   s     G'H1$'+T'<V'<<=<  	$,.##44#4 $4qF{$BB(OO	$ s6   A! ! A! A%AAAAc                      d}
}	 |dz  }	  | i |S # $ r/}|	k(  r||k\  r}n|
dz  z  z  }t        |       Y d }~nd }~ww xY wFr'   r   r*   s        r   retryz/backoff.<locals>.retry_exception.<locals>.retryA   s{    G'H1$000  	$,.##44#4 $4qF{$BB(OO	$ s    A	%AA	)r   inspectisgeneratorfunction)r3   r6   r8   r0   r1   r2   r4   r5   s   `  r   retry_exceptionz backoff.<locals>.retry_exception,   sV    	t	$ 	$ 
	$& 
t	$ 	$ 
	$& &&t,r   r#   )r1   r5   r2   r0   r4   r;   s   ````` r   backoffr<   !   s    + +Z r   c                       e Zd ZdZ fdZd Z fdZ fdZ fdZd Z	 fdZ
	 	 	 dod	Zd
 Z	 	 	 	 	 	 dpdZdqdee   fdZdr fd	Z ee      d        Z ee      	 	 	 dsdededefd       Zdqdee   fdZdtdee   fdZd Zd Zd ZdrdZdefdZdefdZ fdZ de!defd Z"d!e!fd"Z#dud#e!dedefd$Z$dvd%e!dedefd&Z% fd'Z&d( Z'd) Z( fd*Z)dwd+Z*de!fd,Z+dxdee   fd-Z,dwd.Z-dwd/Z.d0 Z/d1 Z0d2 Z1de2e!ef   fd3Z3d4 Z4dtd5Z5dyd6Z6	 	 dzd7Z7d8e!fd9Z8dxdefd:Z9dee   fd;Z:d< Z; fd=Z<d> Z= fd?Z> fd@Z? fdAZ@ fdBZA fdCZBdD ZCdE ZDdF ZEdG ZFdH ZG fdIZHdJ ZIdK ZJd{dededefdLZKdxd%e!dMe!dNe!fdOZLdP ZMdQ ZNdR ZOdS ZPdT ZQdU ZRd|dVZSdWe!defdXZTdY ZUdZ ZVd[ ZWd%e!fd\ZXd]e!ded^efd_ZYd`e!fdaZZd`e!dbe!fdcZ[d`e!fddZ\dee!fdfZ]	 	 	 	 d}de!d%e!dge!de!def
dhZ^dwdefdiZ_defdjZ`dk Za fdlZb fdmZc fdnZd xZeS )~JiraApid   c                    |j                  d      r|nd| }|j                  d      r|j                  d      |d<   n|j                  d      |d<   d|vrd|d<   d|vrt        j                         |d<   t	        |   |g|i | | j                          |j                  d      | _        d	| _        d
| _	        y )Nhttphttps://cloudtokenpasswordtimeout,  sessionFzrest/auth/1/session)

startswithgetcmfutilrequests_sessionsuper__init___set_session_retriesrD   _session_valid_session_url)r   urlr+   r,   	__class__s       r   rN   zJiraApi.__init___   s    ^^F+c8C51A::g!'G!4F:$jj4F7OF" &F9F" ' 8 8 :F9.t.v.!!#ZZ(
#1r   c                     t        t        j                  t        j                  t        j                  d      }t	        |      }| j
                  j                  d|       | j
                  j                  d|       y)u   
        Конфигурирует стратегию повторных попыток
        и ассоциирует ее с сессией
        r)   )totalstatusstatus_forcelistbackoff_factor)max_retrieszhttp://rB   N)r   configIMPORT_REQUEST_RETRY_TOTAL!IMPORT_REQUEST_RETRY_STATUS_CODESr
   _sessionmount)r   retrieshttp_adapters      r   rO   zJiraApi._set_session_retriesu   s`    
 3344#EE	
 #w7I|4J5r   c                 @    | j                   rt        | 	  ||       yy)u   
        Переопределенный метод
        Базовая аутентификация устанавливается только для Jira Cloud
        N)rC   rM   _create_basic_session)r   usernamerE   rS   s      r   rb   zJiraApi._create_basic_session   s     
 ::G)(H= r   c                    | j                   j                  j                          | j                  | j                  d}t
        |   d| j                  |      }| j                   j                  st        d      d| _	        y)u;   
        Выполняет авторизацию
        )rc   rE   POST)pathdatauR   Ошибка аутентификации: файлы cookie не полученыTN)
r]   cookiesclearrc   rE   rM   requestrQ   RuntimeErrorrP   )r   rg   responserS   s      r   _authenticatezJiraApi._authenticate   sy    
 	##% 
 7?"" # 
 }}$$stt"r   c                     	 t         |   d| j                        }|j                  t        j
                  k(  S # t        j                  $ r Y yw xY w)u~   
        Проверяет валидность текущей сессии через тестовый запрос
        GET)rf   F)rM   rj   rQ   status_coder   OKrequestsRequestException)r   rl   rS   s     r   _check_sessionzJiraApi._check_session   sV    	w&& ' H '':==88(( 		s   7; AAc                    | j                   r| j                  st        d      | j                  j                  r4| j
                  s(| j                         rd| _        | j                          y| j                          | j                          y)u>   
        Создает валидную сессию
        u_   Учетные данные для аутентификации не предоставленыTN)	rc   rE   
ValueErrorr]   rh   rP   rt   user_get_websudorm   r   s    r   _create_valid_sessionzJiraApi._create_valid_session   sq     $--~ ==  )<)<""$&*#%%' 	r   c                    | j                   rt        |   |i |S 	 | j                  s| j	                          t        |   |i |}|j
                  t        j                  k(  r&d| _        | j	                          t        |   |i |}|S # t        j                  $ rd}t        |d      rR|j                  j
                  t        j                  k(  r+d| _        | j	                          t        |   |i |cY d}~S  d}~ww xY w)u8  
        Переопределенный метод
        Используется только для Jira Server.
        Перед запросом проверяется валидность сессии
        и при необходимости выполняется авторизация 
        Frl   N)rC   rM   rj   rP   ry   rp   r   UNAUTHORIZEDrr   rs   r   rl   )r   r+   r,   rl   erS   s        r   rj   zJiraApi.request   s     ::7?D3F33	&&**,w77H ##z'>'>>&+#**, 7?D;F;O(( 	q*%!***@*@JD[D[*[&+#**,w777	s%   A/B D!AD 9D?D  Dc           	      "   |xs | j                   }|xs | j                  }| j                  d||       | j                  j	                  |d||| j
                  | j                        5 }t        j                  d| d|j                   d|j                          |j                          |j                  j	                  dd	      }t        j                  d
|      }|r%|j                  d      xs |j                  d      }	nd	}	t!        |d      5 }
|j#                  |      D ]  }|
j%                  |        	 ddd       t'        |      }|j)                         j*                  }|	|dcddd       S # 1 sw Y   <xY w# 1 sw Y   yxY w)u  
        Скачивает файл

        Args:
            download_url (_type_): url файла для скачивания
            save_path (_type_): путь для сохранения файла
            headers (_type_, optional): Заголовки. Defaults to None.
            timeout (_type_, optional): Таймаут. Defaults to None.
            chunk_size (_type_, optional): _description_. Defaults to 8*1024.
        ro   )methodrR   headersT)streamr   rF   verifyproxiesz
HTTP: GET z ->  zContent-Disposition z!filename\*?=(?:"([^"]+)"|([^;]+))r(   r)   wb)
chunk_sizeN)	file_name	file_size)no_check_headersrF   log_curl_debugr]   rJ   
verify_sslr   loggerdebugrp   reasonraise_for_statusr   r   searchgroupopeniter_contentwriter   statst_size)r   download_url	save_pathr   rF   r   rescontent_dispositionmatchr   fchunk	file_pathr   s                 r   download_filezJiraApi.download_file   sz   $ 2T22)T\\5lGL]]??LL  
 	 LL:l^47H#**VW  " #&++//2G"LIIBDWXE!KKN<ekk!n		i& #! ---D #EGGEN## YI!(00I '&5	 	&# #'	 	s%   *B*F)E9>1F9F	>FFc                 
   d}| j                   dd}d}| j                  j                  r5| j                  j                  j                         }|j	                  d      }|r||d<   | j                  ||g | j                        S )u   
        Получает веб-куки sudo
        Переопределенный метод, так как метод в родительском классе выполняется некорректно
        z%secure/admin/WebSudoAuthenticate.jspafalse)webSudoPasswordwebSudoIsPostNzatlassian.xsrf.token	atl_token)rf   rg   filesr   )rE   r]   rh   get_dictrJ   postform_token_headers)r   rR   rg   r   rh   s        r   rw   zJiraApi.user_get_websudo  s    
 6#}}$

 	==  mm++446G$:;I )DyycB@W@WyXXr   c                 V   i }|t        |      |d<   |1t        |t        t        t        f      rdj                  |      }||d<   |||d<   |||d<   |||d<   | j                  | j                  rdnd      }	g }
	 | j                  r
|xs d	|d
<   nt        |      |d<   | j                  |	|      }|s	 |
S |d   }|
j                  |       |	 |
S | j                  r|d   r	 |
S |j                  d
      }n0t        |d         }|t        |      |z   k  r	 |
S |t        |      z  })u   
        Переопределение метода jql_get_list_of_tickets класса Jira
        с учетом https://developer.atlassian.com/changelog/#CHANGE-2046
        
maxResults,fieldsjqlexpandvalidateQuery
search/jqlr   r   nextPageTokenstartAtparamsissuesisLastrU   )int
isinstancelisttuplesetjoinresource_urlrC   rJ   extendlen)r   r   r   startlimitr   validate_querynext_page_tokenr   rR   resultsrl   r   rU   s                 r   jql_get_list_of_ticketszJiraApi.jql_get_list_of_tickets+  so    #&u:F< &4"45&)%F8?F5M%F8%&4F?#

Izz*9*?R'$'Jy!xxFx3H$ ! h'FNN6"   zzH%  #+,,"?HW-.CK%//  V$1 r   returnc              #      K   |d}| j                   rd| }d}d}|xs | j                  }	 | j                  |||d      }|sy||z  }|E d{    |t        |      z  }d|cxk  r|k  ry C7  w)u(    Получение всех задач Norder by created ASCzcreated > '1900-01-01' r   renderedFields)r   r   r   r   )rC   MAX_RESULTSr   r   )r   r   r   start_atrU   max_resultsr   s          r   
get_issueszJiraApi.get_issuesf  s     ;(Czz 0u5/t//11'	 2 F #HS[ E5!E! "  s   AA2A0!A2c              #      K   d}d}d}|xs | j                   }	 t        | 	  ||||d      }|d   sy ||z  }t        j	                  | d|d           |d   E d {    |t        |d         z  }d|cxk  r|k  s
n ||d   kD  ry q7 ,w)Nr   r   changelog,renderedFields)r   r   r   r   u    из rU   )r   rM   get_issues_for_boardgr   r   )	r   board_idr   r   r   rU   r   r   rS   s	           r   r   zJiraApi.get_issues_for_board  s     $/t//W1!1 2 F (##HGGxjvg&789h'''S)**E5!E!Xw%?  (s   ABB -Bc              #      K   d}d}	 | j                  |||      }|j                  dg       sy ||z  }|d   D ]  }|  ;w)Nr   2   )r   r   r   values)get_all_sprintrJ   )r   r   r   r   r   rows         r   get_sprintszJiraApi.get_sprints  sa     %%xuE%RC778R(UNE8} 	 s   AAr   r   r   c              #      K   d| d}|xs d|xs dd}|rdj                  |      |d<   	 | j                  ||      }|j                  d	g       sy|d
xx   |d   z  cc<   |d	   D ]  }|  Ew)u  
        Возвращает все задачи в для заданного спринта.
        Включены только задачи, на просмотр которых у пользователя есть разрешение.

        Args:
            sprint_id (_type_): ID спринта
            start (int, optional): начальный индекс задач. Defaults to None.
            limit (int, optional): максимальное количество задач на странице. Defaults to None.
            fields (list, optional): необходимые поля задач. Defaults to None.

        Yields:
            dict: данные задачи
        zrest/agile/1.0/sprint/z/issuer   r   r   r   r   r   r   r   r   r   N)r   rJ   )	r   	sprint_idr   r   r   rR   r   r   r   s	            r   get_sprint_issueszJiraApi.get_sprint_issues  s     * 'yk8 z+2
 "xx/F8((3v(.C778R(9!558} 	 s   A0A2c              #   x  K   d}|dk  sJ d       d|xs d|d}|r||d<   | j                   ro| j                  d      }	 | j                  ||      }d	|v rt        |d	         |d
   sy|d
   E d{    |dxx   t	        |d
         z  cc<   |r	|d   |k\  ry]| j                         E d{    y7 B7 w)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   r   r   r   workflowNamezworkflow/searchr   errorMessagesr   Nr   )rC   r   rJ   	Exceptionr   get_all_workflows)r   namesr   r   r   rR   r   s          r   get_workflowszJiraApi.get_workflows  s      Z{eee{ekr"$%*F>"::##$56Chhs6h2"c)#C$8998}x=((y!SX%77!VI.%7  --/// )
 0s$   A1B:3B64<B:0B81B:8B:c              #     K   | j                   rx| j                  d      }d|xs | j                  dd}|r||d<   	 | j                  ||      }|d   sy|d   E d{    |d	xx   t	        |d         z  cc<   |r	|d	   |k\  ryK|r| j                  |      E d{    y| j                         E d{    y7 ^7  7 	w)
u.    Получение всех statuses
        zstatuses/searchr   usagesr   	projectIdr   r   Nr   )rC   r   r   rJ   r   get_status_for_projectget_all_statuses)r   r   
project_idrR   r   r   s         r   get_statuseszJiraApi.get_statuses  s      ::##$56C!"%2K4;K;K (*F &0{#hhs6h28}x=((y!SX%77!VI.%7  66zBBB00222 ) C2s6   ACB<?CB>C6C 7C>C Cc                 b    d}d|i}| j                  ||      }d|v rt        |d         |d   S )Nz!rest/api/3/workflowscheme/projectr   r   r   r   rJ   r   )r   r   rR   r   r   s        r   get_project_schemezJiraApi.get_project_scheme  sE    1z*hhs6h*c!C0118}r   c                 0    d| d}| j                  |      S )Nzrest/api/3/workflowscheme/z	/workflowrJ   r   iduris      r   get_issue_type_workflow_schemez&JiraApi.get_issue_type_workflow_scheme  s    *2$i8xx}r   c                 .    d| }| j                  |      S )Nzrest/api/3/issuetype/r   r   s      r   get_issue_typezJiraApi.get_issue_type  s    %bT*xx}r   c              #      K   d|xs | j                   d}d}	 | j                  ||      }d|v rt        |d         |d   sy |d   E d {    |dxx   t        |d         z  cc<   |r	|d   |k\  ry ]7 )w)Nr   r   zrest/api/3/workflowschemer   r   r   r   )r   rJ   r   r   )r   r   r   r   r   s        r   get_all_workflow_schemesz JiraApi.get_all_workflow_schemes  s     e.Gt7G7GH)((3v(.C#%O 455x=8}$$9S]!33	*e3  %s   A
A8A6*A8project_idsc              #      K   dd|d}d}	 | j                  ||      }|d   sy |d   E d {    |dxx   t        |d         z  cc<   @7 w)Nr   r   )r   r   r   z"rest/api/3/issuetypescheme/projectr   r   r   )rJ   r   )r   r   r   r   r   s        r   get_issue_type_schemeszJiraApi.get_issue_type_schemes  sf     b{K2((3v(.Cx=8}$$9S]!33  %s   +AAAr   c                 4    d|i}d}| j                  ||      S )Nr   zrest/api/3/issuetype/projectr   r   )r   r   r   r   s       r   get_issue_for_projectzJiraApi.get_issue_for_project#  s$    z*,xxFx++r   c              #     K   | j                   rd}| j                  |      E d {    y t        |          }| j	                  d      }| j                  dd       t        |          }|r| j                  d|       n| j                  d       |D ])  t        t        fd|      d       }|r|d   d<    + y 7 w)Nzrest/api/3/issuetypejira.user.localeen_UKc                     | d   d   k(  S Nr   r#   )itu
issue_types    r   <lambda>z)JiraApi.get_issue_types.<locals>.<lambda>G  s    CID1A$A r   nameuntranslatedName)	rC   rJ   rM   get_issue_typesget_mypreferencesset_mypreferencesdelete_mypreferencesnextr   )r   r   issue_typescurrent_user_localeissue_types_untranslatedissue_type_untranslatedr  rS   s         @r   r  zJiraApi.get_issue_types(  s     :: )Cxx}$$'13K #'"8"89K"L ""#5w?',w'>'@$"&&'9;NO ))*<= * !
*.A0 +' +5LV5TJ12  !/ %s   #CCBC	issue_keyc              #      K   | j                  d      }| d| d}t        ddd      }	 | j                  ||      }|j                  d	      sy
|d	   E d
{    |dxx   t        |d	         z  cc<   L7 w)u@    Получим все комментарии по задаче issue/z/commentr   r   zrenderedBody,propertiesr   r   commentsNr   )r   dictrJ   r   )r   r  base_urlrR   r   r   s         r   get_commentszJiraApi.get_commentsQ  s     $$W-
!I;h/aB7PQ((3v(.C77:&:&&9S_!55  's   AA9A7A9issue_id_or_keyc              #      K   | j                  d      }| d| d}ddd}	 | j                  ||      }|j                  d      sy	|d   E d	{    |d
   ry	|dxx   t        |d         z  cc<   R7 $w)u?    Получим историю изменений задачи r  r  z
/changelogr   r?   r   r   r   Nr   r   )r   rJ   r   )r   r  r  rR   r   r   s         r   get_changelogzJiraApi.get_changelog]  s     $$W-
!O,J7
 ((3v(.C778$8}$$8}9S]!33  %s   AA6A4%A6r   c                     d| d}|dn||dn|d}g }	 | j                  ||      }|j                  dg       s	 |S |j                  |d          |	 |S |dxx   |d	   z  cc<   R)
u  
        Возвращает все проекты, связанные с доской,
        для заданного идентификатора доски.
        Если у пользователя нет разрешения на просмотр доски,
        никакие проекты не будут возвращены вообще.
        Возвращаемые проекты упорядочены по названию.

        Args:
            board_id (str): id доски
            start (int, optional): начальная позиция выборки. Defaults to 0.
            limit (int, optional): максимальное количество возвращаемых элементов.
                                   Если указано None, то вернет все элементы.
                                   Defaults to 50.

        Returns:
            list: список проектов
        rest/agile/1.0/board/z/projectr   r   r   r   r   r   r   )rJ   r   )r   r   r   r   rR   r   r   results           r   get_agile_board_projectzJiraApi.get_agile_board_projectn  s    $ &hZx8!Mqu %"5

 XXc&X1F::h+  MM&*+   9!55 r   project_keyc                 ~    d}i }|r||d<   |rt        |      |d<   |rt        |      |d<   | j                  ||      S )u  
        Возвращает доски находящиеся в проекте Jira Cloud

        Args:
            project_key (_type_, optional): ключ или id проекта. Defaults to None.
            start (int, optional): начальная позиция выборки. Defaults to 0.
            limit (int, optional): максимальное количество возвращаемых элементов. Defaults to 50.

        Returns:
            _type_: _description_
        zrest/agile/1.0/boardprojectLocationr   r   r   )r   rJ   )r   r   r   r   rR   r   s         r   get_project_boardszJiraApi.get_project_boards  sQ     %(3F$% #E
F9#&u:F< xxFx++r   c              #      K   d}d}	 | j                   r| j                  |||      }nt        |   |||      }|j	                  dg       sy ||z  }|d   D ]  }|  Zw)Nr   r   )r   r   r   r   )rC   r#  rM   get_all_agile_boardsrJ   r   r   r   r   r   r   rS   s         r   r%  zJiraApi.get_all_agile_boards  s     zz--+UZ_-`g2{RW_d2e778R(UNE8} 	 s   A A#c                 f    d}| j                  |d|i      }| j                  |      }||d   d<   |S )Nz3rest/greenhopper/1.0/rapidviewconfig/editmodel.jsonrapidViewIdr   cardColorConfig
strategies)rJ    get_board_card_colors_strategies)r   r   r   rl   card_colors_strategiess        r   get_advanced_board_settingsz#JiraApi.get_advanced_board_settings  sD    C88C(A8B!%!F!Fx!P4J"#L1r   c                     d| d}ddi}i }g d}|D ]"  }	 | d| }| j                  ||      }|||<   $ |S # t        $ r Y 2w xY w)u   
        Получает стратегии присвоения цветов карточкам

        Args:
            board_id (int | str): ID доски

        Returns:
            dict: стратегии цветов карточек
        z rest/greenhopper/1.0/cardcolors/z	/strategypreloadValuestrue)	issuetypepriorityassigneecustomr  r   r   )	r   r   r  r   r*  strategy_typesstrategy_typerR   rl   s	            r   r+  z(JiraApi.get_board_card_colors_strategies  s     6hZyIV
 

 , 	M!
!M?388C87,4
=)		 	  s   :	AAc              #      K   d}d}	 t         |   |||      }|j                  dg       sy ||z  }|d   D ]  }|  9w)Nr   r   )keyr   r   r   )rM   get_project_versions_paginatedrJ   r&  s         r   r9  z&JiraApi.get_project_versions_paginated  sc     '8[PU]b8cC778R(UNE8} 	 s   ?Ac              #      K   | j                  d      }d}d}t               }|r||d<   	 ||d<   ||d<   | j                  ||      }||d   kD  ry ||z  }|d   D ]  }|  9w)	Nzauditing/recordr   i  
projectIdsoffsetr   rU   records)r   r  rJ   )r   r   rR   r   r   r   r   r   s           r   get_audit_recordszJiraApi.get_audit_records  s      12#.F< $F8#F7O((3'Cs7|#UNE9~ 	 s   A!A#c                 .    | j                  |      }|d   S )u(   Наблюдатели по задачеwatchers)issue_get_watchers)r   r  r@  s      r   get_watcherszJiraApi.get_watchers  s    **95
##r   c              #   6  K   | j                   r~d}dddd}|r|d   |kD  r||d<   	 | j                  ||      }|sy|D ])  }|j                  | j                  |d	                | + |d
xx   t	        |      z  cc<   |r	|d
   |k\  ryfd}dddd}|r|d   |kD  r||d<   |xs d|d<   d|d<   	 | j                  ||      }|sy|D ])  }|j                  | j                  |d                | + |d
xx   t	        |      z  cc<   |r	|d
   |k\  ryfw)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   Tr   	accountIdr   zrest/api/2/user/search.rc   includeInactiver8  N)rC   rJ   updateget_user_infor   )r   rc   	limit_endr   r   users	user_infos          r   	get_userszJiraApi.get_users  st     ::+C!"#AefFVL1I='0|$V4!& $I$$T%7%7	+8N%OP#O$ y!SZ/!	!2i!?  +C!"#AefFVL1I='0|$!)SF:(,F$%V4!& $I$$T%7%7	%8H%IJ#O$ y!SZ/!	!2i!? s   DDc                     	 | j                  ||      S # t        j                  $ r%}|j                  j                  dk(  rY d }~y |d }~ww xY w)Nr8  r     userrr   	HTTPErrorrl   rp   )r   r8  r   excs       r   get_user_info_by_keyzJiraApi.get_user_info_by_key-  sJ    	99V944!! 	||''3.I	    AAAAc                     	 | j                  ||      S # t        j                  $ r%}|j                  j                  dk(  rY d }~y |d }~ww xY w)Nrc   r   rO  rP  )r   rc   r   rS  s       r   get_user_info_by_usernamez!JiraApi.get_user_info_by_username5  sJ    	99hv9>>!! 	||''3.I	rU  c                    d}| j                   r| j                  || d      }n9| j                  ||      }|s| j                  ||      }|st	        d| d      dt
        j                   }t        j                  j                  j                  t        |      z
  }|j                  d	      s$t        j                  |d
         d |  | |d	<   |S d|d	   vr|d	   d |  | |d	<   |S )Nzgroups,applicationRolesz,operations)
account_idr   rN  rW  u   Пользователь u    не найден@emailAddressdisplayName)rC   rQ  rT  rX  r   rZ   
ORG_DOMAINcmfr   CmfEmail
max_lengthr   rJ   rK   translit_strip)r   r8  r   rK  postfixmax_lens         r   rH  zJiraApi.get_user_info=  s   *::		SF8;9O	PI11c&1II ::CPV:W	";C5@R STTf''()**%%003w<?}}^,+2+A+A)MBZ+[\d]d+e*fgnfo(pIn%  	.11+4^+DXg+N*OPWy(YIn%r   c                     d| d}ddd}g }	 | j                  ||      }|j                  |d          t        |      |d   k\  r	 |S |d	xx   |d
   z  cc<   L)Nrest/api/2/field//contextr   r   r   r   r   rU   r   r   rJ   r   r   )r   r   rR   r   r   rl   s         r   _get_field_contextzJiraApi._get_field_contextO  sz    !"X.b1xxFx3HJJx)*3x8G,,
 9!55 r   c                     d| d| d}ddd}g }	 | j                  ||      }|j                  |d          t        |      |d	   k\  r	 |S |d
xx   |d   z  cc<   L)Nrf  	/context//optionr   r   r   r   r   rU   r   r   rh  )r   fieldId	contextIdrR   r   r   rl   s          r   _get_field_optionszJiraApi._get_field_options[  s    !')I;gFb1xxFx3HJJx)*3x8G,,
 9!55 r   c                     | j                         }t               }|D ]!  }d|v r	|||d   <   n|||d   <   g |d<   g |d<   # |S )u]    Возвращает системные и настраиваемые поля задачи r8  r   contextoptions)get_all_fieldsr  )r   r   r   fields       r   
get_fieldszJiraApi.get_fieldsg  sd    $$&f 	"E~$)E%L!#(E$K !E)!E)	" 
r   c                 $    | j                  |      S N)issue_editmeta)r   r  s     r   get_issue_metazJiraApi.get_issue_metau  s    ""9--r   c              #      K   d}	 |r||z   |kD  r||z
  }dj                  |      }| j                  |d||d      }| j                  r|}n|d   }|sy |E d {    ||z  }||k\  ry d7 w)Nr?   z"project = "{project}" ORDER BY key)project*allr   r   r   r   r   r   )formatr   advanced_mode)r   r   r   maxr   r   rl   r   s           r   get_all_project_issueszJiraApi.get_all_project_issuesx  s     uu}s*e6==k=RCxxF%uUoxpH!!x(NNUNE|  s   AA,A*A,c                 :   i }|t        |      |d<   |t        |      |d<   |1t        |t        t        t        f      rdj                  |      }||d<   |||d<   |||d<   |||d<   | j                  | j                  rdnd	      }| j                  ||
      S )u   
        Переопределение метода jql класса Jira
        с учетом https://developer.atlassian.com/changelog/#CHANGE-2046
        r   r   r   r   r   r   r   r   r   r   )	r   r   r   r   r   r   r   rC   rJ   )	r   r   r   r   r   r   r   r   rR   s	            r   r   zJiraApi.jql  s    
  #E
F9#&u:F< &4"45&)%F8?F5M%F8%&4F?#

IxxFx++r   c              #      K   d}d| d}|r	|d| dz  }|r	|d| dz  }|dz  }	 |r||z   |kD  r||z
  }| j                  |d||d	      }| j                  r|}	n|d
   }	|	sy |	E d {    ||z  }||k\  ry R7 w)Nr?   project = "r    AND updated >= " AND updated <= " ORDER BY updatedr|  r   r}  r   )r   r  )
r   r{  r   r  
start_dateend_dater   r   rl   r   s
             r   get_all_project_issues_duringz%JiraApi.get_all_project_issues_during  s      G9A&&zl!44C&xj22C""uu}s*exxF%uUoxpH!!x(NNUNE|  s   A&A;(A9)A;r   c                 n    d|i}| j                  d      }| j                  ||      }t        |d         S )u   
        Возвращает количество задач, которые соответствуют JQL

        Args:
            jql (str): Выражение JQL

        Returns:
            int: количество задач
        r   zsearch/approximate-count)rg   count)r   r   r   )r   r   rg   rR   rl   s        r   jql_get_issue_countzJiraApi.jql_get_issue_count  s@     s| :;99St9,8G$%%r   c                     d| d}|r	|d| dz  }|r	|d| dz  }|dz  }| j                   r| j                  |      S | j                  |dd      }t        |d	         S )
Nr  r   r  r  r  r   r(   )r   r   rU   )rC   r  r   r   )r   r   r  r  r   rl   s         r   get_project_issues_count_duringz'JiraApi.get_project_issues_count_during  s    K=*&zl!44C&xj22C""::++C00xx1Ax6Hx())r   c              #   ^   K   | j                         }|st        d      |E d{    y7 w)u*   Возвращает все проектыuE   Не удалось получить ни одного проектаN)get_all_projectsr   )r   r   s     r   get_projectszJiraApi.get_projects  s*     ##%cdds   #-+-c              #      K   d| d}t        ddd      }	 | j                  ||      }|j                  d      sy |d   E d {    |d	xx   t        |d         z  cc<   L7 w)
Nr  z/quickfilterr   r   renderedBodyr   r   r   r   )r  rJ   r   )r   r   r   r   r   s        r   get_board_quick_filterszJiraApi.get_board_quick_filters  sv     %hZ|<aB~F((3v(.C778$8}$$9S]!33  %s   AA&A$A&c                 R    t         |   |      }| j                  |d   d      }|S )Nr   all)r   )rM   get_project_permission_schemeget_permissionscheme)r   r   schemerS   s      r   r  z%JiraApi.get_project_permission_scheme  s0    6zB**6$<*Fr   c                     d| d}g }| j                  |      }|d   D ]'  }|j                  | j                  |d   d             ) |S )Nzrest/api/2/issue/z/propertieskeysr   T)absolute)rJ   append)r   issue_idr   
propertiesr   r   s         r   get_issue_propertieszJiraApi.get_issue_properties  s\    !(;7
hhsmv; 	DCdhhs6{ThBC	Dr   c                 ,    t         |   |      }|d   S )Nworklogs)rM   issue_get_worklog)r   r  r   rS   s      r   r  zJiraApi.issue_get_worklog  s    g'1:r   c                 6    	 t         |   |      S #  i cY S xY wrw  )rM   !get_project_issue_security_scheme)r   r   rS   s     r   r  z)JiraApi.get_project_issue_security_scheme  s$    	7<ZHH	Is    c              #   `   K   t         |          D ]  }| j                  |d           y wr  )rM   get_issue_security_schemesget_issue_security_scheme)r   schrS   s     r   r  z"JiraApi.get_issue_security_schemes  s3     757 	<C00T;;	<s   +.c                 "   d}ddd}g }	 | j                   st        | 	         }nJ| j                  ||      }|j	                  |d          t        |      |d   k\  rn|dxx   |d	   z  cc<   e|D ]  }| j                  |d
         |d<    |S )Nzrest/api/2/screensr   r   r   r   r   rU   r   r   r   tabs)rC   rM   get_all_screensrJ   r   r   get_screen_tabs)r   r   r   r   rl   scrrS   s         r   r  zJiraApi.get_all_screens  s    "b1::
 g-/xxFx3HJJx)*3x8G,,9!55   	:C..s4y9CK	:
r   c                 z    	 t         |   |      }|D ]  }| j                  ||d         |d<    |S #  g cY S xY w)Nr   )	screen_idtab_idr   )rM   r  get_tab_fields)r   r  rl   tabrS   s       r   r  zJiraApi.get_screen_tabs  sY    	w.y9H [ $ 3 3iPSTXPY 3 ZH[O	Is   04 :c                 :    	 | j                  ||      S #  g cY S xY wrw  )get_screen_tab_fields)r   r  r  s      r   r  zJiraApi.get_tab_fields$  s&    	--i@@	Is    c                    g }| j                   rqd| j                  d}d}	 | j                  ||      }d|v rt        |d         |j                  dg       s	 |S |j	                  |d          |dxx   |d   z  cc<   _|S )	Nr   r   z rest/api/2/issuetypescreenschemer   r   r   r   r   )rC   r   rJ   r   r   )r   r   r   r   rl   s        r   get_screen_schemezJiraApi.get_screen_scheme*  s    ::"..F 5C88C87"h.#H_$=>>||Hb1  x12y!VL%99!  r   c                     d}d|i}| j                  ||      }d|v rt        |d         |d   d   d   }| j                  |d         |d	<   |S )
Nz(rest/api/3/issuetypescreenscheme/projectr   r   r   r   r   issueTypeScreenSchemer   r  )rJ   r   get_screen_scheme_issuetypes)r   r   rR   r   rl   screen_schemes         r   get_project_screen_schemez!JiraApi.get_project_screen_scheme>  sq    8z*88C8/h&H_566 *1-.EF'+'H'HW[I\']m$r   c                 :   	 d}d| j                   |d}g }	 | j                  ||      }d|v rt        |d         |j                  dg       sn%|j                  |d          |dxx   |d   z  cc<   ]|D ]  }| j	                  |d	         |d
<    |S #  g cY S xY w)Nz(rest/api/3/issuetypescreenscheme/mappingr   )r   r   issueTypeScreenSchemeIdr   r   r   r   r   screenSchemeIdactions)r   rJ   r   r   get_screen_scheme_actions)r   screen_scheme_idrR   r   r   rl   r  s          r   r  z$JiraApi.get_screen_scheme_issuetypesL  s    	<C"..+;F G88C87"h.#H_$=>>||Hb1x12y!VL%99!  " ]$($B$B6JZC[$\y!] N	Is   BB Bc                     	 d}d|i}| j                  ||      }d|v rt        |d         |d   d   d   S #  i cY S xY w)Nzrest/api/3/screenschemer   r   r   r   r   screensr   )r   r  rR   r   rl   s        r   r  z!JiraApi.get_screen_scheme_actionsj  sb    	+C,-FxxFx3H(* 9::H%a(33	Is   58 >c                 4    	 t         |          S #  g cY S xY wrw  )rM   get_all_priorities)r   rS   s    r   r  zJiraApi.get_all_prioritiesx  s"    	7-//	Is    c                     d| d}ddd}g }	 | j                  ||      }d|v rt        |d         |j                  dg       s	 |S |d   D ]  }|j                  |d	           |d
xx   |d   z  cc<   i)Nrest/api/2/priorityscheme/z	/projectsr   rG   r   r   r   r   r8  r   r   )rJ   r   r  )r   	scheme_idrR   r   project_keysrl   r{  s          r   get_priority_scheme_projectsz$JiraApi.get_priority_scheme_projects~  s    *9+Y?c2xxFx3H(* 9::<<"-  $H- 4##GEN34 9!55 r   c                     d| d}ddd}g }	 | j                  ||      }d|v rt        |d         |j                  dg       s	 |S |j                  |d          |d	xx   |d
   z  cc<   _)Nr  z/prioritiesr   rG   r   r   r   r   r   r   )rJ   r   r   )r   r  rR   r   
prioritiesrl   s         r   get_priority_scheme_prioritiesz&JiraApi.get_priority_scheme_priorities  s    *9+[Ac2
xxFx3H(* 9::<<"- 	 hx019!55 r   c                    | j                   rd}d }d}nd}d}d}i }|t        |      |d<   |t        |      |d<   |r||d<   g }	 | j                  ||	      }|j                  |g       s	 |S ||   D ]  }	| j                   r/| j                  |	d
         |	d<   | j	                  |	d
         |	d<   n2g |	d<   |	d   D ]%  }
|	d   j                  | j                  |
             ' |j                  |	        |dxx   |d   z  cc<   )Nzrest/api/2/priorityschemer   zrest/api/2/priorityschemeszschemes.projectKeysschemesr   r   r   r   r   projectKeysr  	optionIds)rC   r   rJ   r  r  r  get_priority_by_id)r   r   r   rR   r   r8  r   r  rl   r  priority_ids              r   get_priority_schemeszJiraApi.get_priority_schemes  sK   ::-CFC.C*FC #E
F9#&u:F< %F8xxFx3H<<R(  #3- 	'::,0,M,MfUYl,[F=)+/+N+NvVZ|+\F<(+-F<('-k': Z|,33D4K4KK4XYZ v&	' 9!55# r   rr  
issuetypesc           
         g d}ddj                  |       d}d}	 | j                  || j                        }|j                  d      }	|	|vrt        j                  d|	 d|        d}
d|i}|r||d<   |r||d<   	 | j                  |
|      }|S # t        $ ro}d| d}t	        |d	      rM|d
|j
                  j                   d|j
                  j                   d|j
                  j                   d| z  }t        |      d }~ww xY w# t        $ ro}d| d}t	        |d	      rM|d
|j
                  j                   d|j
                  j                   d|j
                  j                   d| z  }t        |      d }~ww xY w)N)z5.2.7z5.2.3z4.8.12z4.8.9z4.8.7z4.7.3z4.5.1u   Установите плагин по ссылке https://marketplace.atlassian.com/apps/1221996/smart-jira-configuration-formerly-smart-project-config-docs/version-history(поддерживаемые версии: z, )z1rest/plugins/1.0/com.eis.jira.plugins.jiradoc-key)r   u   Для получения полной конфигурации проекта не установлен плагин "Smart Jira Configuration". z. rl   u   Код ошибки - z - u   , адрес запроса: versionup   Установлена неподдерживаемая версия плагина 'Smart Jira Configuration': uF   . При импорте могут возникнуть ошибки. z-rest/smart-configuration/1.0/getProjectConfig
projectKeyrr  r  r   uN   Не удалось получить конфигурацию проекта "u6   " через плагин "Smart Jira Configuration". )r   rJ   r   r   r   rl   rp   r   textCmfErrorr   warning)r   r   rr  r  supported_versions
error_text
plugin_urlrl   rS  plugin_versionrR   r   s               r   get_project_smart_configz JiraApi.get_project_smart_config  s    
;;?99EW;X:YYZ\ 	
 I
	'xx
D4I4IxJH "i0!33NNKKYJZ [WWaVbd >, 'F9#-F< 	'xxFx3H Y  	'V,b" 
 sJ',S\\-E-E,FbI\I\H]#,,++,,I*W
 :&&	'@  
	'`al`m nG H  sJ',S\\-E-E,FbI\I\H]#,,++,,I*W
 :&&
	's1   B ?D 	DA*DD	FA*FFc                 ,   d| d}ddd}i }	 | j                  ||      }d|v rt        |d         |j                  dg       s	 |S |d   D ]4  }|j                  t        |d	         g       }|j	                  |d
          6 |dxx   |d   z  cc<   )Nz rest/api/2/issuesecurityschemes/z/membersr   r   r   r   r   r   issueSecurityLevelIdholderr   r   )rJ   r   
setdefaultstrr  )r   security_scheme_idrR   r   security_level_membersrl   membermemberss           r    get_issue_security_level_membersz(JiraApi.get_issue_security_level_members  s    01C0DHM

 "$xxFx3H(* 9::<<"- &% #8, 10;;CG]@^<_acdvh/01 9!55 r   c                     d| d}|d| j                   d}| j                  ||      }|j                  dg       sy|d   d   S )uR    Возвращает контекст пользовательского поляrest/api/3/field/rg  r   rn  r   r   r   r   Nr   rJ   )r   field_id
context_idrR   r   rl   s         r   get_field_contextzJiraApi.get_field_context)  s[    !(84#**
 88C8/||Hb)!!$$r   c                 B   d| d| d}d| j                   d}i }	 	 | j                  ||      }|j                  d	g       }|s	 |S |D ]
  }	|	||	d
   <    |dxx   |d   z  cc<   K# t        j                  $ r$}|j                  j
                  dk(  rY d}~y d}~ww xY w)u`    Возвращает опции контекста пользовательского поля r  rk  rl  r   r   r   i  Nr   r   r   r   )r   rJ   rr   rR  rl   rp   )
r   r  r  rR   r   rr  rl   rS  r   values
             r   get_field_context_optionz JiraApi.get_field_context_option9  s    !(9ZLH**

 88C87 \\(B/F    -',d$- 9!55  %% <<++s2s   A' 'B:BBBc                    d| d}|d| j                   d}g }	 | j                  ||      }|j                  dg       s	 |S |d   D ]1  }|j                  d      s|j                  t        |d                3 |dxx   |d	   z  cc<   r)
u    Возвращает сопоставленный список типов задач и контекста пользователького поля r  z/context/issuetypemappingr   r  r   r   issueTypeIdr   r   )r   rJ   r  r  )r   r  r  rR   r   r  rl   r  s           r   #get_field_context_issuetype_mappingz+JiraApi.get_field_context_issuetype_mappingU  s    !(+DE#**
 
xxFx3H<<"-  "(+ A99]+%%c%*>&?@A 9!55 r   c                    d| d}d| j                   d}g }	 	 | j                  ||      }|j                  d
g       sn%|j                  |d
          |dxx   |d   z  cc<   Ld	}|D ]4  }	|	j                  d      |k(  r|	d   c S |	j                  d      s0|	d   }6 |S # t        j                  $ r>}|j                  j
                  dk(  rt        j                  d| d       Y d	}~|d	}~ww xY w)uz    Возвращает список контекстов пользовательского поля для проекта r  z/context/projectmappingr   r   r   rO  uA   Не удалось получить контексты поля u@   . Пользовательское поле не найдено.Nr   r   r   r   rn  isGlobalContext)	r   rJ   rr   rR  rl   rp   r   r  r   )
r   r  r   rR   r   contextsrl   rS  global_contextrq  s
             r   !get_field_context_project_mappingz)JiraApi.get_field_context_project_mappingm  s)   !(+BC**

 88C87 <<"-OOHX./9!55    	6G{{;':5{++./!(!5		6 ) %% <<++s2NN%fgofp  qq  $r  s		s   B" "C352C.,C..C3c              #      K   d| d}d| j                   d}	 | j                  ||      }|j                  dg       }|sy	|D ]  }|  |dxx   |d   z  cc<   Dw)
u8    Возвращает поля конфигурации zrest/api/3/fieldconfiguration/z/fieldsr   r   r   r   r   r   Nr  )r   field_configuration_idrR   r   rl   r   rt  s          r   get_field_config_fieldszJiraApi.get_field_config_fields  s     ./E.FgN**

 xxFx3H\\(B/F  9!55 s   AAc                     d}d| j                   |d}g }	 | j                  ||      }|j                  dg       sn%|j                  |d          |dxx   |d   z  cc<   K|r|r|d   S |S )u    Возвращает список конфигураций или конфигурацию по умолчанию при is_default=Truezrest/api/3/fieldconfigurationr   )r   r   	isDefaultr   r   r   r   )r   rJ   r   )r   
is_defaultrR   r   field_configurationsrl   s         r   get_field_configzJiraApi.get_field_config  s    -**#
  "xxFx3H<<"- ''(:;9!55  .'**''r   field_configuration_scheme_idc                 >    d}d|i}| j                  ||      }|d   S )u  
        Возвращает список сопоставления типа задачи и конфигурации поля

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

        Returns:
            list: список сопоставления типа задачи и конфигурации поля
        z+rest/api/3/fieldconfigurationscheme/mappingfieldConfigurationSchemeIdr   r   r   )r   r  rR   r   rl   s        r   "get_field_configuration_issue_typez*JiraApi.get_field_configuration_issue_type  s1     <.0MN88C8/!!r   c                 ~    d}d|i}| j                  ||      }|d   d   }d}|j                  d      r|d   d   }|S )	uR    Возвращает схему конфигурации полей прокта z+rest/api/3/fieldconfigurationscheme/projectr   r   r   r   NfieldConfigurationSchemer   r   )r   r   rR   r   rl   r  r  s          r   &get_project_field_configuration_schemez.JiraApi.get_project_field_configuration_scheme  s\    ;z*88C8/(#A&(,%::01,23M,Nt,T),,r   c                 <    d| }| j                  |dddi      }|S )u   
        Получает бизнес-процесс как XML

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

        Returns:
            str: содержимое в формате XML
        zKsecure/admin/workflows/ViewWorkflowXml.jspa?workflowMode=live&workflowName=TAcceptzapplication/xml)not_json_responser   r   )r   r  rR   rl   s       r   get_workflow_as_xmlzJiraApi.get_workflow_as_xml  s<     \\`[ab88"01  
 r   c                 (    d}| j                  |      S )u   
        Получает cloudId для Jira
        https://developer.atlassian.com/cloud/jira/software/rest/intro/#base-url-differences

        Returns:
            dict: результат ответа
        z_edge/tenant_infor   )r   rR   s     r   get_cloud_idzJiraApi.get_cloud_id  s     "xx}r   c                 :    d| }ddi}| j                  ||      S )u   
        Получает информацию о схеме бизнес-процессов проекта

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

        Returns:
            dict: результат ответа
        z$rest/projectconfig/1/workflowscheme/originalTr   r   )r   r   rR   r   s       r   get_project_workflow_schemez#JiraApi.get_project_workflow_scheme  s-     5[MBd#xxFx++r   cloud_idissue_type_idsc                    d| d}ddi}g }|D ]  }|j                  ||d        d|i}| j                  |||      }	|	d   }
|	d	   }|D ]9  }|d   D ]/  t        t        fd
|
      d      }|sj	                  |       1 ; |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/workflowuseTransitionLinksFormatT)r  r   projectAndIssueTypes)r   rg   statuses	workflowsc                     | d   d   k(  S )NstatusReferencer#   )sworkflow_statuss    r   r  z:JiraApi.get_simplified_project_workflows.<locals>.<lambda>0  s    !$5"6/J[:\"\ r   N)r  r   r  r   rG  )r   r  r   r  rR   r   project_and_issue_typesissue_type_idrg   rl   r  r  workflowrV   r"  s                 @r    get_simplified_project_workflowsz(JiraApi.get_simplified_project_workflows  s    $ >hZ{S,d3"$+ 	M#**#0!+	 '(?@99Sd9;J'[)	! 
	3H#+J#7 	3\   #**62	3
	3 r   r8  c                     d}d|i}	 | j                  ||d      }|j
                  S # t        j                  $ r%}|j                  j                  dk(  rY d}~y|d}~ww xY w)u   
        Возвращает значение настройки текущего пользователя

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

        Returns:
            _type_: значение
        rest/api/2/mypreferencesr8  T)r   r  rO  N)rJ   rr   rR  rl   rp   r  )r   r8  rR   r   rl   rS  s         r   r	  zJiraApi.get_mypreferences:  sq     )		xx"   H }} !! 	||''3.I	s   ( A AAA rg   c                 :    d}d|i}| j                  ||i |       y)u   
        Устанавливает значение настройки текущего пользователя

        Args:
            key (str): ключ настройки
            data (str): значение настройки
        r(  r8  )rg   r   r   N)put)r   r8  rg   rR   r   s        r   r
  zJiraApi.set_mypreferencesT  s/     )	 	 	
r   c                 j    d}d|i}	 | j                  ||       y# t        j                  $ r Y yw xY w)u   
        Удаляет значение настройки текущего пользователя

        Args:
            key (str): ключ настройки
        r(  r8  r   N)deleterr   rR  )r   r8  rR   r   s       r   r  zJiraApi.delete_mypreferencesf  s?     )	KKFK+!! 		s    22workflow_scheme_idc                 .    d| }| j                  |      S )u   
        Получает информацию о схеме бизнес-процессов

        Args:
            workflow_scheme_id (str): id схемы бизнес-процесса
        zrest/api/2/workflowscheme/r   )r   r-  rR   s      r   get_workflow_schemezJiraApi.get_workflow_schemeu  s      ++=*>?xx}r   r  c                    | j                  d      }i }|r||d<   |r||d<   |r||d<   |r||d<   | j                  r5| j                         }dj                  |d   j	                               |d<   | j                  ||      }|d   S )	u,  
        Возвращает список разрешений, указывающий, какие разрешения есть у пользователя.
        Подробную информацию о разрешениях пользователя можно получить
        в глобальном контексте, контексте проекта или задачи

        Args:
            project_id (str, optional): ID проекта. Defaults to None.
            project_key (str, optional): Ключ проекта. Defaults to None.
            issue_id (str, optional): ID задачи. Defaults to None.
            issue_key (str, optional): Ключ задачи. Defaults to None.

        Returns:
            dict: Информация о разрешениях
        mypermissionsr   r  issueIdissueKeyr   permissionsr   )r   rC   get_all_permissionsr   r  rJ   )	r   r   r   r  r  rR   r   all_permissionsr4  s	            r   get_permissionszJiraApi.get_permissions  s    * 0",F;#.F<  (F9!*F:::"668O$'HH_]-K-P-P-R$SF=!hhs6h2=))r   c                     d}ddd}|r||d<   ng d}dj                  |      |d<   g }	 | j                  ||      }|j                  d	      s	 |S |j                  |d	          |d
   r	 |S |dxx   |d   z  cc<   T)u2  
        Получает список всех фильтров из Jira Cloud

        Args:
            expand (str, optional): параметры для получения расширенных данных. Defaults to None.

        Returns:
            list: список фильтров
        zrest/api/2/filter/searchr   r   r   r   )r   ownerdescriptionsharePermissionseditPermissionsr   r   r   r   r   r   )r   rJ   r   )r   r   rR   r   expand_listfiltersrl   s          r   get_all_filters_cloudzJiraApi.get_all_filters_cloud  s     )
 %F8K  #xx4F8xxFx3H<<)  NN8H-.!  9!55 r   c                    ddl m} d}dddddd}g }	 | j                  ||| j                  d      } ||d	      }|j	                  d
d      }|s	 |S |j                  dddi      D ]5  }|j                  d      }	| j                  |	      }
|j                  |
       7 |j	                  dd      s	 |S |dxx   dz  cc<   )u  
        Получает список всех фильтров из Jira Server / Data Center

        В Jira Server / Data Center нет метода API для получения списка фильтров.
        Но можно получить ID фильтров через парсинг HTML-разметки страницы фильтров
        из раздела Администрирование > Система > Фильтры,
        и затем по ID фильтре получить информацию о нем через API.

        При указании параметров "decorator" и "contentOnly" в запросе, можно получить
        только необходимую часть HTML с таблицей списка фильтров и указателем пагинации.
        В таблице выводится по 20 фильтров на странице.

        Returns:
            list: список фильтров
        r   )BeautifulSoupz+secure/admin/filters/ViewSharedFilters.jspanoneTr  )	decoratorcontentOnly
sortColumnsortAscendingpagingOffset)r   r   r  lxmltable	mf_browse)r   trzdata-filter-id)attrsaz	icon-next)class_rG  r(   )bs4rA  rJ   r   findfind_all
get_filterr  )r   rA  rR   r   r>  rl   souptable_resultsfilter_data	filter_idfilter_s              r   get_all_filters_serverzJiraApi.get_all_filters_server  s     	&; !
 xx//"&	   H !62D IIg+I>M    -55dCSUYBZ5[ ('OO,<=	//)4w'	( 99S95  >"a'"/ r   c                 Z    | j                   r| j                         S | j                         S )u8   
        Получает все фильтры
        )rC   r?  rX  rx   s    r   get_all_filterszJiraApi.get_all_filters  s)     ::--//..00r   c              #   6  K   t         |          }| j                  d      }| j                  dd       t         |          }|r| j                  d|       n| j	                  d       |D ])  t        t        fd|      d      }|r|d   d<    + yw)uw   
        Получает все решения

        Yields:
            dict: данные решения
        r   r   c                     | d   d   k(  S r  r#   )ru
resolutions    r   r  z-JiraApi.get_all_resolutions.<locals>.<lambda>+  s    r$x:d+;; r   Nr  r  )rM   get_all_resolutionsr	  r
  r  r  r   )r   resolutionsr  resolutions_untranslatedresolution_untranslatedr^  rS   s        @r   r_  zJiraApi.get_all_resolutions  s      g13 #445GH 	17;#(7#>#@  ""#57JK %%&89 & 	J&*;, '# '1H1P
-.	s   BBc              #   .  K   t         |          }| j                  d      }| j                  dd       t         |          }|r| j                  d|       n| j	                  d       |D ]%  t        fd|D        d      }|r|d   d<    ' yw)uw   
        Получает все статусы

        Yields:
            dict: данные статуса
        r   r   c              3   8   K   | ]  }|d    d    k(  r|  ywr   Nr#   .0untranslatedrV   s     r   	<genexpr>z+JiraApi.get_all_statuses.<locals>.<genexpr>O  s*      %1#D)VD\9 !   Nr  r  )rM   r   r	  r
  r  r  )r   r  r  untranslated_statusesuntranslated_statusrV   rS   s        @r   r   zJiraApi.get_all_statuses5  s      7+- #445GH 	17; % 8 : ""#57JK %%&89  	F"&5J # #-@-H)*L	s   BBc              #     	K   t         
|   |      }| j                  d      }| j                  dd       t         
|   |      }|r| j                  d|       n| j	                  d       |D ]L  t        fd|D        d      }|r/d   D ]'  	|d   }t        	fd|D        d      }|s |d   	d<   )  N yw)	u   
        Получает все статусы проекта по типам задач

        Yields:
            dict: данные статуса
        r   r   c              3   8   K   | ]  }|d    d    k(  r|  ywre  r#   )rg  rh  r  s     r   ri  z1JiraApi.get_status_for_project.<locals>.<genexpr>s  s+      %1#D)Z-== !rj  Nr  c              3   8   K   | ]  }|d    d    k(  r|  ywre  r#   rf  s     r   ri  z1JiraApi.get_status_for_project.<locals>.<genexpr>~  s*      -9+D1VD\A )rj  r  r  )rM   r   r	  r
  r  r  )r   r   r  r  untranslated_issue_typesuntranslated_issue_typerk  rl  r  rV   rS   s           @@r   r   zJiraApi.get_status_for_projectZ  s     g4[A #445GH 	17;#(7#A+#N  ""#57JK %%&89% 	J&*5M '# '(4 
QF,CJ,O)*.=R +' +5H5P12
Q -	s   B(B?.B?)NNi   )r|  r   NNNN)Nr   )r   )NNN)r   N)r   r   )Nr   r   rw  )NN)r|  r   NNN)r   NNN)r   r?   )F)NNNN)fr    r!   r"   r   rN   rO   rb   rm   rt   ry   rj   r   rw   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+  r9  r>  rB  rL  rT  rX  rH  ri  ro  r   ru  ry  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/  r7  r?  rX  rZ  r_  r   r   __classcell__)rS   s   @r   r>   r>   \   s   K2,6>#. $F 4lY. 9vx~ 4, Y	 	 Y # # 	#
 # #J0HTN 043 324$ 4, ,
'!R
6c 
6d 
64S 4"" "C "C "H,c , ,QT ,.B	"$c $
((4. (T$

DdO .$,0 48@D6&s &*^a *htn 4
<,(<*(&# &# & &P?C ?# ?Z] ?B&2% 80 D6((2"PS "X\ ""-(	,s ,00 0 	0dS 4
S 
 
$ c  &*&* &* 	&*
 &* 
&*P'D 'R5 5n1#J#J- -r   r>   )g?r)         )r   typingr   r   r   r   r9   	functoolsr   timer	   rr   requests.adaptersr
   urllib3.util.retryr   rA   r   pathlibr   	atlassianr   cmf.includeloggingFilterr   	getLoggerr   	addFilterr<   r>   r#   r   r   <module>r     su    	 1 1     ) $    '..  
		2	3   $& '8vkd kr   