feat: check for existing Trueconf ticket before creating new one
This commit is contained in:
@@ -176,9 +176,35 @@ async def _send_sd_api_request(requester_email: str, subject: str, description:
|
||||
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:
|
||||
"""
|
||||
Создать заявку в Service Desk для запроса доступа к Trueconf.
|
||||
Если уже есть открытая заявка — возвращает её ID.
|
||||
"""
|
||||
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
|
||||
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 = (
|
||||
f"Пользователь {cn} ({user_id}) запросил инструкцию по Trueconf, "
|
||||
f"но не имеет группы 2FA. Требуется выдача доступа."
|
||||
|
||||
Reference in New Issue
Block a user