mirror of
https://github.com/GSA/notifications-admin.git
synced 2026-09-09 07:23:12 -04:00
Merge branch 'main' of https://github.com/GSA/notifications-admin into 1423-Sign-in-content-changes-for-login-gov
This commit is contained in:
@@ -134,11 +134,17 @@ def template_usage(service_id):
|
|||||||
months=months,
|
months=months,
|
||||||
stats=stats,
|
stats=stats,
|
||||||
most_used_template_count=max(
|
most_used_template_count=max(
|
||||||
max(
|
(
|
||||||
(template["requested_count"] for template in month["templates_used"]),
|
max(
|
||||||
default=0,
|
(
|
||||||
)
|
template["requested_count"]
|
||||||
for month in months
|
for template in month["templates_used"]
|
||||||
|
),
|
||||||
|
default=0,
|
||||||
|
)
|
||||||
|
for month in months
|
||||||
|
),
|
||||||
|
default=0,
|
||||||
),
|
),
|
||||||
years=get_tuples_of_financial_years(
|
years=get_tuples_of_financial_years(
|
||||||
partial(url_for, ".template_usage", service_id=service_id),
|
partial(url_for, ".template_usage", service_id=service_id),
|
||||||
@@ -155,31 +161,16 @@ def usage(service_id):
|
|||||||
year, current_financial_year = requested_and_current_financial_year(request)
|
year, current_financial_year = requested_and_current_financial_year(request)
|
||||||
|
|
||||||
free_sms_allowance = billing_api_client.get_free_sms_fragment_limit_for_year(
|
free_sms_allowance = billing_api_client.get_free_sms_fragment_limit_for_year(
|
||||||
service_id, year
|
service_id
|
||||||
)
|
)
|
||||||
|
|
||||||
units = billing_api_client.get_monthly_usage_for_service(service_id, year)
|
units = billing_api_client.get_monthly_usage_for_service(service_id, year)
|
||||||
|
|
||||||
yearly_usage = billing_api_client.get_annual_usage_for_service(service_id, year)
|
yearly_usage = billing_api_client.get_annual_usage_for_service(service_id, year)
|
||||||
|
|
||||||
more_stats = format_monthly_stats_to_list(
|
more_stats = format_monthly_stats_to_list(
|
||||||
service_api_client.get_monthly_notification_stats(service_id, year)["data"]
|
service_api_client.get_monthly_notification_stats(service_id, year)["data"]
|
||||||
)
|
)
|
||||||
if year == current_financial_year:
|
|
||||||
# This includes Oct, Nov, Dec
|
|
||||||
# but we don't need next year's data yet
|
|
||||||
more_stats = [
|
|
||||||
month
|
|
||||||
for month in more_stats
|
|
||||||
if month["name"] in ["October", "November", "December"]
|
|
||||||
]
|
|
||||||
elif year == (current_financial_year + 1):
|
|
||||||
# This is all the other months
|
|
||||||
# and we need last year's data
|
|
||||||
more_stats = [
|
|
||||||
month
|
|
||||||
for month in more_stats
|
|
||||||
if month["name"] not in ["October", "November", "December"]
|
|
||||||
]
|
|
||||||
|
|
||||||
return render_template(
|
return render_template(
|
||||||
"views/usage.html",
|
"views/usage.html",
|
||||||
months=list(get_monthly_usage_breakdown(year, units, more_stats)),
|
months=list(get_monthly_usage_breakdown(year, units, more_stats)),
|
||||||
@@ -341,8 +332,15 @@ def get_dashboard_partials(service_id):
|
|||||||
dashboard_totals = (get_dashboard_totals(stats),)
|
dashboard_totals = (get_dashboard_totals(stats),)
|
||||||
free_sms_allowance = billing_api_client.get_free_sms_fragment_limit_for_year(
|
free_sms_allowance = billing_api_client.get_free_sms_fragment_limit_for_year(
|
||||||
current_service.id,
|
current_service.id,
|
||||||
get_current_financial_year(),
|
|
||||||
)
|
)
|
||||||
|
# These 2 calls will update the dashboard sms allowance count while in trial mode.
|
||||||
|
billing_api_client.get_monthly_usage_for_service(
|
||||||
|
service_id, get_current_financial_year()
|
||||||
|
)
|
||||||
|
billing_api_client.create_or_update_free_sms_fragment_limit(
|
||||||
|
service_id, free_sms_fragment_limit=free_sms_allowance
|
||||||
|
)
|
||||||
|
|
||||||
yearly_usage = billing_api_client.get_annual_usage_for_service(
|
yearly_usage = billing_api_client.get_annual_usage_for_service(
|
||||||
service_id,
|
service_id,
|
||||||
get_current_financial_year(),
|
get_current_financial_year(),
|
||||||
@@ -433,13 +431,7 @@ def aggregate_status_types(counts_dict):
|
|||||||
|
|
||||||
|
|
||||||
def get_months_for_financial_year(year, time_format="%B"):
|
def get_months_for_financial_year(year, time_format="%B"):
|
||||||
return [
|
return [month.strftime(time_format) for month in (get_months_for_year(1, 13, year))]
|
||||||
month.strftime(time_format)
|
|
||||||
for month in (
|
|
||||||
get_months_for_year(10, 13, year) + get_months_for_year(1, 10, year + 1)
|
|
||||||
)
|
|
||||||
if month < datetime.now()
|
|
||||||
]
|
|
||||||
|
|
||||||
|
|
||||||
def get_months_for_year(start, end, year):
|
def get_months_for_year(start, end, year):
|
||||||
|
|||||||
@@ -11,7 +11,7 @@ def get_current_financial_year():
|
|||||||
now = datetime.now(preferred_tz)
|
now = datetime.now(preferred_tz)
|
||||||
current_month = int(now.strftime("%-m"))
|
current_month = int(now.strftime("%-m"))
|
||||||
current_year = int(now.strftime("%Y"))
|
current_year = int(now.strftime("%Y"))
|
||||||
return current_year if current_month > 9 else current_year - 1
|
return current_year if current_month < 10 else current_year + 1
|
||||||
|
|
||||||
|
|
||||||
def is_less_than_days_ago(date_from_db, number_of_days):
|
def is_less_than_days_ago(date_from_db, number_of_days):
|
||||||
|
|||||||
@@ -388,7 +388,7 @@ def test_organization_services_shows_live_services_and_usage(
|
|||||||
|
|
||||||
client_request.login(active_user_with_permissions)
|
client_request.login(active_user_with_permissions)
|
||||||
page = client_request.get(".organization_dashboard", org_id=ORGANISATION_ID)
|
page = client_request.get(".organization_dashboard", org_id=ORGANISATION_ID)
|
||||||
mock.assert_called_once_with(ORGANISATION_ID, 2019)
|
mock.assert_called_once_with(ORGANISATION_ID, 2020)
|
||||||
|
|
||||||
services = page.select("main h3")
|
services = page.select("main h3")
|
||||||
usage_rows = page.select("main .grid-col-6")
|
usage_rows = page.select("main .grid-col-6")
|
||||||
@@ -459,9 +459,9 @@ def test_organization_services_shows_live_services_and_usage_with_count_of_1(
|
|||||||
@pytest.mark.parametrize(
|
@pytest.mark.parametrize(
|
||||||
("financial_year", "expected_selected"),
|
("financial_year", "expected_selected"),
|
||||||
[
|
[
|
||||||
(2017, "2017 to 2018 fiscal year"),
|
|
||||||
(2018, "2018 to 2019 fiscal year"),
|
(2018, "2018 to 2019 fiscal year"),
|
||||||
(2019, "2019 to 2020 fiscal year"),
|
(2019, "2019 to 2020 fiscal year"),
|
||||||
|
(2020, "2020 to 2021 fiscal year"),
|
||||||
],
|
],
|
||||||
)
|
)
|
||||||
def test_organization_services_filters_by_financial_year(
|
def test_organization_services_filters_by_financial_year(
|
||||||
@@ -483,9 +483,9 @@ def test_organization_services_filters_by_financial_year(
|
|||||||
)
|
)
|
||||||
mock.assert_called_once_with(ORGANISATION_ID, financial_year)
|
mock.assert_called_once_with(ORGANISATION_ID, financial_year)
|
||||||
assert normalize_spaces(page.select_one(".pill").text) == (
|
assert normalize_spaces(page.select_one(".pill").text) == (
|
||||||
|
"2020 to 2021 fiscal year "
|
||||||
"2019 to 2020 fiscal year "
|
"2019 to 2020 fiscal year "
|
||||||
"2018 to 2019 fiscal year "
|
"2018 to 2019 fiscal year"
|
||||||
"2017 to 2018 fiscal year"
|
|
||||||
)
|
)
|
||||||
assert normalize_spaces(page.select_one(".pill-item--selected").text) == (
|
assert normalize_spaces(page.select_one(".pill-item--selected").text) == (
|
||||||
expected_selected
|
expected_selected
|
||||||
@@ -610,7 +610,7 @@ def test_organization_services_links_to_downloadable_report(
|
|||||||
assert link_to_report.attrs["href"] == url_for(
|
assert link_to_report.attrs["href"] == url_for(
|
||||||
".download_organization_usage_report",
|
".download_organization_usage_report",
|
||||||
org_id=ORGANISATION_ID,
|
org_id=ORGANISATION_ID,
|
||||||
selected_year=2021,
|
selected_year=2022,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -678,12 +678,12 @@ def test_should_show_redirect_from_template_history(
|
|||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
@freeze_time("2017-01-01 12:00") # 4 months into 2016 financial year
|
@freeze_time("2017-01-01 12:00")
|
||||||
@pytest.mark.parametrize(
|
@pytest.mark.parametrize(
|
||||||
"extra_args",
|
"extra_args",
|
||||||
[
|
[
|
||||||
{},
|
{},
|
||||||
{"year": "2016"},
|
{"year": "2017"},
|
||||||
],
|
],
|
||||||
)
|
)
|
||||||
def test_should_show_monthly_breakdown_of_template_usage(
|
def test_should_show_monthly_breakdown_of_template_usage(
|
||||||
@@ -695,7 +695,7 @@ def test_should_show_monthly_breakdown_of_template_usage(
|
|||||||
"main.template_usage", service_id=SERVICE_ONE_ID, **extra_args
|
"main.template_usage", service_id=SERVICE_ONE_ID, **extra_args
|
||||||
)
|
)
|
||||||
|
|
||||||
mock_get_monthly_template_usage.assert_called_once_with(SERVICE_ONE_ID, 2016)
|
mock_get_monthly_template_usage.assert_called_once_with(SERVICE_ONE_ID, 2017)
|
||||||
|
|
||||||
table_rows = page.select("tbody tr")
|
table_rows = page.select("tbody tr")
|
||||||
|
|
||||||
@@ -703,9 +703,22 @@ def test_should_show_monthly_breakdown_of_template_usage(
|
|||||||
"My first template " "Text message template " "2"
|
"My first template " "Text message template " "2"
|
||||||
)
|
)
|
||||||
|
|
||||||
assert len(table_rows) == len(["October"])
|
assert len(table_rows) == len(["January"])
|
||||||
|
# October is the only month with data, thus it's not in the list.
|
||||||
assert len(page.select(".table-no-data")) == len(
|
assert len(page.select(".table-no-data")) == len(
|
||||||
["November", "December", "January"]
|
[
|
||||||
|
"January",
|
||||||
|
"February",
|
||||||
|
"March",
|
||||||
|
"April",
|
||||||
|
"May",
|
||||||
|
"June",
|
||||||
|
"July",
|
||||||
|
"August",
|
||||||
|
"September",
|
||||||
|
"November",
|
||||||
|
"December",
|
||||||
|
]
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
@@ -748,9 +761,9 @@ def test_stats_pages_show_last_3_years(
|
|||||||
)
|
)
|
||||||
|
|
||||||
assert normalize_spaces(page.select_one(".pill").text) == (
|
assert normalize_spaces(page.select_one(".pill").text) == (
|
||||||
|
"2015 to 2016 fiscal year "
|
||||||
"2014 to 2015 fiscal year "
|
"2014 to 2015 fiscal year "
|
||||||
"2013 to 2014 fiscal year "
|
"2013 to 2014 fiscal year"
|
||||||
"2012 to 2013 fiscal year"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
@@ -965,18 +978,18 @@ def test_usage_page(
|
|||||||
service_id=SERVICE_ONE_ID,
|
service_id=SERVICE_ONE_ID,
|
||||||
)
|
)
|
||||||
|
|
||||||
mock_get_monthly_usage_for_service.assert_called_once_with(SERVICE_ONE_ID, 2011)
|
mock_get_monthly_usage_for_service.assert_called_once_with(SERVICE_ONE_ID, 2012)
|
||||||
mock_get_annual_usage_for_service.assert_called_once_with(SERVICE_ONE_ID, 2011)
|
mock_get_annual_usage_for_service.assert_called_once_with(SERVICE_ONE_ID, 2012)
|
||||||
mock_get_free_sms_fragment_limit.assert_called_with(SERVICE_ONE_ID, 2011)
|
mock_get_free_sms_fragment_limit.assert_called_with(SERVICE_ONE_ID)
|
||||||
|
|
||||||
nav = page.find("ul", {"class": "pill"})
|
nav = page.find("ul", {"class": "pill"})
|
||||||
unselected_nav_links = nav.select("a:not(.pill-item--selected)")
|
unselected_nav_links = nav.select("a:not(.pill-item--selected)")
|
||||||
assert (
|
assert (
|
||||||
normalize_spaces(nav.find("a", {"aria-current": "page"}).text)
|
normalize_spaces(nav.find("a", {"aria-current": "page"}).text)
|
||||||
== "2011 to 2012 fiscal year"
|
== "2012 to 2013 fiscal year"
|
||||||
)
|
)
|
||||||
assert normalize_spaces(unselected_nav_links[0].text) == "2010 to 2011 fiscal year"
|
assert normalize_spaces(unselected_nav_links[0].text) == "2011 to 2012 fiscal year"
|
||||||
assert normalize_spaces(unselected_nav_links[1].text) == "2009 to 2010 fiscal year"
|
assert normalize_spaces(unselected_nav_links[1].text) == "2010 to 2011 fiscal year"
|
||||||
|
|
||||||
annual_usage = page.find_all("div", {"class": "keyline-block"})
|
annual_usage = page.find_all("div", {"class": "keyline-block"})
|
||||||
|
|
||||||
@@ -1043,6 +1056,7 @@ def test_usage_page_monthly_breakdown(
|
|||||||
page = client_request.get("main.usage", service_id=SERVICE_ONE_ID)
|
page = client_request.get("main.usage", service_id=SERVICE_ONE_ID)
|
||||||
monthly_breakdown = normalize_spaces(page.find("table").text)
|
monthly_breakdown = normalize_spaces(page.find("table").text)
|
||||||
|
|
||||||
|
assert "January" in monthly_breakdown
|
||||||
assert "October" in monthly_breakdown
|
assert "October" in monthly_breakdown
|
||||||
assert "February" in monthly_breakdown
|
assert "February" in monthly_breakdown
|
||||||
assert "March" in monthly_breakdown
|
assert "March" in monthly_breakdown
|
||||||
@@ -1051,8 +1065,8 @@ def test_usage_page_monthly_breakdown(
|
|||||||
@pytest.mark.parametrize(
|
@pytest.mark.parametrize(
|
||||||
("now", "expected_number_of_months"),
|
("now", "expected_number_of_months"),
|
||||||
[
|
[
|
||||||
(freeze_time("2017-03-31 11:09:00.061258"), 6),
|
(freeze_time("2017-03-31 11:09:00.061258"), 12),
|
||||||
(freeze_time("2017-01-01 11:09:00.061258"), 4),
|
(freeze_time("2017-01-01 11:09:00.061258"), 12),
|
||||||
],
|
],
|
||||||
)
|
)
|
||||||
def test_usage_page_monthly_breakdown_shows_months_so_far(
|
def test_usage_page_monthly_breakdown_shows_months_so_far(
|
||||||
@@ -1112,7 +1126,7 @@ def test_usage_page_with_year_argument(
|
|||||||
)
|
)
|
||||||
mock_get_monthly_usage_for_service.assert_called_once_with(SERVICE_ONE_ID, 2000)
|
mock_get_monthly_usage_for_service.assert_called_once_with(SERVICE_ONE_ID, 2000)
|
||||||
mock_get_annual_usage_for_service.assert_called_once_with(SERVICE_ONE_ID, 2000)
|
mock_get_annual_usage_for_service.assert_called_once_with(SERVICE_ONE_ID, 2000)
|
||||||
mock_get_free_sms_fragment_limit.assert_called_with(SERVICE_ONE_ID, 2000)
|
mock_get_free_sms_fragment_limit.assert_called_with(SERVICE_ONE_ID)
|
||||||
mock_get_monthly_notification_stats.assert_called_with(SERVICE_ONE_ID, 2000)
|
mock_get_monthly_notification_stats.assert_called_with(SERVICE_ONE_ID, 2000)
|
||||||
|
|
||||||
|
|
||||||
@@ -1147,7 +1161,7 @@ def test_future_usage_page(
|
|||||||
mock_get_annual_usage_for_service_in_future.assert_called_once_with(
|
mock_get_annual_usage_for_service_in_future.assert_called_once_with(
|
||||||
SERVICE_ONE_ID, 2014
|
SERVICE_ONE_ID, 2014
|
||||||
)
|
)
|
||||||
mock_get_free_sms_fragment_limit.assert_called_with(SERVICE_ONE_ID, 2014)
|
mock_get_free_sms_fragment_limit.assert_called_with(SERVICE_ONE_ID)
|
||||||
mock_get_monthly_notification_stats.assert_called_with(SERVICE_ONE_ID, 2014)
|
mock_get_monthly_notification_stats.assert_called_with(SERVICE_ONE_ID, 2014)
|
||||||
|
|
||||||
|
|
||||||
@@ -1378,7 +1392,9 @@ def test_route_for_service_permissions(
|
|||||||
mock_has_no_jobs,
|
mock_has_no_jobs,
|
||||||
mock_get_template_statistics,
|
mock_get_template_statistics,
|
||||||
mock_get_service_statistics,
|
mock_get_service_statistics,
|
||||||
|
mock_get_monthly_usage_for_service,
|
||||||
mock_get_annual_usage_for_service,
|
mock_get_annual_usage_for_service,
|
||||||
|
mock_create_or_update_free_sms_fragment_limit,
|
||||||
mock_get_free_sms_fragment_limit,
|
mock_get_free_sms_fragment_limit,
|
||||||
mock_get_inbound_sms_summary,
|
mock_get_inbound_sms_summary,
|
||||||
):
|
):
|
||||||
|
|||||||
@@ -20,10 +20,10 @@ def test_is_less_than_days_ago(date_from_db, expected_result):
|
|||||||
@pytest.mark.parametrize(
|
@pytest.mark.parametrize(
|
||||||
("datetime_string", "financial_year"),
|
("datetime_string", "financial_year"),
|
||||||
[
|
[
|
||||||
("2021-01-01T00:00:00+00:00", 2020), # Start of 2021
|
("2021-01-01T00:00:00+00:00", 2021), # Start of 2021
|
||||||
("2021-04-01T03:59:59+00:00", 2020), # One minute before midnight (BST)
|
("2021-04-01T03:59:59+00:00", 2021), # One minute before midnight (BST)
|
||||||
("2021-10-01T04:05:00+00:00", 2021), # Midnight (BST)
|
("2021-10-01T04:05:00+00:00", 2022), # Midnight (BST)
|
||||||
("2021-12-12T12:12:12+01:00", 2021), # Later in the year
|
("2021-12-12T12:12:12+01:00", 2022), # Later in the year
|
||||||
],
|
],
|
||||||
)
|
)
|
||||||
def test_get_financial_year(datetime_string, financial_year):
|
def test_get_financial_year(datetime_string, financial_year):
|
||||||
|
|||||||
@@ -2330,6 +2330,8 @@ def client_request(logged_in_client, mocker, service_one): # noqa (C901 too com
|
|||||||
"app.billing_api_client.create_or_update_free_sms_fragment_limit", autospec=True
|
"app.billing_api_client.create_or_update_free_sms_fragment_limit", autospec=True
|
||||||
)
|
)
|
||||||
|
|
||||||
|
mocker.patch("app.billing_api_client.get_monthly_usage_for_service", autospec=True)
|
||||||
|
|
||||||
class ClientRequest:
|
class ClientRequest:
|
||||||
@staticmethod
|
@staticmethod
|
||||||
@contextmanager
|
@contextmanager
|
||||||
|
|||||||
Reference in New Issue
Block a user