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 wagtail.models import Locale, Site from oscar.core.utils import redirect_to_referrer 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", "/"))