#!/usr/bin/env python # -*- coding: utf-8 -*- from django.views import View from django.views.generic.edit import CreateView, UpdateView, DeleteView from django.views.generic.detail import SingleObjectMixin from django.views.generic import ListView from django.contrib import messages from django.contrib.messages.views import SuccessMessageMixin from django.shortcuts import render, redirect, get_object_or_404 from django.urls import reverse_lazy from lostplaces.models import Place, PlaceImage from lostplaces.views import IsAuthenticatedMixin, IsPlaceSubmitterMixin from lostplaces.forms import PlaceForm, PlaceImageForm, TagSubmitForm from taggit.models import Tag class PlaceListView(IsAuthenticatedMixin, ListView): paginate_by = 5 model = Place template_name = 'place/place_list.html' ordering = ['name'] def get_context_data(self, **kwargs): context = super().get_context_data(**kwargs) context['mapping_config'] = { 'all_points': context['place_list'], 'map_center': Place.average_latlon(context['place_list']) } return context class PlaceDetailView(IsAuthenticatedMixin, View): def get(self, request, pk): place = get_object_or_404(Place, pk=pk) context = { 'place': place, 'mapping_config': { 'all_points': [ place ], 'map_center': {'latitude': place.latitude, 'longitude': place.longitude}, }, 'tagging_config': { 'all_tags': Tag.objects.all(), 'submit_form': TagSubmitForm(), 'tagged_item': place, 'submit_url_name': 'place_tag_submit', 'delete_url_name': 'place_tag_delete' } } return render(request, 'place/place_detail.html', context) class PlaceUpdateView(IsAuthenticatedMixin, IsPlaceSubmitterMixin, SuccessMessageMixin, UpdateView): template_name = 'place/place_update.html' model = Place form_class = PlaceForm success_message = 'Successfully updated place.' place_submitter_error_message = 'You do no have permissions to alter this place' def get_success_url(self): return reverse_lazy('place_detail', kwargs={'pk':self.get_object().pk}) def get_place(self): return self.get_object() class PlaceCreateView(IsAuthenticatedMixin, View): def get(self, request, *args, **kwargs): place_image_form = PlaceImageForm() place_form = PlaceForm() context = { 'place_form': place_form, 'place_image_form': place_image_form } return render(request, 'place/place_create.html', context) def post(self, request, *args, **kwargs): place_form = PlaceForm(request.POST) if place_form.is_valid(): submitter = request.user.explorer place = place_form.save(commit=False) # Save logged in user as "submitted_by" place.submitted_by = submitter place.save() if request.FILES: self._apply_multipart_image_upload( files=request.FILES.getlist('filename'), place=place, submitter=submitter ) messages.success( self.request, 'Successfully created place.' ) return redirect(reverse_lazy('place_detail', kwargs={'pk': place.pk})) else: # Usually the browser should have checked the form before sending. messages.error( self.request, 'Please fill in all required fields.' ) return render(request, 'place/place_create.html', context={'form': place_form}) def _apply_multipart_image_upload(self, files, place, submitter): for image in files: place_image = PlaceImage.objects.create( filename=image, place=place, submitted_by=submitter ) place_image.save() class PlaceDeleteView(IsAuthenticatedMixin, IsPlaceSubmitterMixin, DeleteView): template_name = 'place/place_delete.html' model = Place success_message = 'Successfully deleted place.' success_url = reverse_lazy('place_list') success_message = 'Place deleted' place_submitter_error_message = 'You do no have permission to delete this place' def delete(self, request, *args, **kwargs): messages.success(self.request, self.success_message) return super().delete(request, *args, **kwargs) def get_place(self): return self.get_object()