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

1"""Shared payloads for the solve-completion email pub/sub flow.""" 

2 

3from enum import Enum 

4 

5from pydantic import BaseModel 

6 

7from common.models import CloudEventsPayload 

8 

9 

10class SolveCompletionEmailOutcome(str, Enum): 

11 """Stable outcome keys used by both publishers and the Django email consumer.""" 

12 

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" 

20 

21 

22class SolveCompletionEmailRequestPayload(BaseModel): 

23 """Message payload describing one terminal solve email attempt.""" 

24 

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 

38 

39 

40SolveCompletionEmailRequestEvent = CloudEventsPayload[SolveCompletionEmailRequestPayload]