
    ]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T  G d dej                  Ze                    d          Ze                     e                       ddZ G d de          ZdS )    N)DictListOptionalIterator)wrapssleep)HTTPAdapter)Retry)
HTTPStatus)Path)Jira)*c                       e Zd Zd ZdS )SensitiveDataFilterc                 "   t          |d          r~d}|j                            dd          }t          j        d||          }t          j        d||          }t          j        d||          }t          j        d||          }||_        d	S d S )
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#66I;T9MMI;T9MMIBD)TTI<dINNI"FJ4		 		    N)__name__
__module____qualname__r    r   r   r   r      s#        
 
 
 
 
r   r   zatlassian.rest_client皙?         c                 "      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 {V S # $ r5}|	k    r||k    r}n|
dz  z  z  }t          |           Y d }~nd }~ww xY wRNr   T   r%   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$'+tT'<V'<'<<<<<<<=  	$ 	$ 	$,..##444#4 $4qF{$BB(OOOOOOOO	$$s    A+AAc                      d}
}	 |dz  }	  | i |S # $ r5}|	k    r||k    r}n|
dz  z  z  }t          |           Y d }~nd }~ww xY wLr+   r   r-   s        r   retryz/backoff.<locals>.retry_exception.<locals>.retryA   s    G'H$1$40000  	$ 	$ 	$,..##444#4 $4qF{$BB(OOOOOOOO	$$s    A+A

A)r   inspectisgeneratorfunction)r6   r9   r;   r3   r4   r5   r7   r8   s   `  r   retry_exceptionz backoff.<locals>.retry_exception,   s    	t	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 
	$& 
t	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 
	$& &t,, 	r   r#   )r4   r8   r5   r3   r7   r>   s   ````` r   backoffr?   !   s=    + + + + + + + + +Z r   c                   V    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
	 	 	 dvdZd Z	 	 	 	 	 	 dwdZdxdee         fdZdy fd	Z ee          d             Z ee          	 	 	 dzdededefd            Zdxdee         fdZd{dee         fdZd Zd Zd Zdyd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#d|d(e!dedefd)Z$d}d*e!dedefd+Z% fd,Z&d- Z'd. Z( fd/Z)d~d0Z*d#e!fd1Z+ddee         fd2Z,d~d3Z-d~d4Z.d5 Z/d6 Z0d7 Z1de2e!ef         fd8Z3d9 Z4d{d:Z5dd;Z6	 	 dd<Z7d=e!fd>Z8ddefd?Z9dee         fd@Z:dA Z; fdBZ<dC Z= fdDZ> fdEZ? fdFZ@ fdGZA fdHZBdI ZCdJ ZDdK ZEdL ZFdM ZG fdNZHdO ZIdP ZJddededefdQZKdd*e!dRe!dSe!fdTZLdU ZMdV ZNdW ZOdX ZPdY ZQdZ ZRdd\ZSd]e!defd^ZTd_ ZUd` ZVda ZWd*e!fdbZXdce!d eddefdeZYdfe!fdgZZdfe!dhe!fdiZ[dfe!fdjZ\dke!fdlZ]	 	 	 	 dd e!d*e!dme!d#e!def
dnZ^d~defdoZ_defdpZ`dq Za fdrZb fdsZc fdtZddu Ze xZfS )JiraApid   c                    |                     d          r|nd| }|                    d          r|                    d          |d<   n|                    d          |d<   d|vrd|d<   d|vrt                                          |d<    t	                      j        |g|R i | |                                  |                    d          | _        d	| _        d
| _	        d S )Nhttphttps://cloudtokenpasswordtimeout,  sessionFzrest/auth/1/session)

startswithgetcmfutilrequests_sessionsuper__init___set_session_retriesrG   _session_valid_session_url)r   urlr.   r/   	__class__s       r   rQ   zJiraApi.__init___   s    ^^F++Acc1AC1A1A::g 	5!'G!4!4F:$jj44F7OF"" &F9F"" ' 8 8 : :F9.t...v...!!###ZZ((
#1r   c                     t          t          j        t          j        t          j        d          }t	          |          }| j                            d|           | j                            d|           dS )u   
        Конфигурирует стратегию повторных попыток
        и ассоциирует ее с сессией
        r%   )totalstatusstatus_forcelistbackoff_factor)max_retrieszhttp://rE   N)r   configIMPORT_REQUEST_RETRY_TOTAL!IMPORT_REQUEST_RETRY_STATUS_CODESr
   _sessionmount)r   retrieshttp_adapters      r   rR   zJiraApi._set_session_retriesu   su    
 34#E	
 
 
 #w777I|444J55555r   c                 ^    | j         r$t                                          ||           dS dS )u   
        Переопределенный метод
        Базовая аутентификация устанавливается только для Jira Cloud
        N)rF   rP   _create_basic_session)r   usernamerH   rV   s      r   re   zJiraApi._create_basic_session   s9    
 : 	>GG))(H=====	> 	>r   c                     | j         j                                         | j        | j        d}t                                          d| j        |          }| j         j        st          d          d| _	        dS )u;   
        Выполняет авторизацию
        )rf   rH   POST)pathdatauR   Ошибка аутентификации: файлы cookie не полученыTN)
r`   cookiesclearrf   rH   rP   requestrT   RuntimeErrorrS   )r   rj   responserV   s      r   _authenticatezJiraApi._authenticate   s    
 	##%%% 
 
 77??" # 
 
 }$ 	usttt"r   c                     	 t                                          d| j                  }|j        t          j        k    S # t          j        $ r Y dS w xY w)u~   
        Проверяет валидность текущей сессии через тестовый запрос
        GET)ri   F)rP   rm   rT   status_coder   OKrequestsRequestException)r   ro   rV   s     r   _check_sessionzJiraApi._check_session   sd    	ww& '  H ':=88( 	 	 	55	s   <A   AAc                    | j         r| j        st          d          | j        j        r8| j        s1|                                 rd| _        |                                  dS |                                  |                                  dS )u>   
        Создает валидную сессию
        u_   Учетные данные для аутентификации не предоставленыTN)	rf   rH   
