|
1 | 1 | from __future__ import annotations |
2 | 2 |
|
3 | | -from _operator import attrgetter |
| 3 | +from _operator import add, attrgetter |
4 | 4 | from collections import defaultdict |
5 | 5 | from collections.abc import Collection, Iterator, Mapping |
6 | 6 | from dataclasses import dataclass, field |
7 | | -from functools import cached_property |
| 7 | +from functools import cached_property, reduce |
8 | 8 | from itertools import groupby |
9 | 9 | from typing import Any |
10 | 10 |
|
11 | 11 | from wireup import service |
12 | 12 |
|
13 | 13 | 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 |
15 | 15 | from eligibility_signposting_api.services.calculators.rule_calculator import RuleCalculator |
16 | 16 |
|
17 | 17 | Row = Collection[Mapping[str, Any]] |
@@ -72,18 +72,15 @@ def evaluate_eligibility_back_up(self) -> eligibility.EligibilityStatus: |
72 | 72 | from collections import defaultdict |
73 | 73 |
|
74 | 74 | # 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]]: |
79 | 76 | # Find the best status across cohorts |
80 | 77 | best_status = eligibility.Status.best(*[result.status for result in cohort_results.values()]) |
81 | 78 |
|
82 | 79 | # 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] |
84 | 81 | return best_status, best_cohorts |
85 | 82 |
|
86 | | - def evaluate_eligibility(self): |
| 83 | + def evaluate_eligibility(self) -> eligibility.EligibilityStatus: |
87 | 84 | """Iterates over campaign groups, evaluates eligibility, and returns a consolidated status.""" |
88 | 85 | priority_getter = attrgetter("priority") |
89 | 86 | results: dict[ConditionName, tuple[Status, list[CohortStatus]]] = defaultdict() |
@@ -132,23 +129,22 @@ def evaluate_eligibility(self): |
132 | 129 | # Determine Result between cohorts - get the best |
133 | 130 | iteration_results[active_iteration.name] = self.get_best_cohort(cohort_results) # multiple |
134 | 131 | # 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(): |
137 | 134 | 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(): |
139 | 136 | if iteration_result[0] is best_so_far: |
140 | 137 | 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 |
142 | 139 | # Consolidate all the results and return |
143 | 140 | final_result = [ |
144 | 141 | Condition( |
145 | 142 | condition_name=condition_name, |
146 | 143 | 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], []), |
148 | 145 | ) |
149 | 146 | for condition_name, (status, cohort_status_list) in results.items() |
150 | 147 | ] |
151 | | - |
152 | 148 | return eligibility.EligibilityStatus(conditions=final_result) |
153 | 149 |
|
154 | 150 | def get_the_base_eligible_campaigns(self, campaign_group: list[rules.CampaignConfig]) -> list[rules.CampaignConfig]: |
@@ -238,7 +234,7 @@ def evaluate_priority_group( |
238 | 234 | is_rule_stop = any(rule.rule_stop for rule in exclude_capable_rules) |
239 | 235 | return worst_group_status, actionable_reasons, exclusion_reasons, is_rule_stop |
240 | 236 |
|
241 | | - def evaluate_rules_priority_group( # TODO refractor |
| 237 | + def evaluate_rules_priority_group( |
242 | 238 | self, iteration_rule_group: Iterator[rules.IterationRule] |
243 | 239 | ) -> tuple[eligibility.Status, list[eligibility.Reason], list[eligibility.Reason]]: |
244 | 240 | status = Status.not_eligible |
|
0 commit comments