feat: read SD config from config.py, add category/assignee, support date arg
This commit is contained in:
@@ -112,6 +112,10 @@ ENABLE_FUZZY_CORRECTION = True # Нечёткое исправление по
|
|||||||
# 3. ИНТЕГРАЦИЯ С MANAGEENGINE SERVICE DESK API
|
# 3. ИНТЕГРАЦИЯ С MANAGEENGINE SERVICE DESK API
|
||||||
# =====================================================================
|
# =====================================================================
|
||||||
# Корпоративный URL и API-эндпоинт для работы с заявками по протоколу v3
|
# Корпоративный URL и API-эндпоинт для работы с заявками по протоколу v3
|
||||||
|
# Локальный Service Desk (для выгрузки данных)
|
||||||
|
LOCAL_SD_URL = "https://192.168.1.237:8080"
|
||||||
|
LOCAL_SD_API_KEY = "062CE056-C1F5-490C-A6DF-FD2C653A71DD"
|
||||||
|
|
||||||
SERVER_URL = "https://servicedesk.sibcem.ru:8080"
|
SERVER_URL = "https://servicedesk.sibcem.ru:8080"
|
||||||
ENDPOINT = f"{SERVER_URL}/api/v3/requests"
|
ENDPOINT = f"{SERVER_URL}/api/v3/requests"
|
||||||
|
|
||||||
|
|||||||
+25
-13
@@ -8,11 +8,18 @@ import urllib3
|
|||||||
from datetime import datetime, timezone
|
from datetime import datetime, timezone
|
||||||
from html import unescape
|
from html import unescape
|
||||||
import re
|
import re
|
||||||
|
import sys
|
||||||
|
import os
|
||||||
|
|
||||||
BASE_URL = "https://192.168.1.237:8080"
|
# Добавляем путь к конфигу
|
||||||
API_TOKEN = "062CE056-C1F5-490C-A6DF-FD2C653A71DD"
|
sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))
|
||||||
|
|
||||||
FROM_DATE_MS = int(datetime(2026, 7, 20, 0, 0, 0, tzinfo=timezone.utc).timestamp() * 1000)
|
# Локальный Service Desk (для выгрузки данных)
|
||||||
|
LOCAL_SD_URL = "https://192.168.1.237:8080"
|
||||||
|
LOCAL_SD_API_KEY = "062CE056-C1F5-490C-A6DF-FD2C653A71DD"
|
||||||
|
|
||||||
|
# По умолчанию с 20 июля, но можно передать как аргумент
|
||||||
|
DEFAULT_FROM_DATE = "2026-07-20"
|
||||||
|
|
||||||
def get_ts(req):
|
def get_ts(req):
|
||||||
ct = req.get("created_time", {})
|
ct = req.get("created_time", {})
|
||||||
@@ -39,8 +46,8 @@ def get_name(obj):
|
|||||||
async def fetch_ticket_detail(client, req_id):
|
async def fetch_ticket_detail(client, req_id):
|
||||||
try:
|
try:
|
||||||
resp = await client.get(
|
resp = await client.get(
|
||||||
f"{BASE_URL}/api/v3/requests/{req_id}",
|
f"{LOCAL_SD_URL}/api/v3/requests/{req_id}",
|
||||||
headers={"authtoken": API_TOKEN, "Accept": "application/vnd.manageengine.sdp.v3+json"},
|
headers={"authtoken": LOCAL_SD_API_KEY, "Accept": "application/vnd.manageengine.sdp.v3+json"},
|
||||||
timeout=15.0
|
timeout=15.0
|
||||||
)
|
)
|
||||||
data = resp.json()
|
data = resp.json()
|
||||||
@@ -48,24 +55,28 @@ async def fetch_ticket_detail(client, req_id):
|
|||||||
except Exception as e:
|
except Exception as e:
|
||||||
return {}
|
return {}
|
||||||
|
|
||||||
async def list_tickets():
|
async def list_tickets(from_date=DEFAULT_FROM_DATE):
|
||||||
url = f"{BASE_URL}/api/v3/requests"
|
url = f"{LOCAL_SD_URL}/api/v3/requests"
|
||||||
headers = {"authtoken": API_TOKEN, "Accept": "application/vnd.manageengine.sdp.v3+json"}
|
headers = {"authtoken": LOCAL_SD_API_KEY, "Accept": "application/vnd.manageengine.sdp.v3+json"}
|
||||||
|
|
||||||
|
# Вычисляем timestamp с указанной даты
|
||||||
|
date_obj = datetime.strptime(from_date, "%Y-%m-%d")
|
||||||
|
from_date_ms = int(date_obj.replace(tzinfo=timezone.utc).timestamp() * 1000)
|
||||||
|
|
||||||
async with httpx.AsyncClient(verify=False, timeout=30.0) as client:
|
async with httpx.AsyncClient(verify=False, timeout=30.0) as client:
|
||||||
resp = await client.get(url, headers=headers)
|
resp = await client.get(url, headers=headers)
|
||||||
data = resp.json()
|
data = resp.json()
|
||||||
all_reqs = data.get("requests", [])
|
all_reqs = data.get("requests", [])
|
||||||
|
|
||||||
from_20 = [r for r in all_reqs if get_ts(r) >= FROM_DATE_MS]
|
from_date_reqs = [r for r in all_reqs if get_ts(r) >= from_date_ms]
|
||||||
|
|
||||||
# Получаем детали для каждой заявки
|
# Получаем детали для каждой заявки
|
||||||
tasks = [fetch_ticket_detail(client, r.get("request_id", r.get("id", "?"))) for r in from_20]
|
tasks = [fetch_ticket_detail(client, r.get("request_id", r.get("id", "?"))) for r in from_date_reqs]
|
||||||
details = await asyncio.gather(*tasks)
|
details = await asyncio.gather(*tasks)
|
||||||
|
|
||||||
rows = []
|
rows = []
|
||||||
for req, detail in zip(from_20, details):
|
for req, detail in zip(from_date_reqs, details):
|
||||||
# Группа — из списка (есть там)
|
# Группа — из списка
|
||||||
group = req.get("group", {})
|
group = req.get("group", {})
|
||||||
group_name = get_name(group)
|
group_name = get_name(group)
|
||||||
|
|
||||||
@@ -94,4 +105,5 @@ async def list_tickets():
|
|||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
urllib3.disable_warnings()
|
urllib3.disable_warnings()
|
||||||
asyncio.run(list_tickets())
|
from_date = sys.argv[1] if len(sys.argv) > 1 else DEFAULT_FROM_DATE
|
||||||
|
asyncio.run(list_tickets(from_date))
|
||||||
|
|||||||
Reference in New Issue
Block a user