Skip to content

Commit 6aec8fd

Browse files
authored
ELI-351: Refactor (#258)
* ELI-351: Refactor * ELI-351: Adds tests for action rule handler * ELI-351: Renames and fixes tests * ELI-351: Renames and fixes tests
1 parent c5105e4 commit 6aec8fd

10 files changed

Lines changed: 881 additions & 249 deletions

File tree

src/eligibility_signposting_api/audit/audit_context.py

Lines changed: 14 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -18,17 +18,12 @@
1818
RequestAuditQueryParams,
1919
)
2020
from eligibility_signposting_api.audit.audit_service import AuditService
21-
from eligibility_signposting_api.model.campaign_config import (
22-
CampaignID,
23-
CampaignVersion,
24-
Iteration,
25-
RuleName,
26-
RulePriority,
27-
)
2821
from eligibility_signposting_api.model.eligibility_status import (
22+
BestIterationResult,
2923
CohortGroupResult,
3024
ConditionName,
3125
IterationResult,
26+
MatchedActionDetail,
3227
Status,
3328
SuggestedAction,
3429
)
@@ -65,17 +60,15 @@ def add_request_details(request: Request) -> None:
6560

6661
@staticmethod
6762
def append_audit_condition(
68-
suggested_actions: list[SuggestedAction] | None,
6963
condition_name: ConditionName,
70-
best_results: tuple[Iteration | None, IterationResult | None, dict[str, CohortGroupResult] | None],
71-
campaign_details: tuple[CampaignID | None, CampaignVersion | None],
72-
action_rule_details: tuple[RulePriority | None, RuleName | None],
64+
best_iteration_result: BestIterationResult,
65+
action_detail: MatchedActionDetail,
7366
) -> None:
7467
audit_eligibility_cohorts, audit_eligibility_cohort_groups, audit_actions = [], [], []
7568
audit_filter_rule, audit_suitability_rule, audit_action_rule = None, None, None
76-
best_active_iteration = best_results[0]
77-
best_candidate = best_results[1]
78-
best_cohort_results = best_results[2]
69+
best_active_iteration = best_iteration_result.active_iteration
70+
best_candidate = best_iteration_result.iteration_result
71+
best_cohort_results = best_iteration_result.cohort_results
7972

8073
if best_cohort_results:
8174
for cohort_label, result in sorted(best_cohort_results.items(), key=lambda item: item[1].cohort_code):
@@ -94,13 +87,13 @@ def append_audit_condition(
9487
audit_filter_rule = AuditContext.create_audit_filter_rule(best_candidate, result)
9588
audit_suitability_rule = AuditContext.create_audit_suitability_rule(best_candidate, result)
9689

97-
audit_action_rule = AuditContext.add_rule_name_and_priority_to_audit(best_candidate, action_rule_details)
90+
audit_action_rule = AuditContext.add_rule_name_and_priority_to_audit(best_candidate, action_detail)
9891

99-
audit_actions = AuditContext.create_audit_actions(suggested_actions)
92+
audit_actions = AuditContext.create_audit_actions(action_detail.actions)
10093

10194
audit_condition = AuditCondition(
102-
campaign_id=campaign_details[0],
103-
campaign_version=campaign_details[1],
95+
campaign_id=best_iteration_result.campaign_id,
96+
campaign_version=best_iteration_result.campaign_version,
10497
iteration_id=best_active_iteration.id if best_active_iteration else None,
10598
iteration_version=best_active_iteration.version if best_active_iteration else None,
10699
condition_name=condition_name,
@@ -119,15 +112,15 @@ def append_audit_condition(
119112
@staticmethod
120113
def add_rule_name_and_priority_to_audit(
121114
best_candidate: IterationResult | None,
122-
action_rule_details: tuple[RulePriority | None, RuleName | None] | None,
115+
action_detail: MatchedActionDetail,
123116
) -> AuditRedirectRule | None:
124117
audit_action_rule = None
125118
if best_candidate and best_candidate.status:
126-
if action_rule_details is None or (action_rule_details[0] is None and action_rule_details[1] is None):
119+
if action_detail.rule_priority is None and action_detail.rule_name is None:
127120
audit_action_rule = None
128121
else:
129122
audit_action_rule = AuditRedirectRule(
130-
rule_priority=str(action_rule_details[0]), rule_name=action_rule_details[1]
123+
rule_priority=str(action_detail.rule_priority), rule_name=action_detail.rule_name
131124
)
132125
return audit_action_rule
133126

src/eligibility_signposting_api/model/eligibility_status.py

Lines changed: 28 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,14 @@
44
from datetime import date
55
from enum import Enum, StrEnum, auto
66
from functools import total_ordering
7-
from typing import NewType, Self
7+
from typing import TYPE_CHECKING, NewType, Self
88

99
from pydantic import HttpUrl
1010

11+
if TYPE_CHECKING:
12+
from eligibility_signposting_api.model import campaign_config
13+
from eligibility_signposting_api.model.campaign_config import CampaignID, CampaignVersion, CohortLabel, Iteration
14+
1115
NHSNumber = NewType("NHSNumber", str)
1216
DateOfBirth = NewType("DateOfBirth", date)
1317
Postcode = NewType("Postcode", str)
@@ -77,6 +81,13 @@ def get_status_text(self, condition_name: ConditionName) -> StatusText:
7781
}
7882
return status_to_text_mapping.get(self, lambda: StatusText("Unknown status provided"))()
7983

84+
def get_action_rule_type(self) -> RuleType:
85+
return {
86+
self.not_eligible: RuleType.not_eligible_actions,
87+
self.not_actionable: RuleType.not_actionable_actions,
88+
self.actionable: RuleType.redirect,
89+
}[self]
90+
8091

8192
@dataclass
8293
class Reason:
@@ -122,6 +133,22 @@ class IterationResult:
122133
actions: list[SuggestedAction] | None
123134

124135

136+
@dataclass
137+
class BestIterationResult:
138+
iteration_result: IterationResult
139+
active_iteration: Iteration | None = None
140+
campaign_id: CampaignID | None = None
141+
campaign_version: CampaignVersion | None = None
142+
cohort_results: dict[CohortLabel, CohortGroupResult] | None = None
143+
144+
145+
@dataclass
146+
class MatchedActionDetail:
147+
rule_name: campaign_config.RuleName | None = None
148+
rule_priority: campaign_config.RulePriority | None = None
149+
actions: list[SuggestedAction] | None = None
150+
151+
125152
@dataclass
126153
class EligibilityStatus:
127154
"""Represents a person's eligibility for vaccination."""

0 commit comments

Comments
 (0)