Coverage for backend/common/src/common/models/solve_completion_email.py: 100%
26 statements
« prev ^ index » next coverage.py v7.10.7, created at 2026-05-13 02:47 +0000
« prev ^ index » next coverage.py v7.10.7, created at 2026-05-13 02:47 +0000
1"""Shared payloads for the solve-completion email pub/sub flow."""
3from enum import Enum
5from pydantic import BaseModel
7from common.models import CloudEventsPayload
10class SolveCompletionEmailOutcome(str, Enum):
11 """Stable outcome keys used by both publishers and the Django email consumer."""
13 SINGLE_SUCCESS = "single_success"
14 SINGLE_FAILURE = "single_failure"
15 SINGLE_CANCELLED = "single_cancelled"
16 MULTI_ALL_SUCCEEDED = "multi_all_succeeded"
17 MULTI_MIXED = "multi_mixed"
18 MULTI_ALL_FAILED = "multi_all_failed"
19 MULTI_CANCELLED = "multi_cancelled"
22class SolveCompletionEmailRequestPayload(BaseModel):
23 """Message payload describing one terminal solve email attempt."""
25 task_id: int
26 parent_task_id: int | None = None
27 flowsheet_id: int
28 scenario_id: int | None = None
29 recipient_user_id: int
30 recipient_email: str | None = None
31 task_status: str
32 is_multi_solve: bool
33 outcome_key: SolveCompletionEmailOutcome
34 scheduled_count: int = 0
35 successful_count: int = 0
36 failed_count: int = 0
37 cancelled_count: int = 0
40SolveCompletionEmailRequestEvent = CloudEventsPayload[SolveCompletionEmailRequestPayload]