
    i!                     L   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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)contextmanager)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>.retryB   s    G'H$1$40000  	$ 	$ 	$,..##444#4 $4qF{$BB(OOOOOOOO	$$s    A+A

A)r   inspectisgeneratorfunction)r7   r:   r<   r4   r5   r6   r8   r9   s   `  r   retry_exceptionz backoff.<locals>.retry_exception-   s    	t	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 
	$& 
t	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 
	$& &t,, 	r    r$   )r5   r9   r6   r4   r8   r?   s   ````` r   backoffr@   "   s=    + + + + + + + + +Z r    c                   |    e Zd ZdZ fdZd Zedyd            Z fdZ fdZ	 fdZ
d	 Zd
 Z fdZ	 	 	 dzdZd Z	 	 	 	 	 	 d{dZd|dee         fdZd} fd	Z ee          d             Z ee          	 	 	 d~dededefd            Zd|dee         fdZddee         fdZd Zd Zd Zd}d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&dd*e$dedefd+Z'dd,e$dedefd-Z( fd.Z)d/ Z*d0 Z+ fd1Z,dyd2Z-d%e$fd3Z.ddee         fd4Z/dyd5Z0dyd6Z1dyd7Z2d8 Z3d9 Z4de5e$ef         fd:Z6d; Z7dd<Z8dd=Z9	 	 dd>Z:d?e$fd@Z;ddefdAZ<dee         fdBZ=dC Z> fdDZ?dE Z@ fdFZA fdGZB fdHZC fdIZD fdJZEdK ZFdL ZGdM ZHdN ZIdO ZJ fdPZKdQ ZLdR ZMddededefdSZNdd,e$dTe$dUe$fdVZOdW ZPdX ZQdY ZRdZ ZSd[ ZTd\ ZUdd^ZVd_e$defd`ZWda ZXdb ZYdc ZZd,e$fddZ[dee$d"edfefdgZ\dhe$fdiZ]dhe$dje$fdkZ^dhe$fdlZ_dme$fdnZ`	 	 	 	 dd"e$d,e$doe$d%e$def
dpZadydefdqZbdefdrZcds Zd fdtZe fduZf fdvZgdw Zhdx Zi xZjS )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_retriesrH   _session_valid_session_url)r   urlr/   r0   	__class__s       r   rR   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_retrieshttp://rF   N)r   configIMPORT_REQUEST_RETRY_TOTAL!IMPORT_REQUEST_RETRY_STATUS_CODESr   _sessionmount)r   retrieshttp_adapters      r   rS   zJiraApi._set_session_retriesv   su    
 34#E	
 
 
 #w777I|444J55555r    Nc              #   n  K   i }t          d          }dD ]?}| j        j                            |          ||<   | j                            ||           @| j        }|r|| _        	 | V  |                                D ]C\  }}|r| j                            ||           #| j        j                            |d           D|r	|| _        dS dS # |                                D ]C\  }}|r| j                            ||           #| j        j                            |d           D|r|| _        w xY w)u<   
        Временно отключает Retry.
        r   r]   )r_   rF   N)r   rc   adaptersrN   rd   rJ   itemspop)r   rJ   old_adaptersno_retry_adapterprefixold_timeoutadapters          r   without_retryzJiraApi.without_retry   s     
 &1555 . 	: 	:F#'=#9#=#=f#E#EL M(89999l 	#"DL	+JJJ $0#5#5#7#7 = = =M''8888M*..vt<<<<  +*+ + $0#5#5#7#7 = = =M''8888M*..vt<<<<  +*****s   (C A#D4c                 ^    | j         r$t                                          ||           dS dS )u   
        Переопределенный метод
        Базовая аутентификация устанавливается только для Jira Cloud
        N)rG   rQ   _create_basic_session)r   usernamerI   rW   s      r   rr   zJiraApi._create_basic_session   s9    
 : 	>GG))(H=====	> 	>r    c                 2   | j         r| j        st          d          | j        j                                         | j         | j        d}t                                          d| j        |          }| j        j        st          d          d| _
        dS )u;   
        Выполняет авторизацию
        u_   Учетные данные для аутентификации не предоставлены)rs   rI   POST)pathdatauR   Ошибка аутентификации: файлы cookie не полученыTN)rs   rI   
