diff --git a/app/routers/planning_import.py b/app/routers/planning_import.py index 6f21ab3..17e0575 100644 --- a/app/routers/planning_import.py +++ b/app/routers/planning_import.py @@ -29,6 +29,16 @@ templates = Jinja2Templates(directory="app/templates") # Patterns acceptés : "PCT", "prévenance PCT", "prévenir PCT", "prevenir le PCT", "informer PCT", etc. PCT_DETECTION_RE = re.compile(r"\bpct\b", re.IGNORECASE) +# Filtre OS à l'import : on ne garde que les Linux (Windows hors périmètre patcher). +WINDOWS_OS_RE = re.compile(r"\bwin(dows)?\b|microsoft", re.IGNORECASE) + + +def _is_skipped_os(os_str) -> bool: + """Vrai si l'OS est explicitement Windows (ou Microsoft Server) — à exclure de l'import.""" + if not os_str: + return False # OS vide → on garde, on ne sait pas + return bool(WINDOWS_OS_RE.search(str(os_str))) + def _detect_pct_required(rec: dict) -> bool: """Vrai si l'une des colonnes texte de la ligne mentionne 'PCT' en mot entier.""" @@ -601,6 +611,7 @@ async def import_upload(request: Request, db=Depends(get_db), sheet_count = 0 row_count = 0 + skipped_windows = 0 # comptage des rows skippées (Windows) # Pré-charge mapping hostname → server_id pour résolution hostname_map = {} @@ -624,6 +635,10 @@ async def import_upload(request: Request, db=Depends(get_db), asset_str = str(asset).strip() if asset else None if not asset_str: continue + # Skip Windows : seules les Linux sont gérées par le workflow patching + if _is_skipped_os(rec.get("os")): + skipped_windows += 1 + continue sid = hostname_map.get(asset_str.lower()) jour_d, jour_t = _coerce_date_or_text(rec.get("jour")) heure_t = _coerce_time(rec.get("heure")) @@ -688,6 +703,15 @@ async def import_upload(request: Request, db=Depends(get_db), db.execute(text(""" UPDATE patch_planning_imports SET sheet_count=:s, row_count=:r WHERE id=:id """), {"s": sheet_count, "r": row_count, "id": import_id}) + # Append au champ note un récap des skips Windows + if skipped_windows > 0: + existing_note = db.execute(text( + "SELECT note FROM patch_planning_imports WHERE id=:id" + ), {"id": import_id}).scalar() or "" + suffix = f"\n[skip-windows: {skipped_windows} ligne(s) Windows ignorée(s) à l'import]" + db.execute(text( + "UPDATE patch_planning_imports SET note = :n WHERE id = :id" + ), {"n": (existing_note + suffix).strip(), "id": import_id}) db.commit() return RedirectResponse(url=f"/patching/import/{import_id}?msg=ok", status_code=303)