diff --git a/app/main/views/dashboard.py b/app/main/views/dashboard.py index 68bac3f3b..0f368e360 100644 --- a/app/main/views/dashboard.py +++ b/app/main/views/dashboard.py @@ -1,11 +1,9 @@ from datetime import datetime, date, timedelta from collections import namedtuple from itertools import groupby -import json from flask import ( render_template, - redirect, url_for, session, jsonify, @@ -21,7 +19,7 @@ from app import ( service_api_client, template_statistics_client ) -from app.statistics_utils import sum_of_statistics, add_rates_to, add_rate_to_jobs +from app.statistics_utils import add_rates_to, get_formatted_percentage, add_rate_to_jobs from app.utils import user_has_permissions @@ -151,10 +149,13 @@ def get_dashboard_partials(service_id): job_api_client.get_job(service_id, limit_days=7)['data'] )) + service = service_api_client.get_service(service_id, detailed=True) + return { 'totals': render_template( 'views/dashboard/_totals.html', - statistics=get_dashboard_totals(service_id) + service_id=service_id, + statistics=get_dashboard_totals(service) ), 'template-statistics': render_template( 'views/dashboard/template-statistics.html', @@ -176,10 +177,11 @@ def get_dashboard_partials(service_id): } -def get_dashboard_totals(service_id): - return add_rates_to(sum_of_statistics( - statistics_api_client.get_statistics_for_service(service_id, limit_days=7)['data'] - )) +def get_dashboard_totals(service): + for msg_type in service['statistics']: + msg_type['failed_percentage'] = get_formatted_percentage(msg_type['failed'], msg_type['requested']) + msg_type['show_warning'] = msg_type['failed_percentage'] > 3 + return service['statistics'] def calculate_usage(usage): diff --git a/app/statistics_utils.py b/app/statistics_utils.py index cba2484af..122407a67 100644 --- a/app/statistics_utils.py +++ b/app/statistics_utils.py @@ -31,18 +31,12 @@ def sum_of_statistics(delivery_statistics): def add_rates_to(delivery_statistics): return dict( - emails_failure_rate=( - "{0:.1f}".format( - float(delivery_statistics['emails_failed']) / delivery_statistics['emails_requested'] * 100 - ) - if delivery_statistics['emails_requested'] else 0 - ), - sms_failure_rate=( - "{0:.1f}".format( - float(delivery_statistics['sms_failed']) / delivery_statistics['sms_requested'] * 100 - ) - if delivery_statistics['sms_requested'] else 0 - ), + email_failure_rate=get_formatted_percentage( + delivery_statistics['email_failed'], + delivery_statistics['email_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())) ), @@ -50,6 +44,13 @@ def add_rates_to(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': { diff --git a/app/templates/views/dashboard/_totals.html b/app/templates/views/dashboard/_totals.html index 213f73c93..ce5df5482 100644 --- a/app/templates/views/dashboard/_totals.html +++ b/app/templates/views/dashboard/_totals.html @@ -4,24 +4,24 @@
{{ big_number_with_status( - statistics.emails_requested, - message_count_label(statistics.emails_requested, 'email', suffix=''), - statistics.emails_failed, - statistics.get('emails_failure_rate', 0.0), - statistics.get('emails_failure_rate', 0)|float > 3, - failure_link=url_for(".view_notifications", service_id=current_service.id, message_type='email', status='failed'), - link=url_for(".view_notifications", service_id=current_service.id, message_type='email', status='sending,delivered,failed') + statistics['email']['requested'], + message_count_label(statistics['email']['requested'], 'email', suffix=''), + statistics['email']['failed'], + statistics['email']['failed_percentage'], + statistics['email']['show_warning'], + failure_link=url_for(".view_notifications", service_id=id, message_type='email', status='failed'), + link=url_for(".view_notifications", service_id=id, message_type='email', status='sending,delivered,failed') ) }}
{{ big_number_with_status( - statistics.sms_requested, - message_count_label(statistics.sms_requested, 'sms', suffix=''), - statistics.sms_failed, - statistics.get('sms_failure_rate', 0.0), - statistics.get('sms_failure_rate', 0)|float > 3, - failure_link=url_for(".view_notifications", service_id=current_service.id, message_type='sms', status='failed'), - link=url_for(".view_notifications", service_id=current_service.id, message_type='sms', status='sending,delivered,failed') + statistics['sms']['requested'], + message_count_label(statistics['sms']['requested'], 'sms', suffix=''), + statistics['sms']['failed'], + statistics['sms']['failed_percentage'], + statistics['sms']['show_warning'], + failure_link=url_for(".view_notifications", service_id=service_id, message_type='sms', status='failed'), + link=url_for(".view_notifications", service_id=service_id, message_type='sms', status='sending,delivered,failed') ) }}
diff --git a/tests/__init__.py b/tests/__init__.py index 7841a02e7..ac64b3848 100644 --- a/tests/__init__.py +++ b/tests/__init__.py @@ -13,11 +13,11 @@ class TestClient(FlaskClient): session['user_id'] = user.id session['_fresh'] = True if mocker: - mocker.patch('app.user_api_client.get_user', return_value=user) - mocker.patch('app.events_api_client.create_event') - if mocker and service: - session['service_id'] = service['id'] - mocker.patch('app.service_api_client.get_service', return_value={'data': service}) + get_user_mock = mocker.patch('app.user_api_client.get_user', return_value=user) + create_event_mock = mocker.patch('app.events_api_client.create_event') + if service: + session['service_id'] = service['id'] + get_service_mock = mocker.patch('app.service_api_client.get_service', return_value={'data': service}) login_user(user, remember=True) def login_fresh(self): diff --git a/tests/app/main/views/test_dashboard.py b/tests/app/main/views/test_dashboard.py index df7f35f32..661ee7ee6 100644 --- a/tests/app/main/views/test_dashboard.py +++ b/tests/app/main/views/test_dashboard.py @@ -417,18 +417,19 @@ def test_aggregate_template_stats(): assert item['usage_count'] == 206 -def test_service_dashboard_updates_gets_detailed_service(mocker, +def test_service_dashboard_updates_gets_dashboard_totals(mocker, app_, active_user_with_permissions, service_one, - mock_get_service, mock_get_service_statistics, - mock_get_usage, - ): + mock_get_usage): + dashboard_totals = mocker.patch('app.main.views.dashboard.get_dashboard_totals', return_value={ + 'email': {'requested': 0, 'delivered': 0, 'failed': 0}, + 'sms': {'requested': 0, 'delivered': 0, 'failed': 0} + }) + with app_.test_request_context(), app_.test_client() as client: client.login(active_user_with_permissions, mocker, service_one) response = client.get(url_for('main.service_dashboard', service_id=SERVICE_ONE_ID)) assert response.status_code == 200 - # mock_get_service_statistics.assert_not_called() - # mock_get_service.assert_called_once_with(service_one.id, detailed=True)