bornhack-website/src/facilities/views.py

89 lines
3.0 KiB
Python

from django import forms
from django.contrib import messages
from django.shortcuts import redirect
from django.urls import reverse
from django.views.generic import DetailView, ListView
from django.views.generic.edit import CreateView
from camps.mixins import CampViewMixin
from .mixins import FacilityTypeViewMixin, FacilityViewMixin
from .models import Facility, FacilityFeedback, FacilityType
class FacilityTypeListView(CampViewMixin, ListView):
model = FacilityType
template_name = "facility_type_list.html"
class FacilityListView(FacilityTypeViewMixin, ListView):
model = Facility
template_name = "facility_list.html"
def get_queryset(self, *args, **kwargs):
qs = super().get_queryset(*args, **kwargs)
return qs.filter(facility_type=self.facility_type)
class FacilityDetailView(FacilityTypeViewMixin, DetailView):
model = Facility
template_name = "facility_detail.html"
pk_url_kwarg = "facility_uuid"
def get_queryset(self, *args, **kwargs):
qs = super().get_queryset(*args, **kwargs)
return qs.prefetch_related("opening_hours")
class FacilityFeedbackView(FacilityViewMixin, CreateView):
model = FacilityFeedback
template_name = "facility_feedback.html"
fields = ["quick_feedback", "comment", "urgent"]
def get_form(self, form_class=None):
"""
- Add quick feedback field to the form
- Add anon option to the form
"""
form = super().get_form(form_class)
form.fields["quick_feedback"] = forms.ModelChoiceField(
queryset=self.facility_type.quickfeedback_options.all(),
widget=forms.RadioSelect,
empty_label=None,
help_text=form.fields["quick_feedback"].help_text,
)
if self.request.user.is_authenticated:
form.fields["anonymous"] = forms.BooleanField(
label="Anonymous",
required=False,
help_text="Check if you prefer to submit this feedback without associating it with your bornhack.dk username",
)
return form
def get_context_data(self, *args, **kwargs):
context = super().get_context_data(*args, **kwargs)
context["unhandled_feedbacks"] = FacilityFeedback.objects.filter(
facility=self.facility, handled=False
).count()
return context
def form_valid(self, form):
feedback = form.save(commit=False)
feedback.facility = self.facility
if self.request.user.is_authenticated and not form.cleaned_data["anonymous"]:
feedback.user = self.request.user
feedback.save()
messages.success(self.request, "Your feedback has been submitted. Thank you!")
return redirect(
reverse(
"facilities:facility_feedback",
kwargs={
"camp_slug": self.camp.slug,
"facility_type_slug": self.facility_type.slug,
"facility_uuid": self.facility.uuid,
},
)
)