
    Sh                        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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)
HTTPStatus)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>.retry>   s    G'H$1$40000  	$ 	$ 	$,..##444#4 $4qF{$BB(OOOOOOOO	$$s    A+A

A)r   inspectisgeneratorfunction)r3   r6   r8   r0   r1   r2   r4   r5   s   `  r   retry_exceptionz backoff.<locals>.retry_exception)   s    	t	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 
	$& 
t	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 
	$& &t,, 	r   r    )r1   r5   r2   r0   r4   r;   s   ````` r   backoffr<      s=    + + + + + + + + +Z r   c                       e Zd ZdZ fdZ fdZ fdZ fdZd Z fdZ	djd
Z
d Zdkdee         fdZdk fd	Z ee          d             Z ee          	 	 	 dldededefd            Zdmdee         fdZdndee         fdZd Zd Zd ZdkdZdefdZdefdZ fdZd edefd!Z dod#ededefd$Z!dpd%ededefd&Z" fd'Z#d( Z$ fd)Z%dqd*Z&d efd+Z'drdee         fd,Z(dqd-Z)dqd.Z*d/ Z+d0 Z,d1 Z-de.eef         fd2Z/d3 Z0dnd4Z1	 	 dsd5Z2drdefd6Z3dee         fd7Z4d8 Z5 fd9Z6d: Z7 fd;Z8 fd<Z9 fd=Z: fd>Z; fd?Z<d@ Z=dA Z>dB Z?dC Z@dD ZA fdEZBdF ZCdG ZDdtdededefdHZEdrd%edIedJefdKZFdL ZGdM ZHdN ZIdO ZJdP ZKdQ ZLdudSZMdTedefdUZNdV ZOdW ZPdX ZQd%efdYZRdZeded[efd\ZSd]efd^ZTd]ed_efd`ZUd]efdaZVdbefdcZW	 	 	 	 dvded%edded edef
deZXdqdefdfZYdefdgZZdh Z[ fdiZ\ xZ]S )w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httpzhttps://cloudtokenpasswordtimeout,  sessionFzrest/auth/1/session)	
startswithgetcmfutilrequests_sessionsuper__init__rC   _session_valid_session_url)r   urlr+   r,   	__class__s       r   rM   zJiraApi.__init__\   s    ^^F++Acc1AC1A1A::g 	5 &

7 3 3F:$jj44F7OF"" &F9F"" ' 8 8 : :F9.t...v...ZZ((
#1r   c                 ^    | j         r$t                                          ||           dS dS )u   
        Переопределенный метод
        Базовая аутентификация устанавливается только для Jira Cloud
        N)rB   rL   _create_basic_session)r   usernamerD   rQ   s      r   rS   zJiraApi._create_basic_sessionp   s9    
 : 	>GG))(H=====	> 	>r   c                     | j         j                                         | j        | j        d}t                                          d| j        |          }| j         j        st          d          d| _	        dS )u;   
        Выполняет авторизацию
        )rT   rD   POST)pathdatauR   Ошибка аутентификации: файлы cookie не полученыTN)
_sessioncookiesclearrT   rD   rL   requestrO   RuntimeErrorrN   )r   rX   responserQ   s      r   _authenticatezJiraApi._authenticatex   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)rW   F)rL   r\   rO   status_coder
   OKrequestsRequestException)r   r^   rQ   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)	rT   rD   
ValueErrorrY   rZ   rN   rf   user_get_websudor_   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.
        Перед запросом проверяется валидность сессии
        и при необходимости выполняется авторизация 
        Fr^   N)rB   rL   r\   rN   rk   rb   r
   UNAUTHORIZEDrd   re   r   r^   )r   r+   r,   r^   erQ   s        r   r\   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           	         | j         }|p| j        }|                     d||           | j                            |d||| j        | j                  5 }t                              d| d|j	         d|j
                    |                                 t          |d          5 }|                    |	          D ]}|                    |           	 d
d
d
           n# 1 swxY w Y   d
d
d
           d
S # 1 swxY w Y   d
S )ur  
        Скачивает файл

        Args:
            download_url (_type_): url файла для скачивания
            save_path (_type_): путь для сохранения файла
            timeout (_type_, optional): Таймаут. Defaults to None.
            chunk_size (_type_, optional): _description_. Defaults to 8*1024.
        ra   )methodrP   headersT)streamrr   rE   verifyproxiesz
