Skip to content

Commit b9961b5

Browse files
committed
Fixed linting
1 parent 84a57c9 commit b9961b5

6 files changed

Lines changed: 74 additions & 67 deletions

File tree

src/eligibility_signposting_api/audit_context.py

Lines changed: 36 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
from dataclasses import asdict
33
from datetime import UTC, datetime
44
from operator import attrgetter
5+
from uuid import UUID
56

67
from flask import Request, g
78

@@ -36,7 +37,7 @@ class AuditContext:
3637
def add_request_details(request: Request) -> None:
3738
g.audit_log = AuditEvent()
3839
resource_id = None
39-
if "nhs_number" in request.view_args:
40+
if request.view_args and request.view_args["nhs_number"]:
4041
resource_id = request.view_args["nhs_number"]
4142
g.audit_log.request = RequestAuditData(
4243
nhs_number=resource_id,
@@ -62,7 +63,7 @@ def add_request_details(request: Request) -> None:
6263
def append_audit_condition(
6364
suggested_actions: SuggestedActions | None,
6465
condition_name: ConditionName,
65-
best_results: tuple[Iteration, IterationResult, dict[str, CohortGroupResult]],
66+
best_results: tuple[Iteration | None, IterationResult | None, dict[str, CohortGroupResult] | None],
6667
campaign_details: tuple[CampaignID | None, CampaignVersion | None],
6768
redirect_rule_details: tuple[RulePriority | None, RuleName | None],
6869
) -> None:
@@ -72,35 +73,37 @@ def append_audit_condition(
7273
best_candidate = best_results[1]
7374
best_cohort_results = best_results[2]
7475

75-
for value in sorted(best_cohort_results.values(), key=attrgetter("cohort_code")):
76-
audit_eligibility_cohorts.append(
77-
AuditEligibilityCohorts(cohort_code=value.cohort_code, cohort_status=value.status.name)
78-
)
79-
80-
audit_eligibility_cohort_groups.append(
81-
AuditEligibilityCohortGroups(
82-
cohort_code=value.cohort_code, cohort_status=value.status.name, cohort_text=value.description
76+
if best_cohort_results:
77+
for value in sorted(best_cohort_results.values(), key=attrgetter("cohort_code")):
78+
cohort_status_name = value.status.name if value.status else None
79+
audit_eligibility_cohorts.append(
80+
AuditEligibilityCohorts(cohort_code=value.cohort_code, cohort_status=cohort_status_name)
8381
)
84-
)
8582

86-
if value.audit_rules:
87-
if best_candidate.status.name == Status.not_eligible.name:
88-
audit_filter_rule = AuditFilterRule(
89-
rule_priority=int(value.audit_rules[0].rule_priority), rule_name=value.audit_rules[0].rule_name
90-
)
91-
if best_candidate.status.name == Status.not_actionable.name:
92-
audit_suitability_rule = AuditSuitabilityRule(
93-
rule_priority=int(value.audit_rules[0].rule_priority),
94-
rule_name=value.audit_rules[0].rule_name,
95-
rule_message=value.audit_rules[0].rule_description,
83+
audit_eligibility_cohort_groups.append(
84+
AuditEligibilityCohortGroups(
85+
cohort_code=value.cohort_code, cohort_status=cohort_status_name, cohort_text=value.description
9686
)
87+
)
9788

98-
if best_candidate.status.name == Status.actionable.name:
89+
if value.audit_rules and best_candidate: # Check best_candidate here as well
90+
if best_candidate.status and best_candidate.status.name == Status.not_eligible.name:
91+
audit_filter_rule = AuditFilterRule(
92+
rule_priority=int(value.audit_rules[0].rule_priority),
93+
rule_name=value.audit_rules[0].rule_name,
94+
)
95+
if best_candidate.status and best_candidate.status.name == Status.not_actionable.name:
96+
audit_suitability_rule = AuditSuitabilityRule(
97+
rule_priority=int(value.audit_rules[0].rule_priority),
98+
rule_name=value.audit_rules[0].rule_name,
99+
rule_message=value.audit_rules[0].rule_description,
100+
)
101+
102+
if best_candidate and best_candidate.status and best_candidate.status.name == Status.actionable.name:
99103
audit_redirect_rule = AuditRedirectRule(redirect_rule_details[0], redirect_rule_details[1])
100104

101-
if suggested_actions is None or suggested_actions == []:
102-
audit_actions = suggested_actions
103-
105+
if suggested_actions is None:
106+
audit_actions = None
104107
elif len(suggested_actions.actions) > 0:
105108
for action in suggested_actions.actions:
106109
audit_actions.append(
@@ -116,11 +119,11 @@ def append_audit_condition(
116119
audit_condition = AuditCondition(
117120
campaign_id=campaign_details[0],
118121
campaign_version=campaign_details[1],
119-
iteration_id=best_active_iteration.id,
120-
iteration_version=best_active_iteration.version,
122+
iteration_id=best_active_iteration.id if best_active_iteration else None,
123+
iteration_version=best_active_iteration.version if best_active_iteration else None,
121124
condition_name=condition_name,
122-
status=best_candidate.status.name,
123-
status_text=best_candidate.status.name,
125+
status=best_candidate.status.name if best_candidate and best_candidate.status else None,
126+
status_text=best_candidate.status.name if best_candidate and best_candidate.status else None,
124127
eligibility_cohorts=audit_eligibility_cohorts,
125128
eligibility_cohort_groups=audit_eligibility_cohort_groups,
126129
filter_rules=audit_filter_rule,
@@ -132,11 +135,10 @@ def append_audit_condition(
132135
g.audit_log.response.condition.append(audit_condition)
133136

134137
@staticmethod
135-
def add_response_details(response) -> None:
136-
g.audit_log.response.response_id = response.response_id
137-
g.audit_log.response.last_updated = response.meta.last_updated
138+
def add_response_details(response_id: UUID, last_updated: datetime) -> None:
139+
g.audit_log.response.response_id = response_id
140+
g.audit_log.response.last_updated = last_updated
138141

139142
@staticmethod
140-
def write_to_firehose(service: AuditService, response) -> None:
141-
AuditContext.add_response_details(response)
143+
def write_to_firehose(service: AuditService) -> None:
142144
service.audit(asdict(g.audit_log))

src/eligibility_signposting_api/audit_models.py

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,10 @@
55

66
@dataclass
77
class RequestAuditHeader:
8-
x_request_id: str = None
9-
x_correlation_id: str = None
10-
nhsd_end_user_organisation_ods: str = None
11-
nhsd_application_id: str = None
8+
x_request_id: str | None = None
9+
x_correlation_id: str | None = None
10+
nhsd_end_user_organisation_ods: str | None = None
11+
nhsd_application_id: str | None = None
1212

1313

1414
@dataclass
@@ -70,19 +70,19 @@ class AuditAction:
7070

7171
@dataclass
7272
class AuditCondition:
73-
campaign_id: str = None
74-
campaign_version: str = None
75-
iteration_id: str = None
76-
iteration_version: str = None
77-
condition_name: str = None
78-
status: str = None
79-
status_text: str = None
73+
campaign_id: str | None = None
74+
campaign_version: str | None = None
75+
iteration_id: str | None = None
76+
iteration_version: str | None = None
77+
condition_name: str | None = None
78+
status: str | None = None
79+
status_text: str | None = None
8080
eligibility_cohorts: list[AuditEligibilityCohorts] | None = None
8181
eligibility_cohort_groups: list[AuditEligibilityCohortGroups] | None = None
8282
filter_rules: AuditFilterRule | None = None
8383
suitability_rules: AuditSuitabilityRule | None = None
8484
action_rule: AuditRedirectRule | None = None
85-
actions: list[AuditAction] = field(default_factory=list)
85+
actions: list[AuditAction] | None = field(default_factory=list)
8686

8787

8888
@dataclass

src/eligibility_signposting_api/services/calculators/eligibility_calculator.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -144,6 +144,12 @@ def evaluate_eligibility(self, *, include_actions_flag: bool = True) -> eligibil
144144
redirect_rule_priority, redirect_rule_name = None, None
145145

146146
for condition_name, campaign_group in self.campaigns_grouped_by_condition_name:
147+
best_active_iteration: Iteration | None
148+
best_candidate: IterationResult
149+
best_campaign_id: CampaignID | None
150+
best_campaign_version: CampaignVersion | None
151+
best_cohort_results: dict[str, CohortGroupResult] | None
152+
147153
iteration_results: dict[
148154
str, tuple[Iteration, IterationResult, CampaignID, CampaignVersion, dict[str, CohortGroupResult]]
149155
] = {}

src/eligibility_signposting_api/services/calculators/rule_calculator.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ def evaluate_exclusion(self) -> tuple[eligibility.Status, eligibility.Reason]:
2424
reason = eligibility.Reason(
2525
rule_name=eligibility.RuleName(self.rule.name),
2626
rule_type=eligibility.RuleType(self.rule.type),
27-
rule_priority=eligibility.RulePriority(self.rule.priority),
27+
rule_priority=eligibility.RulePriority(str(self.rule.priority)),
2828
rule_description=eligibility.RuleDescription(self.rule.description),
2929
matcher_matched=matcher_matched,
3030
)

src/eligibility_signposting_api/views/eligibility.py

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ def check_eligibility(
4949
return handle_unknown_person_error(nhs_number)
5050
else:
5151
eligibility_response = build_eligibility_response(eligibility_status)
52-
AuditContext.write_to_firehose(audit_service, eligibility_response)
52+
AuditContext.write_to_firehose(audit_service)
5353
return make_response(
5454
eligibility_response.model_dump(by_alias=True, mode="json", exclude_none=True), HTTPStatus.OK
5555
)
@@ -122,9 +122,14 @@ def build_eligibility_response(eligibility_status: EligibilityStatus) -> eligibi
122122

123123
processed_suggestions.append(suggestions)
124124

125+
response_id = uuid.uuid4()
126+
updated = eligibility.LastUpdated(datetime.now(tz=UTC))
127+
128+
AuditContext.add_response_details(response_id, updated)
129+
125130
return eligibility.EligibilityResponse( # pyright: ignore[reportCallIssue]
126-
responseId=uuid.uuid4(), # pyright: ignore[reportCallIssue]
127-
meta=eligibility.Meta(lastUpdated=eligibility.LastUpdated(datetime.now(tz=UTC))),
131+
responseId=response_id, # pyright: ignore[reportCallIssue]
132+
meta=eligibility.Meta(lastUpdated=updated),
128133
# pyright: ignore[reportCallIssue]
129134
processedSuggestions=processed_suggestions,
130135
)

tests/unit/test_audit_context.py

Lines changed: 11 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,6 @@
2828
from eligibility_signposting_api.model.rules import CampaignID, CampaignVersion, Iteration, RuleType
2929
from eligibility_signposting_api.services.audit_service import AuditService
3030
from tests.fixtures.builders.model.rule import IterationFactory
31-
from tests.fixtures.builders.views.response_model.eligibility import EligibilityResponseFactory
3231

3332

3433
@pytest.fixture
@@ -141,35 +140,30 @@ def test_append_audit_condition_adds_condition_to_audit_log_on_g(app):
141140

142141

143142
def test_add_response_details_adds_to_audit_log_on_g(app):
144-
eligibility_response = EligibilityResponseFactory.build(
145-
response_id=uuid.uuid4(),
146-
meta={"last_updated": datetime(2023, 1, 1, 0, 0, tzinfo=UTC)},
147-
processed_suggestions=[],
148-
)
143+
response_id = uuid.uuid4()
144+
last_updated = datetime(2023, 1, 1, 0, 0, tzinfo=UTC)
149145

150146
with app.app_context():
151147
g.audit_log = AuditEvent()
152148

153-
AuditContext.add_response_details(eligibility_response)
149+
AuditContext.add_response_details(response_id, last_updated)
154150

155-
assert g.audit_log.response.response_id == eligibility_response.response_id
156-
assert g.audit_log.response.last_updated is eligibility_response.meta.last_updated
151+
assert g.audit_log.response.response_id == response_id
152+
assert g.audit_log.response.last_updated is last_updated
157153

158154

159155
def test_write_to_firehose_calls_audit_service_with_correct_data_from_g(app):
160156
mock_audit_service = Mock(spec=AuditService)
161-
eligibility_response = EligibilityResponseFactory.build(
162-
response_id=(uuid.uuid4()),
163-
meta={"last_updated": (datetime(2023, 1, 1, 0, 0, tzinfo=UTC))},
164-
processed_suggestions=[],
165-
)
157+
response_id = uuid.uuid4()
158+
last_updated = datetime(2023, 1, 1, 0, 0, tzinfo=UTC)
166159

167160
with app.app_context():
168161
g.audit_log = AuditEvent()
169162

170-
AuditContext.write_to_firehose(mock_audit_service, eligibility_response)
163+
AuditContext.add_response_details(response_id, last_updated)
164+
AuditContext.write_to_firehose(mock_audit_service)
171165

172-
assert g.audit_log.response.response_id == eligibility_response.response_id
173-
assert g.audit_log.response.last_updated == eligibility_response.meta.last_updated
166+
assert g.audit_log.response.response_id == response_id
167+
assert g.audit_log.response.last_updated == last_updated
174168

175169
mock_audit_service.audit.assert_called_once_with(asdict(g.audit_log))

0 commit comments

Comments
 (0)