TorbatYar/backend/services/experience/app/policies/themes.py
Mortezakoohjani 203671a7bf feat(experience): ship Experience Platform phases 11.0-11.10
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>
2026-07-27 11:43:10 +03:30

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)