From 720b0789e6577266169aedc73a2904ee917cff30 Mon Sep 17 00:00:00 2001 From: Admin MPCZ Date: Mon, 18 May 2026 16:05:25 +0200 Subject: [PATCH] feat(snapshots): reconnait les formats manuels SANEF + toggle UI 'Tous formats' MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - backend: nouveau regex SNAP_MANUAL_RE qui capture le premier token avant espace/underscore comme auteur. Permet de classer les snaps style 'kmoad-ext avant maj' ou 'kmoad-ext s1' en origin='manual' avec auteur extrait, au lieu de origin=None. - frontend: checkbox 'Tous formats' (cochée par défaut) qui inclut les snaps manual/slpm/patchcenter. Decoche pour PatchCenter only (ancien comportement). - frontend: filtre intervenant elargi - match aussi sur nom du snap (contains) en plus de l'auteur extrait, pour couvrir les snaps dont l'auteur est concatene avec d'autres mots. Resout le cas ou un utilisateur ne voyait qu'1 seul snap PatchCenter alors qu'il avait des dizaines de snaps crees manuellement (format ' avant maj'). --- app/services/snapshot_mgmt_service.py | 14 +++++++++++--- app/templates/snapshots.html | 26 ++++++++++++++++++++------ 2 files changed, 31 insertions(+), 9 deletions(-) diff --git a/app/services/snapshot_mgmt_service.py b/app/services/snapshot_mgmt_service.py index 0dec007..0f8b954 100644 --- a/app/services/snapshot_mgmt_service.py +++ b/app/services/snapshot_mgmt_service.py @@ -29,6 +29,7 @@ except ImportError: # PatchCenter v2 : `_YYYY-MM-DD_HH-MM_avant_patch` (user = login JWT, depuis 2026-05-07) # PatchCenter v1 : `_YYYY-MM-DD_avant_patch` (legacy, basé sur intervenant) # .exe SLPM : `SLPM__YYYYMMDD_HHMM` +# manuel SANEF : `[ _]...` — fallback, premier token = auteur SNAP_PATCHCENTER_V2_RE = re.compile( r"^(?P[A-Za-z0-9_\-\.]+)_(?P\d{4}-\d{2}-\d{2})_\d{2}-\d{2}_avant_patch$" ) @@ -38,12 +39,16 @@ SNAP_PATCHCENTER_V1_RE = re.compile( SNAP_SLPM_RE = re.compile( r"^SLPM_(?P[A-Za-z0-9_\-\.]+)_\d{8}_\d{4}$" ) +SNAP_MANUAL_RE = re.compile( + r"^(?P[A-Za-z0-9][A-Za-z0-9_\-\.]{1,})[\s_]" +) def _detect_snap_origin(name: str): """Renvoie (origin, author) ou (None, None) si format inconnu. - origin in {'patchcenter', 'slpm'} ; author = préfixe utilisateur. - PatchCenter v2 (avec heure) testé en premier pour ne pas matcher v1.""" + origin in {'patchcenter', 'slpm', 'manual'} ; author = préfixe utilisateur. + PatchCenter v2 (avec heure) testé en premier pour ne pas matcher v1. + 'manual' = fallback : premier token (avant espace ou underscore) = auteur.""" n = name or "" m = SNAP_PATCHCENTER_V2_RE.match(n) if m: @@ -54,6 +59,9 @@ def _detect_snap_origin(name: str): m = SNAP_SLPM_RE.match(n) if m: return "slpm", m.group("author") + m = SNAP_MANUAL_RE.match(n) + if m: + return "manual", m.group("author") return None, None @@ -114,7 +122,7 @@ def _walk_snapshots(snapshot_list, vm, vcenter_name, vcenter_id, vm_moid, parent "created_at": created_iso, "age_days": round(age_days, 2) if age_days is not None else None, "author": author, - "origin": origin, # 'patchcenter' | 'slpm' | None + "origin": origin, # 'patchcenter' | 'slpm' | 'manual' | None "is_managed_format": is_managed, # any des 2 formats SecOps "is_patchcenter_format": origin == "patchcenter", "is_current": bool(getattr(s, "id", None) and vm.snapshot and vm.snapshot.currentSnapshot diff --git a/app/templates/snapshots.html b/app/templates/snapshots.html index 1ffc489..541d4ac 100644 --- a/app/templates/snapshots.html +++ b/app/templates/snapshots.html @@ -66,10 +66,16 @@

Users actifs (hors admins) — défaut = toi.

-
+
+
+ +