feat: check for existing Trueconf ticket before creating new one

This commit is contained in:
Денис Кривоченко
2026-07-27 23:13:34 +07:00
parent 1ac0035b4d
commit 354c6b0a51
+32
View File
@@ -176,9 +176,35 @@ async def _send_sd_api_request(requester_email: str, subject: str, description:
return None return None
async def _find_existing_trueconf_ticket(requester_email: str) -> str | None:
"""
Найти существующую открытую заявку с темой 'Запрос доступа к Trueconf' для пользователя.
"""
subject = "Запрос доступа к Trueconf"
try:
url = f"{SD_URL.rstrip('/')}/api/v3/requests?filter=status:Open&fields=id,subject,requester"
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", [])
for req in requests_list:
requester = req.get("requester", {})
req_email = requester.get("email", "") or requester.get("email_id", "")
if req_email == requester_email and subject in req.get("subject", ""):
ticket_id = req.get("id")
logger.info(f"Found existing Trueconf ticket #{ticket_id} for {requester_email}")
return str(ticket_id)
except Exception as e:
logger.warning(f"Failed to search existing tickets: {e}")
return None
async def create_sd_ticket_for_trueconf(user_id: str, cn: str) -> str | None: async def create_sd_ticket_for_trueconf(user_id: str, cn: str) -> str | None:
""" """
Создать заявку в Service Desk для запроса доступа к Trueconf. Создать заявку в Service Desk для запроса доступа к Trueconf.
Если уже есть открытая заявка — возвращает её ID.
""" """
subject = "Запрос доступа к Trueconf" subject = "Запрос доступа к Trueconf"
@@ -187,6 +213,12 @@ async def create_sd_ticket_for_trueconf(user_id: str, cn: str) -> str | None:
requester_email = ad_info.get("mail") or DEFAULT_REQUESTER requester_email = ad_info.get("mail") or DEFAULT_REQUESTER
city = ad_info.get("city", "Кемерово") if ad_info else "Кемерово" city = ad_info.get("city", "Кемерово") if ad_info else "Кемерово"
# Сначала ищем существующую открытую заявку
existing_ticket = await _find_existing_trueconf_ticket(requester_email)
if existing_ticket:
logger.info(f"Returning existing ticket #{existing_ticket} for {cn}")
return existing_ticket
description = ( description = (
f"Пользователь {cn} ({user_id}) запросил инструкцию по Trueconf, " f"Пользователь {cn} ({user_id}) запросил инструкцию по Trueconf, "
f"но не имеет группы 2FA. Требуется выдача доступа." f"но не имеет группы 2FA. Требуется выдача доступа."