fix: add service_category from template to SD API request
This commit is contained in:
@@ -92,6 +92,10 @@ async def get_sd_templates():
|
|||||||
t_resp = await client.get(url + "/" + str(t["id"]), headers=headers, timeout=15.0)
|
t_resp = await client.get(url + "/" + str(t["id"]), headers=headers, timeout=15.0)
|
||||||
if t_resp.status_code == 200:
|
if t_resp.status_code == 200:
|
||||||
detailed = t_resp.json().get("request_template", {})
|
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
|
return t if detailed.get("show_to_requester") is True else None
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
sd_workflow_logger.warning(f"Ошибка деталей шаблона ID {t['id']}: {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()}")
|
sd_workflow_logger.error(f"📝 [Subject Gen Error] Exception: {e}\n{traceback.format_exc()}")
|
||||||
return "Заявка из КЛЕВЕР"
|
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"}
|
headers = {"authtoken": SD_TOKEN, "Accept": "application/vnd.manageengine.sdp.v3+json", "Content-Type": "application/json"}
|
||||||
endpoint = f"{SD_URL}/api/v3/requests"
|
endpoint = f"{SD_URL}/api/v3/requests"
|
||||||
html_desc = f"<p>{description.replace(chr(10), '<br>')}</p><br><hr><p style='color:#555;font-size:12px;'><i>Создано через TrueConf КЛЕВЕР</i></p>"
|
html_desc = f"<p>{description.replace(chr(10), '<br>')}</p><br><hr><p style='color:#555;font-size:12px;'><i>Создано через TrueConf КЛЕВЕР</i></p>"
|
||||||
async def _send_req(email, current_city):
|
async def _send_req(email, current_city, template_id, templates):
|
||||||
req_payload = {"request": {"subject": subject, "description": html_desc, "requester": {"email_id": email}, "udf_fields": {"udf_pick_301": current_city}}}
|
req_payload = {"request": {"subject": subject, "description": html_desc, "requester": {"name": email}}}
|
||||||
if template_id:
|
if template_id:
|
||||||
req_payload["request"]["template"] = {"id": template_id}
|
req_payload["request"]["template"] = {"id": template_id}
|
||||||
|
# Найти 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:
|
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)
|
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]:
|
if resp.status_code not in [200, 201]:
|
||||||
sd_workflow_logger.error(f"API Error: status={resp.status_code} body={resp.text}")
|
sd_workflow_logger.error(f"API Error: status={resp.status_code} body={resp.text}")
|
||||||
return resp
|
return resp
|
||||||
resp = await _send_req(requester_email, city)
|
resp = await _send_req(requester_email, city, template_id, templates)
|
||||||
data = resp.json() if resp.status_code in [200, 201] else {}
|
data = resp.json() if resp.status_code in [200, 201] else {}
|
||||||
if data.get("response_status", {}).get("status_code") != 2000:
|
if data.get("response_status", {}).get("status_code") != 2000:
|
||||||
resp = await _send_req(requester_email, "Кемерово")
|
resp = await _send_req(requester_email, "Кемерово", template_id, templates)
|
||||||
data = resp.json() if resp.status_code in [200, 201] else {}
|
data = resp.json() if resp.status_code in [200, 201] else {}
|
||||||
if data.get("response_status", {}).get("status_code") == 2000:
|
if data.get("response_status", {}).get("status_code") == 2000:
|
||||||
return data.get("request", {}).get("id")
|
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)
|
subject = await generate_smart_subject(msg_text)
|
||||||
sd_workflow_logger.info(f"📝 [Subject Gen] Text: {msg_text[:50]}... -> Subject: {subject}")
|
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}")
|
sd_workflow_logger.info(f"🎫 [Ticket Created] ID: {ticket_id}")
|
||||||
|
|
||||||
if ticket_id:
|
if ticket_id:
|
||||||
|
|||||||
Reference in New Issue
Block a user