|
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 CohortStatus, Condition, ConditionName, Status |
| 14 | +from eligibility_signposting_api.model.eligibility import CohortStatus, Condition, ConditionName, Status, \ |
| 15 | + IterationStatus |
15 | 16 | from eligibility_signposting_api.services.calculators.rule_calculator import RuleCalculator |
16 | 17 |
|
17 | 18 | Row = Collection[Mapping[str, Any]] |
@@ -83,9 +84,9 @@ def get_best_cohort(self, cohort_results: dict[str, CohortStatus]) -> tuple[Stat |
83 | 84 | def evaluate_eligibility(self) -> eligibility.EligibilityStatus: |
84 | 85 | """Iterates over campaign groups, evaluates eligibility, and returns a consolidated status.""" |
85 | 86 | priority_getter = attrgetter("priority") |
86 | | - results: dict[ConditionName, tuple[Status, list[CohortStatus]]] = defaultdict() |
| 87 | + results: dict[ConditionName, IterationStatus] = defaultdict() |
87 | 88 | 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() |
89 | 90 | for active_iteration in [cc.current_iteration for cc in campaign_group]: |
90 | 91 | cohort_results: dict[str, CohortStatus] = defaultdict() |
91 | 92 |
|
@@ -129,23 +130,19 @@ def evaluate_eligibility(self) -> eligibility.EligibilityStatus: |
129 | 130 | cohort_results[cohort.cohort_label] = CohortStatus(cohort, eligibility.Status.not_eligible, []) |
130 | 131 |
|
131 | 132 | # 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 |
133 | 134 | # 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 | + |
141 | 138 | # Consolidate all the results and return |
142 | 139 | final_result = [ |
143 | 140 | Condition( |
144 | 141 | 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], []), |
147 | 144 | ) |
148 | | - for condition_name, (status, cohort_status_list) in results.items() |
| 145 | + for condition_name, iteration_result in results.items() |
149 | 146 | ] |
150 | 147 | return eligibility.EligibilityStatus(conditions=final_result) |
151 | 148 |
|
|
0 commit comments