From a0f90cd719af625ff4fe2243c17db746e0f3e343 Mon Sep 17 00:00:00 2001 From: Admin MPCZ Date: Fri, 17 Apr 2026 23:19:18 +0000 Subject: [PATCH] Optim: logging structure + query_helpers.py + fix exceptions silencieuses routers --- app/main.py | 6 ++++++ app/routers/campaigns.py | 2 ++ app/routers/contacts.py | 2 ++ app/routers/dashboard.py | 2 ++ app/routers/servers.py | 6 ++++-- app/routers/settings.py | 2 ++ app/services/query_helpers.py | 32 ++++++++++++++++++++++++++++++++ 7 files changed, 50 insertions(+), 2 deletions(-) create mode 100644 app/services/query_helpers.py diff --git a/app/main.py b/app/main.py index 50e522b..68e4f1c 100644 --- a/app/main.py +++ b/app/main.py @@ -1,3 +1,9 @@ +import logging +logging.basicConfig( + level=logging.INFO, + format="%(asctime)s %(levelname)s [%(name)s] %(message)s", + datefmt="%Y-%m-%d %H:%M:%S" +) """PatchCenter v2 — Entry point FastAPI""" from fastapi import FastAPI, Request from fastapi.responses import RedirectResponse diff --git a/app/routers/campaigns.py b/app/routers/campaigns.py index 4e8f406..4e5c509 100644 --- a/app/routers/campaigns.py +++ b/app/routers/campaigns.py @@ -1,3 +1,5 @@ +import logging +logger = logging.getLogger(__name__) """Router campagnes — creation, prereqs, assignation, workflow""" from datetime import datetime from fastapi import APIRouter, Request, Depends, Query, Form diff --git a/app/routers/contacts.py b/app/routers/contacts.py index 63407cf..c3fd329 100644 --- a/app/routers/contacts.py +++ b/app/routers/contacts.py @@ -1,3 +1,5 @@ +import logging +logger = logging.getLogger(__name__) """Router contacts — gestion des responsables applicatifs et scopes""" from fastapi import APIRouter, Request, Depends, Query, Form from fastapi.responses import HTMLResponse, RedirectResponse diff --git a/app/routers/dashboard.py b/app/routers/dashboard.py index c4b84b4..417babd 100644 --- a/app/routers/dashboard.py +++ b/app/routers/dashboard.py @@ -1,3 +1,5 @@ +import logging +logger = logging.getLogger(__name__) from fastapi import APIRouter, Request, Depends from fastapi.responses import HTMLResponse, RedirectResponse from fastapi.templating import Jinja2Templates diff --git a/app/routers/servers.py b/app/routers/servers.py index 59b3817..5577166 100644 --- a/app/routers/servers.py +++ b/app/routers/servers.py @@ -1,3 +1,5 @@ +import logging +logger = logging.getLogger(__name__) """Router serveurs — CRUD + detail + edit via HTMX""" from fastapi import APIRouter, Request, Depends, Query, Form from fastapi.responses import HTMLResponse, RedirectResponse, StreamingResponse @@ -205,8 +207,8 @@ async def server_update(request: Request, server_id: int, db=Depends(get_db), vm_id = list(r["objects"].values())[0]["key"] new_list = [{"applicationsolution_id": int(app_itop_id)}] if app_itop_id else [] client.update("VirtualMachine", vm_id, {"applicationsolution_list": new_list}) - except Exception: - pass + except Exception as e: + logger.warning(f"Erreur non bloquante: {e}") s = get_server_full(db, server_id) tags = get_server_tags(db, s.qid) diff --git a/app/routers/settings.py b/app/routers/settings.py index c65acf8..29a654e 100644 --- a/app/routers/settings.py +++ b/app/routers/settings.py @@ -1,3 +1,5 @@ +import logging +logger = logging.getLogger(__name__) """Router settings — configuration modules externes + connexions""" from fastapi import APIRouter, Request, Depends, Form from fastapi.responses import HTMLResponse, RedirectResponse diff --git a/app/services/query_helpers.py b/app/services/query_helpers.py new file mode 100644 index 0000000..c0b4712 --- /dev/null +++ b/app/services/query_helpers.py @@ -0,0 +1,32 @@ +"""Helpers SQL reutilisables pour eviter la duplication de JOINs.""" +from sqlalchemy import text + +SERVER_BASE_JOINS = """ + LEFT JOIN domain_environments de ON s.domain_env_id = de.id + LEFT JOIN domains d ON de.domain_id = d.id + LEFT JOIN environments e ON de.environment_id = e.id + LEFT JOIN zones z ON s.zone_id = z.id +""" + +SERVER_BASE_COLS = """ + s.id, s.hostname, s.fqdn, s.os_family, s.os_version, + s.etat, s.tier, s.environnement, s.machine_type, + d.name as domaine, d.code as domain_code, + e.name as env_name, e.code as env_code, + z.name as zone +""" + +def server_list_query(where="1=1", order="s.hostname", limit=None, offset=None): + """Construit une requete SELECT serveurs avec JOINs standard.""" + q = f""" + SELECT {SERVER_BASE_COLS} + FROM servers s + {SERVER_BASE_JOINS} + WHERE {where} + ORDER BY {order} + """ + if limit is not None: + q += f" LIMIT {int(limit)}" + if offset is not None: + q += f" OFFSET {int(offset)}" + return text(q)