Coverage for rfpy/mail/schemas.py: 100%

70 statements  

« prev     ^ index     » next       coverage.py v7.8.0, created at 2025-04-24 10:52 +0000

1from typing import List, Union, Optional, TYPE_CHECKING 

2from datetime import datetime 

3 

4from pydantic import BaseModel, EmailStr, Field, ConfigDict 

5 

6 

7from rfpy import conf 

8 

9if TYPE_CHECKING: 

10 from rfpy.model import User 

11 

12 

13class OrmModel(BaseModel): 

14 model_config = ConfigDict(from_attributes=True) 

15 

16 

17class Org(OrmModel): 

18 id: str 

19 name: str 

20 

21 

22class UserModel(OrmModel): 

23 fullname: str 

24 email: EmailStr 

25 organisation: Org 

26 

27 

28class Proj(OrmModel): 

29 id: int 

30 title: str 

31 status: str 

32 owner_organisation: Org = Field(..., alias="owner_org") 

33 author: Optional[UserModel] = None 

34 

35 

36class Issue(OrmModel): 

37 id: int 

38 status: str 

39 deadline: Optional[datetime] = Field(None, alias="deadline_date") 

40 respondent: Optional[Org] = None 

41 respondent_email: Optional[EmailStr] = None 

42 

43 

44class ProjNote(OrmModel): 

45 note_text: str 

46 private: bool 

47 distribution: str = Field(..., alias="pretty_distribution") 

48 author_org: Org = Field(..., alias="organisation") 

49 addressee: Optional[Org] = Field(None, alias="target_organisation") 

50 

51 

52class ScoreSchema(BaseModel): 

53 score_value: Optional[int] = None 

54 comment: Optional[str] = None 

55 question_number: str 

56 respondent_name: str 

57 issue_id: float 

58 

59 

60class EvtSchema(OrmModel): 

61 id: int 

62 timestamp: datetime # output format should be - '%-d %-b %Y %H:%M UTC' 

63 event_type: str 

64 user: Optional[UserModel] = None 

65 organisation: Optional[Org] = None 

66 project: Optional[Proj] = None 

67 issue: Optional[Issue] = None 

68 note: Optional[ProjNote] = None 

69 score: Optional[ScoreSchema] = None 

70 

71 

72class TemplateModelSchema(OrmModel): 

73 system_name: str 

74 host_url_root: str 

75 recipient: Optional[Union[UserModel, EmailStr]] = None 

76 event: EvtSchema 

77 

78 

79class BaseEmail(BaseModel): 

80 To: EmailStr 

81 From: EmailStr 

82 Tag: Optional[str] = None 

83 

84 

85class PostmarkTemplateMessage(BaseEmail): 

86 TemplateModel: TemplateModelSchema 

87 TemplateAlias: str 

88 

89 

90class PostmarkBatchWithTemplates(OrmModel): 

91 Messages: List[PostmarkTemplateMessage] 

92 

93 

94class PostmarkSimpleMessage(BaseEmail): 

95 Subject: str 

96 TextBody: str 

97 

98 

99def build_template_model( 

100 event_model: EvtSchema, recipient_user: "User", to_email: str 

101) -> PostmarkTemplateMessage: 

102 recipient_model: str | UserModel = to_email 

103 if recipient_user: 

104 recipient_model = UserModel.model_validate(recipient_user) 

105 tms = TemplateModelSchema( 

106 system_name=conf.CONF.system_name, 

107 host_url_root=conf.CONF.webapp_hostname, 

108 recipient=recipient_model, 

109 event=event_model, 

110 ) 

111 return PostmarkTemplateMessage( 

112 To=to_email, 

113 From=conf.CONF.email_from_address, 

114 TemplateModel=tms, 

115 TemplateAlias=event_model.event_type, 

116 )