Add option to exclude test key stats on platform admin page

This page currently includes all notifications for all services, including
those sent using a test key. Stats on all other pages exclude test key usage,
though, which can lead to confusion for admins comparing numbers between
pages. Adding the option to toggle between including and excluding test key
usage on the platform admin page gives context for this difference, and allows
admins to see live usage of the platform as well as load associated with test
key usage.
This commit is contained in:
Jenny Duckett
2016-12-05 12:23:29 +00:00
parent fc2ea8aeb8
commit c88a961e04
3 changed files with 85 additions and 26 deletions

View File

@@ -1,6 +1,9 @@
import itertools import itertools
from flask import render_template from flask import (
render_template,
request
)
from flask_login import login_required from flask_login import login_required
from app import service_api_client from app import service_api_client
@@ -13,10 +16,15 @@ from app.statistics_utils import get_formatted_percentage
@login_required @login_required
@user_has_permissions(admin_override=True) @user_has_permissions(admin_override=True)
def platform_admin(): def platform_admin():
include_from_test_key = request.args.get('include_from_test_key') != 'False'
# specifically DO get inactive services # specifically DO get inactive services
services = service_api_client.get_services({'detailed': True})['data'] api_args = {'detailed': True}
if not include_from_test_key:
api_args['include_from_test_key'] = False
services = service_api_client.get_services(api_args)['data']
return render_template( return render_template(
'views/platform-admin.html', 'views/platform-admin.html',
include_from_test_key=include_from_test_key,
**get_statistics(sorted( **get_statistics(sorted(
services, services,
key=lambda service: (service['active'], service['created_at']), key=lambda service: (service['active'], service['created_at']),

View File

@@ -95,31 +95,45 @@
}, },
]) }} ]) }}
<div class="grid-row">
<div class="column-one-third">
<nav class="navigation">
<ul>
{% if include_from_test_key %}
<li>Including test key (<a href="{{ url_for('.platform_admin', include_from_test_key=False) }}">change</a>)</li>
{% else %}
<li>Excluding test key (<a href="{{ url_for('.platform_admin') }}">change</a>)</li>
{% endif %}
</ul>
</nav>
</div>
<main role="main" class="column-two-thirds column-main">
<h2 class='heading-medium'>Today</h2>
<div class="grid-row bottom-gutter">
<div class="column-half">
{{ big_number_with_status(
global_stats.email.delivered,
message_count_label(global_stats.email.delivered, 'email'),
global_stats.email.failed,
global_stats.email.failure_rate,
global_stats.email.failure_rate|float > 3,
) }}
</div>
<div class="column-half">
{{ big_number_with_status(
global_stats.sms.delivered,
message_count_label(global_stats.sms.delivered, 'sms'),
global_stats.sms.failed,
global_stats.sms.failure_rate,
global_stats.sms.failure_rate|float > 3,
) }}
</div>
</div>
<h2 class='heading-medium'>Today</h2> {{ services_table(live_services, 'Live services') }}
<div class="grid-row bottom-gutter">
<div class="column-half"> {{ services_table(trial_mode_services, 'Trial mode services') }}
{{ big_number_with_status( </main>
global_stats.email.delivered,
message_count_label(global_stats.email.delivered, 'email'),
global_stats.email.failed,
global_stats.email.failure_rate,
global_stats.email.failure_rate|float > 3,
) }}
</div>
<div class="column-half">
{{ big_number_with_status(
global_stats.sms.delivered,
message_count_label(global_stats.sms.delivered, 'sms'),
global_stats.sms.failed,
global_stats.sms.failure_rate,
global_stats.sms.failure_rate|float > 3,
) }}
</div>
</div> </div>
{{ services_table(live_services, 'Live services') }}
{{ services_table(trial_mode_services, 'Trial mode services') }}
{% endblock %} {% endblock %}

View File

@@ -87,6 +87,43 @@ def test_should_render_platform_admin_page(
mock_get_detailed_services.assert_called_once_with({'detailed': True}) mock_get_detailed_services.assert_called_once_with({'detailed': True})
@pytest.mark.parametrize('include_from_test_key, expected_text, unexpected_text, api_args', [
(True, 'Including test key', 'Excluding test key', {'detailed': True}),
(False, 'Excluding test key', 'Including test key', {'detailed': True, 'include_from_test_key': False})
])
def test_platform_admin_toggle_including_from_test_key(
include_from_test_key,
expected_text,
unexpected_text,
api_args,
app_,
platform_admin_user,
mocker,
mock_get_detailed_services
):
with app_.test_request_context():
with app_.test_client() as client:
mock_get_user(mocker, user=platform_admin_user)
client.login(platform_admin_user)
response = client.get(url_for('main.platform_admin', include_from_test_key=str(include_from_test_key)))
assert response.status_code == 200
resp_data = response.get_data(as_text=True)
assert expected_text in resp_data
assert unexpected_text not in resp_data
page = BeautifulSoup(response.data.decode('utf-8'), 'html.parser')
change_link = page.find('a', text='change')
assert change_link['href']
query_param = 'include_from_test_key=False'
if include_from_test_key:
assert query_param in change_link['href']
else:
assert query_param not in change_link['href']
mock_get_detailed_services.assert_called_once_with(api_args)
def test_create_global_stats_sets_failure_rates(fake_uuid): def test_create_global_stats_sets_failure_rates(fake_uuid):
services = [ services = [
service_json(fake_uuid, 'a', []), service_json(fake_uuid, 'a', []),