import json from typing import Any import db from .ensure_animation_schema import ensure_animation_schema # Champs modifiables après création — le déplacement/redimensionnement à la # souris dans le panneau timeline n'envoie que start_time/duration, le # formulaire d'édition du clip peut envoyer n'importe lequel des autres. _UPDATABLE_FIELDS = { "kind", "animate_name", "start_time", "duration", "delay", "easing", "iteration_count", } def update_animation_clip(slug: str, clip_id: int, **fields: Any) -> None: ensure_animation_schema(slug) sets: list[str] = [] vals: list[Any] = [] for key, value in fields.items(): if key == "custom_keyframes": sets.append("custom_keyframes = ?") vals.append(json.dumps(value) if value else None) elif key in _UPDATABLE_FIELDS and value is not None: if key in ("start_time", "duration", "delay"): value = float(value) sets.append(f"{key} = ?") vals.append(value) if not sets: return vals.append(clip_id) conn = db.connect(slug) conn.execute(f"UPDATE _animation_clips SET {', '.join(sets)} WHERE id = ?", vals) # nosec B608 # noqa: S608 - sets construit uniquement a partir de _UPDATABLE_FIELDS (whitelist codee en dur ligne 22), jamais d'une cle arbitraire ; valeurs parametrees (?) conn.commit() conn.close()