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
« 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
4from pydantic import BaseModel, EmailStr, Field, ConfigDict
7from rfpy import conf
9if TYPE_CHECKING:
10 from rfpy.model import User
13class OrmModel(BaseModel):
14 model_config = ConfigDict(from_attributes=True)
17class Org(OrmModel):
18 id: str
19 name: str
22class UserModel(OrmModel):
23 fullname: str
24 email: EmailStr
25 organisation: Org
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
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
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")
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
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
72class TemplateModelSchema(OrmModel):
73 system_name: str
74 host_url_root: str
75 recipient: Optional[Union[UserModel, EmailStr]] = None
76 event: EvtSchema
79class BaseEmail(BaseModel):
80 To: EmailStr
81 From: EmailStr
82 Tag: Optional[str] = None
85class PostmarkTemplateMessage(BaseEmail):
86 TemplateModel: TemplateModelSchema
87 TemplateAlias: str
90class PostmarkBatchWithTemplates(OrmModel):
91 Messages: List[PostmarkTemplateMessage]
94class PostmarkSimpleMessage(BaseEmail):
95 Subject: str
96 TextBody: str
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 )