Skip to content

Commit 7f04c9e

Browse files
created data classess for complex structures
1 parent 0697b9e commit 7f04c9e

2 files changed

Lines changed: 16 additions & 14 deletions

File tree

src/eligibility_signposting_api/model/eligibility.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,11 @@ class CohortStatus:
7878
status: Status
7979
reasons: list[Reason]
8080

81+
@dataclass
82+
class IterationStatus:
83+
status: Status
84+
cohort_status: list[CohortStatus]
85+
8186

8287
@dataclass
8388
class EligibilityStatus:

src/eligibility_signposting_api/services/calculators/eligibility_calculator.py

Lines changed: 11 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,8 @@
1111
from wireup import service
1212

1313
from eligibility_signposting_api.model import eligibility, rules
14-
from eligibility_signposting_api.model.eligibility import CohortStatus, Condition, ConditionName, Status
14+
from eligibility_signposting_api.model.eligibility import CohortStatus, Condition, ConditionName, Status, \
15+
IterationStatus
1516
from eligibility_signposting_api.services.calculators.rule_calculator import RuleCalculator
1617

1718
Row = Collection[Mapping[str, Any]]
@@ -83,9 +84,9 @@ def get_best_cohort(self, cohort_results: dict[str, CohortStatus]) -> tuple[Stat
8384
def evaluate_eligibility(self) -> eligibility.EligibilityStatus:
8485
"""Iterates over campaign groups, evaluates eligibility, and returns a consolidated status."""
8586
priority_getter = attrgetter("priority")
86-
results: dict[ConditionName, tuple[Status, list[CohortStatus]]] = defaultdict()
87+
results: dict[ConditionName, IterationStatus] = defaultdict()
8788
for condition_name, campaign_group in self.campaigns_grouped_by_condition_name:
88-
iteration_results: dict[str, tuple[Status, list[CohortStatus]]] = defaultdict()
89+
iteration_results: dict[str, IterationStatus] = defaultdict()
8990
for active_iteration in [cc.current_iteration for cc in campaign_group]:
9091
cohort_results: dict[str, CohortStatus] = defaultdict()
9192

@@ -129,23 +130,19 @@ def evaluate_eligibility(self) -> eligibility.EligibilityStatus:
129130
cohort_results[cohort.cohort_label] = CohortStatus(cohort, eligibility.Status.not_eligible, [])
130131

131132
# Determine Result between cohorts - get the best
132-
iteration_results[active_iteration.name] = self.get_best_cohort(cohort_results) # multiple
133+
iteration_results[active_iteration.name] = IterationStatus(*self.get_best_cohort(cohort_results)) # multiple
133134
# Determine results between iterations - get the best
134-
best_so_far: Status = eligibility.Status.not_eligible
135-
for iteration_result in iteration_results.values():
136-
best_so_far = eligibility.Status.best(best_so_far, iteration_result[0])
137-
for iteration_result in iteration_results.values():
138-
if iteration_result[0] is best_so_far:
139-
results[condition_name] = iteration_result
140-
break # if the status is the same, we can break out of the loop - we are picking the first one
135+
best_candidate = max(iteration_results.values(), key=lambda r: r.status.value)
136+
results[condition_name] = best_candidate
137+
141138
# Consolidate all the results and return
142139
final_result = [
143140
Condition(
144141
condition_name=condition_name,
145-
status=status,
146-
reasons=reduce(add, [cohort.reasons for cohort in cohort_status_list], []),
142+
status=iteration_result.status,
143+
reasons=reduce(add, [cohort.reasons for cohort in iteration_result.cohort_status], []),
147144
)
148-
for condition_name, (status, cohort_status_list) in results.items()
145+
for condition_name, iteration_result in results.items()
149146
]
150147
return eligibility.EligibilityStatus(conditions=final_result)
151148

0 commit comments

Comments
 (0)