22from dataclasses import asdict
33from datetime import UTC , datetime
44from operator import attrgetter
5+ from uuid import UUID
56
67from 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 ))
0 commit comments