ValueErrorrc   cookiesclearrQ   requestrU   RuntimeErrorrT   )r   rw   responserW   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)rv   F)rQ   r{   rU   status_coder   OKrequestsRequestException)r   r}   rW   s     r   _check_sessionzJiraApi._check_session   sd    	ww& '  H ':=88( 	 	 	55	s   <A   AAc                     | j         j        r8| j        s1|                                 rd| _        |                                  dS |                                  |                                  dS )u>   
        Создает валидную сессию
        TN)rc   ry   rT   r   user_get_websudor~   r   s    r   _create_valid_sessionzJiraApi._create_valid_session   sz    
 =  	)< 	""$$ &*#%%''' 	r    c                     | j         j        S N)rc   ry   r   s    r   get_session_cookieszJiraApi.get_session_cookies   s    }$$r    c                 H   | j         r t                      j        |i |S 	 | j        s|                                   t                      j        |i |}|j        t          j        k    r4d| _        |                                   t                      j        |i |}|S # t          j	        $ rp}t          |d          rZ|j        S|j        j        t          j        k    r9d| _        |                                   t                      j        |i |cY d}~S  d}~ww xY w)u8  
        Переопределенный метод
        Используется только для Jira Server.
        Перед запросом проверяется валидность сессии
        и при необходимости выполняется авторизация 
        Fr}   N)rG   rQ   r{   rT   r   r   r   UNAUTHORIZEDr   r   r   r}   )r   r/   r0   r}   erW   s        r   r{   zJiraApi.request   sH    : 	4"577?D3F333	& -**,,,&uww777H #z'>>>&+#**,,,*577?D;F;;O( 		 		 		:&&8J*J*j.EEE&+#**,,,&uww777777777		s%   A>B" "D!1A$DD!DD!   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.
        r   )methodrV   headersT)streamr   rJ   verifyproxiesz
HTTP: GET z ->  zContent-Disposition z!filename\*?=(?:"([^"]+)"|([^;]+))r-   r&   wb)
chunk_sizeN)	file_name	file_size)no_check_headersrJ   log_curl_debugrc   rN   
verify_sslr   loggerdebugr   reasonraise_for_statusr   r   searchgroupopeniter_contentwriter   statst_size)r   download_url	save_pathr   rJ   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)rv   rw   filesr   )rI   rc   ry   get_dictrN   postform_token_headers)r   rV   rw   r   ry   s        r   r   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isLastrY   )int
isinstancelisttuplesetjoinresource_urlrG   rN   extendlen)r   r   r   startlimitr   validate_querynext_page_tokenr   rV   resultsr}   r   rY   s                 r   jql_get_list_of_ticketszJiraApi.jql_get_list_of_ticketsS  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   )rG   MAX_RESULTSr   r   )r   r   r   start_atrY   max_resultsr   s          r   
get_issueszJiraApi.get_issues  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    из rY   )r   rQ   get_issues_for_boardgr   r   )	r   board_idr   r   r   rY   r   r   rW   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_sprintrN   )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   rN   )	r   	sprint_idr   r   r   rV   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   )rG   r   rN   	Exceptionr   get_all_workflows)r   namesr   r   r   rV   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   )rG   r   r   rN   r   get_status_for_projectget_all_statuses)r   r   
project_idrV   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   rN   r   )r   r   rV   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rN   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   rN   r   r   )r   r   r   r  r   s        r   get_all_workflow_schemesz JiraApi.get_all_workflow_schemes3  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   )rN   r   )r   r  r   r  r   s        r   get_issue_type_schemeszJiraApi.get_issue_type_schemesA  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_projectK  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>o  s    CID1A$A r    nameuntranslatedName)	rG   rN   rQ   get_issue_typesget_mypreferencesset_mypreferencesdelete_mypreferencesnextr   )r   r  issue_typescurrent_user_localeissue_types_untranslatedissue_type_untranslatedr  rW   s         @r   r  zJiraApi.get_issue_typesP  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   dictrN   r   )r   r&  base_urlrV   r   r   s         r   get_commentszJiraApi.get_commentsy  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   rC   r   Tr   r   Nr   r   )r   rN   r   )r   r.  r,  rV   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   )rN   r   )r   r   r   r   rV   r   r   results           r   get_agile_board_projectzJiraApi.get_agile_board_project  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   rN   )r   r5  r   r   rV   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)r5  r   r   r   )rG   r8  rQ   get_all_agile_boardsrN   r   r5  r   r   r   r   rW   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)rN    get_board_card_colors_strategies)r   r   r  r}   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_typerV   r}   s	            r   r@  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   )rQ   get_project_versions_paginatedrN   r;  s         r   rN  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   rY   records)r   r+  rN   )r   r  rV   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&  rU  s      r   get_watcherszJiraApi.get_watchers&  s     **955
##r    c           	   #     K   ddd}|r|d         |k    r||d<   | j         rd}d}nd}|pd|d	<   d
|d<   d}	 |                     ||          }|sdS |D ]}	 |                    |                     ||         |                    d                               n># t          $ r1}t
                              t          |                     Y d}~nd}~ww xY w|V  |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 и выше
            r   rC   r   r   zrest/api/3/users/search	accountIdzrest/api/2/user/search.rs   TincludeInactiverM  r   r  )rs   Nr   )	rG   rN   updateget_user_infor   r   r3   strr   )	r   rs   	limit_endr   r  
