Skip to content

Commit 5c938e3

Browse files
wip-3
1 parent 7fac83c commit 5c938e3

2 files changed

Lines changed: 13 additions & 17 deletions

File tree

src/eligibility_signposting_api/model/eligibility.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -71,14 +71,14 @@ class Condition:
7171
status: Status
7272
reasons: list[Reason]
7373

74+
7475
@dataclass
7576
class CohortStatus:
7677
cohort: rules.IterationCohort
7778
status: Status
7879
reasons: list[Reason]
7980

8081

81-
8282
@dataclass
8383
class EligibilityStatus:
8484
"""Represents a person's eligibility for vaccination."""

src/eligibility_signposting_api/services/calculators/eligibility_calculator.py

Lines changed: 12 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,17 @@
11
from __future__ import annotations
22

3-
from _operator import attrgetter
3+
from _operator import add, attrgetter
44
from collections import defaultdict
55
from collections.abc import Collection, Iterator, Mapping
66
from dataclasses import dataclass, field
7-
from functools import cached_property
7+
from functools import cached_property, reduce
88
from itertools import groupby
99
from typing import Any
1010

1111
from wireup import service
1212

1313
from eligibility_signposting_api.model import eligibility, rules
14-
from eligibility_signposting_api.model.eligibility import Status, CohortStatus, Condition, ConditionName
14+
from eligibility_signposting_api.model.eligibility import CohortStatus, Condition, ConditionName, Status
1515
from eligibility_signposting_api.services.calculators.rule_calculator import RuleCalculator
1616

1717
Row = Collection[Mapping[str, Any]]
@@ -72,18 +72,15 @@ def evaluate_eligibility_back_up(self) -> eligibility.EligibilityStatus:
7272
from collections import defaultdict
7373

7474
# Assuming cohort_results contains tuples of (IterationCohort, Status, list[Reason])
75-
def get_best_cohort(
76-
self, cohort_results: dict[str, CohortStatus]
77-
) -> tuple[Status, list[CohortStatus]]:
78-
75+
def get_best_cohort(self, cohort_results: dict[str, CohortStatus]) -> tuple[Status, list[CohortStatus]]:
7976
# Find the best status across cohorts
8077
best_status = eligibility.Status.best(*[result.status for result in cohort_results.values()])
8178

8279
# Filter cohorts that match the best status
83-
best_cohorts = [result for result in cohort_results.values() if result[1] == best_status]
80+
best_cohorts = [result for result in cohort_results.values() if result.status == best_status]
8481
return best_status, best_cohorts
8582

86-
def evaluate_eligibility(self):
83+
def evaluate_eligibility(self) -> eligibility.EligibilityStatus:
8784
"""Iterates over campaign groups, evaluates eligibility, and returns a consolidated status."""
8885
priority_getter = attrgetter("priority")
8986
results: dict[ConditionName, tuple[Status, list[CohortStatus]]] = defaultdict()
@@ -132,23 +129,22 @@ def evaluate_eligibility(self):
132129
# Determine Result between cohorts - get the best
133130
iteration_results[active_iteration.name] = self.get_best_cohort(cohort_results) # multiple
134131
# Determine results between iterations - get the best
135-
best_so_far:Status = eligibility.Status.not_eligible
136-
for name, iteration_result in iteration_results.items():
132+
best_so_far: Status = eligibility.Status.not_eligible
133+
for iteration_result in iteration_results.values():
137134
best_so_far = eligibility.Status.best(best_so_far, iteration_result[0])
138-
for name, iteration_result in iteration_results.items():
135+
for iteration_result in iteration_results.values():
139136
if iteration_result[0] is best_so_far:
140137
results[condition_name] = iteration_result
141-
break # if the status is the same, we can break out of the loop - we are picking the first one
138+
break # if the status is the same, we can break out of the loop - we are picking the first one
142139
# Consolidate all the results and return
143140
final_result = [
144141
Condition(
145142
condition_name=condition_name,
146143
status=status,
147-
reasons=sum((cohort.reasons for cohort in cohort_status_list), [])
144+
reasons=reduce(add, [cohort.reasons for cohort in cohort_status_list], []),
148145
)
149146
for condition_name, (status, cohort_status_list) in results.items()
150147
]
151-
152148
return eligibility.EligibilityStatus(conditions=final_result)
153149

154150
def get_the_base_eligible_campaigns(self, campaign_group: list[rules.CampaignConfig]) -> list[rules.CampaignConfig]:
@@ -238,7 +234,7 @@ def evaluate_priority_group(
238234
is_rule_stop = any(rule.rule_stop for rule in exclude_capable_rules)
239235
return worst_group_status, actionable_reasons, exclusion_reasons, is_rule_stop
240236

241-
def evaluate_rules_priority_group( # TODO refractor
237+
def evaluate_rules_priority_group(
242238
self, iteration_rule_group: Iterator[rules.IterationRule]
243239
) -> tuple[eligibility.Status, list[eligibility.Reason], list[eligibility.Reason]]:
244240
status = Status.not_eligible

0 commit comments

Comments
 (0)