Merge pull request #3165 from alphagov/letters-always-on-usage

Always show letters on the dashboard and usage page
This commit is contained in:
Chris Hill-Scott
2019-11-04 14:49:47 +00:00
committed by GitHub
6 changed files with 74 additions and 229 deletions

View File

@@ -98,6 +98,20 @@
}
.usage-table {
.table-field-heading-first {
width: 35%; // 33.33% + fudge
}
.table-row {
th {
width: 17.5% // 16.67% + fudge
}
}
}
%table-field,
.table-field {

View File

@@ -133,11 +133,8 @@ def usage(service_id):
units = billing_api_client.get_billable_units(service_id, year)
yearly_usage = billing_api_client.get_service_usage(service_id, year)
usage_template = 'views/usage.html'
if current_service.has_permission('letter'):
usage_template = 'views/usage-with-letters.html'
return render_template(
usage_template,
'views/usage.html',
months=list(get_free_paid_breakdown_for_billable_units(
year,
free_sms_allowance,
@@ -293,11 +290,8 @@ def get_dashboard_partials(service_id):
]
stats = aggregate_notifications_stats(all_statistics)
column_width, max_notifiction_count = get_column_properties(
number_of_columns=(
3 if current_service.has_permission('letter') else 2
)
)
column_width, max_notifiction_count = get_column_properties(3)
dashboard_totals = get_dashboard_totals(stats),
highest_notification_count = max(
sum(

View File

@@ -27,19 +27,17 @@
smaller=smaller_font_size
) }}
</div>
{% if current_service.has_permission('letter') %}
<div id="total-letters" class="{{column_width}}">
{{ big_number_with_status(
statistics['letter']['requested'],
message_count_label(statistics['letter']['requested'], 'letter', suffix='sent'),
statistics['letter']['failed'],
statistics['letter']['failed_percentage'],
statistics['letter']['show_warning'],
failure_link=url_for(".view_notifications", service_id=service_id, message_type='letter', status='failed'),
link=url_for(".view_notifications", service_id=service_id, message_type='letter', status=''),
smaller=smaller_font_size
) }}
</div>
{% endif %}
<div id="total-letters" class="{{column_width}}">
{{ big_number_with_status(
statistics['letter']['requested'],
message_count_label(statistics['letter']['requested'], 'letter', suffix='sent'),
statistics['letter']['failed'],
statistics['letter']['failed_percentage'],
statistics['letter']['show_warning'],
failure_link=url_for(".view_notifications", service_id=service_id, message_type='letter', status='failed'),
link=url_for(".view_notifications", service_id=service_id, message_type='letter', status=''),
smaller=smaller_font_size
) }}
</div>
</div>
</div>

View File

@@ -1,140 +0,0 @@
{% from "components/big-number.html" import big_number %}
{% from "components/message-count-label.html" import message_count_label %}
{% from "components/table.html" import list_table, field, hidden_field_heading, row_heading, text_field %}
{% from "components/pill.html" import pill %}
{% extends "withnav_template.html" %}
{% block service_page_title %}
Usage
{% endblock %}
{% block maincolumn_content %}
<h1 class='heading-medium'>Usage</h1>
<div class="bottom-gutter">
{{ pill(years, selected_year, big_number_args={'smallest': True}) }}
</div>
<div id='pill-selected-item'>
<div class='grid-row'>
<div class='column-one-third'>
<h2 class='heading-small'>Emails</h2>
<div class="keyline-block">
{{ big_number(emails_sent, 'sent', smaller=True) }}
{{ big_number("Unlimited", 'free allowance', smaller=True) }}
</div>
</div>
<div class='column-one-third'>
<h2 class='heading-small'>Text messages</h2>
<div class="keyline-block">
{{ big_number(sms_sent, 'sent', smaller=True) }}
{{ big_number(sms_free_allowance, 'free allowance', smaller=True) }}
{{ big_number(sms_allowance_remaining, 'free allowance remaining', smaller=True) }}
{% if sms_chargeable %}
{{ big_number(
sms_chargeable,
'at {:.2f} pence per message'.format(sms_rate * 100),
smaller=True
) }}
{% endif %}
</div>
</div>
<div class='column-one-third'>
<h2 class='heading-small'>Letters</h2>
<div class="keyline-block">
{{ big_number(letter_sent, 'sent', smaller=True) }}
</div>
</div>
</div>
<div class='grid-row'>
<div class='column-one-third'>
<div class="keyline-block">
&nbsp;
</div>
</div>
<div class='column-one-third'>
<div class="keyline-block">
{{ big_number(
(sms_chargeable * sms_rate),
'spent',
currency="£",
smaller=True
) }}
</div>
</div>
<div class='column-one-third'>
<div class="keyline-block">
{{ big_number(
letter_cost,
'spent',
currency="£",
smaller=True
) }}
</div>
</div>
</div>
{% if months %}
<div class="dashboard-table body-copy-table">
{% call(month, row_index) list_table(
months,
caption="Total spend",
caption_visible=False,
empty_message='',
field_headings=[
'By month',
hidden_field_heading('Cost'),
],
field_headings_visible=True
) %}
{% call row_heading() %}
{{ month.name }}
{% endcall %}
{% call field(align='left') %}
{{ big_number(
(sms_rate * month.paid) + month.letter_total,
currency="£",
smallest=True
) }}
<ul>
{% if month.free %}
<li class="tabular-numbers">{{ "{:,}".format(month.free) }} free {{ message_count_label(month.free, 'sms', '') }}</li>
{% endif %}
{% if month.paid %}
<li class="tabular-numbers">{{ "{:,}".format(month.paid) }} {{ message_count_label(month.paid, 'sms', '') }}at
{{- ' {:.2f}p'.format(sms_rate * 100) }}</li>
{% endif %}
{% for letter in month.letters%}
{% if letter[0] %}
<li class="tabular-numbers">{{ "{:,} {}".format(letter[0], letter[3])}} class {{ message_count_label(letter[0], 'letter', '') }}at
{{ '{:.0f}p'.format(letter[1] * 100) }}</li>
{% endif %}
{% endfor %}
{% if not (month.free or month.paid or month.letters) %}
<li aria-hidden="true"></li>
{% endif %}
</ul>
{% endcall %}
{% endcall %}
</div>
{% endif %}
</div>
<div class="grid-row">
<div class="column-half">
<p class="align-with-heading-copy">
Financial year ends 31 March.
</p>
</div>
<div class="column-half">
<p class="align-with-heading-copy">
What counts as 1 text message?<br />
See <a href="{{ url_for('.pricing') }}">pricing</a>.
</p>
</div>
</div>
{% endblock %}

View File

@@ -18,14 +18,14 @@
</div>
<div id='pill-selected-item'>
<div class='grid-row'>
<div class='column-half'>
<div class='column-one-third'>
<h2 class='heading-small'>Emails</h2>
<div class="keyline-block">
{{ big_number(emails_sent, 'sent', smaller=True) }}
{{ big_number("Unlimited", 'free allowance', smaller=True) }}
</div>
</div>
<div class='column-half'>
<div class='column-one-third'>
<h2 class='heading-small'>Text messages</h2>
<div class="keyline-block">
{{ big_number(sms_sent, 'sent', smaller=True) }}
@@ -40,15 +40,21 @@
{% endif %}
</div>
</div>
<div class='column-one-third'>
<h2 class='heading-small'>Letters</h2>
<div class="keyline-block">
{{ big_number(letter_sent, 'sent', smaller=True) }}
</div>
</div>
</div>
<div class='grid-row'>
<div class='column-half'>
<div class='column-one-third'>
<div class="keyline-block">
&nbsp;
</div>
</div>
<div class='column-half'>
<div class='column-one-third'>
<div class="keyline-block">
{{ big_number(
(sms_chargeable * sms_rate),
@@ -58,10 +64,21 @@
) }}
</div>
</div>
<div class='column-one-third'>
<div class="keyline-block">
{{ big_number(
letter_cost,
'spent',
currency="£",
smaller=True
) }}
</div>
</div>
</div>
{% if months %}
<div class="dashboard-table body-copy-table">
<div class="dashboard-table usage-table body-copy-table">
{% call(month, row_index) list_table(
months,
caption="Total spend",
@@ -78,7 +95,7 @@
{% endcall %}
{% call field(align='left') %}
{{ big_number(
sms_rate * month.paid,
(sms_rate * month.paid) + month.letter_total,
currency="£",
smallest=True
) }}
@@ -87,10 +104,16 @@
<li class="tabular-numbers">{{ "{:,}".format(month.free) }} free {{ message_count_label(month.free, 'sms', '') }}</li>
{% endif %}
{% if month.paid %}
<li class="tabular-numbers">{{ "{:,}".format(month.paid) }} {{ message_count_label(month.free, 'sms', '') }}at
<li class="tabular-numbers">{{ "{:,}".format(month.paid) }} {{ message_count_label(month.paid, 'sms', '') }}at
{{- ' {:.2f}p'.format(sms_rate * 100) }}</li>
{% endif %}
{% if not (month.free or month.paid) %}
{% for letter in month.letters%}
{% if letter[0] %}
<li class="tabular-numbers">{{ "{:,} {}".format(letter[0], letter[3])}} class {{ message_count_label(letter[0], 'letter', '') }}at
{{ '{:.0f}p'.format(letter[1] * 100) }}</li>
{% endif %}
{% endfor %}
{% if not (month.free or month.paid or month.letters) %}
<li aria-hidden="true"></li>
{% endif %}
</ul>
@@ -101,12 +124,12 @@
</div>
<div class="grid-row">
<div class="column-half">
<div class="column-one-third">
<p class="align-with-heading-copy">
Financial year ends 31 March.
Financial year ends 31&nbsp;March
</p>
</div>
<div class="column-half">
<div class="column-two-thirds">
<p class="align-with-heading-copy">
What counts as 1 text message?<br />
See <a href="{{ url_for('.pricing') }}">pricing</a>.

View File

@@ -684,71 +684,26 @@ def test_should_show_upcoming_jobs_on_dashboard(
assert table_rows[1].find_all('td')[0].text.strip() == '1'
@pytest.mark.parametrize('permissions, column_name, expected_column_count', [
(['email', 'sms'], '.column-half', 2),
(['email', 'letter'], '.column-third', 3),
(['email', 'sms', 'letter'], '.column-third', 3)
])
def test_correct_columns_display_on_dashboard(
client_request,
mock_get_service_templates,
mock_get_template_statistics,
mock_get_service_statistics,
mock_get_jobs,
service_one,
permissions,
expected_column_count,
column_name
):
service_one['permissions'] = permissions
page = client_request.get(
'main.service_dashboard',
service_id=service_one['id']
)
assert len(page.select(column_name)) == expected_column_count
@pytest.mark.parametrize('permissions, totals, big_number_class, expected_column_count', [
@pytest.mark.parametrize('permissions', (
['email', 'sms'],
['email', 'sms', 'letter'],
))
@pytest.mark.parametrize('totals, big_number_class', [
(
['email', 'sms'],
{
'email': {'requested': 0, 'delivered': 0, 'failed': 0},
'sms': {'requested': 999999999, 'delivered': 0, 'failed': 0}
},
'.big-number',
2,
),
(
['email', 'sms'],
{
'email': {'requested': 1000000000, 'delivered': 0, 'failed': 0},
'sms': {'requested': 1000000, 'delivered': 0, 'failed': 0}
},
'.big-number-smaller',
2,
),
(
['email', 'sms', 'letter'],
{
'email': {'requested': 0, 'delivered': 0, 'failed': 0},
'sms': {'requested': 99999, 'delivered': 0, 'failed': 0},
'letter': {'requested': 99999, 'delivered': 0, 'failed': 0}
},
'.big-number',
3,
),
(
['email', 'sms', 'letter'],
{
'email': {'requested': 0, 'delivered': 0, 'failed': 0},
'sms': {'requested': 0, 'delivered': 0, 'failed': 0},
'letter': {'requested': 100000, 'delivered': 0, 'failed': 0},
},
'.big-number-smaller',
3,
),
])
def test_correct_font_size_for_big_numbers(
@@ -762,7 +717,6 @@ def test_correct_font_size_for_big_numbers(
permissions,
totals,
big_number_class,
expected_column_count,
):
service_one['permissions'] = permissions
@@ -777,9 +731,11 @@ def test_correct_font_size_for_big_numbers(
service_id=service_one['id'],
)
assert expected_column_count == len(
assert len(page.select('.column-third')) == 3
assert len(
page.select('.big-number-with-status {}'.format(big_number_class))
)
) == 3
@freeze_time("2016-01-01 11:09:00.061258")
@@ -834,7 +790,7 @@ def test_usage_page(
mock_get_usage.assert_called_once_with(SERVICE_ONE_ID, 2011)
mock_get_free_sms_fragment_limit.assert_called_with(SERVICE_ONE_ID, 2011)
cols = page.find_all('div', {'class': 'column-half'})
cols = page.find_all('div', {'class': 'column-one-third'})
nav = page.find('ul', {'class': 'pill', 'role': 'tablist'})
nav_links = nav.find_all('a')
@@ -852,7 +808,7 @@ def test_usage_page(
assert 'April' in table
assert 'February' in table
assert 'March' in table
assert '£15.84' in table
assert '£20.59' in table
assert '140 free text messages' in table
assert '£20.30' in table
assert '1,230 text messages at 1.65p' in table