identifierusers	user_infoexcs	            r   	get_userszJiraApi.get_users+  s      
 
  	--	99#,F< : 	+C$JJ*C!)SF:(,F$%J	HHSH00E " 
  
 	+$$**%j1%.]]6%:%: +      ! + + +LLS********+9U+ VI.);;%	s   AB
C&'CCc                     	 |                      ||          S # t          j        $ r}|j        j        dk    rY d }~d S |d }~ww xY w)NrM  r     userr   	HTTPErrorr}   r   )r   rM  r   rc  s       r   get_user_info_by_keyzJiraApi.get_user_info_by_keyV  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rs   r   rg  rh  )r   rs   r   rc  s       r   get_user_info_by_usernamez!JiraApi.get_user_info_by_username^  sa    	99hv9>>>! 	 	 	|'3..tttttI	rl  c                 4   d}| j         r|                     || d          }nX|                     ||          }|s|                     |p||          }|s$|r	d| d| dnd| d}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   rf  rn  'z' ()u   Пользователь u    не найден@emailAddressdisplayName)rG   ri  rk  ro  r   r`   
ORG_DOMAINcmfr   CmfEmail
max_lengthr   rN   rO   translit_strip)r   rM  rs   r   rb  log_userpostfixmax_lens           r   r]  zJiraApi.get_user_infof  sn   *: 	Z		SF9O9O9O	PPII11c&1III d ::HOPS\b:cc	 Z6>N2x22C2222JJJJ XH X X XYYY)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   rY   r   r   rN   r   r   )r   r  rV   r   r   r}   s         r   _get_field_contextzJiraApi._get_field_contexty  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 )Nr  	/context//optionr   r   r   Tr   r   rY   r   r   r  )r   fieldId	contextIdrV   r   r   r}   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]    Возвращает системные и настраиваемые поля задачи rM  r  contextoptions)get_all_fieldsr+  )r   r   r   fields       r   
get_fieldszJiraApi.get_fields  so    $$&&ff 	" 	"E~~$)E%L!!#(E$K !E)!E)
r    c                 ,    |                      |          S r   )issue_editmeta)r   r&  s     r   get_issue_metazJiraApi.get_issue_meta  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)	NrC   Tz"project = "{project}" ORDER BY key)projectr   r   r   r   r   r   r   )formatr   advanced_mode)r   r5  r   maxr   r   r}   r   s           r   get_all_project_issueszJiraApi.get_all_project_issues  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   rG   rN   )	r   r   r   r   r   r   r   r   rV   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)NrC   project = "r    AND updated >= " AND updated <= " ORDER BY updatedTr   r   r  r   )r   r  )
r   r  r   r  
start_dateend_dater   r   r}   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)rw   count)r   r   r   )r   r   rw   rV   r}   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   rY   )rG   r  r   r   )r   r5  r  r  r   r}   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<   `)Nr2  z/quickfilterr   r   renderedBodyr   Tr   r   r   )r+  rN   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   )rQ   get_project_permission_schemeget_permissionscheme)r   r   schemerW   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)rN   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)rQ   issue_get_worklog)r   r  r   rW   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   )rQ   !get_project_issue_security_scheme)r   r   rW   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  )rQ   get_issue_security_schemesget_issue_security_scheme)r   schrW   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   rY   r   r   r  tabs)rG   rQ   get_all_screensrN   r   r   get_screen_tabs)r   r  r   r   r}   scrrW   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   )rQ   r  get_tab_fields)r   r  r}   tabrW   s       r   r  zJiraApi.get_screen_tabsE  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_fieldsN  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   )rG   r   rN   r   r   )r   r   r   r  r}   s        r   get_screen_schemezJiraApi.get_screen_schemeT  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"  )rN   r   get_screen_scheme_issuetypes)r   r   rV   r   r}   screen_schemes         r   get_project_screen_schemez!JiraApi.get_project_screen_schemeh  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   rN   r   r   get_screen_scheme_actions)r   screen_scheme_idrV   r   r   r}   r3  s          r   r  z$JiraApi.get_screen_scheme_issuetypesv  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  rV   r   r}   s        r   r  z!JiraApi.get_screen_scheme_actions  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   )rQ   get_all_priorities)r   rW   s    r   r  zJiraApi.get_all_priorities  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   rK   r   Tr   r   r   rM  r   r   )rN   r   r  )r   	scheme_idrV   r   project_keysr}   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   rK   r   Tr   r   r   r   r   )rN   r   r   )r   r  rV   r   
prioritiesr}   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)rG   r   rN   r  r  r  get_priority_by_id)r   r   r   rV   r   rM  r   r  r}   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    r  
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, rs  z1rest/plugins/1.0/com.eis.jira.plugins.jiradoc-key)r   u   Для получения полной конфигурации проекта не установлен плагин "Smart Jira Configuration". z. r}   u   Код ошибки - z - u   , адрес запроса: versionup   Установлена неподдерживаемая версия плагина 'Smart Jira Configuration': uF   . При импорте могут возникнуть ошибки. z-rest/smart-configuration/1.0/getProjectConfig
projectKeyr  r  r   uN   Не удалось получить конфигурацию проекта "u6   " через плагин "Smart Jira Configuration". )r   rN   r   r   r   r}   r   r   textCmfErrorr   warning)r   r5  r  r  supported_versions
error_text
plugin_urlr}   rc  plugin_versionrV   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   )rN   r   
setdefaultr^  r  )r   security_scheme_idrV   r   security_level_membersr}   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/r  r   r  r   r   r   r   Nr   rN   )r   field_id
context_idrV   r   r}   s         r   get_field_contextzJiraApi.get_field_contextS  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  r  r  r   r   Tr   i  Nr   r  r   r   )r   rN   r   rj  r}   r   )
r   r  r	  rV   r   r  r}   rc  r   values
             r   get_field_context_optionz JiraApi.get_field_context_optionc  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   rN   r  r^  )r   r  r	  rV   r   r  r}   r  s           r   #get_field_context_issuetype_mappingz+JiraApi.get_field_context_issuetype_mapping  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   rg  uA   Не удалось получить контексты поля u@   . Пользовательское поле не найдено.Nr   r   r   r   r  isGlobalContext)	r   rN   r   rj  r}   r   r   r  r   )