HTTP: GET z ->  zwb+)
chunk_sizeN)no_check_headersrE   log_curl_debugrY   rI   
verify_sslru   loggerdebugrb   reasonraise_for_statusopeniter_contentwrite)	r   download_url	save_pathrE   rw   rr   resfchunks	            r   download_filezJiraApi.download_file   s    ')T\5lGLLL]?L  
 
 	# LLVlVVVV#*VVWWW  """i'' #1 ---DD # #EGGENNNN## # # # # # # # # # # # # # #	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	#s7   AC9%/C!C9!C%	%C9(C%	)C99C= C=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)rW   rX   filesrr   )rD   rY   rZ   get_dictrI   postform_token_headers)r   rP   rX   r   rZ   s        r   ri   zJiraApi.user_get_websudo   s    
 6#}$
 

 	=  	<m+4466G$:;;I 	* )DyycB@WyXXXr   r   returnc              #      K   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(    Получение всех задач order by created ASCr   TrenderedFields)jqlstartlimitexpandN)MAX_RESULTSjql_get_list_of_ticketslen)r   r   r   start_attotalmax_resultsissuess          r   
get_issueszJiraApi.get_issues   s      $/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    из r   )r   rL   get_issues_for_boardgr|   r   )	r   board_idr   r   r   r   r   r   rQ   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_sprintrI   )r   r   r   r   r   rows         r   get_sprintszJiraApi.get_sprints)  sv      	%%xuE%RRC778R(( UNE8}  					r   r   r   fieldsc              #     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   startAt
maxResults,r   Tparamsr   r   r   N)joinrI   )	r   	sprint_idr   r   r   rP   r   r   r   s	            r   get_sprint_issueszJiraApi.get_sprint_issues5  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   )rB   resource_urlrI   	Exceptionr   get_all_workflows)r   namesr   r   r   rP   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   )rB   r   r   rI   r   get_status_for_projectget_all_statuses)r   r   
project_idrP   r   r   s         r   get_statuseszJiraApi.get_statusesu  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   rI   r   )r   r   rP   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rI   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   rI   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   )rI   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>  s    CID1A$A r   nameuntranslatedName)	rB   rI   rL   get_issue_typesget_mypreferencesset_mypreferencesdelete_mypreferencesnextr   )r   r   issue_typescurrent_user_localeissue_types_untranslatedissue_type_untranslatedr   rQ   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              #   d  K   |                      d          }| d| d}t          ddd          }	 | j        r|                     ||	          }n|                     ||	          }|                    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   dictrB   rI   r   )r   r   base_urlrP   r   r   s         r   get_commentszJiraApi.get_comments  s      $$W--//I///aB7PQQQ	6z 3hhs6h22hhs6h2277:&& :&&&&&&&9S_!5!55	6r   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   )rI   extend)r   r   r   r   rP   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   )intrI   )r   r   r   r   rP   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   )rB   r   rL   get_all_agile_boardsrI   r   r   r   r   r   r   rQ   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          }|S )Nz3rest/greenhopper/1.0/rapidviewconfig/editmodel.jsonrapidViewIdr   r   )r   r   r   r^   s       r   get_advanced_board_settingsz#JiraApi.get_advanced_board_settings<  s&    C88C(A8BBr   c              #      K   d}d}	 t                                          |||          }|                    dg           sd S ||z  }|d         D ]}|V  Q)Nr   r   T)keyr   r   r   )rL   get_project_versions_paginatedrI   r   s         r   r  z&JiraApi.get_project_versions_paginatedB  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   r   records)r   r   rI   )r   r   rP   r   r   r   r   r   s           r   get_audit_recordszJiraApi.get_audit_recordsM  s       122 	/#.F< 	$F8#F7O((3''Cs7|##UNE9~  					r   c                 <    |                      |          }|d         S )u(   Наблюдатели по задачеwatchers)issue_get_watchers)r   r   r  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   r?   z"operations,groups,applicationRolesr   r   Tr   	accountIdr   zrest/api/2/user/search.rT   includeInactiver  N)rB   rI   updateget_user_infor   )r   rT   	limit_endr   r   users	user_infos          r   	get_userszJiraApi.get_usersc  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     userrd   	HTTPErrorr^   rb   )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rT   r   r  r  )r   rT   r   r   s       r   get_user_info_by_usernamez!JiraApi.get_user_info_by_username  sa    	99hv9>>>! 	 	 	|'3..tttttI	r"  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   r  r$  u   Пользователь u    не найден@emailAddressdisplayName)rB   r  r!  r%  r   config
ORG_DOMAINcmfr   CmfEmail
max_lengthr   rI   rJ   translit_strip)r   r  r   r  postfixmax_lens         r   r  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   r   r   r   rI   r   r   )r   r   rP   r   r   r^   s         r   _get_field_contextzJiraApi._get_field_context  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 )Nr4  	/context//optionr   r   r   Tr   r   r   r   r   r6  )r   fieldId	contextIdrP   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         <   | j        r|d         rg |d<   g |d<   	 |                     |d                   |d<   |d         D ]L}	 |                     |d         |d                   }||d<   |d                             |           F#  Y JxY w#  Y xY wg |d<   g |d<   |S )u]    Возвращает системные и настраиваемые поля задачи r  r   customcontextoptions)get_all_fieldsr   rB   r7  r=  r   )r   r   r   fieldr@  rA  s         r   
get_fieldszJiraApi.get_fields  s9   $$&&ff 	& 	&E~~$)E%L!!#(E$K z &eHo &#%i #%i '+'>'>uT{'K'KE)$#(#3 ! !!&*&=&=eDk7SW=&Y&YG18GI.!),33G<<<<! D!D $&i #%i  
s%   (CACCC
CCc                 ,    |                      |          S N)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)	Nr?   Tz"project = "{project}" ORDER BY key)project*allr   r   r   r   r   r   )formatr   advanced_mode)r   r   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              #      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)Nr?   project = "r    AND updated >= " AND updated <= " ORDER BY updatedTrK  r   rL  r   )r   rN  )
r   rJ  r   rO  
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   c                     d| d}|r	|d| dz  }|r	|d| dz  }|dz  }|                      |dd          }t          |d	                   S )
NrR  r   rS  rT  rU  r   r)   )r   r   r   )r   r   )r   r   rV  rW  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""88Cq8228G$%%%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   rI   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   )rL   get_project_permission_schemeget_permissionscheme)r   r   schemerQ   s      r   rc  z%JiraApi.get_project_permission_scheme1  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)rI   append)r   issue_idr   
propertiesr   r   s         r   get_issue_propertieszJiraApi.get_issue_properties6  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)rL   issue_get_worklog)r   rj  r   rQ   s      r   ro  zJiraApi.issue_get_worklog>  s$    gg''11:r   c                 Z    	 t                                          |          S #  i cY S xY wrF  )rL   !get_project_issue_security_scheme)r   r   rQ   s     r   rq  z)JiraApi.get_project_issue_security_schemeB  s2    	77<<ZHHH	IIIs    $ *c              #      K   t                                                      D ]}|                     |d                   V   d S r   )rL   get_issue_security_schemesget_issue_security_scheme)r   schrQ   s     r   rs  z"JiraApi.get_issue_security_schemesH  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   r   r   r   r   tabs)rB   rL   get_all_screensrI   r   r   get_screen_tabs)r   r   r   r   r^   scrrQ   s         r   rx  zJiraApi.get_all_screensL  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   )rL   ry  get_tab_fields)r   r|  r^   tabrQ   s       r   ry  zJiraApi.get_screen_tabsb  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rF  )get_screen_tab_fields)r   r|  r}  s      r   r~  zJiraApi.get_tab_fieldsk  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   )rB   r   rI   r   r   )r   resultsr   r   r^   s        r   get_screen_schemezJiraApi.get_screen_schemeq  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   )rI   r   get_screen_scheme_issuetypes)r   r   rP   r   r^   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   rI   r   r   get_screen_scheme_actions)r   screen_scheme_idrP   r   r  r^   r   s          r   r  z$JiraApi.get_screen_scheme_issuetypes  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  rP   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rF  )rL   get_all_priorities)r   rQ   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   rF   r   Tr   r   r   r  r   r   )rI   r   ri  )r   	scheme_idrP   r   project_keysr^   rJ  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   rF   r   Tr   r   r   r   r   )rI   r   r   )r   r  rP   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)rB   r   rI   r  r  ri  get_priority_by_id)r   r   r   rP   r   r  r   r  r^   re  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   rA  
issuetypesc           
         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          }|dvrd| d| }t          |          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 )Nu   Установите плагин "Smart Jira Configuration" версии 4.8.12, 4.8.9, 4.8.7, 4.7.3 или 4.5.1. по ссылке https://marketplace.atlassian.com/apps/1221996/smart-jira-configuration-formerly-smart-project-config-docs/version-historyz1rest/plugins/1.0/com.eis.jira.plugins.jiradoc-key)rr   u   Для получения полной конфигурации проекта не установлен плагин "Smart Jira Configuration". z. r^   u   Код ошибки - z, z - u   , адрес запроса: version)z4.8.12z4.8.9z4.8.7z4.7.3z4.5.1u.   Неверная версия плагина (z). z-rest/smart-configuration/1.0/getProjectConfig
