2023-09-22 10:05:50 -07:00
|
|
|
from flask import current_app
|
2021-06-09 15:15:35 +01:00
|
|
|
from notifications_utils.recipients import RecipientCSV
|
|
|
|
|
|
|
|
|
|
from app.models.spreadsheet import Spreadsheet
|
|
|
|
|
from app.utils.templates import get_sample_template
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def get_errors_for_csv(recipients, template_type):
|
|
|
|
|
errors = []
|
|
|
|
|
|
|
|
|
|
if any(recipients.rows_with_bad_recipients):
|
|
|
|
|
number_of_bad_recipients = len(list(recipients.rows_with_bad_recipients))
|
2023-08-25 09:12:23 -07:00
|
|
|
if "sms" == template_type:
|
2021-06-09 15:15:35 +01:00
|
|
|
if 1 == number_of_bad_recipients:
|
|
|
|
|
errors.append("fix 1 phone number")
|
|
|
|
|
else:
|
|
|
|
|
errors.append("fix {} phone numbers".format(number_of_bad_recipients))
|
2023-08-25 09:12:23 -07:00
|
|
|
elif "email" == template_type:
|
2021-06-09 15:15:35 +01:00
|
|
|
if 1 == number_of_bad_recipients:
|
|
|
|
|
errors.append("fix 1 email address")
|
|
|
|
|
else:
|
|
|
|
|
errors.append("fix {} email addresses".format(number_of_bad_recipients))
|
|
|
|
|
|
|
|
|
|
if any(recipients.rows_with_missing_data):
|
|
|
|
|
number_of_rows_with_missing_data = len(list(recipients.rows_with_missing_data))
|
|
|
|
|
if 1 == number_of_rows_with_missing_data:
|
|
|
|
|
errors.append("enter missing data in 1 row")
|
|
|
|
|
else:
|
2023-08-25 09:12:23 -07:00
|
|
|
errors.append(
|
|
|
|
|
"enter missing data in {} rows".format(number_of_rows_with_missing_data)
|
|
|
|
|
)
|
2021-06-09 15:15:35 +01:00
|
|
|
|
|
|
|
|
if any(recipients.rows_with_message_too_long):
|
2023-08-25 09:12:23 -07:00
|
|
|
number_of_rows_with_message_too_long = len(
|
|
|
|
|
list(recipients.rows_with_message_too_long)
|
|
|
|
|
)
|
2021-06-09 15:15:35 +01:00
|
|
|
if 1 == number_of_rows_with_message_too_long:
|
|
|
|
|
errors.append("shorten the message in 1 row")
|
|
|
|
|
else:
|
2023-08-25 09:12:23 -07:00
|
|
|
errors.append(
|
|
|
|
|
"shorten the messages in {} rows".format(
|
|
|
|
|
number_of_rows_with_message_too_long
|
|
|
|
|
)
|
|
|
|
|
)
|
2021-06-09 15:15:35 +01:00
|
|
|
|
|
|
|
|
if any(recipients.rows_with_empty_message):
|
2023-08-25 09:12:23 -07:00
|
|
|
number_of_rows_with_empty_message = len(
|
|
|
|
|
list(recipients.rows_with_empty_message)
|
|
|
|
|
)
|
2021-06-09 15:15:35 +01:00
|
|
|
if 1 == number_of_rows_with_empty_message:
|
|
|
|
|
errors.append("check you have content for the empty message in 1 row")
|
|
|
|
|
else:
|
2023-08-25 09:12:23 -07:00
|
|
|
errors.append(
|
|
|
|
|
"check you have content for the empty messages in {} rows".format(
|
|
|
|
|
number_of_rows_with_empty_message
|
|
|
|
|
)
|
|
|
|
|
)
|
2021-06-09 15:15:35 +01:00
|
|
|
|
|
|
|
|
return errors
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def generate_notifications_csv(**kwargs):
|
|
|
|
|
from app import notification_api_client
|
|
|
|
|
from app.s3_client.s3_csv_client import s3download
|
|
|
|
|
|
2023-08-25 09:12:23 -07:00
|
|
|
if "page" not in kwargs:
|
|
|
|
|
kwargs["page"] = 1
|
|
|
|
|
|
|
|
|
|
if kwargs.get("job_id"):
|
|
|
|
|
original_file_contents = s3download(kwargs["service_id"], kwargs["job_id"])
|
2021-06-09 15:15:35 +01:00
|
|
|
original_upload = RecipientCSV(
|
|
|
|
|
original_file_contents,
|
2023-08-25 09:12:23 -07:00
|
|
|
template=get_sample_template(kwargs["template_type"]),
|
2021-06-09 15:15:35 +01:00
|
|
|
)
|
|
|
|
|
original_column_headers = original_upload.column_headers
|
2023-08-25 09:12:23 -07:00
|
|
|
fieldnames = (
|
|
|
|
|
["Row number"]
|
|
|
|
|
+ original_column_headers
|
2023-09-22 10:05:50 -07:00
|
|
|
+ ["Template", "Type", "Sent by", "Job", "Status", "Time"]
|
2023-08-25 09:12:23 -07:00
|
|
|
)
|
2021-06-09 15:15:35 +01:00
|
|
|
else:
|
2023-08-25 09:12:23 -07:00
|
|
|
fieldnames = [
|
|
|
|
|
"Recipient",
|
|
|
|
|
"Template",
|
|
|
|
|
"Type",
|
|
|
|
|
"Sent by",
|
|
|
|
|
"Job",
|
|
|
|
|
"Status",
|
|
|
|
|
"Time",
|
|
|
|
|
]
|
2021-06-09 15:15:35 +01:00
|
|
|
|
2023-08-25 09:12:23 -07:00
|
|
|
yield ",".join(fieldnames) + "\n"
|
2021-06-09 15:15:35 +01:00
|
|
|
|
2023-08-25 09:12:23 -07:00
|
|
|
while kwargs["page"]:
|
|
|
|
|
notifications_resp = notification_api_client.get_notifications_for_service(
|
|
|
|
|
**kwargs
|
|
|
|
|
)
|
|
|
|
|
for notification in notifications_resp["notifications"]:
|
2023-09-22 10:05:50 -07:00
|
|
|
current_app.logger.info(notification)
|
2023-08-25 09:12:23 -07:00
|
|
|
if kwargs.get("job_id"):
|
|
|
|
|
values = (
|
|
|
|
|
[
|
|
|
|
|
notification["row_number"],
|
|
|
|
|
]
|
|
|
|
|
+ [
|
|
|
|
|
original_upload[notification["row_number"] - 1].get(header).data
|
|
|
|
|
for header in original_column_headers
|
|
|
|
|
]
|
|
|
|
|
+ [
|
|
|
|
|
notification["template_name"],
|
|
|
|
|
notification["template_type"],
|
2023-09-22 10:05:50 -07:00
|
|
|
notification["created_by_name"],
|
2023-08-25 09:12:23 -07:00
|
|
|
notification["job_name"],
|
|
|
|
|
notification["status"],
|
|
|
|
|
notification["created_at"],
|
|
|
|
|
]
|
|
|
|
|
)
|
2021-06-09 15:15:35 +01:00
|
|
|
else:
|
|
|
|
|
values = [
|
2023-08-25 09:12:23 -07:00
|
|
|
notification["recipient"],
|
|
|
|
|
notification["template_name"],
|
|
|
|
|
notification["template_type"],
|
|
|
|
|
notification["created_by_name"] or "",
|
|
|
|
|
notification["job_name"] or "",
|
|
|
|
|
notification["status"],
|
|
|
|
|
notification["created_at"],
|
2021-06-09 15:15:35 +01:00
|
|
|
]
|
|
|
|
|
yield Spreadsheet.from_rows([map(str, values)]).as_csv_data
|
|
|
|
|
|
2023-08-25 09:12:23 -07:00
|
|
|
if notifications_resp["links"].get("next"):
|
|
|
|
|
kwargs["page"] += 1
|
2021-06-09 15:15:35 +01:00
|
|
|
else:
|
|
|
|
|
return
|
|
|
|
|
raise Exception("Should never reach here")
|