From dd14853362cecad2fcbd4aa878c45112a8efb888 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=94=D0=B5=D0=BD=D0=B8=D1=81=20=D0=9A=D1=80=D0=B8=D0=B2?= =?UTF-8?q?=D0=BE=D1=87=D0=B5=D0=BD=D0=BA=D0=BE?= Date: Wed, 29 Jul 2026 01:28:45 +0700 Subject: [PATCH] fix: remove subject filter from API URL (Russian chars), fetch all tickets and filter in code --- instruct/handlers.py | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/instruct/handlers.py b/instruct/handlers.py index ec5c3b4..652d88e 100644 --- a/instruct/handlers.py +++ b/instruct/handlers.py @@ -217,26 +217,31 @@ async def _find_existing_trueconf_ticket(cn: str, requester_email: str = None) - """ subject = "Запрос доступа к Trueconf" try: - # Забираем все заявки с темой (без фильтра по статусу — проверяем в коде) - url = f"{SD_URL.rstrip('/')}/api/v3/requests?filter=subject:{subject}&fields=id,subject,requester,status" + # Забираем все заявки без фильтра — API v3 некорректно работает с русскими буквами в filter + url = f"{SD_URL.rstrip('/')}/api/v3/requests?fields=id,subject,requester,status" headers = {"TECHNICIAN_KEY": SD_TOKEN} async with httpx.AsyncClient(verify=False) as client: resp = await client.get(url, headers=headers, timeout=10.0) if resp.status_code == 200: data = resp.json() requests_list = data.get("requests", []) - logger.info(f"Found {len(requests_list)} tickets with subject='{subject}', searching for CN={cn}") + logger.info(f"Found {len(requests_list)} total tickets, searching for CN={cn}") for req in requests_list: + # Фильтруем по subject в коде + if subject not in req.get("subject", ""): + continue + req_status = req.get("status", {}) status_name = req_status.get("name", "") if isinstance(req_status, dict) else str(req_status) req_id = req.get("id") - req_name = req_status.get("requester", {}).get("name", "") if isinstance(req_status.get("requester"), dict) else "" - logger.info(f"Ticket {req_id}: status={status_name}") # Пропускаем закрытые заявки if status_name in ("Resolved", "Rejected", "Closed", "Solved"): + logger.info(f"Skipping ticket {req_id}: status={status_name}") continue + logger.info(f"Checking ticket {req_id}: status={status_name}") + # Получаем детали заявки для поиска по описанию detail_url = f"{SD_URL.rstrip('/')}/api/v3/requests/{req_id}" detail_resp = await client.get(detail_url, headers=headers, timeout=10.0)