diff --git a/app/routers/audit.py b/app/routers/audit.py index ab5e690..fd017ad 100644 --- a/app/routers/audit.py +++ b/app/routers/audit.py @@ -136,16 +136,20 @@ async def audit_global(request: Request, db=Depends(get_db)): # Construire la requete where = ["s.os_family = 'linux'", "s.etat = 'Production'"] params = {} + # Matche sur domaine plain-text (via d.name) ou via d.code legacy + # et accepte les serveurs sans domaine attribue (ne pas penaliser le NULL) if exclude_domains: - where.append("d.code NOT IN :ed") + where.append( + "(COALESCE(s.domaine, d.name, d.code, '') NOT IN :ed " + "OR COALESCE(s.domaine, d.name, d.code, '') = '')" + ) params["ed"] = tuple(exclude_domains) if exclude_zones: - where.append("z.name NOT IN :ez") + where.append("(z.name NOT IN :ez OR z.name IS NULL)") params["ez"] = tuple(exclude_zones) wc = " AND ".join(where) - # Utiliser du SQL direct avec parametres corrects query = f""" SELECT s.hostname FROM servers s LEFT JOIN domain_environments de ON s.domain_env_id = de.id @@ -153,16 +157,16 @@ async def audit_global(request: Request, db=Depends(get_db)): LEFT JOIN zones z ON s.zone_id = z.id WHERE {wc} ORDER BY s.hostname """ - # Gerer les tuples pour IN + # Expand IN tuples if exclude_domains: placeholders = ",".join([f":ed{i}" for i in range(len(exclude_domains))]) - query = query.replace("d.code NOT IN :ed", f"d.code NOT IN ({placeholders})") + query = query.replace("NOT IN :ed", f"NOT IN ({placeholders})") for i, v in enumerate(exclude_domains): params[f"ed{i}"] = v del params["ed"] if exclude_zones: placeholders = ",".join([f":ez{i}" for i in range(len(exclude_zones))]) - query = query.replace("z.name NOT IN :ez", f"z.name NOT IN ({placeholders})") + query = query.replace("NOT IN :ez", f"NOT IN ({placeholders})") for i, v in enumerate(exclude_zones): params[f"ez{i}"] = v del params["ez"]