File size: 1,491 Bytes
3493993
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
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