mirror of
https://github.com/GSA/notifications-admin.git
synced 2026-02-06 03:13:42 -05:00
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:
@@ -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;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -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):
|
||||
|
||||
@@ -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',
|
||||
|
||||
61
app/templates/views/providers/edit-sms-provider-ratio.html
Normal file
61
app/templates/views/providers/edit-sms-provider-ratio.html
Normal 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 (' '|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 %}
|
||||
Reference in New Issue
Block a user