ValueErrorr`   rk   rS   rw   user_get_websudorp   r   s    r   _create_valid_sessionzJiraApi._create_valid_session   s      	@$- 	@~ =  	)< 	""$$ &*#%%''' 	r   c                 :   | j         r t                      j        |i |S 	 | j        s|                                   t                      j        |i |}|j        t          j        k    r4d| _        |                                   t                      j        |i |}|S # t          j	        $ ri}t          |d          rS|j        j        t          j        k    r9d| _        |                                   t                      j        |i |cY d}~S  d}~ww xY w)u8  
        Переопределенный метод
        Используется только для Jira Server.
        Перед запросом проверяется валидность сессии
        и при необходимости выполняется авторизация 
        Fro   N)rF   rP   rm   rS   r|   rs   r   UNAUTHORIZEDru   rv   r   ro   )r   r.   r/   ro   erV   s        r   rm   zJiraApi.request   s?    : 	4"577?D3F333	& -**,,,&uww777H #z'>>>&+#**,,,*577?D;F;;O( 	 	 	q*%% 8!**@JD[*[*[&+#**,,,&uww777777777	s%   A>B" "D1ADDDDN   c           	      &   |p| j         }|p| j        }|                     d||           | j                            |d||| j        | j                  5 }t                              d| d|j	         d|j
                    |                                 |j                            dd	          }t          j        d
|          }|r+|                    d          p|                    d          }	nd	}	t!          |d          5 }
|                    |          D ]}|
                    |           	 ddd           n# 1 swxY w Y   t'          |          }|                                j        }|	|dcddd           S # 1 swxY w Y   dS )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.
        rr   )methodrU   headersT)streamr   rI   verifyproxiesz
HTTP: GET z ->  zContent-Disposition z!filename\*?=(?:"([^"]+)"|([^;]+))r,   r%   wb)
chunk_sizeN)	file_name	file_size)no_check_headersrI   log_curl_debugr`   rM   
verify_sslr   loggerdebugrs   reasonraise_for_statusr   r   searchgroupopeniter_contentwriter   statst_size)r   download_url	save_pathr   rI   r   rescontent_dispositionmatchr   fchunk	file_pathr   s                 r   download_filezJiraApi.download_file   s2   $ 2T2)T\5lGLLL]?L  
 
 	 LLVlVVVV#*VVWWW  """ #&+//2G"L"LIBDWXXE !KKNN<ekk!nn			i&& #! ---DD # #EGGENNNN## # # # # # # # # # # # # # # YI!((0I '& 5	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	s7   B1F/E6FE	F	E	
/FF
F
c                     d}| j         dd}d}| j        j        r3| j        j                                        }|                    d          }|r||d<   |                     ||g | j                  S )u   
        Получает веб-куки sudo
        Переопределенный метод, так как метод в родительском классе выполняется некорректно
        z%secure/admin/WebSudoAuthenticate.jspafalse)webSudoPasswordwebSudoIsPostNzatlassian.xsrf.token	atl_token)ri   rj   filesr   )rH   r`   rk   get_dictrM   postform_token_headers)r   rU   rj   r   rk   s        r   rz   zJiraApi.user_get_websudo  s    
 6#}$
 

 	=  	<m+4466G$:;;I 	* )DyycB@WyXXXr   *allr   c                    i }|t          |          |d<   |<t          |t          t          t          f          rd                    |          }||d<   |||d<   |||d<   |||d<   |                     | j        rdnd	          }	g }
	 | j        r|pd|d<   nt          |          |d<   |                     |	|          }|sn|d         }|
	                    |           |ne| j        r|d         rnU|                    d          }n>t          |d                   }|t          |          |z   k    rn|t          |          z  }|
S )u   
        Переопределение метода jql_get_list_of_tickets класса Jira
        с учетом https://developer.atlassian.com/changelog/#CHANGE-2046
        N
maxResults,fieldsjqlexpandvalidateQuery
search/jqlr   Tr   nextPageTokenstartAtparamsissuesisLastrX   )int
isinstancelisttuplesetjoinresource_urlrF   rM   extendlen)r   r   r   startlimitr   validate_querynext_page_tokenr   rU   resultsro   r   rX   s                 r   jql_get_list_of_ticketszJiraApi.jql_get_list_of_tickets+  s    #&u::F< &4"455 *&))%F8?F5M%F8%&4F?#
 HII	%z /*9*?R''$'JJy!xxFx33H h'FNN6""" z %H% "*,,"?"?HW-..CKK%///V$1	%4 r   returnc              #      K   |d}| j         rd| }d}d}|p| j        }	 |                     |||d          }|sdS ||z  }|E d{V  |t          |          z  }d|cxk     r|k    rn ndS O)u(    Получение всех задач Norder by created ASCzcreated > '1900-01-01' r   TrenderedFields)r   r   r   r   )rF   MAX_RESULTSr   r   )r   r   r   start_atrX   max_resultsr   s          r   
get_issueszJiraApi.get_issuesf  s      ;(Cz 6 655/t/	11'	 2  F  #HS[[ E5!!!!E!!!!!	r   c              #   d  K   d}d}d}|p| j         }	 t                                          ||||d          }|d         sd S ||z  }t                              | d|d                     |d         E d {V  |t          |d                   z  }d|cxk     r|k    sn ||d         k    rd S )	Nr   r   Tchangelog,renderedFields)r   r   r   r   u    из rX   )r   rP   get_issues_for_boardgr   r   )	r   board_idr   r   r   rX   r   r   rV   s	           r   r   zJiraApi.get_issues_for_board  s     $/t/	WW11!1 2  F (# #HGGx88vg88999h''''''''S)***E5!!!!E!!!!Xw%?%?	r   c              #      K   d}d}	 |                      |||          }|                    dg           sd S ||z  }|d         D ]}|V  E)Nr   2   T)r   r   r   values)get_all_sprintrM   )r   r   r   r   r   rows         r   get_sprintszJiraApi.get_sprints  sv      	%%xuE%RRC778R(( UNE8}  					r   r   r   r   c              #     K   d| d}|pd|pdd}|rd                     |          |d<   	 |                     ||	          }|                    d
g           sdS |dxx         |d         z  cc<   |d
         D ]}|V  U)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   Tr   r   r   r   N)r   rM   )	r   	sprint_idr   r   r   rU   r   r   r   s	            r   get_sprint_issueszJiraApi.get_sprint_issues  s      * 9y888 z+2
 
  	0"xx//F8	((3v(..C778R(( 9!558}  					r   c              #     K   d}|dk    s
J d            d|pd|d}|r||d<   | j         r|                     d          }	 |                     ||	          }d
|v rt          |d
                   |d         sdS |d         E d{V  |dxx         t	          |d                   z  cc<   |r|d         |k    rdS ||                                 E d{V  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   r   r   r   workflowNamezworkflow/searchTr   errorMessagesr   Nr   )rF   r   rM   	Exceptionr   get_all_workflows)r   namesr   r   r   rU   r   s          r   get_workflowszJiraApi.get_workflows  sD      Z{{{e{{{ekr"$ $ 	+%*F>": 	0##$566C
hhs6h22"c))#C$89998} Fx=(((((((y!!!SX%7%77!!! VI.%77F
 --///////////r   c              #     K   | j         r|                     d          }d|p| j        dd}|r||d<   	 |                     ||          }|d         sd	S |d         E d	{V  |d
xx         t	          |d                   z  cc<   |r|d
         |k    rd	S c|r|                     |          E d	{V  d	S |                                 E d	{V  d	S )u.    Получение всех statuses
        zstatuses/searchr   usagesr   	projectIdTr   r   Nr   )rF   r   r   rM   r   get_status_for_projectget_all_statuses)r   r   
project_idrU   r   r   s         r   get_statuseszJiraApi.get_statuses  sF      : 	3##$566C!"%2K4;K (* *F  1&0{#hhs6h228} Fx=(((((((y!!!SX%7%77!!! VI.%77F  366zBBBBBBBBBBB0022222222222r   c                 ~    d}d|i}|                      ||          }d|v rt          |d                   |d         S )Nz!rest/api/3/workflowscheme/projectr   r   r   r   rM   r   )r   r   rU   r   r   s        r   get_project_schemezJiraApi.get_project_scheme  sN    1z*hhs6h**c!!C01118}r   c                 8    d| d}|                      |          S )Nzrest/api/3/workflowscheme/z	/workflowrM   r   iduris      r   get_issue_type_workflow_schemez&JiraApi.get_issue_type_workflow_scheme  s"    82888xx}}r   c                 6    d| }|                      |          S )Nzrest/api/3/issuetype/r   r   s      r   get_issue_typezJiraApi.get_issue_type  s    *b**xx}}r   c              #     K   d|p| j         d}d}	 |                     ||          }d|v rt          |d                   |d         sd S |d         E d {V  |dxx         t          |d                   z  cc<   |r|d         |k    rd S |)	Nr   r   zrest/api/3/workflowschemeTr   r   r   r   )r   rM   r   r   )r   r   r   r   r   s        r   get_all_workflow_schemesz JiraApi.get_all_workflow_schemes  s      e.Gt7GHH)		((3v(..C#%%O 4555x= 8}$$$$$$$9S]!3!33 	*e33		r   project_idsc              #      K   dd|d}d}	 |                      ||          }|d         sd S |d         E d {V  |dxx         t          |d                   z  cc<   S)	Nr   r   )r   r   r   z"rest/api/3/issuetypescheme/projectTr   r   r   )rM   r   )r   r   r   r   r   s        r   get_issue_type_schemeszJiraApi.get_issue_type_schemes  s      b{KK2	4((3v(..Cx= 8}$$$$$$$9S]!3!33	4r   r   c                 <    d|i}d}|                      ||          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}|                     |          E d {V  d S t                                                      }|                     d          }|                     dd           t                                                      }|r|                     d|           n|                     d           |D ]4t          t          fd|          d           }|r|d         d<   V  5d S )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)	rF   rM   rP   get_issue_typesget_mypreferencesset_mypreferencesdelete_mypreferencesnextr   )r   r   issue_typescurrent_user_localeissue_types_untranslatedissue_type_untranslatedr	  rV   s         @r   r  zJiraApi.get_issue_types(  sL     : &	! )Cxx}}$$$$$$$$$''1133K #'"8"89K"L"L ""#5w???',ww'>'>'@'@$" >&&'9;NOOOO ))*<=== * ! !
*.AAAA0  + +' + U5LV5TJ12     ! !r   	issue_keyc              #   &  K   |                      d          }| d| d}t          ddd          }	 |                     ||	          }|                    d
          sdS |d
         E d{V  |dxx         t          |d
                   z  cc<   `)u@    Получим все комментарии по задаче issue/z/commentr   r   zrenderedBody,propertiesr   Tr   commentsNr   )r   dictrM   r   )r   r  base_urlrU   r   r   s         r   get_commentszJiraApi.get_commentsQ  s      $$W--//I///aB7PQQQ	6((3v(..C77:&& :&&&&&&&9S_!5!55	6r   issue_id_or_keyc              #      K   |                      d          }| d| d}ddd}	 |                     ||          }|                    d	          sd
