Add SD group/technician config and auto-assign tickets to Техподдержка ХК / Кривоченко
This commit is contained in:
@@ -96,6 +96,12 @@ ALLOWED_USERS = [ # Список TrueConf ID разрешенны
|
|||||||
|
|
||||||
]
|
]
|
||||||
|
|
||||||
|
# =========================================================
|
||||||
|
# 3.5. НАСТРОЙКИ SERVICE DESK: ГРУППА И ИСПОЛНИТЕЛЬ
|
||||||
|
# =========================================================
|
||||||
|
SD_GROUP_NAME = "Техподдержка ХК" # Название группы в ServiceDesk
|
||||||
|
SD_TECHNICIAN_NAME = "Кривоченко Денис Сергеевич" # ФИО техника в ServiceDesk
|
||||||
|
|
||||||
# =========================================================
|
# =========================================================
|
||||||
# 3. НАСТРОЙКИ СВЯЗИ С КОРПОРАТИВНЫМИ СИСТЕМАМИ
|
# 3. НАСТРОЙКИ СВЯЗИ С КОРПОРАТИВНЫМИ СИСТЕМАМИ
|
||||||
# =========================================================
|
# =========================================================
|
||||||
|
|||||||
+43
-1
@@ -21,7 +21,7 @@ from utils.stats_logger import log_menu_stats
|
|||||||
|
|
||||||
# Безопасный импорт конфигурации
|
# Безопасный импорт конфигурации
|
||||||
try:
|
try:
|
||||||
from config.config import DEFAULT_REQUESTER, SD_URL, SD_TOKEN
|
from config.config import DEFAULT_REQUESTER, SD_URL, SD_TOKEN, SD_GROUP_NAME, SD_TECHNICIAN_NAME
|
||||||
except ImportError:
|
except ImportError:
|
||||||
import importlib.util
|
import importlib.util
|
||||||
config_path = os.path.join(os.path.dirname(os.path.dirname(os.path.abspath(__file__))), "config", "config.py")
|
config_path = os.path.join(os.path.dirname(os.path.dirname(os.path.abspath(__file__))), "config", "config.py")
|
||||||
@@ -31,6 +31,8 @@ except ImportError:
|
|||||||
DEFAULT_REQUESTER = custom_config.DEFAULT_REQUESTER
|
DEFAULT_REQUESTER = custom_config.DEFAULT_REQUESTER
|
||||||
SD_URL = custom_config.SD_URL
|
SD_URL = custom_config.SD_URL
|
||||||
SD_TOKEN = custom_config.SD_TOKEN
|
SD_TOKEN = custom_config.SD_TOKEN
|
||||||
|
SD_GROUP_NAME = custom_config.SD_GROUP_NAME
|
||||||
|
SD_TECHNICIAN_NAME = custom_config.SD_TECHNICIAN_NAME
|
||||||
|
|
||||||
logger = logging.getLogger(__name__)
|
logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
@@ -100,6 +102,7 @@ def get_ad_user_info(user_id: str) -> dict | None:
|
|||||||
async def _send_sd_api_request(requester_email: str, subject: str, description: str, city: str) -> str | None:
|
async def _send_sd_api_request(requester_email: str, subject: str, description: str, city: str) -> str | None:
|
||||||
"""
|
"""
|
||||||
Автономная прямая отправка HTTP-запроса в Service Desk API v3.
|
Автономная прямая отправка HTTP-запроса в Service Desk API v3.
|
||||||
|
Автоматически ищет ID группы и техника по именам из config.
|
||||||
"""
|
"""
|
||||||
# Если запрашивает системный ИИ или не указан email — ищем по ИМЕНИ
|
# Если запрашивает системный ИИ или не указан email — ищем по ИМЕНИ
|
||||||
if requester_email == DEFAULT_REQUESTER or requester_email == "ai@sibcem.ru":
|
if requester_email == DEFAULT_REQUESTER or requester_email == "ai@sibcem.ru":
|
||||||
@@ -107,6 +110,40 @@ async def _send_sd_api_request(requester_email: str, subject: str, description:
|
|||||||
else:
|
else:
|
||||||
requester_payload = {"email_id": requester_email}
|
requester_payload = {"email_id": requester_email}
|
||||||
|
|
||||||
|
# Ищем ID группы
|
||||||
|
group_id = None
|
||||||
|
try:
|
||||||
|
url_groups = f"{SD_URL.rstrip('/')}/api/v3/groups"
|
||||||
|
headers = {"TECHNICIAN_KEY": SD_TOKEN}
|
||||||
|
async with httpx.AsyncClient(verify=False) as client:
|
||||||
|
resp = await client.get(url_groups, headers=headers, timeout=10.0)
|
||||||
|
if resp.status_code == 200:
|
||||||
|
groups = resp.json().get("groups", [])
|
||||||
|
for g in groups:
|
||||||
|
if g.get("name") == SD_GROUP_NAME:
|
||||||
|
group_id = g.get("id")
|
||||||
|
logger.info(f"SD group found: name={SD_GROUP_NAME}, id={group_id}")
|
||||||
|
break
|
||||||
|
except Exception as e:
|
||||||
|
logger.warning(f"Failed to fetch SD groups: {e}")
|
||||||
|
|
||||||
|
# Ищем ID техника
|
||||||
|
tech_id = None
|
||||||
|
try:
|
||||||
|
url_techs = f"{SD_URL.rstrip('/')}/api/v3/technicians"
|
||||||
|
headers = {"TECHNICIAN_KEY": SD_TOKEN}
|
||||||
|
async with httpx.AsyncClient(verify=False) as client:
|
||||||
|
resp = await client.get(url_techs, headers=headers, timeout=10.0)
|
||||||
|
if resp.status_code == 200:
|
||||||
|
techs = resp.json().get("technicians", [])
|
||||||
|
for t in techs:
|
||||||
|
if t.get("display_name") == SD_TECHNICIAN_NAME:
|
||||||
|
tech_id = t.get("id")
|
||||||
|
logger.info(f"SD technician found: name={SD_TECHNICIAN_NAME}, id={tech_id}")
|
||||||
|
break
|
||||||
|
except Exception as e:
|
||||||
|
logger.warning(f"Failed to fetch SD technicians: {e}")
|
||||||
|
|
||||||
payload = {
|
payload = {
|
||||||
"request": {
|
"request": {
|
||||||
"subject": subject,
|
"subject": subject,
|
||||||
@@ -117,6 +154,11 @@ async def _send_sd_api_request(requester_email: str, subject: str, description:
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
# Добавляем группу и исполнителя если найдены
|
||||||
|
if group_id:
|
||||||
|
payload["request"]["group"] = {"id": group_id}
|
||||||
|
if tech_id:
|
||||||
|
payload["request"]["assigned_to"] = {"id": tech_id}
|
||||||
|
|
||||||
url = f"{SD_URL.rstrip('/')}/api/v3/requests"
|
url = f"{SD_URL.rstrip('/')}/api/v3/requests"
|
||||||
headers = {"TECHNICIAN_KEY": SD_TOKEN}
|
headers = {"TECHNICIAN_KEY": SD_TOKEN}
|
||||||
|
|||||||
Reference in New Issue
Block a user