Skip to content

Commit 803df41

Browse files
WIP
1 parent 1a83bfc commit 803df41

5 files changed

Lines changed: 26 additions & 15 deletions

File tree

src/eligibility_signposting_api/model/eligibility.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,7 @@ class Action:
7070
actionCode: str
7171
actionDescription: str
7272
urlLink: str
73+
urlLabel: str
7374

7475
@dataclass
7576
class Condition:

src/eligibility_signposting_api/model/rules.py

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@
1111

1212
from pydantic import BaseModel, Field, field_serializer, field_validator, model_validator
1313

14+
from eligibility_signposting_api.model.eligibility import Action
15+
1416
if typing.TYPE_CHECKING: # pragma: no cover
1517
from pydantic import SerializationInfo
1618

@@ -120,6 +122,12 @@ def parse_yn_to_bool(cls, v: str | bool) -> bool: # noqa: N805
120122
def __str__(self) -> str:
121123
return json.dumps(self.model_dump(by_alias=True), indent=2)
122124

125+
class AvailableAction(BaseModel):
126+
actionType: str | None = Field(None, alias="ActionType")
127+
actionCode: str | None = Field(None, alias="ExternalRoutingCode")
128+
actionDescription: str | None = Field(None, alias="ActionDescription")
129+
urlLink: str | None = Field(None, alias="UrlLink")
130+
urlLabel: str | None = Field(None, alias="UrlLabel")
123131

124132
class Iteration(BaseModel):
125133
id: IterationID = Field(..., alias="ID")
@@ -130,10 +138,10 @@ class Iteration(BaseModel):
130138
approval_minimum: int | None = Field(None, alias="ApprovalMinimum")
131139
approval_maximum: int | None = Field(None, alias="ApprovalMaximum")
132140
type: Literal["A", "M", "S"] = Field(..., alias="Type")
133-
default_comms_routing: str | None = Field(None, alias="DefualtCommsRouting")
141+
default_comms_routing: str | None = Field(None, alias="DefaultCommsRouting")
134142
iteration_cohorts: list[IterationCohort] = Field(..., alias="IterationCohorts")
135143
iteration_rules: list[IterationRule] = Field(..., alias="IterationRules")
136-
actions_mapper: dict[str, dict[str, str]] | None = Field(default_factory=dict, alias="ActionsMapper")
144+
actions_mapper: dict[str, AvailableAction] | None = Field(default_factory=dict, alias="ActionsMapper")
137145

138146
model_config = {"populate_by_name": True, "arbitrary_types_allowed": True, "extra": "ignore"}
139147

src/eligibility_signposting_api/services/calculators/eligibility_calculator.py

Lines changed: 8 additions & 7 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
14+
from eligibility_signposting_api.model.rules import Iteration, IterationCohort, AvailableAction
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, dict[str, str]], str]:
100+
) -> tuple[tuple[rules.IterationRule, ...], dict[str, AvailableAction], str]:
101101
redirect_rules = tuple(
102102
rule for rule in active_iteration.iteration_rules if rule.type in rules.RuleType.redirect
103103
)
@@ -268,14 +268,15 @@ 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, dict[str, str]], comms: str) -> list[Action]:
271+
def get_actions_from_comms(self, action_mapper: dict[str, AvailableAction], comms: str) -> list[Action]:
272272
actions: list[Action] = []
273273
for comm in comms.split("|"):
274274
actions.append(Action(
275-
actionType=action_mapper.get(comm)["ActionType"],
276-
actionCode=action_mapper.get(comm)["ExternalRoutingCode"],
277-
actionDescription=action_mapper.get(comm)["ActionDescription"],
278-
urlLink=action_mapper.get(comm)["url_link"],
275+
actionType=action_mapper.get(comm).actionType,
276+
actionCode=action_mapper.get(comm).actionCode,
277+
actionDescription=action_mapper.get(comm).actionDescription,
278+
urlLink=action_mapper.get(comm).urlLink,
279+
urlLabel=action_mapper.get(comm).urlLabel,
279280
)
280281
)
281282

tests/test_data/test_config/test_config.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,8 @@
1818
"DefaultCommsRouting": "INTERNALCONTACTGP1|INTERNALCONTACTGP2",
1919
"ActionsMapper": {
2020
"INTERNALCONTACTGP1": {"ExternalRoutingCode": "CONTACTGP","ActionDescription":"Contact GP Text1 description", "ActionType":"text1"},
21-
"INTERNALCONTACTGP2": {"ExternalRoutingCode": "CONTACTGP","ActionDescription":"Contact GP Link description", "ActionType":"link", "url_link": "link123"},
22-
"INTERNALTESCO": {"ExternalRoutingCode": "TESCO","ActionDescription":"Tesco description", "ActionType":"link", "url_link": "tesco link"},
21+
"INTERNALCONTACTGP2": {"ExternalRoutingCode": "CONTACTGP","ActionDescription":"Contact GP Link description", "ActionType":"link", "UrlLink": "link123", "UrlLabel": "link label"},
22+
"INTERNALTESCO": {"ExternalRoutingCode": "TESCO","ActionDescription":"Tesco description", "ActionType":"link", "UrlLink": "tesco link", "UrlLabel": "link label"},
2323
"INTERNALFINDWALKIN": {"ExternalRoutingCode": "FINDWALKIN","ActionDescription":"Find walkin description", "ActionType":"button"}
2424
},
2525
"IterationCohorts": [

tests/unit/services/calculators/test_eligibility_calculator.py

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1076,12 +1076,14 @@ def test_correct_actions_determined_from_redirect_r_rules(faker: Faker):
10761076
actions_mapper={"ActionCode1": {"ExternalRoutingCode": "ActionCode1",
10771077
"ActionDescription": "Action description",
10781078
"ActionType": "ActionType",
1079-
"url_link": "ActionLink",
1079+
"UrlLink": "ActionLink",
1080+
"UrlLabel": "Label",
10801081
},
10811082
"defaultcomms": {"ExternalRoutingCode": "ActionCode1",
10821083
"ActionDescription": "Action description",
10831084
"ActionType": "ActionType",
1084-
"url_link": "ActionLink",
1085+
"UrlLink": "ActionLink",
1086+
"UrlLabel": "Label",
10851087
},
10861088
},
10871089
iteration_rules=[rule_builder.ICBRedirectRuleFactory.build()]
@@ -1096,7 +1098,7 @@ def test_correct_actions_determined_from_redirect_r_rules(faker: Faker):
10961098
# When
10971099
actual = calculator.evaluate_eligibility()
10981100

1099-
expected_actions = [Action("ActionType", 'ActionCode1', "Action description", "ActionLink")]
1101+
expected_actions = [Action("ActionType", 'ActionCode1', "Action description", "ActionLink", "Label")]
11001102

11011103
# Then
11021104
assert_that(
@@ -1111,7 +1113,6 @@ def test_correct_actions_determined_from_redirect_r_rules(faker: Faker):
11111113
),
11121114
)
11131115

1114-
11151116
def test_cohort_label_not_supported_used_in_r_rules(faker: Faker):
11161117
# Given
11171118
nhs_number = NHSNumber(faker.nhs_number())

0 commit comments

Comments
 (0)