Skip to content

Commit 0daff15

Browse files
Refactor - extract evaluate_priority_group method.
1 parent 99b2e16 commit 0daff15

File tree

1 file changed

+36
-19
lines changed

1 file changed

+36
-19
lines changed

src/eligibility_signposting_api/services/eligibility_services.py

Lines changed: 36 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import logging
22
from collections import defaultdict
3-
from collections.abc import Collection, Mapping
3+
from collections.abc import Collection, Iterator, Mapping
44
from itertools import groupby
55
from operator import attrgetter
66
from typing import Any
@@ -154,25 +154,13 @@ def evaluate_for_base_eligible_campaigns(
154154
for _priority, iteration_rule_group in groupby(
155155
sorted(iteration.iteration_rules, key=priority_getter), key=priority_getter
156156
):
157-
exclude_capable_rules = [
158-
ir for ir in iteration_rule_group if ir.type in (rules.RuleType.filter, rules.RuleType.suppression)
159-
]
160-
best_status_so_far_for_priority_group = (
161-
eligibility.Status.not_eligible if exclude_capable_rules else eligibility.Status.actionable
162-
)
163-
for iteration_rule in exclude_capable_rules:
164-
exclusion, reason = EligibilityService.evaluate_exclusion(iteration_rule, person_data)
165-
if exclusion:
166-
best_status_so_far_for_priority_group = EligibilityService.best_status(
167-
iteration_rule.type, best_status_so_far_for_priority_group
168-
)
169-
exclusion_reasons.append(reason)
170-
else:
171-
best_status_so_far_for_priority_group = eligibility.Status.actionable
172-
actionable_reasons.append(reason)
173-
worst_status_so_far_for_condition = EligibilityService.worst_status(
174-
best_status_so_far_for_priority_group, worst_status_so_far_for_condition
157+
worst_status_so_far_for_condition, group_actionable_reasons, group_exclusion_reasons = (
158+
EligibilityService.evaluate_priority_group(
159+
iteration_rule_group, person_data, worst_status_so_far_for_condition
160+
)
175161
)
162+
actionable_reasons.extend(group_actionable_reasons)
163+
exclusion_reasons.extend(group_exclusion_reasons)
176164
condition_entry = base_eligible_evaluations.setdefault(condition_name, {})
177165
condition_status_entry = condition_entry.setdefault(worst_status_so_far_for_condition, [])
178166
condition_status_entry.extend(
@@ -182,6 +170,35 @@ def evaluate_for_base_eligible_campaigns(
182170
)
183171
return base_eligible_evaluations
184172

173+
@staticmethod
174+
def evaluate_priority_group(
175+
iteration_rule_group: Iterator[rules.IterationRule],
176+
person_data: Collection[Mapping[str, Any]],
177+
worst_status_so_far_for_condition: eligibility.Status,
178+
) -> tuple[eligibility.Status, list[eligibility.Reason], list[eligibility.Reason]]:
179+
actionable_reasons, exclusion_reasons = [], []
180+
exclude_capable_rules = [
181+
ir for ir in iteration_rule_group if ir.type in (rules.RuleType.filter, rules.RuleType.suppression)
182+
]
183+
best_status_so_far_for_priority_group = (
184+
eligibility.Status.not_eligible if exclude_capable_rules else eligibility.Status.actionable
185+
)
186+
for iteration_rule in exclude_capable_rules:
187+
exclusion, reason = EligibilityService.evaluate_exclusion(iteration_rule, person_data)
188+
if exclusion:
189+
best_status_so_far_for_priority_group = EligibilityService.best_status(
190+
iteration_rule.type, best_status_so_far_for_priority_group
191+
)
192+
exclusion_reasons.append(reason)
193+
else:
194+
best_status_so_far_for_priority_group = eligibility.Status.actionable
195+
actionable_reasons.append(reason)
196+
return (
197+
EligibilityService.worst_status(best_status_so_far_for_priority_group, worst_status_so_far_for_condition),
198+
actionable_reasons,
199+
exclusion_reasons,
200+
)
201+
185202
@staticmethod
186203
def worst_status(*statuses: eligibility.Status) -> eligibility.Status:
187204
"""Pick the worst status from those given.

0 commit comments

Comments
 (0)