Store contact form submissions in Wagtail admin
This commit is contained in:
7
contact_form/__init__.py
Normal file
7
contact_form/__init__.py
Normal file
@@ -0,0 +1,7 @@
|
||||
"""Project-level overrides for the Ocyan contact_form plugin.
|
||||
|
||||
Ocyan loads contact form handlers via module labels like `contact_form.views`.
|
||||
By shipping this package in the project repository we can extend behavior
|
||||
without forking the upstream plugin.
|
||||
"""
|
||||
|
||||
104
contact_form/views.py
Normal file
104
contact_form/views.py
Normal file
@@ -0,0 +1,104 @@
|
||||
from __future__ import annotations
|
||||
|
||||
import logging
|
||||
|
||||
from django.conf import settings
|
||||
from django.contrib import messages
|
||||
from django.core.mail import EmailMultiAlternatives
|
||||
from django.shortcuts import redirect
|
||||
from django.template.loader import render_to_string
|
||||
from django.urls import reverse
|
||||
from django.utils.translation import gettext as _
|
||||
from django.views.decorators.http import require_http_methods
|
||||
from django.views.generic import TemplateView
|
||||
|
||||
from oscar.core.utils import redirect_to_referrer
|
||||
from wagtail.models import Locale, Site
|
||||
|
||||
from ocyan.core.fender import config
|
||||
from ocyan.plugin.contact_form.forms import ContactForm
|
||||
from ocyan.plugin.contact_form.utils import get_from_email, get_to_email
|
||||
|
||||
from mandelstudio.models import ContactMessage
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
|
||||
def _client_ip(request) -> str | None:
|
||||
forwarded_for = request.META.get("HTTP_X_FORWARDED_FOR")
|
||||
if forwarded_for:
|
||||
return forwarded_for.split(",")[0].strip() or None
|
||||
return request.META.get("REMOTE_ADDR")
|
||||
|
||||
def _active_locale(request) -> Locale:
|
||||
language_code = (getattr(request, "LANGUAGE_CODE", "") or "").split("-")[0]
|
||||
if language_code:
|
||||
locale = Locale.objects.filter(language_code=language_code).first()
|
||||
if locale is not None:
|
||||
return locale
|
||||
return Locale.get_default()
|
||||
|
||||
|
||||
@require_http_methods(["POST"])
|
||||
def post_contact_form(request):
|
||||
form = ContactForm(request.POST, request=request)
|
||||
|
||||
if form.is_valid():
|
||||
cleaned = form.cleaned_data
|
||||
site = Site.find_for_request(request) or Site.objects.order_by("id").first()
|
||||
locale = _active_locale(request)
|
||||
|
||||
message_obj = ContactMessage.objects.create(
|
||||
site=site,
|
||||
locale=locale,
|
||||
user=request.user if getattr(request.user, "is_authenticated", False) else None,
|
||||
ip_address=_client_ip(request),
|
||||
path=request.path or "",
|
||||
name=str(cleaned.get("name", "")),
|
||||
email=str(cleaned.get("email_from", "")),
|
||||
phone_number=str(cleaned.get("phonenumber") or ""),
|
||||
message=str(cleaned.get("message", "")),
|
||||
)
|
||||
logger.info("Saved ContactMessage id=%s email=%s", message_obj.id, message_obj.email)
|
||||
|
||||
context = {
|
||||
"website_url": request.build_absolute_uri(),
|
||||
"form_data": cleaned,
|
||||
}
|
||||
|
||||
html_message = render_to_string("contact_form/contact_email.html", context)
|
||||
text_message = render_to_string("contact_form/contact_email.txt", context)
|
||||
|
||||
site_name = getattr(site, "site_name", "") or config.get("django", "name")
|
||||
subject = _("Contact form email from %s") % site_name
|
||||
msg = EmailMultiAlternatives(
|
||||
subject,
|
||||
text_message,
|
||||
from_email=get_from_email(request, form),
|
||||
to=get_to_email(request, form),
|
||||
reply_to=[cleaned["email_from"]],
|
||||
)
|
||||
msg.attach_alternative(html_message, "text/html")
|
||||
msg.send()
|
||||
|
||||
request.session["contact_form_submitted"] = True
|
||||
messages.add_message(request, messages.SUCCESS, _("Message sent"))
|
||||
return redirect(reverse("contact_form:contact-form-thank-you"))
|
||||
|
||||
request.session["contact_form_post_data"] = request.POST
|
||||
messages.add_message(
|
||||
request,
|
||||
messages.ERROR,
|
||||
_("An error occured in the contact form: %s") % form.errors.as_text(),
|
||||
)
|
||||
return redirect_to_referrer(request, "contact_form:contact-form-handler")
|
||||
|
||||
|
||||
class ContactFormThankYou(TemplateView):
|
||||
template_name = "contact_form/thank_you.html"
|
||||
|
||||
def get(self, request, *args, **kwargs):
|
||||
contact_form_submitted = request.session.pop("contact_form_submitted", False)
|
||||
if contact_form_submitted:
|
||||
return super().get(request, *args, **kwargs)
|
||||
return redirect(getattr(settings, "CONTACT_REDIRECT_URL", "/"))
|
||||
Reference in New Issue
Block a user