Coverage for postrfp/model/fsm_context/project_context.py: 100%
30 statements
« prev ^ index » next coverage.py v7.11.0, created at 2025-10-22 21:34 +0000
« prev ^ index » next coverage.py v7.11.0, created at 2025-10-22 21:34 +0000
1"""
2FSM context implementation for Project entities.
4This module provides context data and schema for Project entities
5to be used in FSM guard and action functions.
6"""
8from datetime import datetime
9from typing import Optional, TYPE_CHECKING
10from pydantic import BaseModel, Field, ConfigDict
12if TYPE_CHECKING:
13 from postrfp.model.project import Project
16class ApprovalUser(BaseModel):
17 model_config = ConfigDict(from_attributes=True)
18 id: str
19 email: str
20 roles: list[str]
21 type: str
22 org_id: str
25class ProjCtxApproval(BaseModel):
26 model_config = ConfigDict(from_attributes=True)
27 id: Optional[int] = None
28 project_id: int
29 user_id: str
30 user: ApprovalUser
31 project_status: str
32 date_approved: datetime
35class ProjectContext(BaseModel):
36 """Pydantic model defining the context data available for Project FSM operations."""
38 project_id: int = Field(..., description="Unique identifier for the project")
39 project_title: str = Field(..., description="Title of the project")
40 project_status: str
41 organisation_id: Optional[str] = Field(
42 None, description="ID of the owning organisation"
43 )
44 author_id: Optional[str] = Field(None, description="ID of the project author")
45 deadline: Optional[datetime] = Field(None, description="Project deadline")
46 approvals: list[ProjCtxApproval] = Field(
47 default_factory=list,
48 description="List of approvals associated with the project",
49 )
52def get_project_context_data(project: "Project") -> dict:
53 """
54 Extract context data from a Project instance for FSM operations.
56 Args:
57 project: A Project model instance
59 Returns:
60 dict: Context data validated by ProjectContext schema
61 """
62 approval_list = [ProjCtxApproval.model_validate(pa) for pa in project.approvals]
63 context = ProjectContext(
64 project_id=project.id,
65 project_title=project.title,
66 project_status=str(project.status_name),
67 organisation_id=project.org_id,
68 author_id=project.author_id,
69 deadline=project.deadline,
70 approvals=approval_list,
71 )
72 return context.model_dump()