49 lines
1.3 KiB
Python
49 lines
1.3 KiB
Python
# storage.py
|
|
"""
|
|
Gestion du stockage "avancé" pour agent_v0.
|
|
|
|
v0 :
|
|
- création d'une archive ZIP pour une session donnée
|
|
"""
|
|
|
|
from __future__ import annotations
|
|
|
|
import os
|
|
import zipfile
|
|
|
|
from config import SESSIONS_ROOT
|
|
from raw_session import RawSession
|
|
|
|
|
|
def create_session_zip(session: RawSession, base_dir: str | None = None) -> str:
|
|
"""
|
|
Crée un ZIP contenant tout le dossier de la session :
|
|
|
|
sessions/<session_id>/
|
|
- <session_id>.json
|
|
- shots/*.png
|
|
|
|
Le ZIP est créé dans SESSIONS_ROOT :
|
|
sessions/<session_id>.zip
|
|
|
|
Retourne le chemin absolu du ZIP.
|
|
"""
|
|
base_dir = base_dir or SESSIONS_ROOT
|
|
|
|
session_dir = os.path.join(base_dir, session.session_id)
|
|
if not os.path.isdir(session_dir):
|
|
raise FileNotFoundError(f"Dossier de session introuvable : {session_dir}")
|
|
|
|
zip_path = os.path.join(base_dir, f"{session.session_id}.zip")
|
|
|
|
# On crée/écrase le zip
|
|
with zipfile.ZipFile(zip_path, "w", compression=zipfile.ZIP_DEFLATED) as zf:
|
|
for root, _, files in os.walk(session_dir):
|
|
for name in files:
|
|
full_path = os.path.join(root, name)
|
|
# chemin relatif dans l'archive (à partir de SESSIONS_ROOT)
|
|
arcname = os.path.relpath(full_path, base_dir)
|
|
zf.write(full_path, arcname)
|
|
|
|
return os.path.abspath(zip_path)
|