#65 KML Import
This commit is contained in:
@@ -5,4 +5,5 @@ from lostplaces.views.base_views import *
|
||||
from lostplaces.views.views import *
|
||||
from lostplaces.views.place_views import *
|
||||
from lostplaces.views.place_image_views import *
|
||||
from lostplaces.views.explorer_views import *
|
||||
from lostplaces.views.explorer_views import *
|
||||
from lostplaces.views.imports import *
|
||||
@@ -31,6 +31,21 @@ class IsAuthenticatedMixin(LoginRequiredMixin, View):
|
||||
messages.error(self.request, self.permission_denied_message)
|
||||
return super().handle_no_permission()
|
||||
|
||||
class IsSuperUserMixin(UserPassesTestMixin, View):
|
||||
'''
|
||||
A view mixin that checks if the user is a superuser.
|
||||
Users who are not logged in or users who are no superuser get
|
||||
a permission deined message.
|
||||
'''
|
||||
permission_denied_message = _('You are not allowed to see this page')
|
||||
|
||||
def test_func(self):
|
||||
return self.request.user.is_superuser
|
||||
|
||||
def handle_no_permission(self):
|
||||
messages.error(self.request, self.permission_denied_message)
|
||||
return super().handle_no_permission()
|
||||
|
||||
class IsPlaceSubmitterMixin(UserPassesTestMixin, View):
|
||||
'''
|
||||
A view mixin that checks wether a user is the submitter
|
||||
|
||||
91
django_lostplaces/lostplaces/views/imports.py
Normal file
91
django_lostplaces/lostplaces/views/imports.py
Normal file
@@ -0,0 +1,91 @@
|
||||
from django.views import View
|
||||
from django.shortcuts import render, redirect, get_object_or_404
|
||||
from django.urls import reverse
|
||||
from django.utils.translation import gettext as _
|
||||
from django.core.paginator import Paginator
|
||||
|
||||
from pykml import parser as kml_parser
|
||||
|
||||
from lostplaces.forms import UploadMapFileForm
|
||||
from lostplaces.models import Place, PlaceImport
|
||||
from lostplaces.views.base_views import (
|
||||
IsSuperUserMixin
|
||||
)
|
||||
|
||||
class UploadMapFileView(IsSuperUserMixin, View):
|
||||
permission_denied_message = _('You are not allowed to import any places')
|
||||
|
||||
def get(self, request):
|
||||
upload_form = UploadMapFileForm()
|
||||
return render(request, 'import/upload_map_file.html', {'upload_form': upload_form})
|
||||
|
||||
def post(self, request):
|
||||
upload_form = UploadMapFileForm(request.POST, request.FILES)
|
||||
explorer = request.user.explorer
|
||||
|
||||
if upload_form.is_valid():
|
||||
map_file = upload_form.cleaned_data['map_file']
|
||||
parsed_kml = kml_parser.fromstring(map_file.read())
|
||||
|
||||
place_import = PlaceImport.objects.create(
|
||||
explorer=request.user.explorer,
|
||||
description=upload_form.cleaned_data['description']
|
||||
)
|
||||
|
||||
for folder in parsed_kml.Document.Folder:
|
||||
for place_kml in folder.Placemark:
|
||||
lat_long = self.get_lat_long(place_kml)
|
||||
|
||||
name = str(place_kml.name) if hasattr(place_kml, 'name') else ''
|
||||
description = str(place_kml.description) if hasattr(place_kml, 'description') else ''
|
||||
|
||||
place_model = Place.objects.create(
|
||||
name=name.strip(),
|
||||
latitude=lat_long[0],
|
||||
longitude=lat_long[1],
|
||||
description=description.strip(),
|
||||
place_import=place_import,
|
||||
mode='imported'
|
||||
)
|
||||
|
||||
place_import.save()
|
||||
|
||||
return redirect(reverse('lostplaces_home'))
|
||||
|
||||
def get_lat_long(self, place_kml):
|
||||
if hasattr(place_kml, 'Point') and len(place_kml.Point.coordinates) >= 1:
|
||||
coordinates = str(place_kml.Point.coordinates[0]).strip()
|
||||
splited = coordinates.split(',')
|
||||
latitude = 0
|
||||
longitude = 0
|
||||
|
||||
if len(splited) >= 1:
|
||||
longitude = splited[0]
|
||||
if len(splited) >= 2:
|
||||
latitude = splited[1]
|
||||
|
||||
return (latitude, longitude)
|
||||
else:
|
||||
return (0, 0)
|
||||
|
||||
class ImportDetailView(IsSuperUserMixin, View):
|
||||
permission_denied_message = _('You are not allowed to see this import\'s details')
|
||||
|
||||
def get_import(self):
|
||||
return get_object_or_404(PlaceImport, pk=self.kwargs['pk'])
|
||||
|
||||
def get(self, request, *args, **kwargs):
|
||||
place_import = self.get_import()
|
||||
|
||||
place_paginator = Paginator(place_import.place_list.all(), 18)
|
||||
paginated_places = place_paginator.get_page(
|
||||
request.GET.get('page')
|
||||
)
|
||||
context = {
|
||||
'import': place_import,
|
||||
'paginated_places': paginated_places,
|
||||
'import_type': place_import.get_import_type_display()
|
||||
}
|
||||
|
||||
return render(request, 'import/import_detail_view.html', context)
|
||||
|
||||
@@ -12,7 +12,6 @@ from django.contrib import messages
|
||||
from django.contrib.messages.views import SuccessMessageMixin
|
||||
from django.utils.translation import gettext as _
|
||||
from django.utils import timezone
|
||||
from django.utils.translation import gettext as _
|
||||
|
||||
from django.shortcuts import render, redirect, get_object_or_404
|
||||
from django.urls import reverse_lazy, reverse
|
||||
@@ -37,7 +36,7 @@ from lostplaces.common import redirect_referer_or
|
||||
from taggit.models import Tag
|
||||
|
||||
class PlaceListView(IsAuthenticatedMixin, LevelCapPlaceListView):
|
||||
paginate_by = 5
|
||||
paginate_by = 18
|
||||
template_name = 'place/place_list.html'
|
||||
ordering = [Lower('name')]
|
||||
|
||||
@@ -65,6 +64,11 @@ class PlaceDetailView(IsAuthenticatedMixin, IsEligibleToSeePlaceMixin, View):
|
||||
self.request,
|
||||
_('This place is still in draft mode and only visible to the submitter and superusers')
|
||||
)
|
||||
elif place.mode == 'imported':
|
||||
messages.info(
|
||||
self.request,
|
||||
_('This place was imported and not reviewed & correted yet. This place is visbible for superusers only and does not appear in the list views.')
|
||||
)
|
||||
|
||||
context = {
|
||||
'place': place,
|
||||
|
||||
Reference in New Issue
Block a user