projectKeyrA  r  r   uN   Не удалось получить конфигурацию проекта "u6   " через плагин "Smart Jira Configuration". )	rI   rx   r   r   r^   rb   r}   textCmfError)r   r   rA  r  
error_text
plugin_urlr^   r   plugin_versionrP   r   s              r   get_project_smart_configz JiraApi.get_project_smart_config  sH   J 	
 I
	'xx
D4IxJJHH 	' 	' 	'"" " " 
 sJ'' WS\-E W WI\ W W,+W WJTW W
 :&&&	' "i00!OOO```T^``  :&&& ?, 	( '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C& &
E	0A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   )rI   r   
setdefaultstrri  )r   security_scheme_idrP   r   security_level_membersr^   membermemberss           r    get_issue_security_level_membersz(JiraApi.get_issue_security_level_membersM  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/r5  r   r<  r   r   r   r   Nr   rI   )r   field_id
context_idrP   r   r^   s         r   get_field_contextzJiraApi.get_field_contextf  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  r9  r:  r   r   Tr   i  Nr   r   r   r   )r   rI   rd   r  r^   rb   )
r   r  r  rP   r   rA  r^   r   r   values
             r   get_field_context_optionz JiraApi.get_field_context_optionv  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   rI   ri  r  )r   r  r  rP   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   r  uA   Не удалось получить контексты поля u@   . Пользовательское поле не найдено.Nr   r   r   r   r<  isGlobalContext)	r   rI   rd   r  r^   rb   r{   warningr   )
