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

1""" 

2FSM context implementation for Project entities. 

3 

4This module provides context data and schema for Project entities 

5to be used in FSM guard and action functions. 

6""" 

7 

8from datetime import datetime 

9from typing import Optional, TYPE_CHECKING 

10from pydantic import BaseModel, Field, ConfigDict 

11 

12if TYPE_CHECKING: 

13 from postrfp.model.project import Project 

14 

15 

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 

23 

24 

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 

33 

34 

35class ProjectContext(BaseModel): 

36 """Pydantic model defining the context data available for Project FSM operations.""" 

37 

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 ) 

50 

51 

52def get_project_context_data(project: "Project") -> dict: 

53 """ 

54 Extract context data from a Project instance for FSM operations. 

55 

56 Args: 

57 project: A Project model instance 

58 

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()