Skip to content

Commit 6d4ff94

Browse files
authored
[PRMP-1555] Update Statistical Report to include Audit of access (#594)
1 parent 46821d5 commit 6d4ff94

File tree

9 files changed

+74
-1
lines changed

9 files changed

+74
-1
lines changed

lambdas/handlers/get_report_by_ods_handler.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,13 +58,14 @@ def handle_api_gateway_request(event):
5858
file_type = FileType.CSV
5959

6060
service = OdsReportService()
61-
logger.info(f"Starting process for ods code: {ods_code}")
61+
logger.info(f"Received a request to create a report for ODS code: {ods_code}")
6262
pre_signed_url = service.get_nhs_numbers_by_ods(
6363
ods_code=ods_code,
6464
is_pre_signed_needed=True,
6565
is_upload_to_s3_needed=True,
6666
file_type_output=file_type,
6767
)
68+
logger.info("A report has been successfully created.")
6869
return ApiGatewayResponse(
6970
200, json.dumps({"url": pre_signed_url}), "GET"
7071
).create_api_gateway_response()

lambdas/models/report/statistics.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,8 @@ class OrganisationData(StatisticData):
5858
daily_count_deleted: int = 0
5959
daily_count_searched: int = 0
6060
daily_count_users_accessing_deceased: int = 0
61+
daily_count_ods_report_requested: int = 0
62+
daily_count_ods_report_created: int = 0
6163

6264

6365
class ApplicationData(StatisticData):

lambdas/services/data_collection_service.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,8 @@
2424
LloydGeorgeRecordsSearched,
2525
LloydGeorgeRecordsStored,
2626
LloydGeorgeRecordsViewed,
27+
OdsReportsCreated,
28+
OdsReportsRequested,
2729
UniqueActiveUserIds,
2830
)
2931
from utils.common_query_filters import UploadCompleted
@@ -198,6 +200,12 @@ def get_organisation_data(
198200
daily_count_deceased = self.get_cloud_watch_query_result(
199201
CountUsersAccessedDeceasedPatient, start_date, end_date
200202
)
203+
daily_count_ods_report_requested = self.get_cloud_watch_query_result(
204+
OdsReportsRequested, start_date, end_date
205+
)
206+
daily_count_ods_report_created = self.get_cloud_watch_query_result(
207+
OdsReportsCreated, start_date, end_date
208+
)
201209
joined_query_result = self.join_results_by_ods_code(
202210
[
203211
number_of_patients,
@@ -208,6 +216,8 @@ def get_organisation_data(
208216
daily_count_stored,
209217
daily_count_searched,
210218
daily_count_deceased,
219+
daily_count_ods_report_requested,
220+
daily_count_ods_report_created,
211221
]
212222
)
213223

lambdas/services/statistical_report_service.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -213,6 +213,8 @@ def reorder_columns(self, joined_data: pl.DataFrame) -> pl.DataFrame:
213213
"weekly_count_downloaded",
214214
"weekly_count_stored",
215215
"weekly_count_deleted",
216+
"weekly_count_ods_report_requested",
217+
"weekly_count_ods_report_created",
216218
"active_users_count",
217219
"unique_active_user_ids_hashed",
218220
]

lambdas/tests/unit/helpers/data/statistic/mock_collected_data.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,8 @@
5757
daily_count_deleted=2,
5858
daily_count_searched=30,
5959
daily_count_users_accessing_deceased=13,
60+
daily_count_ods_report_created=13,
61+
daily_count_ods_report_requested=20,
6062
),
6163
OrganisationData(
6264
statistic_id=TEST_UUID,
@@ -70,6 +72,8 @@
7072
daily_count_deleted=1,
7173
daily_count_searched=50,
7274
daily_count_users_accessing_deceased=2,
75+
daily_count_ods_report_created=0,
76+
daily_count_ods_report_requested=10,
7377
),
7478
]
7579

