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(
|
2016-07-20 11:46:29 +01:00
|
|
|
emails_failure_rate=get_formatted_percentage(
|
|
|
|
|
delivery_statistics['emails_failed'],
|
|
|
|
|
delivery_statistics['emails_requested']),
|
2016-07-19 17:10:48 +01:00
|
|
|
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
|
|
|
|
|
|
|
|
|
2016-07-19 17:10:48 +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'
|
2016-07-19 17:10:48 +01:00
|
|
|
|
|
|
|
|
|
2018-08-14 13:34:53 +01:00
|
|
|
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']
|
|
|
|
|
}
|
|
|
|
|
}
|