暂无描述

views.py 6.7KB

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