From 5325b43c952b24aad92dfd1996145a2a354266ca 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, 15 Jul 2026 22:49:26 +0700 Subject: [PATCH] fix: add service_category from template to SD API request --- service_desk/handlers.py | 37 +++++++++++++++++++++++++++---------- 1 file changed, 27 insertions(+), 10 deletions(-) diff --git a/service_desk/handlers.py b/service_desk/handlers.py index 4d4e715..627b821 100644 --- a/service_desk/handlers.py +++ b/service_desk/handlers.py @@ -92,6 +92,10 @@ async def get_sd_templates(): t_resp = await client.get(url + "/" + str(t["id"]), headers=headers, timeout=15.0) if t_resp.status_code == 200: detailed = t_resp.json().get("request_template", {}) + if detailed.get("show_to_requester") is True: + sc = detailed.get("service_category", {}) + t["service_category"] = sc + t["request"] = detailed.get("request", {}) return t if detailed.get("show_to_requester") is True else None except Exception as e: sd_workflow_logger.warning(f"Ошибка деталей шаблона ID {t['id']}: {e}") @@ -169,23 +173,36 @@ async def generate_smart_subject(text: str) -> str: sd_workflow_logger.error(f"📝 [Subject Gen Error] Exception: {e}\n{traceback.format_exc()}") return "Заявка из КЛЕВЕР" -async def create_ticket_in_sd(requester_email: str, subject: str, description: str, city: str, template_id: str = None): +async def create_ticket_in_sd(requester_email: str, subject: str, description: str, city: str, template_id: str | None = None, templates: list | None = None): headers = {"authtoken": SD_TOKEN, "Accept": "application/vnd.manageengine.sdp.v3+json", "Content-Type": "application/json"} endpoint = f"{SD_URL}/api/v3/requests" html_desc = f"

{description.replace(chr(10), '
')}



Создано через TrueConf КЛЕВЕР

" - async def _send_req(email, current_city): - req_payload = {"request": {"subject": subject, "description": html_desc, "requester": {"email_id": email}, "udf_fields": {"udf_pick_301": current_city}}} + async def _send_req(email, current_city, template_id, templates): + req_payload = {"request": {"subject": subject, "description": html_desc, "requester": {"name": email}}} if template_id: req_payload["request"]["template"] = {"id": template_id} - async with httpx.AsyncClient(verify=False) as client: + # Найти service_category по шаблону + for t in templates: + if str(t.get("id")) == str(template_id): + sc = t.get("service_category", {}) + if sc: + req_payload["request"]["service_category"] = sc + break + if "udf_pick_301" in req_payload["request"]: + req_payload["request"]["udf_fields"] = {"udf_pick_301": current_city} + elif "udf_fields" in req_payload["request"] and current_city: + req_payload["request"]["udf_fields"]["udf_pick_301"] = current_city + else: + req_payload["request"]["udf_fields"] = {"udf_pick_301": current_city} + async with httpx.AsyncClient(verify=False) as client: resp = await client.post(endpoint, headers=headers, params={"input_data": json.dumps(req_payload)}, timeout=15.0) if resp.status_code not in [200, 201]: sd_workflow_logger.error(f"API Error: status={resp.status_code} body={resp.text}") - return resp - resp = await _send_req(requester_email, city) - data = resp.json() if resp.status_code in [200, 201] else {} - if data.get("response_status", {}).get("status_code") != 2000: - resp = await _send_req(requester_email, "Кемерово") + return resp + resp = await _send_req(requester_email, city, template_id, templates) + data = resp.json() if resp.status_code in [200, 201] else {} + if data.get("response_status", {}).get("status_code") != 2000: + resp = await _send_req(requester_email, "Кемерово", template_id, templates) data = resp.json() if resp.status_code in [200, 201] else {} if data.get("response_status", {}).get("status_code") == 2000: return data.get("request", {}).get("id") @@ -276,7 +293,7 @@ async def _create_ticket_and_attach_files(user_id, msg_text, session, msg, login subject = await generate_smart_subject(msg_text) sd_workflow_logger.info(f"📝 [Subject Gen] Text: {msg_text[:50]}... -> Subject: {subject}") - ticket_id = await create_ticket_in_sd(sender_email, subject, msg_text, city, template_id) + ticket_id = await create_ticket_in_sd(sender_email, subject, msg_text, city, template_id, session.get("templates", [])) sd_workflow_logger.info(f"🎫 [Ticket Created] ID: {ticket_id}") if ticket_id: