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 requests
import json import json
from datetime import datetime from datetime import datetime
from collections import defaultdict
from sqlalchemy import text from sqlalchemy import text
log = logging.getLogger(__name__) 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() fullname = f"{p.get('first_name','')} {p.get('name','')}".strip()
person_email[fullname.lower()] = p.get("email", "") 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", vms = client.get_all("VirtualMachine",
"name,description,status,managementip,osfamily_id_friendlyname," "name,description,status,managementip,osfamily_id_friendlyname,"
"osversion_id_friendlyname,organization_name,cpu,ram," "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 de_id = row.id
else: else:
try: try:
resp_dom_name = v.get("responsable_domaine_name", "") db.execute(text("INSERT INTO domain_environments (domain_id, environment_id) VALUES (:d, :e)"),
resp_dom_email = person_email.get(resp_dom_name.lower(), "") {"d": did, "e": eid})
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.commit() db.commit()
row = db.execute(text("SELECT id FROM domain_environments WHERE domain_id=:d AND environment_id=:e"), row = db.execute(text("SELECT id FROM domain_environments WHERE domain_id=:d AND environment_id=:e"),
{"d": did, "e": eid}).fetchone() {"d": did, "e": eid}).fetchone()
@ -227,6 +229,13 @@ def sync_from_itop(db, itop_url, itop_user, itop_pass):
except Exception: except Exception:
db.rollback() 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()) zone_id = zone_map.get(v.get("zone_name", "").lower())
tier_raw = v.get("tier_name", "") tier_raw = v.get("tier_name", "")
tier = tier_raw.lower().replace(" ", "") if tier_raw else "a_definir" 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() db.rollback()
stats["errors"].append(f"VM {hostname}: {str(e)[:80]}") 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", phys = client.get_all("Server",
"name,description,status,managementip,osfamily_id_friendlyname," "name,description,status,managementip,osfamily_id_friendlyname,"
"osversion_id_friendlyname,contacts_list,location_name") "osversion_id_friendlyname,contacts_list,location_name")