lambdas/tests/unit/helpers/data/statistic/mock_logs_query_results.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,15 @@
8484
{"ods_code": "H81109", "daily_count_users_accessing_deceased": "13"},
8585
]
8686

87+
MOCK_ODS_REPORT_REQUESTED = [
88+
{"ods_code": "Y12345", "daily_count_ods_report_requested": "10"},
89+
{"ods_code": "H81109", "daily_count_ods_report_requested": "20"},
90+
]
91+
92+
MOCK_ODS_REPORT_CREATED = [
93+
{"ods_code": "Y12345", "daily_count_ods_report_created": "0"},
94+
{"ods_code": "H81109", "daily_count_ods_report_created": "13"},
95+
]
8796
MOCK_RESPONSE_QUERY_IN_PROGRESS = {"status": "Running"}
8897

8998
MOCK_RESPONSE_QUERY_FAILED = {"status": "Failed"}

lambdas/tests/unit/helpers/data/statistic/mock_statistic_data.py

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,8 @@
9393
daily_count_downloaded=4,
9494
daily_count_deleted=1,
9595
daily_count_users_accessing_deceased=12,
96+
daily_count_ods_report_requested=10,
97+
daily_count_ods_report_created=0,
9698
)
9799
MOCK_ORGANISATION_DATA_2 = OrganisationData(
98100
statistic_id="9ee2c3d1-97b9-4c34-b75c-83e7d1b442f4",
@@ -105,6 +107,8 @@
105107
daily_count_downloaded=1,
106108
daily_count_deleted=1,
107109
daily_count_users_accessing_deceased=22,
110+
daily_count_ods_report_requested=2,
111+
daily_count_ods_report_created=2,
108112
)
109113
MOCK_ORGANISATION_DATA_3 = OrganisationData(
110114
statistic_id="3f54cfe3-6c84-4bb2-b5b4-b786aa03b9c7",
@@ -117,6 +121,8 @@
117121
daily_count_downloaded=5,
118122
daily_count_deleted=1,
119123
daily_count_users_accessing_deceased=9,
124+
daily_count_ods_report_requested=2,
125+
daily_count_ods_report_created=2,
120126
)
121127

