Files
notifications-admin/app/statistics_utils.py
Chris Hill-Scott f3a0c505bd Enforce order and style of imports
Done using isort[1], with the following command:
```
isort -rc ./app ./tests
```

Adds linting to the `run_tests.sh` script to stop badly-sorted imports
getting re-introduced.

Chosen style is ‘Vertical Hanging Indent’ with trailing commas, because
I think it gives the cleanest diffs, eg:
```
from third_party import (
    lib1,
    lib2,
    lib3,
    lib4,
)
```

1. https://pypi.python.org/pypi/isort
2018-02-27 16:35:13 +00:00

90 lines
2.4 KiB
Python

from datetime import datetime
from functools import reduce
from dateutil import parser
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']),
week_end_datetime=parser.parse(
delivery_statistics.get('week_end', str(datetime.utcnow()))
),
**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 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']
}
}
def get_failure_rate_for_job(job):
if not job.get('notifications_delivered'):
return 1 if job.get('notifications_failed') else 0
return (
job.get('notifications_failed', 0) /
(job.get('notifications_failed', 0) + job.get('notifications_delivered', 0))
)
def add_rate_to_job(job):
return dict(
failure_rate=(get_failure_rate_for_job(job)) * 100,
**job
)