Skip to content

Commit a32827b

Browse files
authored
Merge pull request #5534 from alphagov/limits_stats
Show info about remaining daily limit on Settings pages
2 parents 745fccf + b922cab commit a32827b

File tree

13 files changed

+78
-6
lines changed

13 files changed

+78
-6
lines changed

app/__init__.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -140,6 +140,7 @@
140140
from app.url_converters import (
141141
AgreementTypeConverter,
142142
BrandingTypeConverter,
143+
DailyLimitTypeConverter,
143144
LetterFileExtensionConverter,
144145
SimpleDateTypeConverter,
145146
TemplateTypeConverter,
@@ -271,6 +272,7 @@ def inject_global_template_variables():
271272
application.url_map.converters["uuid"].to_python = lambda self, value: value.lower()
272273
application.url_map.converters["agreement_type"] = AgreementTypeConverter
273274
application.url_map.converters["template_type"] = TemplateTypeConverter
275+
application.url_map.converters["daily_limit_type"] = DailyLimitTypeConverter
274276
application.url_map.converters["branding_type"] = BrandingTypeConverter
275277
application.url_map.converters["ticket_type"] = TicketTypeConverter
276278
application.url_map.converters["letter_file_extension"] = LetterFileExtensionConverter

app/main/views/service_settings/index.py

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -611,9 +611,31 @@ def set_per_day_international_sms_message_limit(service_id):
611611
"views/service-settings/set-message-limit-for-international-sms.html",
612612
form=form,
613613
error_summary_enabled=True,
614+
partials=get_daily_limit_partials(daily_limit_type="international_sms"),
615+
updates_url=url_for(
616+
"json_updates.view_remaining_limit",
617+
service_id=service_id,
618+
daily_limit_type="international_sms",
619+
),
614620
)
615621

616622

623+
@json_updates.route(
624+
"/services/<uuid:service_id>/service-settings/<daily_limit_type:daily_limit_type>/remaining-today.json"
625+
)
626+
@user_has_permissions("manage_service")
627+
def view_remaining_limit(service_id, daily_limit_type):
628+
return jsonify(**get_daily_limit_partials(daily_limit_type=daily_limit_type))
629+
630+
631+
def get_daily_limit_partials(daily_limit_type):
632+
return {
633+
"remaining_limit": render_template(
634+
"partials/daily-limits/remaining-limit.html", daily_limit_type=daily_limit_type
635+
),
636+
}
637+
638+
617639
@main.route("/services/<uuid:service_id>/service-settings/set-international-letters", methods=["GET", "POST"])
618640
@user_has_permissions("manage_service")
619641
def service_set_international_letters(service_id):

app/models/service.py

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -617,9 +617,10 @@ def get_message_limit(self, notification_type):
617617
def remaining_messages(self, notification_type):
618618
if notification_type == "international_sms" and not self.has_permission("international_sms"):
619619
return 0
620-
return self.get_message_limit(notification_type) - (
621-
service_api_client.get_notification_count(self.id, notification_type=notification_type)
622-
)
620+
return self.get_message_limit(notification_type) - self.sent_today(notification_type)
621+
622+
def sent_today(self, notification_type):
623+
return service_api_client.get_notification_count(self.id, notification_type=notification_type)
623624

624625
@property
625626
def sign_in_method(self) -> str:
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
{% from "govuk_frontend_jinja/components/inset-text/macro.html" import govukInsetText %}
2+
3+
{% set sent_today = current_service.sent_today(daily_limit_type) %}
4+
{% set remaining_limit = current_service.remaining_messages(daily_limit_type) %}
5+
6+
<div class="ajax-block-container">
7+
{{ govukInsetText({
8+
"text": "You have sent {} today ({} remaining).".format(
9+
sent_today|message_count(daily_limit_type),
10+
remaining_limit|format_thousands
11+
),
12+
"classes": "govuk-!-margin-top-0"
13+
}) }}
14+
</div>

app/templates/views/service-settings.html

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -216,6 +216,7 @@
216216
{% endset %}
217217

218218
{% set service_text_message_settings %}
219+
219220
{% set text_message_sender_ids_html %}
220221
{{ current_service.default_sms_sender | nl2br if current_service.default_sms_sender else 'None'}}
221222
{% if current_service.count_sms_senders > 1 %}
@@ -225,6 +226,14 @@
225226
{% endif %}
226227
{% endset %}
227228