r   r  r   rP   r   contextsr^   r   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_idrP   r   r^   r   rC  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   rI   r   )r   
is_defaultrP   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  rP   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   rP   r   r^   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_responserr   r   )r   r   rP   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   rP   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   rP   r   s       r   get_project_workflow_schemez#JiraApi.get_project_workflow_scheme7  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   rX   statuses	workflowsc                 (    | d         d         k    S )NstatusReferencer    )sworkflow_statuss    r   r   z:JiraApi.get_simplified_project_workflows.<locals>.<lambda>m  s    !$5"6/J[:\"\ r   N)ri  r   r   r   r  )r   r  r   r  rP   r   project_and_issue_typesissue_type_idrX   r^   r  r  workflowstatusr  s                 @r    get_simplified_project_workflowsz(JiraApi.get_simplified_project_workflowsE  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   rN  r  N)rI   rd   r  r^   rb   r  )r   r  rP   r   r^   r   s         r   r   zJiraApi.get_mypreferencesw  s     *		xx"    HH
 ! 	 	 	|'3..tttttI	
 }s   ! AAAArX   c                 D    d}d|i}|                      ||i |           dS )u   
        Устанавливает значение настройки текущего пользователя

        Args:
            key (str): ключ настройки
            data (str): значение настройки
        r  r  )rX   r   r   N)put)r   r  rX   rP   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  r  r   N)deleterd   r  )r   r  rP   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   r  rP   s      r   get_workflow_schemezJiraApi.get_workflow_scheme  s#     @+=??xx}}r   rj  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   rB   get_all_permissionsr   rg  rI   )	r   r   r   rj  r   rP   r   all_permissionsr  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   isLastr   r   )r   rI   r   )r   r   rP   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 ]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   rr   r  lxmltable	mf_browse)r   trzdata-filter-id)attrsaz	icon-next)class_r  r)   )bs4r  rI   r   findfind_all
get_filterri  )r   r  rP   r   r
  r^   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   
        Получает все фильтры
        )rB   r  r$  rj   s    r   get_all_filterszJiraApi.get_all_filtersD  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>h  s    r$x:d+;; r   Nr   r   )rL   get_all_resolutionsr   r   r   r   r   )r   resolutionsr   resolutions_untranslatedresolution_untranslatedr*  rQ   s        @r   r+  zJiraApi.get_all_resolutionsM  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   )Nro   )r   )NNN)Nr   )r   N)r   r   )Nr   r   rF  )NN)r   NNN)r   r?   )F)NNNN)^r   r   r   r   rM   rS   r_   rf   rk   r\   r   ri   r   r   r   r   r<   r   r   r   listr   r   r   r   r   r   r   r   r   r   r  r   r   r   r   r  r  r  r  r  r!  r%  r  r7  r=  r   rD  rH  rP  rX  rZ  r]  r`  rc  rl  ro  rq  rs  rx  ry  r~  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r   r   r   r  r  r  r$  r&  r+  __classcell__)rQ   s   @r   r>   r>   Y   sN       K2 2 2 2 2(> > > > ># # # # #.         $    ># # # #:Y Y Y( Xd^    *     , 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" " "C "C " " " "H, ,c , ,QT , , , ,.      	 	 	 	 	   "$c $ $ $ $
( ((4. ( ( ( (T        $
 
 

 
 
DdO    >. . .   & 48@D   6& &^a & & & &htn    4 4 4    
          < < < < <    ,        (    <        *  (& &# &# & & & & &P5 5C 5# 5Z] 5 5 5 5n& & &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# # # # # # # # #r   r>   )r!   r"   r#   r$   )r   typingr   r   r   r   r9   	functoolsr   timer	   rd   rA   r
   	atlassianr   cmf.includeloggingFilterr   	getLoggerr{   	addFilterr<   r>   r    r   r   <module>r:     sK   				 1 1 1 1 1 1 1 1 1 1 1 1                                  '.    
		2	3	3   $$&& ' ' '8 8 8 8vW W W W Wd W W W W Wr   