129 lines
3.0 KiB
Python
129 lines
3.0 KiB
Python
"""Pydantic request/response models for the mail API."""
|
|
|
|
from __future__ import annotations
|
|
|
|
from typing import Any, Literal
|
|
|
|
from pydantic import BaseModel, EmailStr
|
|
|
|
|
|
class BaseSubmission(BaseModel):
|
|
fullName: str
|
|
email: EmailStr
|
|
phone: str
|
|
website: str = ""
|
|
formStartedAt: int | None = None
|
|
visitStartedAt: int | None = None
|
|
pageEnteredAt: int | None = None
|
|
firstInteractionAt: int | None = None
|
|
sendClickedAt: int | None = None
|
|
referrer: str = ""
|
|
page: str = ""
|
|
|
|
|
|
class BookingSubmission(BaseSubmission):
|
|
enquiryType: str = "booking"
|
|
petName: str = ""
|
|
location: str = ""
|
|
message: str = ""
|
|
services: list[str] = []
|
|
stepChanges: int = 0
|
|
journey: list[str] = []
|
|
|
|
|
|
class OnboardingSubmission(BaseSubmission):
|
|
address: str
|
|
dogName: str
|
|
dogBreed: str
|
|
dogAge: str = ""
|
|
servicesNeeded: list[str] = []
|
|
temperament: str = ""
|
|
medicalNotes: str = ""
|
|
accessInstructions: str = ""
|
|
vetName: str
|
|
vetPhone: str
|
|
emergencyContactName: str
|
|
emergencyContactPhone: str
|
|
councilRegistrationConfirmed: bool = False
|
|
vaccinationsConfirmed: bool = False
|
|
emergencyVetConsent: bool = False
|
|
termsAccepted: bool = False
|
|
signatureDataUrl: str
|
|
submissionSnapshot: dict[str, Any] = {}
|
|
|
|
|
|
class WelcomePackEmailRequest(BaseModel):
|
|
email: EmailStr
|
|
serviceType: str
|
|
priceDetails: str
|
|
startDate: str
|
|
preview: bool = False
|
|
|
|
|
|
class BirthdayEmailRequest(BaseModel):
|
|
email: EmailStr
|
|
preview: bool = False
|
|
|
|
|
|
class BirthdayAutoSendRequest(BaseModel):
|
|
email: EmailStr
|
|
enabled: bool
|
|
|
|
|
|
# Client lifecycle status. Soft-delete only — every client stays on file so the
|
|
# history is preserved for future newsletter / retention work.
|
|
ClientLifecycleStatus = Literal["active", "paused", "cancelled", "archived"]
|
|
|
|
|
|
class ClientStatusUpdate(BaseModel):
|
|
email: EmailStr
|
|
status: ClientLifecycleStatus
|
|
reason: str = ""
|
|
|
|
|
|
class ContractSubmission(BaseSubmission):
|
|
address: str
|
|
dogName: str
|
|
dogBreed: str
|
|
dogAge: str = ""
|
|
serviceType: str
|
|
startDate: str
|
|
walkFrequency: str = ""
|
|
additionalNotes: str = ""
|
|
agreeServiceTerms: bool = False
|
|
agreeCancellation: bool = False
|
|
agreePayment: bool = False
|
|
agreeEmergency: bool = False
|
|
agreeLiability: bool = False
|
|
agreeAccuracy: bool = False
|
|
signatureDataUrl: str
|
|
|
|
|
|
class RenderMessageRequest(BaseModel):
|
|
templateId: str
|
|
heading: str = ""
|
|
body: str = ""
|
|
ctaLabel: str = ""
|
|
ctaUrl: str = ""
|
|
subHeading: str = ""
|
|
highlightText: str = ""
|
|
signOff: str = ""
|
|
footerNote: str = ""
|
|
fontId: str = "system"
|
|
|
|
|
|
class SendMessageRequest(BaseModel):
|
|
templateId: str
|
|
subject: str
|
|
heading: str = ""
|
|
body: str = ""
|
|
ctaLabel: str = ""
|
|
ctaUrl: str = ""
|
|
subHeading: str = ""
|
|
highlightText: str = ""
|
|
signOff: str = ""
|
|
footerNote: str = ""
|
|
fontId: str = "system"
|
|
recipients: list[EmailStr] = []
|
|
preview: bool = False
|