Refactored reports to use pregenerated docs instead

This commit is contained in:
alexjanousekGSA
2025-08-13 20:37:41 -04:00
parent a12ed166d5
commit 90abf9c90e
4 changed files with 313 additions and 2 deletions

View File

@@ -1,8 +1,10 @@
# -*- coding: utf-8 -*-
from datetime import datetime
import pytz
from flask import (
Response,
current_app,
flash,
jsonify,
render_template,
@@ -15,6 +17,8 @@ from app import current_service, job_api_client, notification_api_client
from app.enums import ServicePermission
from app.main import main
from app.notify_client.api_key_api_client import KEY_TYPE_TEST
from app.utils.s3_csv import convert_s3_csv_timestamps
from app.s3_client.s3_csv_client import s3download
from app.utils import (
DELIVERED_STATUSES,
FAILURE_STATUSES,
@@ -25,6 +29,7 @@ from app.utils import (
from app.utils.csv import generate_notifications_csv, get_user_preferred_timezone
from app.utils.templates import get_template
from app.utils.user import user_has_permissions
from notifications_utils.s3 import S3ObjectNotFound
@main.route("/services/<uuid:service_id>/notification/<uuid:notification_id>")
@@ -135,6 +140,28 @@ def get_all_personalisation_from_notification(notification):
return notification["personalisation"]
PERIOD_TO_S3_FILENAME = {
"one_day": "1-day-report",
"three_day": "3-day-report",
"five_day": "5-day-report",
"seven_day": "7-day-report",
}
def generate_empty_report_csv():
headers = [
"Phone Number",
"Template",
"Sent by",
"Batch File",
"Carrier Response",
"Status",
"Time",
"Carrier",
]
yield ",".join(headers) + "\n"
@main.route("/services/<uuid:service_id>/download-notifications.csv")
@user_has_permissions(ServicePermission.VIEW_ACTIVITY)
def download_notifications_csv(service_id):
@@ -144,14 +171,43 @@ def download_notifications_csv(service_id):
service_data_retention_days = current_service.get_days_of_retention(
filter_args.get("message_type")[0], number_of_days
)
file_time = datetime.now().strftime("%Y-%m-%d %I:%M:%S %p")
user_tz = pytz.timezone(get_user_preferred_timezone())
file_time = datetime.now(user_tz).strftime("%Y-%m-%d %I:%M:%S %p")
file_time = f"{file_time} {get_user_preferred_timezone()}"
job_id = request.args.get("job_id")
if not job_id and number_of_days in PERIOD_TO_S3_FILENAME:
try:
s3_report_id = PERIOD_TO_S3_FILENAME[number_of_days]
s3_file_content = s3download(service_id, s3_report_id)
return Response(
stream_with_context(convert_s3_csv_timestamps(s3_file_content)),
mimetype="text/csv",
headers={
"Content-Disposition": 'inline; filename="{} - {} - {} report.csv"'.format(
file_time,
filter_args["message_type"][0],
current_service.name,
)
},
)
except S3ObjectNotFound:
return Response(
stream_with_context(generate_empty_report_csv()),
mimetype="text/csv",
headers={
"Content-Disposition": 'inline; filename="{} - {} - {} report.csv"'.format(
file_time,
filter_args["message_type"][0],
current_service.name,
)
},
)
return Response(
stream_with_context(
generate_notifications_csv(
service_id=service_id,
job_id=None,
job_id=job_id,
status=filter_args.get("status"),
page=request.args.get("page", 1),
page_size=10000,