229+
{% set international_text_message_limit_html %}
230+
{{ "{} per day".format(current_service.get_message_limit('international_sms')|format_thousands) }}
231+
<div class="govuk-hint">
232+
{{ current_service.sent_today("international_sms")|string + " sent today" }}
233+
</div>
234+
{% endset %}
235+
236+
228237
{% set base_text_message_setting_row = [
229238
{
230239
"key": {
@@ -345,7 +354,8 @@
345354
"text": "International text message limit",
346355
},
347356
"value": {
348-
"text": "{} per day".format(current_service.get_message_limit('international_sms')|format_thousands)
357+
"text": international_text_message_limit_html,
358+
"classes": "govuk-summary-list__value--truncate"
349359
},
350360
"actions": {
351361
"items": [

app/templates/views/service-settings/set-message-limit-for-international-sms.html

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
{% extends "withnav_template.html" %}
2+
{% from "components/ajax-block.html" import ajax_block %}
23
{% from "components/page-header.html" import page_header %}
34
{% from "components/page-footer.html" import page_footer %}
45
{% from "components/form.html" import form_wrapper %}
@@ -23,6 +24,9 @@
2324
<p class="govuk-body">
2425
Number of international text messages the service is allowed to send each day.
2526
</p>
27+
28+
{{ ajax_block(partials, updates_url, 'remaining_limit') }}
29+
2630
<p class="govuk-body">
2731
When choosing a limit you should think about:
2832
</p>

app/url_converters.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,10 @@ class BrandingTypeConverter(BaseConverter):
2020
regex = "(?:email|letter)"
2121

2222

23+
class DailyLimitTypeConverter(BaseConverter):
24+
regex = f"(?:{'|'.join(Service.TEMPLATE_TYPES)}|international_sms)"
25+
26+
2327
class TicketTypeConverter(BaseConverter):
2428
regex = f"(?:{PROBLEM_TICKET_TYPE}|{QUESTION_TICKET_TYPE}|{GENERAL_TICKET_TYPE})"
2529

tests/app/main/test_init.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ def test_all_routes_return_401_for_unauthorised(self, notify_admin, client_reque
1111
"template_type": "email",
1212
"message_type": "email",
1313
"job_id": fake_uuid,
14+
"daily_limit_type": "email",
1415
}
1516
bad_views = []
1617
client_request.logout()

tests/app/main/test_permissions.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -332,6 +332,7 @@ def test_routes_have_permissions_decorators():
332332
def test_routes_require_types(client_request):
333333
partial_param_name_to_type = {
334334
"_id": "uuid",
335+
"daily_limit_type": "daily_limit_type",
335336
"template_type": "template_type",
336337
"notification_type": "template_type",
337338
"branding_type": "branding_type",

tests/app/main/views/service_settings/test_service_settings.py

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -317,7 +317,7 @@ def test_send_files_by_email_row_on_settings_page(
317317
"Start text messages with service name On Change your settings for starting text messages with service name", # noqa
318318
"Receive text messages On Change your settings for receiving text messages",
319319
"Send international text messages On Change your settings for sending international text messages",
320-
"International text message limit 500 per day Change daily international text message limit",
320+
"International text message limit 500 per day 0 sent today Change daily international text message limit", # noqa
321321
"Send letters Off Change your settings for sending letters",
322322
],
323323
),
@@ -3916,15 +3916,26 @@ def test_switch_service_enable_international_sms_and_letters(
39163916
def test_should_show_page_to_set_per_day_international_sms_message_limit(
39173917
client_request,
39183918
service_one,
3919+
mocker,
39193920
):
39203921
service_one["permissions"] = ["international_sms"]
3922+
mock_get_notification_count = mocker.patch("app.service_api_client.get_notification_count", return_value=1)
39213923

39223924
page = client_request.get(
39233925
"main.set_per_day_international_sms_message_limit",
39243926
service_id=SERVICE_ONE_ID,
39253927
)
39263928
assert normalize_spaces(page.select_one("label").text) == "Daily international text message limit"
3929+
# form prefilled with current limit
39273930
assert normalize_spaces(page.select_one("input[type=text]")["value"]) == "500"
3931+
# today's remaining limit pulled and displayed
3932+
assert mock_get_notification_count.called_once_with(
3933+
service_id=SERVICE_ONE_ID, notification_type="international_sms"
3934+
)
3935+
assert (
3936+
normalize_spaces(page.select(".ajax-block-container")[0].text)
3937+
== "You have sent 1 international text message today (499 remaining)."
3938+
)
39283939

39293940

39303941
@pytest.mark.parametrize(

0 commit comments

Comments
 (0)