r   r  r   rV   r   contextsr}   rc  global_contextr  s
             r   !get_field_context_project_mappingz)JiraApi.get_field_context_project_mapping  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_idrV   r   r}   r   r  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   rN   r   )r   
is_defaultrV   r   field_configurationsr}   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  rV   r   r}   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   rV   r   r}   r3  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  rV   r}   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   rV   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   r5  rV   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                 D   d| d}ddi}g }|D ]}|                     ||d           d|d}|                     |||          }	|	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/3/workflowuseTransitionLinksFormatT)r  r   r   )skipUsageLookupprojectAndIssueTypes)r   rw   statuses	workflowsc                 (    | d         d         k    S )NstatusReferencer$   )sworkflow_statuss    r   r  z:JiraApi.get_simplified_project_workflows.<locals>.<lambda>]  s    !$5"6/J[:\"\ r    N)r  r   r!  r   r\  )r   r/  r   r0  rV   r   project_and_issue_typesissue_type_idrw   r}   r5  r6  workflowrZ   r:  s                 @r    get_simplified_project_workflowsz(JiraApi.get_simplified_project_workflows2  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    rM  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/mypreferencesrM  T)r   r  rg  N)rN   r   rj  r}   r   r  )r   rM  rV   r   r}   rc  s         r   r  zJiraApi.get_mypreferencesg  s     *		xx"    HH
 ! 	 	 	|'3..tttttI	
 }s   ! AAAArw   c                 D    d}d|i}|                      ||i |           dS )u   
        Устанавливает значение настройки текущего пользователя

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

        Args:
            key (str): ключ настройки
        r@  rM  r   N)deleter   rj  )r   rM  rV   r   s       r   r   zJiraApi.delete_mypreferences  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   rE  rV   s      r   get_workflow_schemezJiraApi.get_workflow_scheme  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   rG   get_all_permissionsr   r  rN   )	r   r   r5  r  r&  rV   r   all_permissionsrL  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   rN   r   )r   r   rV   r   expand_listfiltersr}   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 ]y}|                    d          }		 |                     |	          }