S |d	         E d
{V  |d         rd
S |dxx         t          |d	                   z  cc<   j)u?    Получим историю изменений задачи r  r  z
/changelogr   rB   r   Tr   r   Nr   r   )r   rM   r   )r   r  r  rU   r   r   s         r   get_changelogzJiraApi.get_changelog]  s      $$W--77O777
 
	4((3v(..C778$$ 8}$$$$$$$8} 9S]!3!33	4r   r   r   c                     d| d}|dn||dn|d}g }	 |                      ||          }|                     d	g           sn5|                    |d	                    |n|d
xx         |d         z  cc<   c|S )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/projectNr   r   r   Tr   r   r   r   )rM   r   )r   r   r   r   rU   r   r   results           r   get_agile_board_projectzJiraApi.get_agile_board_projectn  s    $ 9h888!Mqqu %""5
 

 	6XXc&X11F::h++ MM&*+++ 9!55	6 r   project_keyc                     d}i }|r||d<   |rt          |          |d<   |rt          |          |d<   |                     ||          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   rM   )r   r%  r   r   rU   r   s         r   get_project_boardszJiraApi.get_project_boards  sg     % 	4(3F$% 	+ #E

F9 	.#&u::F< xxFx+++r   c              #      K   d}d}	 | j         r|                     |||          }n$t                                          |||          }|                    dg           sd S ||z  }|d         D ]}|V  q)Nr   r   T)r%  r   r   r   )rF   r(  rP   get_all_agile_boardsrM   r   r%  r   r   r   r   rV   s         r   r*  zJiraApi.get_all_agile_boards  s      		z f--+UZ_-``gg22{RW_d2ee778R(( UNE8}  						r   c                 |    d}|                      |d|i          }|                     |          }||d         d<   |S )Nz3rest/greenhopper/1.0/rapidviewconfig/editmodel.jsonrapidViewIdr   cardColorConfig
strategies)rM    get_board_card_colors_strategies)r   r   r   ro   card_colors_strategiess        r   get_advanced_board_settingsz#JiraApi.get_advanced_board_settings  sJ    C88C(A8BB!%!F!Fx!P!P4J"#L1r   c                     d| d}ddi}i }g d}|D ]6}	 | d| }|                      ||          }|||<   '# t          $ r Y 3w xY w|S )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_typerU   ro   s	            r   r0  z(JiraApi.get_board_card_colors_strategies  s     JhIIIV
 

 
 
 , 	 	M!33M3388C877,4
