diff --git a/lostplaces/lostplaces_app/views/base_views.py b/lostplaces/lostplaces_app/views/base_views.py index 0fe6d5a..4eeded9 100644 --- a/lostplaces/lostplaces_app/views/base_views.py +++ b/lostplaces/lostplaces_app/views/base_views.py @@ -1,7 +1,15 @@ from django.views import View +from django.views.generic.edit import CreateView +from django.views.generic.detail import SingleObjectMixin -from django.contrib.auth.mixins import UserPassesTestMixin, LoginRequiredMixin from django.contrib import messages +from django.contrib.auth.mixins import UserPassesTestMixin, LoginRequiredMixin +from django.contrib.messages.views import SuccessMessageMixin + +from django.shortcuts import redirect +from django.urls import reverse_lazy + +from lostplaces_app.models import Place class IsAuthenticated(LoginRequiredMixin, View): redirect_field_name = 'redirect_to' @@ -35,3 +43,56 @@ class IsPlaceSubmitter(UserPassesTestMixin, View): if self.place_submitter_error_message: messages.error(self.request, self.place_submitter_error_message) return False + +class PlaceAssetCreateView(IsAuthenticated, SuccessMessageMixin, CreateView): + model = None + fields = [] + template_name = '' + success_message = '' + + def get(self, request, place_id, *args, **kwargs): + self.place = Place.objects.get(pk=place_id) + return super().get(request, *args, **kwargs) + + def post(self, request, place_id, *args, **kwargs): + self.place = Place.objects.get(pk=place_id) + response = super().post(request, *args, **kwargs) + self.object.place = self.place + self.object.submitted_by = request.user + self.object.save() + return response + + def get_context_data(self, **kwargs): + context = super().get_context_data(**kwargs) + context['place'] = self.place + return context + + def get_success_url(self): + return reverse_lazy('place_detail', kwargs={'pk': self.place.id}) + +class PlaceAssetDeleteView(IsAuthenticated, IsPlaceSubmitter, SingleObjectMixin, View): + model = None + pk_url_kwarg = 'pk' + success_message = '' + permission_denied_message = '' + + def get_place(self): + place_id = self.get_object().place.id + return Place.objects.get(pk=place_id) + + def test_func(self): + can_edit_place = super().test_func() + if can_edit_place: + return True + + if self.get_object().submitted_by == self.request.user: + return True + + messages.error(self.request, self.permission_denied_message) + return False + + def get(self, request, *args, **kwargs): + place_id = self.get_object().place.id + self.get_object().delete() + messages.success(self.request, self.success_message) + return redirect(reverse_lazy('place_detail', kwargs={'pk': place_id})) \ No newline at end of file diff --git a/lostplaces/lostplaces_app/views/views.py b/lostplaces/lostplaces_app/views/views.py index 81fc63e..28f7f25 100644 --- a/lostplaces/lostplaces_app/views/views.py +++ b/lostplaces/lostplaces_app/views/views.py @@ -1,6 +1,5 @@ from django.views import View from django.views.generic.edit import CreateView -from django.views.generic.detail import SingleObjectMixin from django.contrib.messages.views import SuccessMessageMixin from django.contrib import messages @@ -10,7 +9,10 @@ from django.shortcuts import render, redirect from lostplaces_app.forms import ExplorerCreationForm from lostplaces_app.models import Place, PhotoAlbum -from lostplaces_app.views.base_views import IsAuthenticated, IsPlaceSubmitter +from lostplaces_app.views.base_views import ( + PlaceAssetCreateView, + PlaceAssetDeleteView +) class SignUpView(SuccessMessageMixin, CreateView): form_class = ExplorerCreationForm success_url = reverse_lazy('login') @@ -27,54 +29,14 @@ class HomeView(View): } return render(request, 'home.html', context) -class PhotoAlbumCreateView(IsAuthenticated, SuccessMessageMixin, CreateView): +class PhotoAlbumCreateView(PlaceAssetCreateView): model = PhotoAlbum fields = ['url', 'label'] template_name = 'photo_album/photo_album_create.html' success_message = 'Photo Album submitted' - def get(self, request, place_id, *args, **kwargs): - self.place = Place.objects.get(pk=place_id) - return super().get(request, *args, **kwargs) - - def post(self, request, place_id, *args, **kwargs): - self.place = Place.objects.get(pk=place_id) - response = super().post(request, *args, **kwargs) - self.object.place = self.place - self.object.submitted_by = request.user - self.object.save() - return response - - def get_context_data(self, **kwargs): - context = super().get_context_data(**kwargs) - context['place'] = self.place - return context - - def get_success_url(self): - return reverse_lazy('place_detail', kwargs={'pk': self.place.id}) - -class PhotoAlbumDeleteView(IsAuthenticated, IsPlaceSubmitter, SingleObjectMixin, View): +class PhotoAlbumDeleteView(PlaceAssetDeleteView): model = PhotoAlbum pk_url_kwarg = 'pk' success_message = 'Photo Album deleted' - - def get_place(self): - place_id = self.get_object().place.id - return Place.objects.get(pk=place_id) - - def test_func(self): - can_edit_place = super().test_func() - if can_edit_place: - return True - - if self.get_object().submitted_by == self.request.user: - return True - - messages.error(self.request, 'You do not have permissions to alter this photo album') - return False - - def get(self, request, *args, **kwargs): - place_id = self.get_object().place.id - self.get_object().delete() - messages.success(self.request, self.success_message) - return redirect(reverse_lazy('place_detail', kwargs={'pk': place_id})) \ No newline at end of file + permission_denied_messsage = 'You do not have permissions to alter this photo album' \ No newline at end of file