Add the experience service with sites through analytics/AI hooks, migrations through 0011, and phase docs/manifests marking the track complete. Co-authored-by: Cursor <cursoragent@cursor.com>
78 lines
2.5 KiB
Python
78 lines
2.5 KiB
Python
"""Theme & layout domain policies — Phase 11.3 (versioned)."""
|
|
from __future__ import annotations
|
|
|
|
from typing import Any
|
|
|
|
from app.models.types import (
|
|
LayoutStatus,
|
|
LayoutVersionStatus,
|
|
ThemeStatus,
|
|
ThemeVersionStatus,
|
|
)
|
|
from app.validators.themes import (
|
|
ensure_assignable_layout,
|
|
ensure_assignable_layout_version,
|
|
ensure_assignable_theme,
|
|
ensure_assignable_theme_version,
|
|
ensure_layout_status_transition,
|
|
ensure_layout_version_mutable,
|
|
ensure_layout_version_status_transition,
|
|
ensure_theme_status_transition,
|
|
ensure_theme_version_mutable,
|
|
ensure_theme_version_status_transition,
|
|
)
|
|
|
|
|
|
class ThemeLifecyclePolicy:
|
|
def assert_status_change(
|
|
self, *, current: ThemeStatus, target: ThemeStatus
|
|
) -> ThemeStatus:
|
|
ensure_theme_status_transition(current, target)
|
|
return target
|
|
|
|
|
|
class ThemeVersionPolicy:
|
|
def assert_can_update(self, version: Any) -> None:
|
|
ensure_theme_version_mutable(version)
|
|
|
|
def assert_publish(self, *, current: ThemeVersionStatus) -> None:
|
|
ensure_theme_version_status_transition(current, ThemeVersionStatus.PUBLISHED)
|
|
|
|
def assert_retire(self, *, current: ThemeVersionStatus) -> None:
|
|
ensure_theme_version_status_transition(current, ThemeVersionStatus.RETIRED)
|
|
|
|
|
|
class LayoutLifecyclePolicy:
|
|
def assert_status_change(
|
|
self, *, current: LayoutStatus, target: LayoutStatus
|
|
) -> LayoutStatus:
|
|
ensure_layout_status_transition(current, target)
|
|
return target
|
|
|
|
|
|
class LayoutVersionPolicy:
|
|
def assert_can_update(self, version: Any) -> None:
|
|
ensure_layout_version_mutable(version)
|
|
|
|
def assert_publish(self, *, current: LayoutVersionStatus) -> None:
|
|
ensure_layout_version_status_transition(current, LayoutVersionStatus.PUBLISHED)
|
|
|
|
def assert_retire(self, *, current: LayoutVersionStatus) -> None:
|
|
ensure_layout_version_status_transition(current, LayoutVersionStatus.RETIRED)
|
|
|
|
|
|
class SiteThemeBindingPolicy:
|
|
def assert_theme_assignable(self, theme: Any) -> None:
|
|
ensure_assignable_theme(theme)
|
|
|
|
def assert_version_assignable(self, version: Any) -> None:
|
|
ensure_assignable_theme_version(version)
|
|
|
|
|
|
class PageLayoutBindingPolicy:
|
|
def assert_layout_assignable(self, layout: Any) -> None:
|
|
ensure_assignable_layout(layout)
|
|
|
|
def assert_version_assignable(self, version: Any) -> None:
|
|
ensure_assignable_layout_version(version)
|