=))    s   #:
AAc              #      K   d}d}	 t                                          |||          }|                    dg           sd S ||z  }|d         D ]}|V  Q)Nr   r   T)keyr   r   r   )rP   get_project_versions_paginatedrM   r+  s         r   r>  z&JiraApi.get_project_versions_paginated  s}      	''88[PU]b8ccC778R(( UNE8}  					r   c              #      K   |                      d          }d}d}t                      }|r||d<   	 ||d<   ||d<   |                     ||          }||d         k    rd S ||z  }|d	         D ]}|V  C)
Nzauditing/recordr   i  
projectIdsToffsetr   rX   records)r   r  rM   )r   r   rU   r   r   r   r   r   s           r   get_audit_recordszJiraApi.get_audit_records  s       122 	/#.F< 	$F8#F7O((3''Cs7|##UNE9~  					r   c                 <    |                      |          }|d         S )u(   Наблюдатели по задачеwatchers)issue_get_watchers)r   r  rE  s      r   get_watcherszJiraApi.get_watchers  s     **955
##r   c              #     K   | j         rd}dddd}|r|d         |k    r||d<   	 |                     ||          }|sdS |D ]4}|                    |                     |d	                              |V  5|d
xx         t	          |          z  cc<   |r|d
         |k    rdS d}dddd}|r|d         |k    r||d<   |pd|d<   d|d<   	 |                     ||          }|sdS |D ]4}|                    |                     |d                              |V  5|d
xx         t	          |          z  cc<   |r|d
         |k    rdS )u   Возвращает список всех пользователей, включая активных,
            неактивных и ранее удаленных, у которых есть учетная запись Atlassian.
            в старых версиях невозможно получить больше 1000 учеток
            https://jira.atlassian.com/browse/JRASERVER-65089
            исправлено в 8.7.0, 8.6.1 и выше
            zrest/api/3/users/searchr   rB   z"operations,groups,applicationRolesr   r   Tr   	accountIdr   zrest/api/2/user/search.rf   includeInactiver=  N)rF   rM   updateget_user_infor   )r   rf   	limit_endr   r   users	user_infos          r   	get_userszJiraApi.get_users  s      : !	+C!"#AeffF 1VL1I=='0|$
V44 E!& $ $I$$T%7%7	+8N%O%OPPP#OOOOy!!!SZZ/!!! 	!2i!?!?E
 +C!"#AeffF 1VL1I=='0|$!)SF:(,F$%
V44 E!& $ $I$$T%7%7	%8H%I%IJJJ#OOOOy!!!SZZ/!!! 	!2i!?!?E
r   c                     	 |                      ||          S # t          j        $ r}|j        j        dk    rY d }~d S |d }~ww xY w)Nr=  r     userru   	HTTPErrorro   rs   )r   r=  r   excs       r   get_user_info_by_keyzJiraApi.get_user_info_by_key-  sa    	99V9444! 	 	 	|'3..tttttI	    AA A  Ac                     	 |                      ||          S # t          j        $ r}|j        j        dk    rY d }~d S |d }~ww xY w)Nrf   r   rT  rU  )r   rf   r   rX  s       r   get_user_info_by_usernamez!JiraApi.get_user_info_by_username5  sa    	99hv9>>>! 	 	 	|'3..tttttI	rZ  c                    d}| j         r|                     || d          }nE|                     ||          }|s|                     ||          }|st	          d| d          dt
          j         }t          j        j	        j
        t          |          z
  }|                    d	          s0t                              |d
                   d |          | |d	<   n!d|d	         vr|d	         d |          | |d	<   |S )Nzgroups,applicationRolesz,operations)
account_idr   rS  r\  u   Пользователь u    не найден@emailAddressdisplayName)rF   rV  rY  r]  r   r]   
ORG_DOMAINcmfr   CmfEmail
max_lengthr   rM   rN   translit_strip)r   r=  r   rP  postfixmax_lens         r   rM  zJiraApi.get_user_info=  s>   *: 	U		SF9O9O9O	PPII11c&1III X ::CPV:WW	 U SC S S STTT)f'))*%03w<<?}}^,, 	Z+2+A+A)MBZ+[+[\d]d\d+e(pgn(p(pIn%%	.111+4^+DXgX+N(YPW(Y(YIn%r   c                     d| d}ddd}g }	 |                      ||          }|                    |d                    t          |          |d	         k    rn|d
xx         |d         z  cc<   c|S )Nrest/api/2/field//contextr   r   r   Tr   r   rX   r   r   rM   r   r   )r   r   rU   r   r   ro   s         r   _get_field_contextzJiraApi._get_field_contextO  s    ."...b11	6xxFx33HJJx)***3xx8G,,,9!55	6 
r   c                     d| d| d}ddd}g }	 |                      ||          }|                    |d	                    t          |          |d
         k    rn|dxx         |d         z  cc<   c|S )Nrk  	/context//optionr   r   r   Tr   r   rX   r   r   rm  )r   fieldId	contextIdrU   r   r   ro   s          r   _get_field_optionszJiraApi._get_field_options[  s    F'FFIFFFb11	6xxFx33HJJx)***3xx8G,,,9!55	6 
r   c                     |                                  }t                      }|D ]'}d|v r|||d         <   n|||d         <   g |d<   g |d<   (|S )u]    Возвращает системные и настраиваемые поля задачи r=  r   contextoptions)get_all_fieldsr  )r   r   r   fields       r   
get_fieldszJiraApi.get_fieldsg  so    $$&&ff 	" 	"E~~$)E%L!!#(E$K !E)!E)
r   c                 ,    |                      |          S N)issue_editmeta)r   r  s     r   get_issue_metazJiraApi.get_issue_metau  s    ""9---r   c              #      K   d}	 |r||z   |k    r||z
  }d                     |          }|                     |d||d          }| j        r|}n|d         }|sd S |E d {V  ||z  }||k    rd S l)	NrB   Tz"project = "{project}" ORDER BY key)projectr   r   r   r   r   r   r   )formatr   advanced_mode)r   r%  r   maxr   r   ro   r   s           r   get_all_project_issueszJiraApi.get_all_project_issuesx  s      	 $uu}s**e6==k=RRCxxF%uUoxppH! )x( NNNNNNNUNE||	r   c                 f   i }|t          |          |d<   |t          |          |d<   |<t          |t          t          t          f          rd                    |          }||d<   |||d<   |||d<   |||d<   |                     | j        rd	nd
          }|                     ||          S )u   
        Переопределение метода jql класса Jira
        с учетом https://developer.atlassian.com/changelog/#CHANGE-2046
        Nr   r   r   r   r   r   r   r   r   r   )	r   r   r   r   r   r   r   rF   rM   )	r   r   r   r   r   r   r   r   rU   s	            r   r   zJiraApi.jql  s    
  #E

