diff --git a/app/assets/stylesheets/views/history.scss b/app/assets/stylesheets/views/history.scss index b971a1726..2b31ef45f 100644 --- a/app/assets/stylesheets/views/history.scss +++ b/app/assets/stylesheets/views/history.scss @@ -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; + } + + } + } diff --git a/app/main/views/providers.py b/app/main/views/providers.py index 003f054ff..eecbf2176 100644 --- a/app/main/views/providers.py +++ b/app/main/views/providers.py @@ -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/") @user_is_platform_admin def view_provider(provider_id): diff --git a/app/navigation.py b/app/navigation.py index 018c903e4..4e9cdef8c 100644 --- a/app/navigation.py +++ b/app/navigation.py @@ -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', diff --git a/app/templates/views/providers/edit-sms-provider-ratio.html b/app/templates/views/providers/edit-sms-provider-ratio.html new file mode 100644 index 000000000..2527ba733 --- /dev/null +++ b/app/templates/views/providers/edit-sms-provider-ratio.html @@ -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 %} +

+ {% if day %} + {{ day|format_date_human|title }} + {% else %} + Start + {% endif %} +

+ + {% endfor %} + +{% endblock %}