Sync iTop: responsables domaine par fréquence + emails

- domain_environments.responsable_nom/email = responsable_domaine iTop le plus fréquent par couple domaine×env
- servers.responsable_nom/email = responsable_serveur iTop (par VM)
- servers.referent_nom/email = responsable_domaine iTop (par VM)
- Mapping Excel: Resp Domaine DTS → domain_environments.responsable, Valideur RA = par serveur
This commit is contained in:
Pierre & Lumière 2026-04-11 14:22:29 +02:00
parent 73cec814b6
commit 3707308063

View File

@ -3,6 +3,7 @@ import logging
import requests
import json
from datetime import datetime
from collections import defaultdict
from sqlalchemy import text
log = logging.getLogger(__name__)
@ -183,7 +184,12 @@ def sync_from_itop(db, itop_url, itop_user, itop_pass):
fullname = f"{p.get('first_name','')} {p.get('name','')}".strip()
person_email[fullname.lower()] = p.get("email", "")
# ─── 7. VirtualMachines ───
# ─── 7. Pre-collect responsables per domaine×env (most frequent wins) ───
# Will be populated during VM processing, then used to update domain_environments
de_responsables = defaultdict(lambda: {"resp_dom": defaultdict(int), "resp_dom_email": {},
"referent": defaultdict(int), "referent_email": {}})
# ─── 8. VirtualMachines ───
vms = client.get_all("VirtualMachine",
"name,description,status,managementip,osfamily_id_friendlyname,"
"osversion_id_friendlyname,organization_name,cpu,ram,"
@ -214,12 +220,8 @@ def sync_from_itop(db, itop_url, itop_user, itop_pass):
de_id = row.id
else:
try:
resp_dom_name = v.get("responsable_domaine_name", "")
resp_dom_email = person_email.get(resp_dom_name.lower(), "")
db.execute(text("INSERT INTO domain_environments (domain_id, environment_id, responsable_nom, responsable_email, referent_nom, referent_email) VALUES (:d, :e, :rn, :re, :fn, :fe)"),
{"d": did, "e": eid, "rn": resp_dom_name, "re": resp_dom_email,
"fn": v.get("responsable_serveur_name", ""),
"fe": person_email.get(v.get("responsable_serveur_name", "").lower(), "")})
db.execute(text("INSERT INTO domain_environments (domain_id, environment_id) VALUES (:d, :e)"),
{"d": did, "e": eid})
db.commit()
row = db.execute(text("SELECT id FROM domain_environments WHERE domain_id=:d AND environment_id=:e"),
{"d": did, "e": eid}).fetchone()
@ -227,6 +229,13 @@ def sync_from_itop(db, itop_url, itop_user, itop_pass):
except Exception:
db.rollback()
# Collect responsables for this domain×env
if de_id:
resp_dom = v.get("responsable_domaine_name", "")
if resp_dom:
de_responsables[de_id]["resp_dom"][resp_dom] += 1
de_responsables[de_id]["resp_dom_email"][resp_dom] = person_email.get(resp_dom.lower(), "")
zone_id = zone_map.get(v.get("zone_name", "").lower())
tier_raw = v.get("tier_name", "")
tier = tier_raw.lower().replace(" ", "") if tier_raw else "a_definir"
@ -295,7 +304,19 @@ def sync_from_itop(db, itop_url, itop_user, itop_pass):
db.rollback()
stats["errors"].append(f"VM {hostname}: {str(e)[:80]}")
# ─── 8. Physical Servers ───
# ─── 8b. Update domain_environments with most frequent responsables ───
for de_id, resps in de_responsables.items():
updates = {}
if resps["resp_dom"]:
top_resp = max(resps["resp_dom"], key=resps["resp_dom"].get)
updates["responsable_nom"] = top_resp
updates["responsable_email"] = resps["resp_dom_email"].get(top_resp, "")
db.execute(text("""UPDATE domain_environments SET
responsable_nom=:responsable_nom, responsable_email=:responsable_email
WHERE id=:id"""),
{"id": de_id, **updates}) if updates else None
# ─── 9. Physical Servers ───
phys = client.get_all("Server",
"name,description,status,managementip,osfamily_id_friendlyname,"
"osversion_id_friendlyname,contacts_list,location_name")