F9#&u::F< &4"455 *&))%F8?F5M%F8%&4F?#
 HIIxxFx+++r   c              #      K   d}d| d}|r	|d| dz  }|r	|d| dz  }|dz  }	 |r||z   |k    r||z
  }|                      |d||d	
          }| j        r|}	n|d         }	|	sd S |	E d {V  ||z  }||k    rd S V)NrB   project = "r    AND updated >= " AND updated <= " ORDER BY updatedTr   r   r  r   )r   r  )
r   r  r   r  
start_dateend_dater   r   ro   r   s
             r   get_all_project_issues_duringz%JiraApi.get_all_project_issues_during  s       &G&&& 	54z4444C 	32x2222C""	 $uu}s**exxF%uUoxppH! )x( NNNNNNNUNE||	r   r   c                     d|i}|                      d          }|                     ||          }t          |d                   S )u   
        Возвращает количество задач, которые соответствуют JQL

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

        Returns:
            int: количество задач
        r   zsearch/approximate-count)rj   count)r   r   r   )r   r   rj   rU   ro   s        r   jql_get_issue_countzJiraApi.jql_get_issue_count  sI     s| :;;99St9,,8G$%%%r   c                     d| d}|r	|d| dz  }|r	|d| dz  }|dz  }| j         r|                     |          S |                     |dd          }t          |d	                   S )
