From f73ea25d5d54337ff6c1402d31a5ecf9f59e88c3 Mon Sep 17 00:00:00 2001 From: Admin MPCZ Date: Fri, 10 Apr 2026 23:17:58 +0200 Subject: [PATCH] Referentiel: boutons sync iTop (import/export) + messages status --- app/routers/referentiel.py | 52 ++++++++++++++++++++++++++++++++++ app/templates/referentiel.html | 25 ++++++++++++++++ 2 files changed, 77 insertions(+) diff --git a/app/routers/referentiel.py b/app/routers/referentiel.py index 68e99ae..d97fb8a 100644 --- a/app/routers/referentiel.py +++ b/app/routers/referentiel.py @@ -476,3 +476,55 @@ def dns_delete(request: Request, dns_id: int, db=Depends(get_db)): db.execute(text("DELETE FROM domain_ltd_list WHERE id = :id"), {"id": dns_id}) db.commit() return RedirectResponse(url="/referentiel?tab=dns&msg=deleted", status_code=303) + + +# ========================================================= +# SYNC iTop +# ========================================================= + +@router.post("/referentiel/itop/sync-from") +def itop_sync_from(request: Request, db=Depends(get_db)): + """Importer serveurs et contacts depuis iTop""" + user = get_current_user(request) + if not user: + return RedirectResponse(url="/login") + perms = get_user_perms(db, user) + if not can_edit(perms, "settings"): + return RedirectResponse(url="/referentiel?tab=domains") + + from ..services.secrets_service import get_secret + from ..services.itop_service import sync_from_itop + itop_url = get_secret(db, "itop_url") + itop_user = get_secret(db, "itop_user") + itop_pass = get_secret(db, "itop_pass") + + if not itop_url or not itop_user: + return RedirectResponse(url="/referentiel?tab=domains&msg=itop_noconfig", status_code=303) + + stats = sync_from_itop(db, itop_url, itop_user, itop_pass) + msg = f"itop_from_{stats['servers_created']}_{stats['servers_updated']}_{stats['contacts_created']}_{stats['contacts_updated']}" + return RedirectResponse(url=f"/referentiel?tab=domains&msg={msg}", status_code=303) + + +@router.post("/referentiel/itop/sync-to") +def itop_sync_to(request: Request, db=Depends(get_db)): + """Exporter serveurs PatchCenter vers iTop""" + user = get_current_user(request) + if not user: + return RedirectResponse(url="/login") + perms = get_user_perms(db, user) + if not can_edit(perms, "settings"): + return RedirectResponse(url="/referentiel?tab=domains") + + from ..services.secrets_service import get_secret + from ..services.itop_service import sync_to_itop + itop_url = get_secret(db, "itop_url") + itop_user = get_secret(db, "itop_user") + itop_pass = get_secret(db, "itop_pass") + + if not itop_url or not itop_user: + return RedirectResponse(url="/referentiel?tab=domains&msg=itop_noconfig", status_code=303) + + stats = sync_to_itop(db, itop_url, itop_user, itop_pass) + msg = f"itop_to_{stats['updated']}" + return RedirectResponse(url=f"/referentiel?tab=domains&msg={msg}", status_code=303) diff --git a/app/templates/referentiel.html b/app/templates/referentiel.html index 3e694a4..74dc22b 100644 --- a/app/templates/referentiel.html +++ b/app/templates/referentiel.html @@ -48,6 +48,31 @@ {% if tab == 'domains' %} + +{% if can_modify %} +
+ Synchronisation iTop : +
+ +
+
+ +
+ {% if 'itop_from' in request.query_params.get('msg','') %} + Import iTop OK + {% elif 'itop_to' in request.query_params.get('msg','') %} + Export iTop OK + {% elif request.query_params.get('msg') == 'itop_noconfig' %} + Configurer iTop dans Settings + {% endif %} +
+{% endif %}