Skip to content

Commit 29c3aeb

Browse files
WIP - Pydantic AvailableActionMap.
1 parent 803df41 commit 29c3aeb

3 files changed

Lines changed: 28 additions & 19 deletions

File tree

src/eligibility_signposting_api/model/rules.py

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,9 @@
99
from operator import attrgetter
1010
from typing import Literal, NewType
1111

12-
from pydantic import BaseModel, Field, field_serializer, field_validator, model_validator
12+
from pydantic import BaseModel, Field, field_serializer, field_validator, model_validator, RootModel
1313

14-
from eligibility_signposting_api.model.eligibility import Action
14+
#from eligibility_signposting_api.model.eligibility import Action
1515

1616
if typing.TYPE_CHECKING: # pragma: no cover
1717
from pydantic import SerializationInfo
@@ -129,6 +129,10 @@ class AvailableAction(BaseModel):
129129
urlLink: str | None = Field(None, alias="UrlLink")
130130
urlLabel: str | None = Field(None, alias="UrlLabel")
131131

132+
class AvailableActionMap(RootModel[dict[str, AvailableAction]]):
133+
def get(self, key, default=None):
134+
return self.root.get(key, default)
135+
132136
class Iteration(BaseModel):
133137
id: IterationID = Field(..., alias="ID")
134138
version: IterationVersion = Field(..., alias="Version")
@@ -141,7 +145,8 @@ class Iteration(BaseModel):
141145
default_comms_routing: str | None = Field(None, alias="DefaultCommsRouting")
142146
iteration_cohorts: list[IterationCohort] = Field(..., alias="IterationCohorts")
143147
iteration_rules: list[IterationRule] = Field(..., alias="IterationRules")
144-
actions_mapper: dict[str, AvailableAction] | None = Field(default_factory=dict, alias="ActionsMapper")
148+
#actions_mapper: dict[str, AvailableAction] | None = Field(default_factory=dict, alias="ActionsMapper")
149+
actions_mapper: AvailableActionMap | None = Field(default_factory=lambda: AvailableActionMap({}), alias="ActionsMapper")
145150

146151
model_config = {"populate_by_name": True, "arbitrary_types_allowed": True, "extra": "ignore"}
147152

src/eligibility_signposting_api/services/calculators/eligibility_calculator.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
#from pygments.lexer import default
1212

1313
if TYPE_CHECKING:
14-
from eligibility_signposting_api.model.rules import Iteration, IterationCohort, AvailableAction
14+
from eligibility_signposting_api.model.rules import Iteration, IterationCohort, AvailableAction, AvailableActionMap
1515

1616
from wireup import service
1717

@@ -97,7 +97,7 @@ def get_rules_by_type(
9797
@staticmethod
9898
def get_redirect_rules(
9999
active_iteration: Iteration,
100-
) -> tuple[tuple[rules.IterationRule, ...], dict[str, AvailableAction], str]:
100+
) -> tuple[tuple[rules.IterationRule, ...], AvailableActionMap, str]:
101101
redirect_rules = tuple(
102102
rule for rule in active_iteration.iteration_rules if rule.type in rules.RuleType.redirect
103103
)
@@ -268,7 +268,7 @@ def evaluate_rules_priority_group(
268268
return best_status, inclusion_reasons, exclusion_reasons, is_rule_stop
269269

270270
@staticmethod
271-
def get_actions_from_comms(self, action_mapper: dict[str, AvailableAction], comms: str) -> list[Action]:
271+
def get_actions_from_comms(self, action_mapper: AvailableActionMap, comms: str) -> list[Action]:
272272
actions: list[Action] = []
273273
for comm in comms.split("|"):
274274
actions.append(Action(

tests/unit/services/calculators/test_eligibility_calculator.py

Lines changed: 17 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
RuleResult,
1818
Status, Action,
1919
)
20+
from eligibility_signposting_api.model.rules import AvailableActionMap, AvailableAction
2021
from eligibility_signposting_api.services.calculators.eligibility_calculator import EligibilityCalculator
2122
from tests.fixtures.builders.model import rule as rule_builder
2223
from tests.fixtures.builders.repos.person import person_rows_builder
@@ -1073,19 +1074,22 @@ def test_correct_actions_determined_from_redirect_r_rules(faker: Faker):
10731074
rule_builder.IterationFactory.build(
10741075
iteration_cohorts=[rule_builder.IterationCohortFactory.build(cohort_label="cohort1")],
10751076
default_comms_routing="defaultcomms",
1076-
actions_mapper={"ActionCode1": {"ExternalRoutingCode": "ActionCode1",
1077-
"ActionDescription": "Action description",
1078-
"ActionType": "ActionType",
1079-
"UrlLink": "ActionLink",
1080-
"UrlLabel": "Label",
1081-
},
1082-
"defaultcomms": {"ExternalRoutingCode": "ActionCode1",
1083-
"ActionDescription": "Action description",
1084-
"ActionType": "ActionType",
1085-
"UrlLink": "ActionLink",
1086-
"UrlLabel": "Label",
1087-
},
1088-
},
1077+
actions_mapper=AvailableActionMap({
1078+
"ActionCode1": AvailableAction(
1079+
actionCode="ActionCode1",
1080+
actionDescription="Action description",
1081+
actionType="ActionType",
1082+
urlLink="ActionLink",
1083+
urlLabel="Label"
1084+
),
1085+
"defaultcomms": AvailableAction(
1086+
actionCode="ActionCode1",
1087+
actionDescription="Action description",
1088+
actionType="ActionType",
1089+
urlLink="ActionLink",
1090+
urlLabel="Label"
1091+
),
1092+
}),
10891093
iteration_rules=[rule_builder.ICBRedirectRuleFactory.build()]
10901094
)
10911095
],

0 commit comments

Comments
 (0)