From 8daaa0974d900593a73acb278f01e2eb847d044d Mon Sep 17 00:00:00 2001 From: Daniel Roth Date: Tue, 7 Jul 2026 10:05:25 +0000 Subject: [PATCH] =?UTF-8?q?A=20trigger=20message=20validates=20the=20field?= =?UTF-8?q?s=20each=20fired=20Abri=20flow=20needs=20=F0=9F=9F=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Fable 5 --- applications/abri/abri_trigger_request.py | 26 ++++++++++++++++++----- 1 file changed, 21 insertions(+), 5 deletions(-) diff --git a/applications/abri/abri_trigger_request.py b/applications/abri/abri_trigger_request.py index d159105c7..0a9346ca9 100644 --- a/applications/abri/abri_trigger_request.py +++ b/applications/abri/abri_trigger_request.py @@ -7,22 +7,38 @@ visibility surface. """ from datetime import date -from typing import Any, List, Literal, Optional +from typing import Dict, List, Literal, Optional, Tuple -from pydantic import BaseModel, ConfigDict +from pydantic import BaseModel, ConfigDict, Field, model_validator AbriFlow = Literal["amend_job", "log_job", "sync_tenant_data"] +# The deal fields each flow reads; hubspot_deal_id is always required. +_FIELDS_BY_FLOW: Dict[AbriFlow, Tuple[str, ...]] = { + "amend_job": ("confirmed_survey_date",), + "log_job": ("place_ref", "deal_name", "confirmed_survey_date"), + "sync_tenant_data": ("place_ref",), +} + class AbriTriggerRequest(BaseModel): model_config = ConfigDict(extra="ignore") hubspot_deal_id: str - flows: List[AbriFlow] + flows: List[AbriFlow] = Field(min_length=1) place_ref: Optional[str] = None deal_name: Optional[str] = None confirmed_survey_date: Optional[date] = None confirmed_survey_time: Optional[str] = None - def model_post_init(self, __context: Any) -> None: - raise NotImplementedError + @model_validator(mode="after") + def _each_fired_flow_has_its_fields(self) -> "AbriTriggerRequest": + missing = [ + f"flow {flow} requires {field}" + for flow in self.flows + for field in _FIELDS_BY_FLOW[flow] + if getattr(self, field) is None + ] + if missing: + raise ValueError("; ".join(missing)) + return self