122128
EXPECTED_SUMMARY_ORGANISATION_DATA = pl.DataFrame(
@@ -129,6 +135,8 @@
129135
"weekly_count_deleted": 1,
130136
"weekly_count_searched": 0,
131137
"weekly_count_users_accessing_deceased": 12,
138+
"weekly_count_ods_report_requested": 10,
139+
"weekly_count_ods_report_created": 0,
132140
"average_records_per_patient": 4.5,
133141
"number_of_patients": 4,
134142
},
@@ -140,6 +148,8 @@
140148
"weekly_count_deleted": 1 + 1,
141149
"weekly_count_searched": 0,
142150
"weekly_count_users_accessing_deceased": 31,
151+
"weekly_count_ods_report_requested": 4,
152+
"weekly_count_ods_report_created": 4,
143153
"average_records_per_patient": (3.51 + 2.78) / 2,
144154
"number_of_patients": 10,
145155
},
@@ -158,6 +168,7 @@
158168
"DailyCountDownloaded": 4,
159169
"DailyCountDeleted": 1,
160170
"DailyCountUsersAccessingDeceased": 12,
171+
"DailyCountOdsReportRequested": 10,
161172
"StatisticID": "OrganisationData#5acda4bf-8b93-4ba0-8410-789aac4fcbae",
162173
},
163174
{
@@ -170,6 +181,8 @@
170181
"DailyCountDownloaded": 1,
171182
"DailyCountDeleted": 1,
172183
"DailyCountUsersAccessingDeceased": 22,
184+
"DailyCountOdsReportRequested": 2,
185+
"DailyCountOdsReportCreated": 2,
173186
"StatisticID": "OrganisationData#9ee2c3d1-97b9-4c34-b75c-83e7d1b442f4",
174187
},
175188
{
@@ -182,6 +195,8 @@
182195
"DailyCountDownloaded": 5,
183196
"DailyCountDeleted": 1,
184197
"DailyCountUsersAccessingDeceased": 9,
198+
"DailyCountOdsReportRequested": 2,
199+
"DailyCountOdsReportCreated": 2,
185200
"StatisticID": "OrganisationData#3f54cfe3-6c84-4bb2-b5b4-b786aa03b9c7",
186201
},
187202
]
@@ -301,6 +316,8 @@
301316
"Weekly count downloaded": 4,
302317
"Weekly count stored": 0,
303318
"Weekly count deleted": 1,
319+
"Weekly count ods report requested": 10,
320+
"Weekly count ods report created": 0,
304321
"Active users count": 1,
305322
"Unique active user ids hashed": str(
306323
[str(SERIALISED_APPLICATION_DATA[0]["ActiveUserIdsHashed"][0])]
@@ -321,6 +338,8 @@
321338
"Weekly count downloaded": 1 + 5,
322339
"Weekly count stored": 0 + 2,
323340
"Weekly count deleted": 1 + 1,
341+
"Weekly count ods report requested": 4,
342+
"Weekly count ods report created": 4,
324343
"Active users count": 3,
325344
"Unique active user ids hashed": str(
326345
[

lambdas/tests/unit/services/test_data_collection_service.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,8 @@
4545
MOCK_LG_DOWNLOADED,
4646
MOCK_LG_STORED,
4747
MOCK_LG_VIEWED,
48+
MOCK_ODS_REPORT_CREATED,
49+
MOCK_ODS_REPORT_REQUESTED,
4850
MOCK_PATIENT_SEARCHED,
4951
MOCK_UNIQUE_ACTIVE_USER_IDS,
5052
)
@@ -56,6 +58,8 @@
5658
LloydGeorgeRecordsSearched,
5759
LloydGeorgeRecordsStored,
5860
LloydGeorgeRecordsViewed,
61+
OdsReportsCreated,
62+
OdsReportsRequested,
5963
UniqueActiveUserIds,
6064
)
6165
from utils.common_query_filters import UploadCompleted
@@ -112,6 +116,10 @@ def mock_implementation(query_params: CloudwatchLogsQueryParams, **_kwargs):
112116
return MOCK_PATIENT_SEARCHED
113117
elif query_params == CountUsersAccessedDeceasedPatient:
114118
return MOCK_DECEASED_ACCESS
119+
elif query_params == OdsReportsRequested:
120+
return MOCK_ODS_REPORT_REQUESTED
121+
elif query_params == OdsReportsCreated:
122+
return MOCK_ODS_REPORT_CREATED
115123

116124
patched_instance = mocker.patch(
117125
"services.data_collection_service.CloudwatchService",

lambdas/utils/cloudwatch_logs_query.py

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,24 @@ class CloudwatchLogsQueryParams:
6262
""",
6363
)
6464

65+
OdsReportsRequested = CloudwatchLogsQueryParams(
66+
lambda_name="GetReportByODS",
67+
query_string="""
68+
fields @timestamp, Message, Authorisation.selected_organisation.org_ods_code AS ods_code
69+
| filter Message like /Received a request to create a report for ODS code/
70+
| stats count() AS daily_count_ods_report_requested BY ods_code
71+
""",
72+
)
73+
74+
OdsReportsCreated = CloudwatchLogsQueryParams(
75+
lambda_name="GetReportByODS",
76+
query_string="""
77+
fields @timestamp, Message, Authorisation.selected_organisation.org_ods_code AS ods_code
78+
| filter Message = 'A report has been successfully created.'
79+
| stats count() AS daily_count_ods_report_created BY ods_code
80+
""",
81+
)
82+
6583
UniqueActiveUserIds = CloudwatchLogsQueryParams(
6684
lambda_name="TokenRequestHandler",
6785
query_string="""

0 commit comments

Comments
 (0)