mirror of
https://github.com/GSA/notifications-api.git
synced 2026-08-18 21:48:49 -04:00
remove LetterPreview
This commit is contained in:
@@ -210,64 +210,9 @@ class PreheaderRenderer(PlainTextRenderer):
|
|||||||
return ""
|
return ""
|
||||||
|
|
||||||
|
|
||||||
class LetterPreviewRenderer(mistune.HTMLRenderer):
|
|
||||||
def heading(self, text, level):
|
|
||||||
if level == 1:
|
|
||||||
return super().heading(text, 2)
|
|
||||||
return self.paragraph(text)
|
|
||||||
|
|
||||||
def paragraph(self, text):
|
|
||||||
if text.strip():
|
|
||||||
return f"<p>{text}</p>"
|
|
||||||
return ""
|
|
||||||
|
|
||||||
def block_code(self, code, info=None):
|
|
||||||
return code.strip()
|
|
||||||
|
|
||||||
def link(self, link, text=None, title=None, url=None):
|
|
||||||
current_app.logger(f"title={title}")
|
|
||||||
href = url
|
|
||||||
display_text = text or link
|
|
||||||
return f"{display_text}: <strong>{href.replace('http://', '').replace('https://', '')}</strong>"
|
|
||||||
|
|
||||||
def autolink(self, link, is_email=False):
|
|
||||||
current_app.logger.debug(f"is_email={is_email}")
|
|
||||||
return f"<strong>{link.replace('http://', '')}.replace(https://', '')</strong>"
|
|
||||||
|
|
||||||
def thematic_break(self):
|
|
||||||
return '<div class="page-break"> </div>'
|
|
||||||
|
|
||||||
def image(self, src, alt="", title=None, **kwargs):
|
|
||||||
return ""
|
|
||||||
|
|
||||||
def block_quote(self, text):
|
|
||||||
return text
|
|
||||||
|
|
||||||
def list_item(self, text, level=None):
|
|
||||||
return f"<li>{text.strip()}</li>\n"
|
|
||||||
|
|
||||||
def emphasis(self, text):
|
|
||||||
return f"*{text}*"
|
|
||||||
|
|
||||||
def strong(self, text):
|
|
||||||
return f"**{text}**"
|
|
||||||
|
|
||||||
def codespan(self, text):
|
|
||||||
return f"`{text}`"
|
|
||||||
|
|
||||||
def linebreak(self):
|
|
||||||
return "<br>"
|
|
||||||
|
|
||||||
def newline(self):
|
|
||||||
return "<br>"
|
|
||||||
|
|
||||||
|
|
||||||
_notify_email_markdown = mistune.create_markdown(
|
_notify_email_markdown = mistune.create_markdown(
|
||||||
renderer=EmailRenderer(), hard_wrap=True
|
renderer=EmailRenderer(), hard_wrap=True
|
||||||
)
|
)
|
||||||
notify_letter_preview_markdown = mistune.create_markdown(
|
|
||||||
renderer=LetterPreviewRenderer()
|
|
||||||
)
|
|
||||||
notify_email_preheader_markdown = mistune.create_markdown(renderer=PreheaderRenderer())
|
notify_email_preheader_markdown = mistune.create_markdown(renderer=PreheaderRenderer())
|
||||||
_notify_plain_text_email_markdown = mistune.create_markdown(
|
_notify_plain_text_email_markdown = mistune.create_markdown(
|
||||||
renderer=PlainTextRenderer()
|
renderer=PlainTextRenderer()
|
||||||
|
|||||||
@@ -8,20 +8,13 @@ from os import path
|
|||||||
from jinja2 import Environment, FileSystemLoader, select_autoescape
|
from jinja2 import Environment, FileSystemLoader, select_autoescape
|
||||||
from markupsafe import Markup
|
from markupsafe import Markup
|
||||||
|
|
||||||
from notifications_utils import (
|
from notifications_utils import MAGIC_SEQUENCE, SMS_CHAR_COUNT_LIMIT
|
||||||
LETTER_MAX_PAGE_COUNT,
|
|
||||||
MAGIC_SEQUENCE,
|
|
||||||
SMS_CHAR_COUNT_LIMIT,
|
|
||||||
utc_now,
|
|
||||||
)
|
|
||||||
from notifications_utils.countries.data import Postage
|
|
||||||
from notifications_utils.field import Field, PlainTextField
|
from notifications_utils.field import Field, PlainTextField
|
||||||
from notifications_utils.formatters import (
|
from notifications_utils.formatters import (
|
||||||
add_prefix,
|
add_prefix,
|
||||||
add_trailing_newline,
|
add_trailing_newline,
|
||||||
autolink_urls,
|
autolink_urls,
|
||||||
escape_html,
|
escape_html,
|
||||||
formatted_list,
|
|
||||||
make_quotes_smart,
|
make_quotes_smart,
|
||||||
nl2br,
|
nl2br,
|
||||||
normalise_multiple_newlines,
|
normalise_multiple_newlines,
|
||||||
@@ -30,7 +23,6 @@ from notifications_utils.formatters import (
|
|||||||
remove_smart_quotes_from_email_addresses,
|
remove_smart_quotes_from_email_addresses,
|
||||||
remove_whitespace_before_punctuation,
|
remove_whitespace_before_punctuation,
|
||||||
replace_hyphens_with_en_dashes,
|
replace_hyphens_with_en_dashes,
|
||||||
replace_hyphens_with_non_breaking_hyphens,
|
|
||||||
sms_encode,
|
sms_encode,
|
||||||
strip_leading_whitespace,
|
strip_leading_whitespace,
|
||||||
strip_unsupported_characters,
|
strip_unsupported_characters,
|
||||||
@@ -40,10 +32,8 @@ from notifications_utils.insensitive_dict import InsensitiveDict
|
|||||||
from notifications_utils.markdown import (
|
from notifications_utils.markdown import (
|
||||||
notify_email_markdown,
|
notify_email_markdown,
|
||||||
notify_email_preheader_markdown,
|
notify_email_preheader_markdown,
|
||||||
notify_letter_preview_markdown,
|
|
||||||
notify_plain_text_email_markdown,
|
notify_plain_text_email_markdown,
|
||||||
)
|
)
|
||||||
from notifications_utils.postal_address import PostalAddress, address_lines_1_to_7_keys
|
|
||||||
from notifications_utils.sanitise_text import SanitiseSMS
|
from notifications_utils.sanitise_text import SanitiseSMS
|
||||||
from notifications_utils.take import Take
|
from notifications_utils.take import Take
|
||||||
from notifications_utils.template_change import TemplateChange
|
from notifications_utils.template_change import TemplateChange
|
||||||
@@ -714,231 +704,6 @@ class EmailPreviewTemplate(BaseEmailTemplate):
|
|||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
class BaseLetterTemplate(SubjectMixin, Template):
|
|
||||||
template_type = "letter"
|
|
||||||
|
|
||||||
address_block = "\n".join(
|
|
||||||
f'(({line.replace("_", " ")}))' for line in address_lines_1_to_7_keys
|
|
||||||
)
|
|
||||||
|
|
||||||
def __init__(
|
|
||||||
self,
|
|
||||||
template,
|
|
||||||
values=None,
|
|
||||||
contact_block=None,
|
|
||||||
admin_base_url="http://localhost:6012",
|
|
||||||
logo_file_name=None,
|
|
||||||
redact_missing_personalisation=False,
|
|
||||||
date=None,
|
|
||||||
):
|
|
||||||
self.contact_block = (contact_block or "").strip()
|
|
||||||
super().__init__(
|
|
||||||
template,
|
|
||||||
values,
|
|
||||||
redact_missing_personalisation=redact_missing_personalisation,
|
|
||||||
)
|
|
||||||
self.admin_base_url = admin_base_url
|
|
||||||
self.logo_file_name = logo_file_name
|
|
||||||
self.date = date or utc_now()
|
|
||||||
|
|
||||||
@property
|
|
||||||
def subject(self):
|
|
||||||
return (
|
|
||||||
Take(
|
|
||||||
Field(
|
|
||||||
self._subject,
|
|
||||||
self.values,
|
|
||||||
redact_missing_personalisation=self.redact_missing_personalisation,
|
|
||||||
html="escape",
|
|
||||||
)
|
|
||||||
)
|
|
||||||
.then(do_nice_typography)
|
|
||||||
.then(normalise_whitespace)
|
|
||||||
)
|
|
||||||
|
|
||||||
@property
|
|
||||||
def placeholders(self):
|
|
||||||
return get_placeholders(self.contact_block) | super().placeholders
|
|
||||||
|
|
||||||
@property
|
|
||||||
def postal_address(self):
|
|
||||||
return PostalAddress.from_personalisation(InsensitiveDict(self.values))
|
|
||||||
|
|
||||||
@property
|
|
||||||
def _address_block(self):
|
|
||||||
if (
|
|
||||||
self.postal_address.has_enough_lines
|
|
||||||
and not self.postal_address.has_too_many_lines
|
|
||||||
):
|
|
||||||
return self.postal_address.normalised_lines
|
|
||||||
|
|
||||||
if "address line 7" not in self.values and "postcode" in self.values:
|
|
||||||
self.values["address line 7"] = self.values["postcode"]
|
|
||||||
|
|
||||||
return Field(
|
|
||||||
self.address_block,
|
|
||||||
self.values,
|
|
||||||
html="escape",
|
|
||||||
with_brackets=False,
|
|
||||||
).splitlines()
|
|
||||||
|
|
||||||
@property
|
|
||||||
def _contact_block(self):
|
|
||||||
return (
|
|
||||||
Take(
|
|
||||||
Field(
|
|
||||||
"\n".join(line.strip() for line in self.contact_block.split("\n")),
|
|
||||||
self.values,
|
|
||||||
redact_missing_personalisation=self.redact_missing_personalisation,
|
|
||||||
html="escape",
|
|
||||||
)
|
|
||||||
)
|
|
||||||
.then(remove_whitespace_before_punctuation)
|
|
||||||
.then(nl2br)
|
|
||||||
)
|
|
||||||
|
|
||||||
@property
|
|
||||||
def _date(self):
|
|
||||||
return self.date.strftime("%-d %B %Y")
|
|
||||||
|
|
||||||
@property
|
|
||||||
def _message(self):
|
|
||||||
return (
|
|
||||||
Take(
|
|
||||||
Field(
|
|
||||||
self.content,
|
|
||||||
self.values,
|
|
||||||
html="escape",
|
|
||||||
markdown_lists=True,
|
|
||||||
redact_missing_personalisation=self.redact_missing_personalisation,
|
|
||||||
)
|
|
||||||
)
|
|
||||||
.then(add_trailing_newline)
|
|
||||||
.then(notify_letter_preview_markdown)
|
|
||||||
.then(do_nice_typography)
|
|
||||||
.then(replace_hyphens_with_non_breaking_hyphens)
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
class LetterPreviewTemplate(BaseLetterTemplate):
|
|
||||||
jinja_template = template_env.get_template("letter_pdf/preview.jinja2")
|
|
||||||
|
|
||||||
def __str__(self):
|
|
||||||
return Markup(
|
|
||||||
self.jinja_template.render(
|
|
||||||
{
|
|
||||||
"admin_base_url": self.admin_base_url,
|
|
||||||
"logo_file_name": self.logo_file_name,
|
|
||||||
# logo_class should only ever be None, svg or png
|
|
||||||
"logo_class": (
|
|
||||||
self.logo_file_name.lower()[-3:]
|
|
||||||
if self.logo_file_name
|
|
||||||
else None
|
|
||||||
),
|
|
||||||
"subject": self.subject,
|
|
||||||
"message": self._message,
|
|
||||||
"address": self._address_block,
|
|
||||||
"contact_block": self._contact_block,
|
|
||||||
"date": self._date,
|
|
||||||
}
|
|
||||||
)
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
class LetterPrintTemplate(LetterPreviewTemplate):
|
|
||||||
jinja_template = template_env.get_template("letter_pdf/print.jinja2")
|
|
||||||
|
|
||||||
|
|
||||||
class LetterImageTemplate(BaseLetterTemplate):
|
|
||||||
jinja_template = template_env.get_template("letter_image_template.jinja2")
|
|
||||||
first_page_number = 1
|
|
||||||
allowed_postage_types = (
|
|
||||||
Postage.FIRST,
|
|
||||||
Postage.SECOND,
|
|
||||||
Postage.EUROPE,
|
|
||||||
Postage.REST_OF_WORLD,
|
|
||||||
)
|
|
||||||
|
|
||||||
def __init__(
|
|
||||||
self,
|
|
||||||
template,
|
|
||||||
values=None,
|
|
||||||
image_url=None,
|
|
||||||
page_count=None,
|
|
||||||
contact_block=None,
|
|
||||||
postage=None,
|
|
||||||
):
|
|
||||||
super().__init__(template, values, contact_block=contact_block)
|
|
||||||
if not image_url:
|
|
||||||
raise TypeError("image_url is required")
|
|
||||||
if not page_count:
|
|
||||||
raise TypeError("page_count is required")
|
|
||||||
if postage not in [None] + list(self.allowed_postage_types):
|
|
||||||
raise TypeError(
|
|
||||||
"postage must be None, {}".format(
|
|
||||||
formatted_list(
|
|
||||||
self.allowed_postage_types,
|
|
||||||
conjunction="or",
|
|
||||||
before_each="'",
|
|
||||||
after_each="'",
|
|
||||||
)
|
|
||||||
)
|
|
||||||
)
|
|
||||||
self.image_url = image_url
|
|
||||||
self.page_count = int(page_count)
|
|
||||||
self._postage = postage
|
|
||||||
|
|
||||||
@property
|
|
||||||
def postage(self):
|
|
||||||
if self.postal_address.international:
|
|
||||||
return self.postal_address.postage
|
|
||||||
return self._postage
|
|
||||||
|
|
||||||
@property
|
|
||||||
def last_page_number(self):
|
|
||||||
return min(self.page_count, LETTER_MAX_PAGE_COUNT) + self.first_page_number
|
|
||||||
|
|
||||||
@property
|
|
||||||
def page_numbers(self):
|
|
||||||
return list(range(self.first_page_number, self.last_page_number))
|
|
||||||
|
|
||||||
@property
|
|
||||||
def postage_description(self):
|
|
||||||
return {
|
|
||||||
Postage.FIRST: "first class",
|
|
||||||
Postage.SECOND: "second class",
|
|
||||||
Postage.EUROPE: "international",
|
|
||||||
Postage.REST_OF_WORLD: "international",
|
|
||||||
}.get(self.postage)
|
|
||||||
|
|
||||||
@property
|
|
||||||
def postage_class_value(self):
|
|
||||||
return {
|
|
||||||
Postage.FIRST: "letter-postage-first",
|
|
||||||
Postage.SECOND: "letter-postage-second",
|
|
||||||
Postage.EUROPE: "letter-postage-international",
|
|
||||||
Postage.REST_OF_WORLD: "letter-postage-international",
|
|
||||||
}.get(self.postage)
|
|
||||||
|
|
||||||
def __str__(self):
|
|
||||||
return Markup(
|
|
||||||
self.jinja_template.render(
|
|
||||||
{
|
|
||||||
"image_url": self.image_url,
|
|
||||||
"page_numbers": self.page_numbers,
|
|
||||||
"address": self._address_block,
|
|
||||||
"contact_block": self._contact_block,
|
|
||||||
"date": self._date,
|
|
||||||
"subject": self.subject,
|
|
||||||
"message": self._message,
|
|
||||||
"show_postage": bool(self.postage),
|
|
||||||
"postage_description": self.postage_description,
|
|
||||||
"postage_class_value": self.postage_class_value,
|
|
||||||
}
|
|
||||||
)
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
def get_sms_fragment_count(character_count, non_gsm_characters):
|
def get_sms_fragment_count(character_count, non_gsm_characters):
|
||||||
if non_gsm_characters:
|
if non_gsm_characters:
|
||||||
return 1 if character_count <= 70 else math.ceil(float(character_count) / 67)
|
return 1 if character_count <= 70 else math.ceil(float(character_count) / 67)
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user