Files
notifications-admin/app/statistics_utils.py
T

81 lines
2.2 KiB
Python
Raw Normal View History

2016-05-25 16:51:09 +01:00
from datetime import datetime
from functools import reduce
2018-02-20 11:22:17 +00:00
from dateutil import parser
2016-05-25 16:51:09 +01:00
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):
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']),
2016-05-25 16:51:09 +01:00
week_end_datetime=parser.parse(
delivery_statistics.get('week_end', str(datetime.utcnow()))
),
**delivery_statistics
)
2016-06-08 15:15:59 +01:00
def get_formatted_percentage(x, tot):
"""
Return a percentage to one decimal place (respecting )
"""
2016-07-20 14:12:03 +01:00
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'
2016-06-08 15:15:59 +01:00
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']
}
}