Files
notifications-admin/app/main/views/conversation.py
T

153 lines
4.9 KiB
Python
Raw Normal View History

2018-02-20 11:22:17 +00:00
from flask import jsonify, redirect, render_template, session, url_for
from flask_login import current_user
2018-02-20 11:22:17 +00:00
from notifications_python_client.errors import HTTPError
2017-05-24 13:19:31 +01:00
from notifications_utils.recipients import format_phone_number_human_readable
from notifications_utils.template import SMSPreviewTemplate
2018-02-20 11:22:17 +00:00
2018-10-25 07:59:50 +01:00
from app import current_service, notification_api_client, service_api_client
2017-05-24 13:19:31 +01:00
from app.main import main
from app.main.forms import SearchByNameForm
from app.models.template_list import TemplateList
2021-06-09 13:19:05 +01:00
from app.utils.user import user_has_permissions
2017-05-24 13:19:31 +01:00
2019-11-04 11:07:55 +00:00
@main.route("/services/<uuid:service_id>/conversation/<uuid:notification_id>")
@user_has_permissions("view_activity")
2017-05-24 13:19:31 +01:00
def conversation(service_id, notification_id):
user_number = get_user_number(service_id, notification_id)
return render_template(
"views/conversations/conversation.html",
2017-05-24 13:19:31 +01:00
user_number=user_number,
2017-07-07 15:34:06 +01:00
partials=get_conversation_partials(service_id, user_number),
updates_url=url_for(
".conversation_updates",
service_id=service_id,
notification_id=notification_id,
),
2017-10-15 12:59:36 +01:00
notification_id=notification_id,
2017-05-24 13:19:31 +01:00
)
2019-11-04 11:07:55 +00:00
@main.route("/services/<uuid:service_id>/conversation/<uuid:notification_id>.json")
@user_has_permissions("view_activity")
2017-07-07 15:34:06 +01:00
def conversation_updates(service_id, notification_id):
return jsonify(
get_conversation_partials(
service_id, get_user_number(service_id, notification_id)
)
)
2017-07-07 15:34:06 +01:00
@main.route(
"/services/<uuid:service_id>/conversation/<uuid:notification_id>/reply-with"
)
@main.route(
"/services/<uuid:service_id>/conversation/<uuid:notification_id>/reply-with/from-folder/<uuid:from_folder>"
)
@user_has_permissions("send_messages")
2017-10-15 12:59:36 +01:00
def conversation_reply(
service_id,
notification_id,
from_folder=None,
2017-10-15 12:59:36 +01:00
):
return render_template(
"views/templates/choose-reply.html",
templates_and_folders=TemplateList(
current_service,
template_folder_id=from_folder,
user=current_user,
template_type="sms",
),
template_folder_path=current_service.get_template_folder_path(from_folder),
search_form=SearchByNameForm(),
notification_id=notification_id,
template_type="sms",
2017-10-15 12:59:36 +01:00
)
@main.route(
"/services/<uuid:service_id>/conversation/<uuid:notification_id>/reply-with/<uuid:template_id>"
)
@user_has_permissions("send_messages")
def conversation_reply_with_template(
service_id,
notification_id,
template_id,
):
session["recipient"] = get_user_number(service_id, notification_id)
session["placeholders"] = {"phone number": session["recipient"]}
return redirect(
url_for(
"main.send_one_off_step",
service_id=service_id,
template_id=template_id,
step_index=1,
)
)
2017-07-07 15:34:06 +01:00
def get_conversation_partials(service_id, user_number):
return {
"messages": render_template(
"views/conversations/messages.html",
2017-07-07 15:34:06 +01:00
conversation=get_sms_thread(service_id, user_number),
)
}
2017-05-24 13:19:31 +01:00
def get_user_number(service_id, notification_id):
try:
user_number = service_api_client.get_inbound_sms_by_id(
service_id, notification_id
)["user_number"]
except HTTPError as e:
if e.status_code != 404:
raise
user_number = notification_api_client.get_notification(
service_id, notification_id
)["to"]
2017-05-24 13:19:31 +01:00
return format_phone_number_human_readable(user_number)
def get_sms_thread(service_id, user_number):
for notification in sorted(
( # noqa: B020
notification_api_client.get_notifications_for_service(
service_id, to=user_number, template_type="sms"
)["notifications"]
+ service_api_client.get_inbound_sms(service_id, user_number=user_number)[
"data"
]
),
key=lambda notification: notification["created_at"],
):
is_inbound = "notify_number" in notification
redact_personalisation = (
not is_inbound and notification["template"]["redact_personalisation"]
)
2017-07-07 10:04:49 +01:00
if redact_personalisation:
notification["personalisation"] = {}
2017-06-07 15:46:34 +01:00
yield {
"inbound": is_inbound,
"content": SMSPreviewTemplate(
{
"template_type": "sms",
"content": (
notification["content"]
if is_inbound
else notification["template"]["content"]
),
},
notification.get("personalisation"),
2019-05-03 15:13:39 +01:00
downgrade_non_sms_characters=(not is_inbound),
2017-07-07 10:04:49 +01:00
redact_missing_personalisation=redact_personalisation,
2017-05-24 13:19:31 +01:00
),
"created_at": notification["created_at"],
"status": notification.get("status"),
"id": notification["id"],
2017-05-24 13:19:31 +01:00
}