From 3707308063529b3ad1af03f9b8ed80e33afdc3ff Mon Sep 17 00:00:00 2001 From: Admin MPCZ Date: Sat, 11 Apr 2026 14:22:29 +0200 Subject: [PATCH] =?UTF-8?q?Sync=20iTop:=20responsables=20domaine=20par=20f?= =?UTF-8?q?r=C3=A9quence=20+=20emails?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 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 --- app/services/itop_service.py | 37 ++++++++++++++++++++++++++++-------- 1 file changed, 29 insertions(+), 8 deletions(-) diff --git a/app/services/itop_service.py b/app/services/itop_service.py index 101b182..7b41d05 100644 --- a/app/services/itop_service.py +++ b/app/services/itop_service.py @@ -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")