Фильтры
Фильтр (filter) — это сохранённый набор условий отбора задач: кто исполнитель, в каком
статусе, какая очередь и так далее. Фильтр можно построить двумя взаимоисключающими
способами — набором условий по полям (filter_) или строкой на языке запросов (query);
использовать оба способа одновременно API не позволяет. yatracker предоставляет методы
для создания, получения и изменения фильтров.
Обратите внимание
Как и все методы YaTracker, методы работы с фильтрами являются асинхронными. В
примерах ниже вызовы показаны так, как будто мы уже находимся внутри корутины.
Официальная документация:
Создание и получение
create_filter
async def create_filter(
self,
name: str,
*,
filter_: dict[str, Any] | None = None,
query: str | None = None,
fields: str | Iterable[str] | None = None,
sorts: Iterable[FilterSort | dict[str, Any]] | None = None,
group_by: str | dict[str, Any] | None = None,
folder: str | dict[str, Any] | None = None,
**kwargs,
) -> Filter: ...
Создаёт новый сохранённый фильтр задач.
filter_ = await tracker.create_filter(
name="Мои открытые задачи",
filter_={"status": "open", "assignee": "me()"},
sorts=[{"field": "created", "isAscending": False}],
fields=["key", "summary", "status"],
)
name— название фильтра (обязательное поле).filter_— условия фильтрации по полям задачи, ключи — имена полей, значения — условие: обычное значение ("assignee": "me()"), список ("status": ["open", "inProgress"]) или диапазон дат ("created": "2024-01-01..2024-12-31"). Полный список полей — на страницеhttps://tracker.yandex.ru/admin/fields. Отправляется какfilter.query— условия фильтрации на языке запросов. Используйте либоquery, либоfilter_, не оба одновременно — иначе поведение API не гарантировано.fields— список полей задачи, которые будут показаны в интерфейсе Трекера при применении фильтра. На результат/issues/_searchне влияет. Кроме коллекции имён принимается и строка через запятую ("key,summary,status") — она разбивается на массив, которого ждёт API.sorts— правила сортировки результата, см. раздел «Сортировки» ниже. Одиночное правило вместо коллекции (словарь илиFilterSort) бросаетTypeError.group_by— поле, по которому результат группируется в интерфейсе; строка (ключ поля) или готовый объект.folder— папка, в которую сохраняется фильтр; строка или готовый объект.kwargs— любое другое поле фильтра.
Источник: https://yandex.ru/support/tracker/ru/api/filters/create-filter
get_filter
Возвращает фильтр по его идентификатору.
filter_id— идентификатор фильтра.
Источник: https://yandex.ru/support/tracker/ru/api/filters/get-filter
Изменение
update_filter
async def update_filter(
self,
filter_id: str | int,
*,
name: str | None = None,
filter_: dict[str, Any] | None = None,
query: str | None = None,
fields: str | Iterable[str] | None = None,
sorts: Iterable[FilterSort | dict[str, Any]] | None = None,
group_by: str | dict[str, Any] | None = None,
folder: str | dict[str, Any] | None = None,
**kwargs,
) -> Filter: ...
Изменяет существующий фильтр. Поля, оставленные None, не отправляются и остаются
без изменений.
filter_ = await tracker.update_filter(
filter_.id,
name="Мои открытые задачи (обновлено)",
filter_={"status": ["open", "inProgress"], "assignee": "me()"},
)
filter_id— идентификатор изменяемого фильтра.name— новое название фильтра.filter_,query,fields,sorts,group_by,folder— новые значения полей, формат такой же, как вcreate_filter.kwargs— любое другое поле фильтра.
filter_ заменяется целиком
При изменении фильтра параметр filter_ заменяется полностью, а не
объединяется с уже сохранёнными условиями. Чтобы сохранить старые условия и
добавить новые, передайте в запросе все условия сразу — и старые, и новые:
Источник: https://yandex.ru/support/tracker/ru/api/filters/update-filter
Сортировки
sorts в запросе — список объектов {"field": "<ключ поля>", "isAscending": <bool>}.
Метод принимает такую сортировку в одном из двух видов:
- словарь в этом же формате, отправляется как есть;
- объект
FilterSort— модель, которую Трекер возвращает вFilter.sorts. Так можно взять сортировку у одного фильтра и передать её другому без ручной сборки словаря:
new_filter = await tracker.create_filter(
name="Копия сортировки",
query="Queue: TEST",
sorts=filter_.sorts,
)
FilterSort.field — объект FieldRef (url, id, display), а в запросе достаточно
field.id; поле is_ascending, если оно None, не отправляется вовсе (Трекер выбирает
направление сортировки сам). Подстановку делает сама модель, поэтому FilterSort можно
передавать обратно как есть везде, где он попадает в тело запроса, а не только в sorts.
Модели
Filter
| Поле | Тип | Описание |
|---|---|---|
url |
str |
Ссылка на фильтр. |
id |
str |
Идентификатор фильтра. |
name |
str |
Название фильтра. |
filter_ |
dict[str, Any] \| None |
Условия фильтрации по полям (JSON-ключ filter). |
query |
str \| None |
Условия фильтрации на языке запросов. |
fields |
list[FieldRef] \| None |
Поля задачи, показываемые в интерфейсе. |
group_by |
FieldRef \| None |
Поле группировки результата. |
sorts |
list[FilterSort] \| None |
Правила сортировки. Возвращаются только если сортировка настроена. |
favorite |
bool \| None |
Добавлен ли фильтр в избранное. |
permissions |
FilterPermissions \| None |
Права доступа к фильтру. |
owner |
User \| None |
Владелец фильтра. |
FilterSort
| Поле | Тип | Описание |
|---|---|---|
field |
FieldRef |
Поле задачи, по которому сортируется результат. |
is_ascending |
bool \| None |
Направление сортировки: True — по возрастанию, False — по убыванию. |
FilterPermissions
Права доступа к фильтру, ключи ответа — READ и WRITE в верхнем регистре (учтено
через alias на уровне полей).
| Поле | Тип | Описание |
|---|---|---|
read |
FilterPermission \| None |
Кто может читать фильтр (JSON-ключ READ). |
write |
FilterPermission \| None |
Кто может изменять фильтр (JSON-ключ WRITE). |
FilterPermission
| Поле | Тип | Описание |
|---|---|---|
users |
list[User] |
Пользователи, имеющие право. |
groups |
list[Ref] |
Группы, имеющие право. |
roles |
list[dict[str, Any]] |
Роли, имеющие право. В примерах ответа всегда пустой массив, поэтому формат объектов не документирован и хранится как есть. |
Типичный сценарий
Создать фильтр по условиям, прочитать его, а затем расширить условия и добавить сортировку, не потеряв уже сохранённые условия:
filter_ = await tracker.create_filter(
name="Мои открытые задачи",
filter_={"status": "open", "assignee": "me()"},
)
filter_ = await tracker.get_filter(filter_.id)
filter_ = await tracker.update_filter(
filter_.id,
filter_={**filter_.filter_, "priority": "critical"},
sorts=[{"field": "created", "isAscending": False}],
)