from __future__ import annotations from enum import Enum from app.projects.errors import ProjectRenderTransitionError class RenderStatus(str, Enum): QUEUED = "queued" PROCESSING = "processing" COMPLETED = "completed" FAILED = "failed" CANCELLING = "cancelling" CANCELLED = "cancelled" TERMINAL_RENDER_STATUSES = frozenset( {RenderStatus.COMPLETED, RenderStatus.FAILED, RenderStatus.CANCELLED} ) ALLOWED_RENDER_TRANSITIONS: dict[RenderStatus, frozenset[RenderStatus]] = { RenderStatus.QUEUED: frozenset( {RenderStatus.PROCESSING, RenderStatus.CANCELLED, RenderStatus.FAILED} ), RenderStatus.PROCESSING: frozenset( { RenderStatus.QUEUED, RenderStatus.COMPLETED, RenderStatus.FAILED, RenderStatus.CANCELLING, RenderStatus.CANCELLED, } ), RenderStatus.CANCELLING: frozenset( {RenderStatus.CANCELLED, RenderStatus.COMPLETED, RenderStatus.FAILED} ), RenderStatus.COMPLETED: frozenset(), RenderStatus.FAILED: frozenset(), RenderStatus.CANCELLED: frozenset(), } def validate_render_transition(current: str, target: str) -> RenderStatus: source = RenderStatus(current) destination = RenderStatus(target) if destination not in ALLOWED_RENDER_TRANSITIONS[source]: raise ProjectRenderTransitionError( f"Cannot transition render from {source.value} to {destination.value}." ) return destination