Fix email send crash when worker lacks staticfiles manifest.
Fall back to an unhashed logo URL if ManifestStaticFilesStorage misses, and run collectstatic in the worker entrypoint.
This commit is contained in:
@@ -3,13 +3,40 @@
|
||||
from __future__ import annotations
|
||||
|
||||
import html
|
||||
import logging
|
||||
import re
|
||||
|
||||
from django.conf import settings
|
||||
from django.contrib.staticfiles.storage import staticfiles_storage
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
_URL_RE = re.compile(r"(https?://[^\s<]+)")
|
||||
_LOGO_STATIC_PATH = "brand/exit_logo.png"
|
||||
|
||||
|
||||
def _absolute_static_url(site_url: str, relative: str) -> str:
|
||||
"""
|
||||
Build an absolute URL for a static asset.
|
||||
|
||||
Prefer the hashed Manifest URL when available. Fall back to the stable
|
||||
path when the manifest is missing (dj-queue worker does not run
|
||||
collectstatic) so sending mail never crashes.
|
||||
"""
|
||||
try:
|
||||
path = staticfiles_storage.url(relative)
|
||||
except ValueError:
|
||||
logger.debug(
|
||||
"staticfiles manifest miss for %s; using unhashed URL", relative
|
||||
)
|
||||
static_prefix = settings.STATIC_URL or "/static/"
|
||||
path = f"{static_prefix}{relative.lstrip('/')}"
|
||||
|
||||
if path.startswith("http://") or path.startswith("https://"):
|
||||
return path
|
||||
if not path.startswith("/"):
|
||||
path = f"/{path}"
|
||||
return f"{site_url}{path}"
|
||||
|
||||
|
||||
def email_brand_context(**extra):
|
||||
@@ -17,11 +44,7 @@ def email_brand_context(**extra):
|
||||
if not site_url:
|
||||
site_url = "https://mkdrealtor.com"
|
||||
|
||||
logo_path = staticfiles_storage.url("brand/exit_logo.png")
|
||||
if logo_path.startswith("http://") or logo_path.startswith("https://"):
|
||||
logo_url = logo_path
|
||||
else:
|
||||
logo_url = f"{site_url}{logo_path}"
|
||||
logo_url = _absolute_static_url(site_url, _LOGO_STATIC_PATH)
|
||||
|
||||
brand_name = getattr(settings, "SITE_NAME", None) or "Monica Dhillon"
|
||||
brand_legal = getattr(settings, "CREDIT_NAME", None) or brand_name
|
||||
|
||||
Reference in New Issue
Block a user