11import logging
22from collections import defaultdict
3- from collections .abc import Collection , Mapping
3+ from collections .abc import Collection , Iterator , Mapping
44from itertools import groupby
55from operator import attrgetter
66from 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