Encapsulate target-type dispatch via polymorphism (Phase 1)

Replace isinstance checks with polymorphic methods on PictureTarget
hierarchy: register_with_manager, sync_with_manager, update_fields,
and has_picture_source property.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-02-20 02:20:33 +03:00
parent 3101894ab5
commit 99f47fdbf9
6 changed files with 109 additions and 69 deletions

View File

@@ -191,25 +191,10 @@ async def create_target(
)
# Register in processor manager
if isinstance(target, WledPictureTarget) and target.device_id:
try:
manager.add_target(
target_id=target.id,
device_id=target.device_id,
settings=target.settings,
picture_source_id=target.picture_source_id,
)
except ValueError as e:
logger.warning(f"Could not register target {target.id} in processor manager: {e}")
elif isinstance(target, KeyColorsPictureTarget):
try:
manager.add_kc_target(
target_id=target.id,
picture_source_id=target.picture_source_id,
settings=target.settings,
)
except ValueError as e:
logger.warning(f"Could not register KC target {target.id}: {e}")
try:
target.register_with_manager(manager)
except ValueError as e:
logger.warning(f"Could not register target {target.id} in processor manager: {e}")
return _target_to_response(target)
@@ -279,14 +264,14 @@ async def update_target(
description=data.description,
)
# Sync processor manager (unified API handles both target types)
# Sync processor manager
try:
if data.settings is not None or data.key_colors_settings is not None:
manager.update_target_settings(target_id, target.settings)
if data.picture_source_id is not None:
manager.update_target_source(target_id, target.picture_source_id)
if data.device_id is not None and isinstance(target, WledPictureTarget):
manager.update_target_device(target_id, target.device_id)
target.sync_with_manager(
manager,
settings_changed=data.settings is not None or data.key_colors_settings is not None,
source_changed=data.picture_source_id is not None,
device_changed=data.device_id is not None,
)
except ValueError:
pass