Add page showing priority of two SMS providers

It’s not very useful to know the priority of one provider without
knowing the other. And these pages were never really designed, so they
weren’t super easy to understand anyway.

This commit adds a page that takes the first two text message providers
and shows their relative priority against each other.

It follows the design of the events page, as a pattern for showing a
log of historical events.
This commit is contained in:
Chris Hill-Scott
2019-12-02 14:29:34 +00:00
parent 9b12747bb4
commit 16ebdfeb8b
4 changed files with 208 additions and 2 deletions

View File

@@ -26,4 +26,61 @@ $item-top-padding: $gutter-half;
color: $secondary-text-colour;
}
&-percentage {
$axis-thickness: 2px;
border-bottom: $axis-thickness solid $black;
position: relative;
margin-bottom: 30px;
height: 35px;
&:before,
&:after {
content: "";
position: absolute;
bottom: -6px;
left: 0;
height: 10px;
width: $axis-thickness;
background: $black;
}
&:after {
left: auto;
right: 0;
}
&-marker {
$size: 20px;
$border-thickness: 7px;
$text-width: 100px;
display: block;
width: $size;
height: $size;
position: absolute;
top: 35px - ($size / 2) - ($border-thickness - ($axis-thickness / 2));
margin-left: 0 - ($size / 2) - $border-thickness;
background: $black;
border-radius: $size;
border: $border-thickness solid $white;
}
&-left-label,
&-right-label {
width: 100%;
position: absolute;
top: 0;
}
&-left-label {
left: 0;
}
&-right-label {
right: 0;
text-align: right;
}
}
}

View File

@@ -1,11 +1,17 @@
from flask import render_template, url_for
from collections import defaultdict
from datetime import datetime
from operator import itemgetter
from flask import abort, render_template, url_for
from werkzeug.utils import redirect
from app import provider_client
from app import format_date_numeric, provider_client
from app.main import main
from app.main.forms import ProviderForm
from app.utils import user_is_platform_admin
PROVIDER_PRIORITY_MEANING_SWITCHOVER = datetime(2019, 11, 29, 11, 0)
@main.route("/providers")
@user_is_platform_admin
@@ -51,6 +57,84 @@ def edit_provider(provider_id):
return render_template('views/providers/edit-provider.html', form=form, provider=provider)
@main.route("/provider/edit-sms-provider-ratio", methods=['GET', 'POST'])
@user_is_platform_admin
def edit_sms_provider_ratio():
providers = sorted([
provider
for provider in provider_client.get_all_providers()['provider_details']
if provider['notification_type'] == 'sms'
], key=itemgetter('identifier'), reverse=True)
if len(providers) < 2:
abort(400)
return render_template(
'views/providers/edit-sms-provider-ratio.html',
versions=_chunk_versions_by_day(_get_versions(providers[0], providers[1])),
)
def _get_versions(provider0, provider1):
versions = sorted((
provider_client.get_provider_versions(provider0['id'])['data'] +
provider_client.get_provider_versions(provider1['id'])['data']
), key=lambda version: version['updated_at'] or '', reverse=True)
for index, version in enumerate(versions):
previous_version = get_previous_version(
versions,
index,
version['identifier'],
)
if (
(version['updated_at'] or '0') < str(PROVIDER_PRIORITY_MEANING_SWITCHOVER)
):
version['priority'], previous_version['priority'] = (
int(version['priority'] > previous_version['priority']),
int(version['priority'] <= previous_version['priority'])
)
if version['identifier'] == provider0['identifier']:
fresh_version = version.copy()
fresh_version['other_provider'] = previous_version.copy()
yield fresh_version
elif previous_version['identifier'] in {provider0['identifier'], None}:
fresh_version = previous_version.copy()
fresh_version['other_provider'] = version.copy()
yield fresh_version
def get_previous_version(versions, start_index, current_provider_identifier):
for index, version in enumerate(versions):
if index < start_index:
continue
if current_provider_identifier == version['identifier']:
continue
return version
return {
'identifier': None,
'priority': 999,
'updated_at': None,
}
def _chunk_versions_by_day(versions):
days = defaultdict(list)
for version in sorted(versions, key=lambda version: version['updated_at'] or '', reverse=True):
days[
format_date_numeric(version['updated_at']) if version['updated_at'] else ''
].append(version)
return sorted(days.items(), reverse=True)
@main.route("/provider/<uuid:provider_id>")
@user_is_platform_admin
def view_provider(provider_id):

View File

@@ -89,6 +89,7 @@ class HeaderNavigation(Navigation):
'clear_cache',
'create_email_branding',
'create_letter_branding',
'edit_sms_provider_ratio',
'email_branding',
'find_services_by_name',
'find_users_by_email',
@@ -497,6 +498,7 @@ class MainNavigation(Navigation):
'edit_organisation_name',
'edit_organisation_type',
'edit_provider',
'edit_sms_provider_ratio',
'edit_user_org_permissions',
'email_branding',
'email_not_received',
@@ -717,6 +719,7 @@ class CaseworkNavigation(Navigation):
'edit_organisation_name',
'edit_organisation_type',
'edit_provider',
'edit_sms_provider_ratio',
'edit_service_template',
'edit_template_postage',
'edit_user_email',
@@ -1002,6 +1005,7 @@ class OrgNavigation(Navigation):
'edit_data_retention',
'edit_provider',
'edit_service_template',
'edit_sms_provider_ratio',
'edit_template_postage',
'edit_user_email',
'edit_user_mobile_number',

View File

@@ -0,0 +1,61 @@
{% extends "views/platform-admin/_base_template.html" %}
{% from "components/textbox.html" import textbox %}
{% from "components/page-header.html" import page_header %}
{% from "components/page-footer.html" import page_footer %}
{% from "components/form.html" import form_wrapper %}
{% block per_page_title %}
Text message providers
{% endblock %}
{% block platform_admin_content %}
{{ page_header('Text message providers') }}
{% call form_wrapper() %}
{% endcall %}
{% for day, versions in versions %}
<h2 class="heading-small top-gutter">
{% if day %}
{{ day|format_date_human|title }}
{% else %}
Start
{% endif %}
</h2>
<ul class="bottom-gutter">
{% for version in versions %}
<li class="history-list-item">
<div class="grid-row">
<div class="column-one-third">
<div class="history-list-user">
{{ version.created_by.name or ('&nbsp;'|safe) }}
</div>
{% if version.updated_at %}
<div class="history-list-time">
{{ version.updated_at|format_time }}
</div>
{% endif %}
</div>
<div class="column-two-thirds">
{% set percentage = (version.priority / (version.priority + version.other_provider.priority) * 100) %}
<div class="history-list-percentage">
<div class="history-list-percentage-left-label">
{{ version.display_name }}<br><br>
{{ percentage|format_thousands }}%
</div>
<div class="history-list-percentage-right-label">
{{ version.other_provider.display_name }}<br><br>
{{ (100 - percentage)|format_thousands }}%
</div>
<div class="history-list-percentage-marker" style="left: {{ (100 -percentage)|format_thousands }}%"></div>
</div>
</div>
</div>
</li>
{% endfor %}
</ul>
{% endfor %}
{% endblock %}