Nr  r   r  r  r  r   r,   )r   r   rX   )rF   r  r   r   )r   r%  r  r  r   ro   s         r   get_project_issues_count_duringz'JiraApi.get_project_issues_count_during  s    *K*** 	54z4444C 	32x2222C"": 	*++C000xx1Ax66Hx()))r   c              #   d   K   |                                  }|st          d          |E d{V  dS )u*   Возвращает все проектыuE   Не удалось получить ни одного проектаN)get_all_projectsr   )r   r   s     r   get_projectszJiraApi.get_projects  sD      ##%% 	ecdddr   c              #      K   d| d}t          ddd          }	 |                     ||          }|                    d	          sd S |d	         E d {V  |d
xx         t          |d	                   z  cc<   `)Nr"  z/quickfilterr   r   renderedBodyr   Tr   r   r   )r  rM   r   )r   r   r   r   r   s        r   get_board_quick_filterszJiraApi.get_board_quick_filters  s      <h<<<aB~FFF	4((3v(..C778$$ 8}$$$$$$$9S]!3!33	4r   c                     t                                          |          }|                     |d         d          }|S )Nr   all)r   )rP   get_project_permission_schemeget_permissionscheme)r   r   schemerV   s      r   r  z%JiraApi.get_project_permission_scheme  s;    66zBB**6$<*FFr   c                     d| d}g }|                      |          }|d         D ]2}|                    |                      |d         d                     3|S )Nzrest/api/2/issue/z/propertieskeysr   T)absolute)rM   append)r   issue_idr   
propertiesr   r   s         r   get_issue_propertieszJiraApi.get_issue_properties  sl    7(777
hhsmmv; 	D 	DCdhhs6{ThBBCCCCr   c                 V    t                                          |          }|d         S )Nworklogs)rP   issue_get_worklog)r   r  r   rV   s      r   r  zJiraApi.issue_get_worklog  s$    gg''11:r   c                 Z    	 t                                          |          S #  i cY S xY wr|  )rP   !get_project_issue_security_scheme)r   r   rV   s     r   r  z)JiraApi.get_project_issue_security_scheme  s2    	77<<ZHHH	IIIs    $ *c              #      K   t                                                      D ]}|                     |d                   V   d S r  )rP   get_issue_security_schemesget_issue_security_scheme)r   schrV   s     r   r  z"JiraApi.get_issue_security_schemes  sQ      775577 	< 	<C00T;;;;;;	< 	<r   c                 x   d}ddd}g }	 | j         s!t                                                      }nc|                     ||          }|                    |d                    t          |          |d         k    rn|d	xx         |d
         z  cc<   |D ] }|                     |d                   |d<   !|S )Nzrest/api/2/screensr   r   r   Tr   r   rX   r   r   r   tabs)rF   rP   get_all_screensrM   r   r   get_screen_tabs)r   r   r   r   ro   scrrV   s         r   r  zJiraApi.get_all_screens  s    "b11	6: 
 gg--//xxFx33HJJx)***3xx8G,,,9!55	6  	: 	:C..s4y99CKK
r   c                     	 t                                          |          }|D ]"}|                     ||d                   |d<   #|S #  g cY S xY w)Nr   )	screen_idtab_idr   )rP   r  get_tab_fields)r   r  ro   tabrV   s       r   r  zJiraApi.get_screen_tabs  sl    	ww..y99H [ [ $ 3 3iPSTXPY 3 Z ZHO	IIIs   AA Ac                 B    	 |                      ||          S #  g cY S xY wr|  )get_screen_tab_fields)r   r  r  s      r   r  zJiraApi.get_tab_fields$  s/    	--i@@@	IIIs    c                 $   g }| j         rd| j        d}d}	 |                     ||          }d|v rt          |d                   |                    dg           sn2|                    |d                    |dxx         |d	         z  cc<   y|S )
Nr   r   z rest/api/2/issuetypescreenschemeTr   r   r   r   r   )rF   r   rM   r   r   )r   r   r   r   ro   s        r   get_screen_schemezJiraApi.get_screen_scheme*  s    : 	:". F 5C:88C877"h..#H_$=>>>||Hb11 x1222y!!!VL%99!!!: r   c                     d}d|i}|                      ||          }d|v rt          |d                   |d         d         d         }|                     |d                   |d	<   |S )
Nz(rest/api/3/issuetypescreenscheme/projectr   r   r   r   r   issueTypeScreenSchemer   r  )rM   r   get_screen_scheme_issuetypes)r   r   rU   r   ro   screen_schemes         r   get_project_screen_schemez!JiraApi.get_project_screen_scheme>  s}    8z*88C8//h&&H_5666 *1-.EF'+'H'HW[I\']']m$r   c                 r   	 d}d| j         |d}g }	 |                     ||          }d|v rt          |d                   |                    dg           sn2|                    |d                    |dxx         |d	         z  cc<   y|D ] }|                     |d
                   |d<   !|S #  g cY S xY w)Nz(rest/api/3/issuetypescreenscheme/mappingr   )r   r   issueTypeScreenSchemeIdTr   r   r   r   r   screenSchemeIdactions)r   rM   r   r   get_screen_scheme_actions)r   screen_scheme_idrU   r   r   ro   r#  s          r   r  z$JiraApi.get_screen_scheme_issuetypesL  s   	<C".+; F G:88C877"h..#H_$=>>>||Hb11 x1222y!!!VL%99!!!: " ] ]$($B$B6JZC[$\$\y!!N	IIIs   B-B0 0B6c                     	 d}d|i}|                      ||          }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  rU   r   ro   s        r   r  z!JiraApi.get_screen_scheme_actionsj  sq    	+C,-FxxFx33H(** 9:::H%a(33	IIIs   A	A Ac                 X    	 t                                                      S #  g cY S xY wr|  )rP   get_all_priorities)r   rV   s    r   r  zJiraApi.get_all_prioritiesx  s0    	77--///	IIIs   # )c                 *   d| d}ddd}g }	 |                      ||          }d|v rt          |d                   |                     d	g           sn=|d	         D ]}|                    |d
                    |dxx         |d         z  cc<   |S )Nrest/api/2/priorityscheme/z	/projectsr   rJ   r   Tr   r   r   r=  r   r   )rM   r   r  )r   	scheme_idrU   r   project_keysro   r  s          r   get_priority_scheme_projectsz$JiraApi.get_priority_scheme_projects~  s    ?9???c22	6xxFx33H(** 9:::<<"-- #H- 4 4##GEN33339!55	6 r   c                    d| d}ddd}g }	 |                      ||          }d|v rt          |d                   |                     d	g           sn2|                    |d	                    |d
xx         |d         z  cc<   y|S )Nr  z/prioritiesr   rJ   r   Tr   r   r   r   r   )rM   r   r   )r   r  rU   r   
prioritiesro   s         r   get_priority_scheme_prioritiesz&JiraApi.get_priority_scheme_priorities  s    A9AAAc22
	6xxFx33H(** 9:::<<"-- hx01119!55	6 r   c                 d   | j         rd}d }d}nd}d}d}i }|t          |          |d<   |t          |          |d<   |r||d<   g }	 |                     ||
          }|                    |g           sn||         D ]}	| j         r=|                     |	d                   |	d<   |                     |	d                   |	d<   n>g |	d<   |	d         D ]0}
|	d                             |                     |
                     1|                    |	           |dxx         |d         z  cc<   |S )Nzrest/api/2/priorityschemer   zrest/api/2/priorityschemeszschemes.projectKeysschemesr   r   r   Tr   r   projectKeysr  	optionIds)rF   r   rM   r  r  r  get_priority_by_id)r   r   r   rU   r   r=  r   r  ro   r  priority_ids              r   get_priority_schemeszJiraApi.get_priority_schemes  s   : 	-CFCC.C*FC #E

F9#&u::F<  	&%F8	6xxFx33H<<R(( "3- 	' 	': Z,0,M,MfUYl,[,[F=)+/+N+NvVZ|+\+\F<((+-F<('-k': Z Z|,33D4K4KK4X4XYYYYv&&&&9!55#	6& r   rw  
issuetypesc           
         g d}dd                     |           d}d}	 |                     || j                  }nf# t          $ rY}d| d}t	          |d	          r/|d
|j        j         d|j        j         d|j        j         d| z  }t          |          d }~ww xY w|                    d          }	|	|vr t                              d|	 d|            d}
d|i}|r||d<   |r||d<   	 |                     |
|          }nf# t          $ rY}d| d}t	          |d	          r/|d
|j        j         d|j        j         d|j        j         d| z  }t          |          d }~ww xY w|S )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. ro   u   Код ошибки - z - u   , адрес запроса: versionup   Установлена неподдерживаемая версия плагина 'Smart Jira Configuration': uF   . При импорте могут возникнуть ошибки. z-rest/smart-configuration/1.0/getProjectConfig
projectKeyrw  r  r   uN   Не удалось получить конфигурацию проекта "u6   " через плагин "Smart Jira Configuration". )r   rM   r   r   r   ro   rs   r   textCmfErrorr   warning)r   r%  rw  r  supported_versions
error_text
plugin_urlro   rX  plugin_versionrU   r   s               r   get_project_smart_configz JiraApi.get_project_smart_config  s   
 
 
\;?99EW;X;X\ \ \ 	
 I
	'xx
D4IxJJHH 	' 	' 	'"" " " 
 sJ'' WS\-E W WI\ W W,+W WJTW W
 :&&&	' "i00!333NNdKYd dWad d   >, 	( 'F9 	.#-F< 	'xxFx33HH 
	' 
	' 
	'Hal H H H  sJ'' WS\-E W WI\ W W,+W WJTW W
 :&&&
	' s/   > 
B!ABB!2D
 

E-AE((E-c                 |   d| d}ddd}i }	 |                      ||          }d|v rt          |d                   |                     d	g           snf|d	         D ]F}|                    t          |d
                   g           }|                    |d                    G|dxx         |d         z  cc<   |S )Nz rest/api/2/issuesecurityschemes/z/membersr   r   r   Tr   r   r   issueSecurityLevelIdholderr   r   )rM   r   
setdefaultstrr  )r   security_scheme_idrU   r   security_level_membersro   membermemberss           r    get_issue_security_level_membersz(JiraApi.get_issue_security_level_members  s    M1CMMM
 

 "$	6xxFx33H(** 9:::<<"-- "8, 1 10;;CG]@^<_<_acddvh/00009!55	6 &%r   c                     d| d}|d| j         d}|                     ||          }|                    dg           sdS |d         d         S )uR    Возвращает контекст пользовательского поляrest/api/3/field/rl  r   rs  r   r   r   r   Nr   rM   )r   field_id
context_idrU   r   ro   s         r   get_field_contextzJiraApi.get_field_context)  sl    4(444#*
 
 88C8//||Hb)) 	F!!$$r   c                 @   d| d| d}d| j         d}i }	 	 |                     ||          }n.# t          j        $ r}|j        j        dk    rY d	}~d	S  d	}~ww xY w|                    d
g           }|sn'|D ]}	|	||	d         <   |dxx         |d         z  cc<   |S )u`    Возвращает опции контекста пользовательского поля r  rp  rq  r   r   Tr   i  Nr   r   r   r   )r   rM   ru   rW  ro   rs   )
r   r  r  rU   r   rw  ro   rX  r   values
             r   get_field_context_optionz JiraApi.get_field_context_option9  s   H(HHZHHH*
 

 	688C877%   <+s2244444
 \\(B//F  - -',d$$9!55	6" s   0 AAAAc                 H   d| d}|d| j         d}g }	 |                     ||          }|                    dg           sn_|d         D ]?}|                    d          r(|                    t          |d                              @|d	xx         |d
         z  cc<   |S )u    Возвращает сопоставленный список типов задач и контекста пользователького поля r  z/context/issuetypemappingr   r  Tr   r   issueTypeIdr   r   )r   rM   r  r  )r   r  r  rU   r   r  ro   r  s           r   #get_field_context_issuetype_mappingz+JiraApi.get_field_context_issuetype_mappingU  s    E(EEE#*
 
 

	6xxFx33H<<"-- !(+ A A99]++ A%%c%*>&?&?@@@9!55
	6 r   c                    d| d}d| j         d}g }	 	 |                     ||          }nL# t          j        $ r:}|j        j        dk    r#t                              d| d	           Y d
}~nS|d
}~ww xY w|                    dg           sn2|                    |d                    |dxx         |d         z  cc<   d
}|D ]B}	|	                    d          |k    r
|	d         c S |	                    d          r|	d         }C|S )uz    Возвращает список контекстов пользовательского поля для проекта r  z/context/projectmappingr   r   Tr   rT  uA   Не удалось получить контексты поля u@   . Пользовательское поле не найдено.Nr   r   r   r   rs  isGlobalContext)	r   rM   ru   rW  ro   rs   r   r  r   )
r   r  r   rU   r   contextsro   rX  global_contextrv  s
             r   !get_field_context_project_mappingz)JiraApi.get_field_context_project_mappingm  s   C(CCC*
 

 	688C877%   <+s22NN  $rgo  $r  $r  $r  s  s  sEEEE		 <<"-- OOHX.///9!55	6   	6 	6G{{;'':55{++++.// 6!(!5s   - A6.A1/A11A6c              #      K   d| d}d| j         d}	 |                     ||          }|                    dg           }|sd
S |D ]}|V  |dxx         |d	         z  cc<   Q)u8    Возвращает поля конфигурации zrest/api/3/fieldconfiguration/z/fieldsr   r   Tr   r   r   r   Nr  )r   field_configuration_idrU   r   ro   r   ry  s          r   get_field_config_fieldszJiraApi.get_field_config_fields  s      N/ENNN*
 


	6xxFx33H\\(B//F   9!55
	6r   Fc                     d}d| j         |d}g }	 |                     ||          }|                    dg           sn2|                    |d                    |dxx         |d         z  cc<   `|r
|r|d         S |S )	u    Возвращает список конфигураций или конфигурацию по умолчанию при is_default=Truezrest/api/3/fieldconfigurationr   )r   r   	isDefaultTr   r   r   r   )r   rM   r   )r   
is_defaultrU   r   field_configurationsro   s         r   get_field_configzJiraApi.get_field_config  s    -*#
 
  "	6xxFx33H<<"--  ''(:;;;9!55	6  	(. 	('**''r   field_configuration_scheme_idc                 L    d}d|i}|                      ||          }|d         S )u  
        Возвращает список сопоставления типа задачи и конфигурации поля

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

        Returns:
            list: список сопоставления типа задачи и конфигурации поля
        z+rest/api/3/fieldconfigurationscheme/mappingfieldConfigurationSchemeIdr   r   r   )r   r  rU   r   ro   s        r   "get_field_configuration_issue_typez*JiraApi.get_field_configuration_issue_type  s4     <.0MN88C8//!!r   c                     d}d|i}|                      ||          }|d         d         }d}|                     d          r|d         d         }|S )	uR    Возвращает схему конфигурации полей прокта z+rest/api/3/fieldconfigurationscheme/projectr   r   r   r   NfieldConfigurationSchemer   r   )r   r   rU   r   ro   r#  r  s          r   &get_project_field_configuration_schemez.JiraApi.get_project_field_configuration_scheme  sh    ;z*88C8//(#A&(,%::011 	U,23M,Nt,T),,r   c                 D    d| }|                      |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  rU   ro   s       r   get_workflow_as_xmlzJiraApi.get_workflow_as_xml  sA     c\`bb88"01  
 
 r   c                 0    d}|                      |          S )u   
        Получает cloudId для Jira
        https://developer.atlassian.com/cloud/jira/software/rest/intro/#base-url-differences

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

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

        Returns:
            dict: результат ответа
        z$rest/projectconfig/1/workflowscheme/originalTr   r   )r   r%  rU   r   s       r   get_project_workflow_schemez#JiraApi.get_project_workflow_scheme  s2     C[BBd#xxFx+++r   cloud_idissue_type_idsc                 B   d| d}ddi}g }|D ]}|                     ||d           d|i}|                     |||          }	|	d         }
|	d	         }|D ]E}|d         D ]:t          t          fd
|
          d          }|r                    |           ;F|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   rj   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   rL  )r   r  r   r  rU   r   project_and_issue_typesissue_type_idrj   ro   r!  r"  workflowrY   r&  s                 @r    get_simplified_project_workflowsz(JiraApi.get_simplified_project_workflows  s   $ ThSSS,d3"$+ 	 	M#**#0!+     '(?@99Sd9;;J'[)	! 
	3 
	3H#+J#7 	3 	3\\\\      3#**6222	3 r   r=  c                     d}d|i}	 |                      ||d          }n/# t          j        $ r}|j        j        dk    rY d}~dS |d}~ww xY w|j        S )u   
        Возвращает значение настройки текущего пользователя

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

        Returns:
            _type_: значение
        rest/api/2/mypreferencesr=  T)r   r  rT  N)rM   ru   rW  ro   rs   r  )r   r=  rU   r   ro   rX  s         r   r  zJiraApi.get_mypreferences:  s     *		xx"    HH
 ! 	 	 	|'3..tttttI	
 }s   ! AAAArj   c                 D    d}d|i}|                      ||i |           dS )u   
        Устанавливает значение настройки текущего пользователя

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

        Args:
            key (str): ключ настройки
        r,  r=  r   N)deleteru   rW  )r   r=  rU   r   s       r   r  zJiraApi.delete_mypreferencesf  sX     *	KKFK+++++! 	 	 	DD	s   ! 44workflow_scheme_idc                 6    d| }|                      |          S )u   
        Получает информацию о схеме бизнес-процессов

        Args:
            workflow_scheme_id (str): id схемы бизнес-процесса
        zrest/api/2/workflowscheme/r   )r   r1  rU   s      r   get_workflow_schemezJiraApi.get_workflow_schemeu  s#     @+=??xx}}r   r  c                 <   |                      d          }i }|r||d<   |r||d<   |r||d<   |r||d<   | j        rD|                                 }d                    |d                                                   |d<   |                     ||          }|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   rF   get_all_permissionsr   r  rM   )	r   r   r%  r  r  rU   r   all_permissionsr8  s	            r   get_permissionszJiraApi.get_permissions  s    * 00 	-",F; 	/#.F<  	) (F9 	+!*F:: 	T"6688O$'HH_]-K-P-P-R-R$S$SF=!hhs6h22=))r   c                 2   d}ddd}|r||d<   ng d}d                     |          |d<   g }	 |                     ||	          }|                    d
          sn;|                    |d
                    |d         rn|dxx         |d         z  cc<   h|S )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   Tr   r   r   r   r   )r   rM   r   )r   r   rU   r   expand_listfiltersro   s          r   get_all_filters_cloudzJiraApi.get_all_filters_cloud  s     )
 
  
	5%F8  K  #xx44F8		6xxFx33H<<)) NN8H-...! 9!55		6 r   c                    ddl m} d}dddddd}g }	 |                     ||| j        d          } ||d	          }|                    d
d          }|sn|                    dddi          D ]A}|                    d          }	|                     |	          }
|                    |
           B|                    dd          sn|dxx         dz  cc<   |S )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_rK  r,   )bs4rE  rM   r   findfind_all
get_filterr  )r   rE  rU   r   rB  ro   souptable_resultsfilter_data	filter_idfilter_s              r   get_all_filters_serverzJiraApi.get_all_filters_server  sD     	&%%%%%; !
 
 	(xx/"&	    H !=622D IIg+I>>M    -55dCSUYBZ5[[ ( ('OO,<==	//)44w'''' 99S955 >"""a'"""/	(2 r   c                 `    | j         r|                                 S |                                 S )u8   
        Получает все фильтры
        )rF   rC  r\  r{   s    r   get_all_filterszJiraApi.get_all_filters  s2     : 	1--///..000r   c              #     K   t                                                      }|                     d          }|                     dd           t                                                      }|r|                     d|           n|                     d           |D ]4t          t          fd|          d          }|r|d         d<   V  5dS )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  )rP   get_all_resolutionsr  r  r  r  r   )r   resolutionsr  resolutions_untranslatedresolution_untranslatedrb  rV   s        @r   rc  zJiraApi.get_all_resolutions  s      gg1133 #445GHH 	17;;;#(77#>#>#@#@   	:""#57JKKKK %%&8999 & 	 	J&*;;;;,  ' '# ' Q1H1P
-.	 	r   c              #     K   t                                                      }|                     d          }|                     dd           t                                                      }|r|                     d|           n|                     d           |D ]/t          fd|D             d          }|r|d         d<   V  0dS )uw   
        Получает все статусы

        Yields:
            dict: данные статуса
        r  r  c              3   @   K   | ]}|d          d          k    |V  dS r   Nr#   .0untranslatedrY   s     r   	<genexpr>z+JiraApi.get_all_statuses.<locals>.<genexpr>O  sC        %1#D)VD\99 !9999 r   Nr  r  )rP   r   r  r  r  r  )r   r!  r  untranslated_statusesuntranslated_statusrY   rV   s        @r   r   zJiraApi.get_all_statuses5  s      77++-- #445GHH 	17;;; % 8 8 : :  	:""#57JKKKK %%&8999  	 	F"&   5J   # # # I-@-H)*LLLL	 	r   c              #     	K   t                                          |          }|                     d          }|                     dd           t                                          |          }|r|                     d|           n|                     d           |D ]`t          fd|D             d          }|r<d         D ]3	|d         }t          	fd|D             d          }|r|d         	d<   4V  adS )	u   
        Получает все статусы проекта по типам задач

        Yields:
            dict: данные статуса
        r  r  c              3   @   K   | ]}|d          d          k    |V  dS ri  r#   )rk  rl  r	  s     r   rm  z1JiraApi.get_status_for_project.<locals>.<genexpr>s  sD        %1#D)Z-=== !==== r   Nr!  c              3   @   K   | ]}|d          d          k    |V  dS ri  r#   rj  s     r   rm  z1JiraApi.get_status_for_project.<locals>.<genexpr>~  sC        -9+D1VD\AA )AAAA r   r  r  )rP   r   r  r  r  r  )r   r%  r  r  untranslated_issue_typesuntranslated_issue_typern  ro  r	  rY   rV   s           @@r   r   zJiraApi.get_status_for_projectZ  s      gg44[AA #445GHH 	17;;;#(77#A#A+#N#N   	:""#57JKKKK %%&8999% 	 	J&*   5M   ' '# ' Q(4 
