93 lines
2.8 KiB
Python
93 lines
2.8 KiB
Python
import random
|
|
|
|
from django.http import JsonResponse
|
|
from django.shortcuts import render
|
|
from django.views import View
|
|
from django.views.generic import ListView, TemplateView
|
|
|
|
from apps.products.models import SubProduct
|
|
|
|
from .forms import ContactForm
|
|
from .models import AboutSection, ContactSubmission, FAQEntry, HeroSection, HomepageSection
|
|
|
|
|
|
class HomeView(TemplateView):
|
|
template_name = "pages/home.html"
|
|
|
|
def get_context_data(self, **kwargs):
|
|
ctx = super().get_context_data(**kwargs)
|
|
ctx["hero"] = HeroSection.objects.first()
|
|
ctx["homepage_sections"] = (
|
|
HomepageSection.objects.filter(is_active=True)
|
|
.prefetch_related("items")
|
|
.order_by("order")
|
|
)
|
|
ctx["sub_products"] = (
|
|
SubProduct.objects.filter(is_active=True, show_on_homepage=True)
|
|
.select_related("main_product")
|
|
.order_by("homepage_order", "order")
|
|
)
|
|
return ctx
|
|
|
|
|
|
class AboutView(TemplateView):
|
|
template_name = "pages/about.html"
|
|
|
|
def get_context_data(self, **kwargs):
|
|
ctx = super().get_context_data(**kwargs)
|
|
ctx["about_sections"] = (
|
|
AboutSection.objects.filter(is_active=True)
|
|
.prefetch_related("items")
|
|
.order_by("order")
|
|
)
|
|
return ctx
|
|
|
|
|
|
class FAQView(ListView):
|
|
model = FAQEntry
|
|
template_name = "pages/faq.html"
|
|
context_object_name = "faq_entries"
|
|
queryset = FAQEntry.objects.filter(is_active=True)
|
|
|
|
|
|
class ContactView(View):
|
|
template_name = "pages/contact.html"
|
|
|
|
def _new_captcha(self, request):
|
|
a, b = random.randint(1, 9), random.randint(1, 9)
|
|
request.session["captcha_answer"] = a + b
|
|
return f"{a} + {b}"
|
|
|
|
def get(self, request, *args, **kwargs):
|
|
return render(
|
|
request,
|
|
self.template_name,
|
|
{"form": ContactForm(), "captcha_question": self._new_captcha(request)},
|
|
)
|
|
|
|
def post(self, request, *args, **kwargs):
|
|
form = ContactForm(request.POST)
|
|
expected = request.session.get("captcha_answer")
|
|
captcha_question = self._new_captcha(request)
|
|
|
|
captcha_ok = False
|
|
try:
|
|
captcha_ok = int(request.POST.get("captcha_answer", "")) == expected
|
|
except (ValueError, TypeError):
|
|
pass
|
|
|
|
if form.is_valid() and captcha_ok:
|
|
form.save()
|
|
return JsonResponse({"success": True})
|
|
|
|
errors: dict = {}
|
|
if not captcha_ok:
|
|
errors["captcha"] = ["Incorrect answer — please try again."]
|
|
errors.update(
|
|
{field: [str(e) for e in errs] for field, errs in form.errors.items()}
|
|
)
|
|
return JsonResponse(
|
|
{"success": False, "errors": errors, "captcha_question": captcha_question},
|
|
status=400,
|
|
)
|