Add clone support for scene presets and update TODO

- Add clone_preset() to ScenePresetStore with deep copy of target snapshots
- Add POST /scene-presets/{id}/clone API endpoint
- Add clone button to scene preset cards in Automations tab
- Add i18n keys for clone feedback in all 3 locales
- Add TODO items for dashboard stats collapse and protocol badge review

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-03-08 20:17:09 +03:00
parent fddbd771f2
commit 80b48e3618
8 changed files with 74 additions and 3 deletions

View File

@@ -6,7 +6,7 @@ from datetime import datetime
from pathlib import Path
from typing import Dict, List, Optional
from wled_controller.storage.scene_preset import ScenePreset
from wled_controller.storage.scene_preset import ScenePreset, TargetSnapshot
from wled_controller.utils import atomic_write_json, get_logger
logger = get_logger(__name__)
@@ -117,6 +117,25 @@ class ScenePresetStore:
logger.info(f"Recaptured scene preset: {preset_id}")
return existing
def clone_preset(self, preset_id: str) -> ScenePreset:
"""Duplicate an existing preset with a new ID and '(Copy)' suffix."""
if preset_id not in self._presets:
raise ValueError(f"Scene preset not found: {preset_id}")
source = self._presets[preset_id]
new_id = f"scene_{uuid.uuid4().hex[:8]}"
cloned = ScenePreset(
id=new_id,
name=f"{source.name} (Copy)",
description=source.description,
targets=[TargetSnapshot.from_dict(t.to_dict()) for t in source.targets],
order=source.order,
)
self._presets[new_id] = cloned
self._save()
logger.info(f"Cloned scene preset: {preset_id} -> {new_id}")
return cloned
def delete_preset(self, preset_id: str) -> None:
if preset_id not in self._presets:
raise ValueError(f"Scene preset not found: {preset_id}")