|                    |
           C# t          $ r*}t          
                    d|	 d|            Y d}~rd}~ww xY w|                    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)attrsu2   Ошибка получения фильтра id z: Naz	icon-next)class_r_  r-   )bs4rY  rN   r   findfind_all
get_filterr  r   r   r3   )r   rY  rV   r   rV  r}   souptable_resultsfilter_data	filter_idfilter_rc  s               r   get_all_filters_serverzJiraApi.get_all_filters_server  s     	&%%%%%; !
 
 	(xx/"&	    H !=622D IIg+I>>M    -55dCSUYBZ5[[ j j'OO,<==	j"ooi88GNN7++++  j j jLL!hV_!h!hcf!h!hiiiiiiiij 99S955 >"""a'"""5	(8 s   	*B44
C(> C##C(c                 `    | j         r|                                 S |                                 S )u8   
        Получает все фильтры
        )rG   rW  rp  r   s    r   get_all_filterszJiraApi.get_all_filters7  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  )rQ   get_all_resolutionsr  r  r   r!  r   )r   resolutionsr#  resolutions_untranslatedresolution_untranslatedrv  rW   s        @r   rw  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untranslatedrZ   s     r   	<genexpr>z+JiraApi.get_all_statuses.<locals>.<genexpr>  sC        %1#D)VD\99 !9999 r    Nr  r  )rQ   r   r  r  r   r!  )r   r5  r#  untranslated_statusesuntranslated_statusrZ   rW   s        @r   r   zJiraApi.get_all_statusese  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 r}  r$   )r  r  r  s     r   r  z1JiraApi.get_status_for_project.<locals>.<genexpr>  sD        %1#D)Z-=== !==== r    Nr5  c              3   @   K   | ]}|d          d          k    |V  dS r}  r$   r~  s     r   r  z1JiraApi.get_status_for_project.<locals>.<genexpr>  sC        -9+D1VD\AA )AAAA r    r  r  )rQ   r   r  r  r   r!  )r   r5  r"  r#  untranslated_issue_typesuntranslated_issue_typer  r  r  rZ   rW   s           @@r   r   zJiraApi.get_status_for_project  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   r5  rV   s      r   get_project_shortcutszJiraApi.get_project_shortcuts  s%     B;AAAxx}}r    c                 0    d}|                      |          S )u^   
        Возвращает данные о текущем пользователе
        zrest/api/2/myselfr  r*  s     r   
get_myselfzJiraApi.get_myself  s     "xx}}r    r   )NNr   )r   r   NNNN)Nr   )r   )NNN)r   N)r   r   )Nr   r   )NN)r   r   NNN)r   NNN)r   rC   )F)NNNN)kr!   r"   r#   r   rR   rS   r
   rp   rr   r~   r   r   r   r{   r   r   r   r   r+  r   r   r@   r   r   r   r   r   r   r   r  r	  r  r  r  r  r  r^  r-  r0  r4  r8  r:  rB  r@  rN  rS  rW  rd  rk  ro  r]  r  r  r   r  r  r  r   r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r
  r  r  r  r  r  r!  r$  r(  r+  r.  r>  r  r  r   rG  rO  rW  rp  rr  rw  r   r   r  r  __classcell__)rW   s   @r   rB   rB   ]   st	       K2 2 2 2 2,6 6 6 + + + ^+>> > > > ># # # # #4         % % %! ! ! ! !N 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. ) ) ) )V         &
 
 

 
 
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 , , , ,33 3 	3 3 3 3jS    4
S 
 
 
 
 
$    c     &* &*&* &* 	&*
 &* 
&* &* &* &*P' 'D ' ' ' 'R8 8 8 8 8t1 1 1# # # # #J# # # # #J- - - - -^        r    rB   )r%   r&   r'   r(   )!r   typingr   r   r   r   r=   	functoolsr   timer	   r   
contextlibr
   requests.adaptersr   urllib3.util.retryr   rE   r   pathlibr   	atlassianr   cmf.includeloggingFilterr   	getLoggerr   	addFilterr@   rB   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n n n n nd n n n n nr    