Files
notifications-admin/app/statistics_utils.py
Alex Janousek 8d33f28b76 Refactored reports to use pregenerated docs instead (#2831)
* Refactored reports to use pregenerated docs instead

* Fixed e2e test

* Fixed anothr bug

* Cleanup

* Fixed timezone conversion

* Updated ref files

* Updated reference files, refreshed ui/ux for report generation. Buttons toggle on and off based on if report exists

* Fixed linting errors, removed pytz

* Fixed test failure

* e2e test fix

* Speeding up unit tests

* Removed python time library that was causing performance issues with unit tests

* Updated poetry lock

* Unit test improvements

* Made change that ken reccomended
2025-08-15 15:02:54 -04:00

82 lines
2.3 KiB
Python

from datetime import datetime
from functools import reduce
from dateutil import parser
from app.utils.csv import get_user_preferred_timezone_obj
def sum_of_statistics(delivery_statistics):
statistics_keys = (
"emails_delivered",
"emails_requested",
"emails_failed",
"sms_requested",
"sms_delivered",
"sms_failed",
)
if not delivery_statistics or not delivery_statistics[0]:
return {key: 0 for key in statistics_keys}
return reduce(
lambda x, y: {key: x.get(key, 0) + y.get(key, 0) for key in statistics_keys},
delivery_statistics,
)
def add_rates_to(delivery_statistics):
preferred_tz = get_user_preferred_timezone_obj()
return dict(
emails_failure_rate=get_formatted_percentage(
delivery_statistics["emails_failed"],
delivery_statistics["emails_requested"],
),
sms_failure_rate=get_formatted_percentage(
delivery_statistics["sms_failed"], delivery_statistics["sms_requested"]
),
week_end_datetime=parser.parse(
delivery_statistics.get("week_end", str(datetime.now(preferred_tz)))
),
**delivery_statistics
)
def get_formatted_percentage(x, tot):
"""
Return a percentage to one decimal place (respecting )
"""
return "{0:.1f}".format((float(x) / tot * 100)) if tot else "0"
def get_formatted_percentage_two_dp(x, tot):
"""
Return a percentage to two decimal places
"""
return "{0:.2f}".format((float(x) / tot * 100)) if tot else "0"
def statistics_by_state(statistics):
return {
"sms": {
"processed": statistics["sms_requested"],
"sending": (
statistics["sms_requested"]
- statistics["sms_failed"]
- statistics["sms_delivered"]
),
"delivered": statistics["sms_delivered"],
"failed": statistics["sms_failed"],
},
"email": {
"processed": statistics["emails_requested"],
"sending": (
statistics["emails_requested"]
- statistics["emails_failed"]
- statistics["emails_delivered"]
),
"delivered": statistics["emails_delivered"],
"failed": statistics["emails_failed"],
},
}