lostplaces-backend/lostplaces/lostplaces_app/views/place_views.py

133 lines
4.6 KiB
Python
Raw Normal View History

2020-08-30 17:11:24 +02:00
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
from django.urls import reverse_lazy
from lostplaces_app.models import Place, PlaceImage
from lostplaces_app.views import IsAuthenticated, IsPlaceSubmitter
2020-08-30 18:39:45 +02:00
from lostplaces_app.forms import PlaceForm, PlaceImageCreateForm, TagSubmitForm
2020-08-30 17:11:24 +02:00
2020-08-31 18:18:24 +02:00
from taggit.models import Tag
2020-08-30 17:11:24 +02:00
class PlaceListView(IsAuthenticated, 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)
2020-09-12 12:02:25 +02:00
context['map_config'] = {
'point_list': context['place_list'],
'map_center': Place.average_latlon(context['place_list'])
}
2020-08-30 17:11:24 +02:00
return context
class PlaceDetailView(IsAuthenticated, View):
def get(self, request, pk):
place = Place.objects.get(pk=pk)
context = {
'place': place,
2020-09-12 11:42:31 +02:00
'map_config': {
'point_list': [ place ],
'map_center': {'latitude': place.latitude, 'longitude': place.longitude},
},
2020-09-02 00:08:00 +02:00
'tagging_config': {
2020-09-12 11:24:16 +02:00
'all_tags': Tag.objects.all(),
2020-09-02 00:08:00 +02:00
'submit_form': TagSubmitForm(),
'tagged_item': place,
2020-09-12 11:24:16 +02:00
'submit_url_name': 'place_tag_submit',
2020-09-02 00:08:00 +02:00
'delete_url_name': 'place_tag_delete'
}
2020-08-30 17:11:24 +02:00
}
return render(request, 'place/place_detail.html', context)
class PlaceUpdateView(IsAuthenticated, IsPlaceSubmitter, 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(IsAuthenticated, View):
def get(self, request, *args, **kwargs):
place_image_form = PlaceImageCreateForm()
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
2020-08-30 17:11:24 +02:00
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
)
kwargs_to_pass = {
'pk': place.pk
}
messages.success(
self.request, 'Successfully created place.')
return redirect(reverse_lazy('place_detail', kwargs=kwargs_to_pass))
else:
context = {
'form': form_place
}
# 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)
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(IsAuthenticated, IsPlaceSubmitter, 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()