module
pretalx.mail.domain.placeholders
Functions 8
escape_for_html_body(value) -> strsourceHTML-variant escape for untrusted content: HTML-escape tag characters, entity-encode markdown link brackets, and collapse newlines to <br> to keep the surrounding <span> fence intact.
def escape_for_html_body(value) -> str:
"""HTML-variant escape for untrusted content: HTML-escape tag
characters, entity-encode markdown link brackets, and collapse
newlines to ``<br>`` to keep the surrounding ``<span>`` fence intact."""
escaped = conditional_escape(str(value or ""))
escaped = defuse_markdown_links(escaped)
return _NEWLINE_RE.sub("<br>", escaped)
escape_for_plain_body(value) -> strsourcePlain-variant escape for untrusted content: strip HTML-tag-like sequences and backslash-escape markdown link metacharacters.
def escape_for_plain_body(value) -> str:
"""Plain-variant escape for untrusted content: strip HTML-tag-like
sequences and backslash-escape markdown link metacharacters."""
return defuse_markdown_links(
_HTML_TAG_LIKE_RE.sub("", str(value or "")), mode=MODE_PLAIN
)
get_available_placeholders(event, kwargs)source
def get_available_placeholders(event, kwargs):
params = {}
for _recv, placeholders in register_mail_placeholders.send(sender=event):
placeholder_list = (
placeholders if isinstance(placeholders, (list, tuple)) else [placeholders]
)
for placeholder in placeholder_list:
if all(required in kwargs for required in placeholder.required_context):
params[placeholder.identifier] = placeholder
return params
get_invalid_placeholders(text, valid_placeholders)source
def get_invalid_placeholders(text, valid_placeholders):
return get_used_placeholders(text) - set(valid_placeholders)
get_used_placeholders(text)source
def get_used_placeholders(text):
if not text:
return set()
if isinstance(text, str):
return {element[1] for element in string.Formatter().parse(text) if element[1]}
if getattr(text, "data", None):
return get_used_placeholders(text.data)
if isinstance(text, dict):
placeholders = set()
for lang in text.values():
placeholders |= get_used_placeholders(lang)
return placeholders
return set()
placeholders_for_role(event, role)sourceReturn the dict of valid placeholders for role on event.
def placeholders_for_role(event, role):
"""Return the dict of valid placeholders for role on event."""
extras = {p.identifier: p for p in ROLE_EXTRA_PLACEHOLDERS.get(role, [])}
kwargs = PLACEHOLDER_KWARGS.get(role, ["event", "user", "submission", "slot"])
return get_available_placeholders(event=event, kwargs=kwargs) | extras
placeholders_for_template(template)source
def placeholders_for_template(template):
return placeholders_for_role(template.event, template.role)
untrusted_plain_value(value) -> pretalx.common.text.formatting.EmailAlternativeStringsourceBuild an EmailAlternativeString for a raw untrusted string.
Use to pass a per-call untrusted value through safe_extra_context when no registered placeholder fits.
def untrusted_plain_value(value) -> EmailAlternativeString:
"""Build an :class:`EmailAlternativeString` for a raw untrusted
string. Use to pass a per-call untrusted value through
``safe_extra_context`` when no registered placeholder fits."""
return EmailAlternativeString(
plain=escape_for_plain_body(value),
html=f"<span>{escape_for_html_body(value)}</span>",
)