Bez popisu

views.py 5.6KB

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