diff --git a/src/villages/mixins.py b/src/villages/mixins.py new file mode 100644 index 00000000..9b157ef6 --- /dev/null +++ b/src/villages/mixins.py @@ -0,0 +1,17 @@ +from django.views.generic.detail import SingleObjectMixin +from django.contrib import messages +from django.shortcuts import redirect +from django.urls import reverse + + +class EnsureWritableCampMixin(SingleObjectMixin): + def dispatch(self, request, *args, **kwargs): + # do not permit view if camp is in readonly mode + if self.camp.read_only: + messages.error(request, "No thanks") + return redirect(reverse('village_list', kwargs={'camp_slug': self.camp.slug})) + + # alright, continue with the request + return super().dispatch(request, *args, **kwargs) + + diff --git a/src/villages/templates/village_list.html b/src/villages/templates/village_list.html index 2331e81a..fcdda927 100644 --- a/src/villages/templates/village_list.html +++ b/src/villages/templates/village_list.html @@ -16,7 +16,7 @@ Villages | {{ block.super }} tent, chairs and tables in the shop!

-{% if user.is_authenticated %} +{% if user.is_authenticated and not camp.read_only %} Create a new {{ camp.title }} village {% endif %} diff --git a/src/villages/views.py b/src/villages/views.py index bad5bfdb..81464aa9 100644 --- a/src/villages/views.py +++ b/src/villages/views.py @@ -7,6 +7,8 @@ from django.views.generic.detail import SingleObjectMixin from .models import Village from camps.models import Camp from camps.mixins import CampViewMixin +from .mixins import EnsureWritableCampMixin +from django.contrib import messages class VillageListView(CampViewMixin, ListView): @@ -21,7 +23,7 @@ class VillageDetailView(CampViewMixin, DetailView): context_object_name = 'village' -class VillageCreateView(LoginRequiredMixin, CreateView): +class VillageCreateView(CampViewMixin, LoginRequiredMixin, EnsureWritableCampMixin, CreateView): model = Village template_name = 'village_form.html' fields = ['name', 'description', 'private'] @@ -51,7 +53,7 @@ class EnsureUserOwnsVillageMixin(SingleObjectMixin): ) -class VillageUpdateView(EnsureUserOwnsVillageMixin, LoginRequiredMixin, UpdateView): +class VillageUpdateView(CampViewMixin, EnsureUserOwnsVillageMixin, LoginRequiredMixin, EnsureWritableCampMixin, UpdateView): model = Village queryset = Village.objects.not_deleted() template_name = 'village_form.html' @@ -61,7 +63,7 @@ class VillageUpdateView(EnsureUserOwnsVillageMixin, LoginRequiredMixin, UpdateVi return self.get_object().get_absolute_url() -class VillageDeleteView(EnsureUserOwnsVillageMixin, LoginRequiredMixin, DeleteView): +class VillageDeleteView(CampViewMixin, EnsureUserOwnsVillageMixin, LoginRequiredMixin, EnsureWritableCampMixin, DeleteView): model = Village template_name = 'village_confirm_delete.html' context_object_name = 'village'