Q 
QF,CJ,O)*.   =R   + +' + Q5H5P12-	 	r   c                 8    d| d}|                      |          S )u   
        Ссылки проекта

        Args:
            project_key (str): код проекта

        Returns:
            list: список ссылок проекта
        zrest/projects/1.0/project/z	/shortcutr   )r   r%  rU   s      r   get_project_shortcutszJiraApi.get_project_shortcuts  s%     B;AAAxx}}r   )NNr   )r   r   NNNN)Nr   )r   )NNN)r   N)r   r   )Nr   r   r|  )NN)r   r   NNN)r   NNN)r   rB   )F)NNNN)gr    r!   r"   r   rQ   rR   re   rp   rw   r|   rm   r   rz   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*  r2  r0  r>  rC  rG  rQ  rY  r]  rM  rn  rt  r   rz  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  r3  r;  rC  r\  r^  rc  r   r   rv  __classcell__)rV   s   @r   rA   rA   \   s1	       K2 2 2 2 2,6 6 6> > > > ># # # # #.         $    F 4 4 4 4lY Y Y. 9 9 9 9v x~    4     , WY	 	 	 WY # # # 	#
 # # # #J0 0HTN 0 0 0 043 3 3 3 3 32         4$ 4 4 4 4, , , , ,
'! '! '! '! '!R
6c 
6d 
6 
6 
6 
64S 4 4 4 4"" " "C "C " " " "H, ,c , ,QT , , , ,.        B	 	 	 	 	   "$c $ $ $ $
( ((4. ( ( ( (T        $
 
 

 
 
DdO    . . .   $, , , ,0 48@D   6&s & & & &* *^a * * * *htn    4 4 4    
          < < < < <    ,        (    <        *  (& &# &# & & & & &P? ?C ?# ?Z] ? ? ? ?B& & &2% % %   8  0     D6 6 6(( ( ( (2"PS "X\ " " " ""- - -  (	 	 	,s , , , ,00 0 	0 0 0 0dS    4
S 
 
 
 
 
$    c     &* &*&* &* 	&*
 &* 
&* &* &* &*P' 'D ' ' ' 'R5 5 5 5 5n1 1 1# # # # #J# # # # #J- - - - -^      r   rA   )r$   r%   r&   r'   )r   typingr   r   r   r   r<   	functoolsr   timer	   ru   requests.adaptersr
   urllib3.util.retryr   rD   r   pathlibr   	atlassianr   cmf.includeloggingFilterr   	getLoggerr   	addFilterr?   rA   r#   r   r   <module>r     s   				 1 1 1 1 1 1 1 1 1 1 1 1               ) ) ) ) ) ) $ $ $ $ $ $                          '.    
		2	3	3   $$&& ' ' '8 8 8 8vx x x x xd x x x x xr   