diff --git a/app/main/forms.py b/app/main/forms.py index d952f2cfe..b78d418a0 100644 --- a/app/main/forms.py +++ b/app/main/forms.py @@ -1564,20 +1564,20 @@ class SearchUsersForm(StripWhitespaceForm): search = UsaSearchField("Search by name or email address") -class SearchNotificationsForm(StripWhitespaceForm): - to = UsaSearchField() - - labels = { - "email": "Search by email address", - "sms": "Search by phone number", - } - - def __init__(self, message_type, *args, **kwargs): - super().__init__(*args, **kwargs) - self.to.label.text = self.labels.get( - message_type, - "Search by phone number or email address", - ) +# class SearchNotificationsForm(StripWhitespaceForm): +# to = UsaSearchField() +# +# labels = { +# "email": "Search by email address", +# "sms": "Search by phone number", +# } +# +# def __init__(self, message_type, *args, **kwargs): +# super().__init__(*args, **kwargs) +# self.to.label.text = self.labels.get( +# message_type, +# "Search by phone number or email address", +# ) class SearchTemplatesForm(StripWhitespaceForm): diff --git a/app/main/views/jobs.py b/app/main/views/jobs.py index 367dfbb36..59d83d45a 100644 --- a/app/main/views/jobs.py +++ b/app/main/views/jobs.py @@ -1,5 +1,5 @@ # -*- coding: utf-8 -*- -from functools import partial +# from functools import partial from flask import ( Response, @@ -12,27 +12,30 @@ from flask import ( stream_with_context, url_for, ) -from flask_login import current_user + +# from flask_login import current_user from markupsafe import Markup -from app import ( +from app import ( # notification_api_client,; service_api_client, current_service, format_datetime_table, - notification_api_client, - service_api_client, ) -from app.enums import NotificationStatus, NotificationType, ServicePermission + +# from app.enums import NotificationStatus, NotificationType, ServicePermission +from app.enums import ServicePermission from app.formatters import get_time_left, message_count_noun from app.main import main -from app.main.forms import SearchNotificationsForm + +# from app.main.forms import SearchNotificationsForm from app.models.job import Job from app.utils import parse_filter_args, set_status_filters from app.utils.csv import generate_notifications_csv -from app.utils.pagination import ( - generate_next_dict, - generate_previous_dict, - get_page_from_request, -) + +# from app.utils.pagination import ( +# generate_next_dict, +# generate_previous_dict, +# get_page_from_request, +# ) from app.utils.user import user_has_permissions from notifications_python_client.errors import HTTPError from notifications_utils.template import EmailPreviewTemplate, SMSBodyPreviewTemplate @@ -197,242 +200,242 @@ def view_job_notifications_table(service_id, job_id): ) -@main.route("/services//notifications", methods=["GET", "POST"]) -@main.route( - "/services//notifications/", - methods=["GET", "POST"], -) -@user_has_permissions() -def view_notifications(service_id, message_type=None): - return render_template( - "views/notifications.html", - partials=get_notifications(service_id, message_type), - message_type=message_type, - status=request.args.get("status") or "sending,delivered,failed", - page=request.args.get("page", 1), - search_form=SearchNotificationsForm( - message_type=message_type, - to=request.form.get("to"), - ), - things_you_can_search_by={ - "email": ["email address"], - "sms": ["phone number"], - None: ["recipient"], - }.get(message_type) - + { - True: ["reference"], - False: [], - }.get(bool(current_service.api_keys)), - download_link_one_day=url_for( - ".download_notifications_csv", - service_id=current_service.id, - message_type=message_type, - status=request.args.get("status"), - number_of_days="one_day", - ), - download_link_today=url_for( - ".download_notifications_csv", - service_id=current_service.id, - message_type=message_type, - status=request.args.get("status"), - number_of_days="today", - ), - download_link_three_day=url_for( - ".download_notifications_csv", - service_id=current_service.id, - message_type=message_type, - status=request.args.get("status"), - number_of_days="three_day", - ), - download_link_five_day=url_for( - ".download_notifications_csv", - service_id=current_service.id, - message_type=message_type, - status=request.args.get("status"), - number_of_days="five_day", - ), - download_link_seven_day=url_for( - ".download_notifications_csv", - service_id=current_service.id, - message_type=message_type, - status=request.args.get("status"), - number_of_days="seven_day", - ), - ) +# @main.route("/services//notifications", methods=["GET", "POST"]) +# @main.route( +# "/services//notifications/", +# methods=["GET", "POST"], +# ) +# @user_has_permissions() +# def view_notifications(service_id, message_type=None): +# return render_template( +# "views/notifications.html", +# partials=get_notifications(service_id, message_type), +# message_type=message_type, +# status=request.args.get("status") or "sending,delivered,failed", +# page=request.args.get("page", 1), +# search_form=SearchNotificationsForm( +# message_type=message_type, +# to=request.form.get("to"), +# ), +# things_you_can_search_by={ +# "email": ["email address"], +# "sms": ["phone number"], +# None: ["recipient"], +# }.get(message_type) +# + { +# True: ["reference"], +# False: [], +# }.get(bool(current_service.api_keys)), +# download_link_one_day=url_for( +# ".download_notifications_csv", +# service_id=current_service.id, +# message_type=message_type, +# status=request.args.get("status"), +# number_of_days="one_day", +# ), +# download_link_today=url_for( +# ".download_notifications_csv", +# service_id=current_service.id, +# message_type=message_type, +# status=request.args.get("status"), +# number_of_days="today", +# ), +# download_link_three_day=url_for( +# ".download_notifications_csv", +# service_id=current_service.id, +# message_type=message_type, +# status=request.args.get("status"), +# number_of_days="three_day", +# ), +# download_link_five_day=url_for( +# ".download_notifications_csv", +# service_id=current_service.id, +# message_type=message_type, +# status=request.args.get("status"), +# number_of_days="five_day", +# ), +# download_link_seven_day=url_for( +# ".download_notifications_csv", +# service_id=current_service.id, +# message_type=message_type, +# status=request.args.get("status"), +# number_of_days="seven_day", +# ), +# ) -@main.route("/services//notifications.json", methods=["GET", "POST"]) -@main.route( - "/services//notifications/.json", - methods=["GET", "POST"], -) -@user_has_permissions() -def get_notifications_as_json(service_id, message_type=None): - return jsonify( - get_notifications( - service_id, message_type, status_override=request.args.get("status") - ) - ) +# @main.route("/services//notifications.json", methods=["GET", "POST"]) +# @main.route( +# "/services//notifications/.json", +# methods=["GET", "POST"], +# ) +# @user_has_permissions() +# def get_notifications_as_json(service_id, message_type=None): +# return jsonify( +# get_notifications( +# service_id, message_type, status_override=request.args.get("status") +# ) +# ) -@main.route( - "/services//notifications.csv", endpoint="view_notifications_csv" -) -@main.route( - "/services//notifications/.csv", - endpoint="view_notifications_csv", -) -@user_has_permissions() -def get_notifications(service_id, message_type, status_override=None): # noqa - # TODO get the api to return count of pages as well. - page = get_page_from_request() - if page is None: - abort(404, "Invalid page argument ({}).".format(request.args.get("page"))) - filter_args = parse_filter_args(request.args) - filter_args["status"] = set_status_filters(filter_args) - service_data_retention_days = None - search_term = request.form.get("to", "") - if message_type is not None: - service_data_retention_days = current_service.get_days_of_retention( - message_type, number_of_days="seven_day" - ) - - if request.path.endswith("csv") and current_user.has_permissions( - ServicePermission.VIEW_ACTIVITY - ): - return Response( - generate_notifications_csv( - service_id=service_id, - page=page, - page_size=5000, - template_type=[message_type], - status=filter_args.get("status"), - limit_days=service_data_retention_days, - ), - mimetype="text/csv", - headers={"Content-Disposition": 'inline; filename="notifications.csv"'}, - ) - notifications = notification_api_client.get_notifications_for_service( - service_id=service_id, - page=page, - template_type=[message_type] if message_type else [], - status=filter_args.get("status"), - limit_days=service_data_retention_days, - to=search_term, - ) - - notifications_list = notifications.get("notifications", []) - - url_args = {"message_type": message_type, "status": request.args.get("status")} - prev_page = None - if "links" in notifications and notifications["links"].get("prev", None): - prev_page = generate_previous_dict( - "main.view_notifications", service_id, page, url_args=url_args - ) - next_page = None - - total_items = notifications.get("total", 0) - page_size = notifications.get("page_size", 50) - total_pages = (total_items + page_size - 1) // page_size - if ( - "links" in notifications - and notifications["links"].get("next", None) - and total_items > 50 - and page < total_pages - ): - next_page = generate_next_dict( - "main.view_notifications", service_id, page, url_args - ) - - if message_type: - download_link = url_for( - ".view_notifications_csv", - service_id=current_service.id, - message_type=message_type, - status=request.args.get("status"), - ) - else: - download_link = None - return { - "service_data_retention_days": service_data_retention_days, - "counts": render_template( - "views/activity/counts.html", - status=request.args.get("status"), - status_filters=get_status_filters( - current_service, - message_type, - service_api_client.get_service_statistics( - service_id, limit_days=service_data_retention_days - ), - ), - ), - "notifications": render_template( - "views/activity/notifications.html", - notifications=list( - add_preview_of_content_to_notifications(notifications_list) - ), - page=page, - limit_days=service_data_retention_days, - prev_page=prev_page, - next_page=next_page, - show_pagination=(not search_term), - status=request.args.get("status"), - message_type=message_type, - download_link=download_link, - single_notification_url=partial( - url_for, - ".view_notification", - service_id=current_service.id, - ), - ), - } +# @main.route( +# "/services//notifications.csv", endpoint="view_notifications_csv" +# ) +# @main.route( +# "/services//notifications/.csv", +# endpoint="view_notifications_csv", +# ) +# @user_has_permissions() +# def get_notifications(service_id, message_type, status_override=None): # noqa +# # TODO get the api to return count of pages as well. +# page = get_page_from_request() +# if page is None: +# abort(404, "Invalid page argument ({}).".format(request.args.get("page"))) +# filter_args = parse_filter_args(request.args) +# filter_args["status"] = set_status_filters(filter_args) +# service_data_retention_days = None +# search_term = request.form.get("to", "") +# if message_type is not None: +# service_data_retention_days = current_service.get_days_of_retention( +# message_type, number_of_days="seven_day" +# ) +# +# if request.path.endswith("csv") and current_user.has_permissions( +# ServicePermission.VIEW_ACTIVITY +# ): +# return Response( +# generate_notifications_csv( +# service_id=service_id, +# page=page, +# page_size=5000, +# template_type=[message_type], +# status=filter_args.get("status"), +# limit_days=service_data_retention_days, +# ), +# mimetype="text/csv", +# headers={"Content-Disposition": 'inline; filename="notifications.csv"'}, +# ) +# notifications = notification_api_client.get_notifications_for_service( +# service_id=service_id, +# page=page, +# template_type=[message_type] if message_type else [], +# status=filter_args.get("status"), +# limit_days=service_data_retention_days, +# to=search_term, +# ) +# +# notifications_list = notifications.get("notifications", []) +# +# url_args = {"message_type": message_type, "status": request.args.get("status")} +# prev_page = None +# if "links" in notifications and notifications["links"].get("prev", None): +# prev_page = generate_previous_dict( +# "main.view_notifications", service_id, page, url_args=url_args +# ) +# next_page = None +# +# total_items = notifications.get("total", 0) +# page_size = notifications.get("page_size", 50) +# total_pages = (total_items + page_size - 1) // page_size +# if ( +# "links" in notifications +# and notifications["links"].get("next", None) +# and total_items > 50 +# and page < total_pages +# ): +# next_page = generate_next_dict( +# "main.view_notifications", service_id, page, url_args +# ) +# +# if message_type: +# download_link = url_for( +# ".view_notifications_csv", +# service_id=current_service.id, +# message_type=message_type, +# status=request.args.get("status"), +# ) +# else: +# download_link = None +# return { +# "service_data_retention_days": service_data_retention_days, +# "counts": render_template( +# "views/activity/counts.html", +# status=request.args.get("status"), +# status_filters=get_status_filters( +# current_service, +# message_type, +# service_api_client.get_service_statistics( +# service_id, limit_days=service_data_retention_days +# ), +# ), +# ), +# "notifications": render_template( +# "views/activity/notifications.html", +# notifications=list( +# add_preview_of_content_to_notifications(notifications_list) +# ), +# page=page, +# limit_days=service_data_retention_days, +# prev_page=prev_page, +# next_page=next_page, +# show_pagination=(not search_term), +# status=request.args.get("status"), +# message_type=message_type, +# download_link=download_link, +# single_notification_url=partial( +# url_for, +# ".view_notification", +# service_id=current_service.id, +# ), +# ), +# } -def get_status_filters(service, message_type, statistics): - message_types = ( - [message_type] - if message_type - else [NotificationType.EMAIL, NotificationType.SMS] - ) - - stats = { - NotificationStatus.REQUESTED: sum( - statistics[mt].get(NotificationStatus.REQUESTED, 0) for mt in message_types - ), - NotificationStatus.DELIVERED: sum( - statistics[mt].get(NotificationStatus.DELIVERED, 0) for mt in message_types - ), - NotificationStatus.FAILED: sum( - statistics[mt].get(NotificationStatus.FAILED, 0) for mt in message_types - ), - } - - stats[NotificationStatus.PENDING] = ( - stats[NotificationStatus.REQUESTED] - - stats[NotificationStatus.DELIVERED] - - stats[NotificationStatus.FAILED] - ) - - filters = [ - (NotificationStatus.REQUESTED, "total", "sending,delivered,failed"), - (NotificationStatus.PENDING, "pending", "sending,pending"), - (NotificationStatus.DELIVERED, "delivered", "delivered"), - (NotificationStatus.FAILED, "failed", "failed"), - ] - return [ - ( - label, - option, - url_for( - ".view_notifications", - service_id=service.id, - message_type=message_type, - status=option, - ), - stats.get(key), - ) - for key, label, option in filters - ] +# def get_status_filters(service, message_type, statistics): +# message_types = ( +# [message_type] +# if message_type +# else [NotificationType.EMAIL, NotificationType.SMS] +# ) +# +# stats = { +# NotificationStatus.REQUESTED: sum( +# statistics[mt].get(NotificationStatus.REQUESTED, 0) for mt in message_types +# ), +# NotificationStatus.DELIVERED: sum( +# statistics[mt].get(NotificationStatus.DELIVERED, 0) for mt in message_types +# ), +# NotificationStatus.FAILED: sum( +# statistics[mt].get(NotificationStatus.FAILED, 0) for mt in message_types +# ), +# } +# +# stats[NotificationStatus.PENDING] = ( +# stats[NotificationStatus.REQUESTED] +# - stats[NotificationStatus.DELIVERED] +# - stats[NotificationStatus.FAILED] +# ) +# +# filters = [ +# (NotificationStatus.REQUESTED, "total", "sending,delivered,failed"), +# (NotificationStatus.PENDING, "pending", "sending,pending"), +# (NotificationStatus.DELIVERED, "delivered", "delivered"), +# (NotificationStatus.FAILED, "failed", "failed"), +# ] +# return [ +# ( +# label, +# option, +# url_for( +# ".view_notifications", +# service_id=service.id, +# message_type=message_type, +# status=option, +# ), +# stats.get(key), +# ) +# for key, label, option in filters +# ] def _get_job_counts(job): diff --git a/app/navigation.py b/app/navigation.py index a539671c8..1a016f0dc 100644 --- a/app/navigation.py +++ b/app/navigation.py @@ -63,7 +63,7 @@ class HeaderNavigation(Navigation): "service_dashboard", "template_usage", "view_notification", - "view_notifications", + # "view_notifications", "action_blocked", "add_service_template", "check_messages", @@ -160,7 +160,7 @@ class MainNavigation(Navigation): "service_dashboard", "template_usage", "view_notification", - "view_notifications", + # "view_notifications", }, "templates": { "action_blocked", @@ -268,7 +268,7 @@ class CaseworkNavigation(Navigation): "send_one_off_to_myself", }, "sent-messages": { - "view_notifications", + # "view_notifications", "view_notification", }, "uploads": { diff --git a/app/templates/components/main_nav.html b/app/templates/components/main_nav.html index f110a9455..51797fe7f 100644 --- a/app/templates/components/main_nav.html +++ b/app/templates/components/main_nav.html @@ -10,9 +10,9 @@
  • Dashboard
  • Activity
  • {% endif %} - {% if not current_user.has_permissions(ServicePermission.VIEW_ACTIVITY) %} -
  • Sent messages
  • - {% endif %} + {# {% if not current_user.has_permissions(ServicePermission.VIEW_ACTIVITY) %} #} + {#
  • Sent messages
  • #} + {# {% endif %} #} {% elif current_user.has_permissions(allow_org_user=True) %}
  • Usage
  • Team members
  • diff --git a/app/templates/views/notifications.html b/app/templates/views/notifications.html deleted file mode 100644 index 594fa412d..000000000 --- a/app/templates/views/notifications.html +++ /dev/null @@ -1,92 +0,0 @@ -{% extends "withnav_template.html" %} -{% from "components/ajax-block.html" import ajax_block %} -{% from "components/page-header.html" import page_header %} -{% from "components/page-footer.html" import page_footer %} -{% from "components/form.html" import form_wrapper %} -{% from "components/components/button/macro.njk" import usaButton %} - -{% set page_title = ( - (99|message_count_label(message_type, suffix='')) | capitalize - if current_user.has_permissions(ServicePermission.VIEW_ACTIVITY) - else 'Sent messages' -) %} - -{% block service_page_title %} - {{ page_title }} -{% endblock %} - -{% block maincolumn_content %} - - {{ page_header(page_title) }} - {{ ajax_block( - partials, - url_for('.get_notifications_as_json', service_id=current_service.id, message_type=message_type, status=status), - 'counts' - ) }} - - -

    - Messages will remain in pending state until carrier status is received, typically 5 minutes. -

    - - {% call form_wrapper( - action=url_for('.view_notifications', service_id=current_service.id, message_type=message_type), - class="usa-search margin-bottom-2" - ) %} -
    - {{ search_form.to(param_extensions={ - "label": { - "text": things_you_can_search_by|formatted_list( - conjunction='or', - before_each='', - after_each='', - prefix='Search by', - prefix_plural='Search by' - ) - } - }) }} -
    - - - {% endcall %} - - - - - - {% call form_wrapper(id="search-form") %} - - - {% endcall %} - - {% if current_user.has_permissions(ServicePermission.VIEW_ACTIVITY) %} -

    - Download all data last 7 days (CSV) -   - Data available for {{ partials.service_data_retention_days }} days -

    -

    - Download all data last 5 days (CSV) -   -

    -

    - Download all data last 3 days (CSV) -   -

    -

    - Download all data today (CSV) -   -

    - {% endif %} - - {{ ajax_block( - partials, - url_for('.get_notifications_as_json', service_id=current_service.id, message_type=message_type, status=status, page=page), - 'notifications', - form='search-form' - ) }} - -{% endblock %} diff --git a/tests/app/test_navigation.py b/tests/app/test_navigation.py index e7c4646bb..7f7d93700 100644 --- a/tests/app/test_navigation.py +++ b/tests/app/test_navigation.py @@ -104,7 +104,6 @@ EXCLUDED_ENDPOINTS = tuple( "get_daily_stats_by_user", "get_volumes_by_service", "get_example_csv", - "get_notifications_as_json", "get_redis_report", "get_started", "get_started_old",