Merge branch 'main' of https://github.com/GSA/notifications-admin into 1269-content-update-for-login-gov-settings

This commit is contained in:
Jonathan Bobel
2024-04-10 11:30:21 -04:00
14 changed files with 616 additions and 76 deletions

View File

@@ -52,6 +52,7 @@ from app.formatters import (
format_datetime_human,
format_datetime_normal,
format_datetime_relative,
format_datetime_scheduled_notification,
format_datetime_table,
format_day_of_week,
format_delta,
@@ -551,6 +552,7 @@ def add_template_filters(application):
format_datetime,
format_datetime_24h,
format_datetime_normal,
format_datetime_scheduled_notification,
format_datetime_table,
valid_phone_number,
linkable_name,

View File

@@ -583,3 +583,9 @@ details form {
#countdown-container {
display: none; // Hide the countdown timer
}
.placeholder, .placeholder-conditional {
background-color: #face00;
border: 1px solid #face00;
border-radius: 7px;
}

View File

@@ -22,7 +22,7 @@ from notifications_utils.recipients import InvalidPhoneError, validate_phone_num
from notifications_utils.take import Take
from app.utils.csv import get_user_preferred_timezone
from app.utils.time import parse_dt, parse_naive_dt
from app.utils.time import parse_naive_dt
def apply_html_class(tags, html_file):
@@ -93,16 +93,34 @@ def format_datetime_normal(date):
)
def format_datetime_scheduled_notification(date):
# e.g. April 09, 2024 at 04:00 PM US/Eastern.
# Everything except scheduled notifications, the time is always "now".
# Scheduled notifications are the exception to the rule.
# Here we are formating and displaying the datetime without converting datetime to a different timezone.
datetime_obj = parse_naive_dt(date)
format_time_without_tz = datetime_obj.replace(tzinfo=timezone.utc).strftime(
"%I:%M %p"
)
return "{} at {} {}".format(
format_date_normal(date), format_time_without_tz, get_user_preferred_timezone()
)
def format_datetime_table(date):
# example: 03-18-2024 at 04:53 PM, intended for datetimes in tables
return "{} at {}".format(format_date_numeric(date), format_time_12h(date))
def format_time_12h(date):
date = parse_dt(date)
date = parse_naive_dt(date)
preferred_tz = pytz.timezone(get_user_preferred_timezone())
return date.astimezone(preferred_tz).strftime("%I:%M %p")
return (
date.replace(tzinfo=timezone.utc).astimezone(preferred_tz).strftime("%I:%M %p")
)
def format_datetime_relative(date):

View File

@@ -470,7 +470,7 @@ def send_one_off_step(service_id, template_id, step_index):
)
def _check_messages(service_id, template_id, upload_id, preview_row):
def _check_messages(service_id, template_id, upload_id, preview_row, **kwargs):
try:
# The happy path is that the job doesnt already exist, so the
# API will return a 404 and the client will raise HTTPError.
@@ -510,11 +510,7 @@ def _check_messages(service_id, template_id, upload_id, preview_row):
show_recipient=False,
email_reply_to=email_reply_to,
sms_sender=sms_sender,
)
simplifed_template = get_template(
db_template,
current_service,
show_recipient=False,
**kwargs,
)
allow_list = []
@@ -535,7 +531,7 @@ def _check_messages(service_id, template_id, upload_id, preview_row):
allow_list = None
recipients = RecipientCSV(
contents,
template=template or simplifed_template,
template=template,
max_initial_rows_shown=50,
max_errors_shown=50,
guestlist=allow_list,
@@ -569,9 +565,6 @@ def _check_messages(service_id, template_id, upload_id, preview_row):
if preview_row < len(recipients) + 2:
template.values = recipients[preview_row - 2].recipient_and_personalisation
simplifed_template.values = recipients[
preview_row - 2
].recipient_and_personalisation
elif preview_row > 2:
abort(404)
@@ -599,7 +592,6 @@ def _check_messages(service_id, template_id, upload_id, preview_row):
service_id, template.id, db_template["version"], original_file_name
),
template_id=template_id,
simplifed_template=simplifed_template,
)
@@ -658,7 +650,9 @@ def check_messages(service_id, template_id, upload_id, row_index=2):
@user_has_permissions("send_messages", restrict_admin_usage=True)
def preview_job(service_id, template_id, upload_id, row_index=2):
session["scheduled_for"] = request.form.get("scheduled_for", "")
data = _check_messages(service_id, template_id, upload_id, row_index)
data = _check_messages(
service_id, template_id, upload_id, row_index, force_hide_sender=True
)
return render_template(
"views/check/preview.html",
@@ -825,11 +819,11 @@ def send_one_off_to_myself(service_id, template_id):
def check_notification(service_id, template_id):
return render_template(
"views/notifications/check.html",
**_check_notification(service_id, template_id),
**_check_notification(service_id, template_id, show_recipient=True),
)
def _check_notification(service_id, template_id, exception=None):
def _check_notification(service_id, template_id, exception=None, **kwargs):
db_template = current_service.get_template_with_user_permission_or_403(
template_id, current_user
)
@@ -842,13 +836,9 @@ def _check_notification(service_id, template_id, exception=None):
template = get_template(
db_template,
current_service,
show_recipient=True,
email_reply_to=email_reply_to,
sms_sender=sms_sender,
)
simplifed_template = get_template(
db_template,
current_service,
**kwargs,
)
placeholders = fields_to_fill_in(template)
@@ -874,7 +864,6 @@ def _check_notification(service_id, template_id, exception=None):
back_link_from_preview=back_link_from_preview,
choose_time_form=choose_time_form,
**(get_template_error_dict(exception) if exception else {}),
simplifed_template=simplifed_template,
)
@@ -924,7 +913,9 @@ def preview_notification(service_id, template_id):
return render_template(
"views/notifications/preview.html",
**_check_notification(service_id, template_id),
**_check_notification(
service_id, template_id, show_recipient=False, force_hide_sender=True
),
scheduled_for=session["scheduled_for"],
recipient=recipient,
)

