diff --git a/app/services/itop_service.py b/app/services/itop_service.py index 9b3627d..5bef845 100644 --- a/app/services/itop_service.py +++ b/app/services/itop_service.py @@ -48,6 +48,12 @@ def sync_from_itop(db, itop_url, itop_user, itop_pass): stats = {"contacts": 0, "domains": 0, "environments": 0, "zones": 0, "servers_created": 0, "servers_updated": 0, "errors": []} + # Reset any failed transaction + try: + db.rollback() + except Exception: + pass + # ─── 1. Contacts (Person) ─── persons = client.get_all("Person", "name,first_name,email,phone,org_name,function") for p in persons: @@ -55,14 +61,15 @@ def sync_from_itop(db, itop_url, itop_user, itop_pass): existing = db.execute(text("SELECT id FROM contacts WHERE LOWER(email) = LOWER(:e)"), {"e": p.get("email", "")}).fetchone() if existing: - db.execute(text("UPDATE contacts SET nom=:n, telephone=:t, updated_at=NOW() WHERE id=:id"), - {"id": existing.id, "n": fullname, "t": p.get("phone", "")}) + db.execute(text("UPDATE contacts SET name=:n, updated_at=NOW() WHERE id=:id"), + {"id": existing.id, "n": fullname}) else: try: - db.execute(text("INSERT INTO contacts (nom, email, telephone) VALUES (:n, :e, :t)"), - {"n": fullname, "e": p.get("email", ""), "t": p.get("phone", "")}) + db.execute(text("INSERT INTO contacts (name, email, role) VALUES (:n, :e, 'referent_technique')"), + {"n": fullname, "e": p.get("email", "")}) stats["contacts"] += 1 except Exception as e: + db.rollback() stats["errors"].append(f"Contact {fullname}: {e}") # ─── 2. Domaines applicatifs (typology via VMs) ─── @@ -70,12 +77,12 @@ def sync_from_itop(db, itop_url, itop_user, itop_pass): "name,description,status,managementip,osfamily_id_friendlyname," "osversion_id_friendlyname,organization_name,cpu,ram," "responsable_serveur_name,responsable_domaine_name," - "environnement,environnement_name," + "environnement_name," "domaine_applicatif_name,zone_name," - "applicationsolution_list,contacts_list," + "contacts_list," "virtualhost_name,business_criticity," "tier_name,connexion_method_name,ssh_user_name," - "patch_frequency_name,pref_patch_jour_name,pref_patch_heure_name," + "patch_frequency_name,pref_patch_jour_name,patch_window," "patch_excludes,domain_ldap_name,last_patch_date") # Also get physical Servers @@ -190,7 +197,7 @@ def sync_from_itop(db, itop_url, itop_user, itop_pass): # Map pref_patch_jour/heure pref_jour = (v.get("pref_patch_jour_name", "") or "").lower() or "indifferent" - pref_heure = v.get("pref_patch_heure_name", "") or "indifferent" + pref_heure = v.get("patch_window", "") or "indifferent" vals = { "hostname": hostname, @@ -248,6 +255,7 @@ def sync_from_itop(db, itop_url, itop_user, itop_pass): """), vals) stats["servers_created"] += 1 except Exception as e: + db.rollback() stats["errors"].append(f"Server {hostname}: {e}") # ─── 8. Insert physical servers ─── @@ -274,6 +282,7 @@ def sync_from_itop(db, itop_url, itop_user, itop_pass): }) stats["servers_created"] += 1 except Exception as e: + db.rollback() stats["errors"].append(f"Physical {hostname}: {e}") db.commit() diff --git a/app/templates/settings.html b/app/templates/settings.html index 313ae91..e3e84f1 100644 --- a/app/templates/settings.html +++ b/app/templates/settings.html @@ -439,7 +439,7 @@