in bedrock/newsletter/views.py [0:0]
def newsletter_subscribe(request):
if request.method == "POST":
newsletters = request.POST.getlist("newsletters")
form = NewsletterFooterForm(newsletters, l10n_utils.get_locale(request), request.POST)
errors = []
if form.is_valid():
data = form.cleaned_data
kwargs = {}
# add optional data
kwargs.update(
{
k: data[k]
for k in [
"country",
"lang",
"source_url",
"first_name",
"last_name",
]
if data[k]
}
)
# NOTE this is not a typo; Referrer is misspelled in the HTTP spec
# https://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.36
if not kwargs.get("source_url") and request.headers.get("Referer"):
kwargs["source_url"] = request.headers["Referer"]
# Convert data["newsletters"] to a comma separated string.
newsletters = data["newsletters"]
if isinstance(newsletters, list):
newsletters = ",".join(newsletters)
try:
basket.subscribe(data["email"], newsletters, **kwargs)
except basket.BasketException as e:
if e.code == basket.errors.BASKET_INVALID_EMAIL:
errors.append(str(invalid_email_address))
else:
log.exception(f"Error subscribing {data['email']} to newsletter(s) {newsletters}")
errors.append(str(general_error))
else:
if "email" in form.errors:
errors.append(ftl("newsletter-form-please-enter-a-valid"))
if "privacy" in form.errors:
errors.append(ftl("newsletter-form-you-must-agree-to"))
for fieldname in ("newsletters", "lang", "country"):
if fieldname in form.errors:
errors.extend(form.errors[fieldname])
# form error messages may contain unsanitized user input
errors = [escape(e) for e in errors]
if request.headers.get("x-requested-with") == "XMLHttpRequest":
# return JSON
if errors:
resp = {
"success": False,
"errors": errors,
}
else:
resp = {"success": True}
return JsonResponse(resp)
else:
ctx = {"newsletter_form": form}
if not errors:
ctx["success"] = True
return l10n_utils.render(request, "newsletter/index.html", ctx, ftl_files=FTL_FILES)
return l10n_utils.render(request, "newsletter/index.html", ftl_files=FTL_FILES)