Geen omschrijving

views.py 6.9KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181
  1. from __future__ import annotations
  2. from django.shortcuts import render, redirect, get_object_or_404
  3. from django.contrib import messages
  4. from django.urls import reverse
  5. from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger
  6. from orgs.models import Organization
  7. from recycle_core.models import ProvidedService
  8. from recycle_core.models import Material, ScrapListing, PickupOrder
  9. from cms.models import Post, PostCategory
  10. from .forms import PickupRequestForm, ContactForm
  11. from .models import Lead
  12. from recycle_core.controllers.pickup_request import (
  13. PickupRequestController,
  14. PickupRequestData,
  15. )
  16. def home(request):
  17. org = getattr(request, "org", None)
  18. posts_qs = Post.objects.all()
  19. if org is not None:
  20. posts_qs = posts_qs.filter(organization=org)
  21. posts = posts_qs.order_by("-published_at")[:3]
  22. listings_qs = ScrapListing.objects.filter(is_public=True)
  23. if org is not None:
  24. listings_qs = listings_qs.filter(organization=org)
  25. listings = listings_qs.order_by("-created_at")[:6]
  26. materials_qs = Material.objects.all().order_by("name")
  27. if org is not None:
  28. materials_qs = materials_qs.filter(organization=org)
  29. materials = materials_qs[:12]
  30. services_qs = ProvidedService.objects.none()
  31. if org is not None:
  32. services_qs = ProvidedService.objects.filter(organization=org, is_enabled=True).order_by("display_order", "id")
  33. services = list(services_qs)
  34. pickup_form = PickupRequestForm()
  35. contact_form = ContactForm()
  36. return render(
  37. request,
  38. "public_frontend/home.html",
  39. {
  40. "posts": posts,
  41. "listings": listings,
  42. "materials": materials,
  43. "services": services,
  44. "pickup_form": pickup_form,
  45. "contact_form": contact_form,
  46. "org": org,
  47. },
  48. )
  49. def materials_list(request):
  50. org = getattr(request, "org", None)
  51. qs = Material.objects.all().order_by("name")
  52. if org is not None:
  53. qs = qs.filter(organization=org)
  54. return render(request, "public_frontend/materials_list.html", {"materials": qs, "org": org})
  55. def listings_list(request):
  56. org = getattr(request, "org", None)
  57. qs = ScrapListing.objects.filter(is_public=True, status=ScrapListing.STATUS_OPEN).order_by("-created_at")
  58. if org is not None:
  59. qs = qs.filter(organization=org)
  60. paginator = Paginator(qs, 12)
  61. page = request.GET.get("page")
  62. try:
  63. page_obj = paginator.page(page)
  64. except PageNotAnInteger:
  65. page_obj = paginator.page(1)
  66. except EmptyPage:
  67. page_obj = paginator.page(paginator.num_pages)
  68. return render(request, "public_frontend/listings_list.html", {"page_obj": page_obj, "listings": page_obj.object_list, "org": org})
  69. def listing_detail(request, pk: int):
  70. org = getattr(request, "org", None)
  71. base_qs = ScrapListing.objects.filter(is_public=True)
  72. if org is not None:
  73. base_qs = base_qs.filter(organization=org)
  74. listing = get_object_or_404(base_qs, pk=pk)
  75. return render(request, "public_frontend/listing_detail.html", {"listing": listing, "org": org})
  76. def service_detail(request, pk: int):
  77. org = getattr(request, "org", None)
  78. base_qs = ProvidedService.objects.filter(is_enabled=True)
  79. if org is not None:
  80. base_qs = base_qs.filter(organization=org)
  81. service = get_object_or_404(base_qs, pk=pk)
  82. return render(request, "public_frontend/service_detail.html", {"service": service, "org": org})
  83. def pickup_request(request):
  84. org = getattr(request, "org", None)
  85. form = PickupRequestForm(request.POST or None, request.FILES or None)
  86. if request.method == "POST":
  87. if not org:
  88. messages.error(request, "Organization context missing.")
  89. return redirect("public_frontend:pickup_request")
  90. if form.is_valid():
  91. ctrl = PickupRequestController()
  92. data = PickupRequestData(
  93. organization=org,
  94. name=form.cleaned_data.get("name"),
  95. email=form.cleaned_data.get("email", ""),
  96. phone=form.cleaned_data.get("phone", ""),
  97. address=form.cleaned_data.get("address", ""),
  98. materials=form.cleaned_data.get("materials", ""),
  99. preferred_at=form.cleaned_data.get("preferred_at"),
  100. files=request.FILES.getlist("photos") if hasattr(request, "FILES") and "photos" in request.FILES else [],
  101. )
  102. result = ctrl.submit(data)
  103. if result.ok:
  104. messages.success(request, "Thanks! Your pickup request was submitted.")
  105. return redirect("public_frontend:home")
  106. else:
  107. messages.error(request, result.error or "Unable to submit your request.")
  108. else:
  109. messages.error(request, "Please correct the errors below.")
  110. return render(request, "public_frontend/pickup_request.html", {"form": form, "org": org})
  111. def contact(request):
  112. org = getattr(request, "org", None)
  113. form = ContactForm(request.POST or None)
  114. if request.method == "POST":
  115. if not org:
  116. messages.error(request, "Organization context missing.")
  117. return redirect("public_frontend:contact")
  118. if form.is_valid():
  119. Lead.objects.create(
  120. organization=org,
  121. name=form.cleaned_data["name"],
  122. email=form.cleaned_data["email"],
  123. phone=form.cleaned_data.get("phone", ""),
  124. subject=form.cleaned_data.get("subject", ""),
  125. message=form.cleaned_data.get("message", ""),
  126. source="contact",
  127. )
  128. messages.success(request, "Thanks! We will get back to you shortly.")
  129. return redirect("public_frontend:home")
  130. messages.error(request, "Please correct the errors below.")
  131. return render(request, "public_frontend/contact.html", {"form": form, "org": org})
  132. def blog_list(request):
  133. org = getattr(request, "org", None)
  134. qs = Post.objects.all().order_by("-published_at", "-created_at")
  135. if org is not None:
  136. qs = qs.filter(organization=org)
  137. paginator = Paginator(qs, 10)
  138. page = request.GET.get("page")
  139. try:
  140. page_obj = paginator.page(page)
  141. except PageNotAnInteger:
  142. page_obj = paginator.page(1)
  143. except EmptyPage:
  144. page_obj = paginator.page(paginator.num_pages)
  145. return render(request, "public_frontend/blog_list.html", {"page_obj": page_obj, "posts": page_obj.object_list, "org": org})
  146. def blog_detail(request, slug: str):
  147. org = getattr(request, "org", None)
  148. base_qs = Post.objects.all()
  149. if org is not None:
  150. base_qs = base_qs.filter(organization=org)
  151. post = get_object_or_404(base_qs, slug=slug)
  152. # Ensure markdown is rendered; fallback to raw content if needed
  153. html = getattr(post, "content_html", None) or getattr(post, "content", "")
  154. return render(request, "public_frontend/blog_detail.html", {"post": post, "html": html, "org": org})