From e95cc5ea938d4bfeae739188487589cf9904d10a Mon Sep 17 00:00:00 2001
From: Thomas Steen Rasmussen
Date: Sat, 18 Mar 2017 16:54:23 +0100
Subject: [PATCH] add EnsureWritableCampMixin to villages
---
src/villages/mixins.py | 17 +++++++++++++++++
src/villages/templates/village_list.html | 2 +-
src/villages/views.py | 8 +++++---
3 files changed, 23 insertions(+), 4 deletions(-)
create mode 100644 src/villages/mixins.py
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'