View File

@@ -21,14 +21,14 @@
{{ page_header('Preview') }}
<div>
<p class="sms-message-scheduler">Scheduled: {{ scheduled_for |format_datetime_normal if scheduled_for else 'Now'}}</p>
<p class="sms-message-scheduler">Scheduled: {{ scheduled_for |format_datetime_scheduled_notification if scheduled_for else 'Now'}}</p>
<p class="sms-message-file-name">File: {{original_file_name}}</p>
<p class="sms-message-template">Template: {{template.name}}</p>
<p class="sms-message-sender" >From: {{ template.sender }}</p>
</div>
<h2 id="{{ file_contents_header_id }}">Message</h2>
<div class="preview-message"> {{ simplifed_template|string }}</div>
<div class="preview-message"> {{ template|string }}</div>
{% if not request.args.from_test %}
<h2>Recipients list</h2>
<div>

View File

@@ -43,14 +43,14 @@
{{ page_header('Preview') }}
{% endif %}
<div>
<p class="sms-message-scheduler">Scheduled: {{ scheduled_for |format_datetime_normal if scheduled_for else 'Now'}}</p>
<p class="sms-message-scheduler">Scheduled: {{ scheduled_for |format_datetime_scheduled_notification if scheduled_for else 'Now'}}</p>
<p class="sms-message-template">Template: {{template.name}}</p>
<p class="sms-message-sender" >From: {{ template.sender }}</p>
<p class="sms-message-sender" >To: {{ recipient }}</p>
</div>
<h2 id="{{ file_contents_header_id }}">Message</h2>
<div class="preview-message"> {{ simplifed_template|string }}</div>
<div class="preview-message"> {{ template|string }}</div>
<div class="js-stick-at-bottom-when-scrolling">
<form method="post" enctype="multipart/form-data" action="{{url_for(

View File

@@ -17,6 +17,7 @@ def get_template(
redact_missing_personalisation=False,
email_reply_to=None,
sms_sender=None,
force_hide_sender=False,
):
if "email" == template["template_type"]:
return EmailPreviewTemplate(
@@ -33,7 +34,7 @@ def get_template(
prefix=service.name,
show_prefix=service.prefix_sms,
sender=sms_sender,
show_sender=bool(sms_sender),
show_sender=bool(sms_sender) and not force_hide_sender,
show_recipient=show_recipient,
redact_missing_personalisation=redact_missing_personalisation,
)

View File

@@ -22,8 +22,3 @@ def is_less_than_days_ago(date_from_db, number_of_days):
def parse_naive_dt(dt):
return parser.parse(dt, ignoretz=True)
def parse_dt(dt):
# Parse datetime without ignoring the timezone
return parser.parse(dt)