2016-09-23 17:02:17 +02:00
|
|
|
from django.conf import settings
|
2017-05-01 18:10:46 +02:00
|
|
|
from django.core.exceptions import PermissionDenied
|
2016-09-23 15:23:02 +02:00
|
|
|
from django.http.response import Http404
|
2016-11-27 23:51:44 +01:00
|
|
|
from django.shortcuts import get_object_or_404, redirect, render
|
2016-09-23 15:23:02 +02:00
|
|
|
|
2017-05-01 18:37:10 +02:00
|
|
|
from c3nav.access.apply import can_access, filter_queryset_by_access
|
2016-12-19 16:54:11 +01:00
|
|
|
from c3nav.mapdata.models import AreaLocation
|
2017-05-05 12:32:35 +02:00
|
|
|
from c3nav.mapdata.models.base import FEATURE_TYPES
|
2016-11-27 23:51:44 +01:00
|
|
|
|
|
|
|
|
|
|
|
def list_mapitemtypes(request, level):
|
|
|
|
def get_item_count(mapitemtype):
|
2016-12-01 12:25:02 +01:00
|
|
|
if hasattr(mapitemtype, 'level'):
|
2016-12-22 03:29:07 +01:00
|
|
|
return filter_queryset_by_access(request, mapitemtype.objects.filter(level__name=level)).count()
|
2016-12-01 12:25:02 +01:00
|
|
|
|
|
|
|
if hasattr(mapitemtype, 'levels'):
|
2016-12-22 03:29:07 +01:00
|
|
|
return filter_queryset_by_access(request, mapitemtype.objects.filter(levels__name=level)).count()
|
2016-12-01 12:25:02 +01:00
|
|
|
|
|
|
|
return 0
|
2016-11-27 23:51:44 +01:00
|
|
|
|
|
|
|
return render(request, 'editor/mapitemtypes.html', {
|
|
|
|
'level': level,
|
|
|
|
'mapitemtypes': [
|
|
|
|
{
|
|
|
|
'name': name,
|
|
|
|
'title': mapitemtype._meta.verbose_name_plural,
|
2016-12-01 12:25:02 +01:00
|
|
|
'has_level': hasattr(mapitemtype, 'level') or hasattr(mapitemtype, 'levels'),
|
2016-11-27 23:51:44 +01:00
|
|
|
'count': get_item_count(mapitemtype),
|
2017-05-05 12:32:35 +02:00
|
|
|
} for name, mapitemtype in FEATURE_TYPES.items()
|
2016-11-27 23:51:44 +01:00
|
|
|
],
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
|
|
def list_mapitems(request, mapitem_type, level=None):
|
2017-05-05 12:32:35 +02:00
|
|
|
mapitemtype = FEATURE_TYPES.get(mapitem_type)
|
2016-11-27 23:51:44 +01:00
|
|
|
if mapitemtype is None:
|
|
|
|
raise Http404('Unknown mapitemtype.')
|
|
|
|
|
2016-12-01 12:25:02 +01:00
|
|
|
has_level = hasattr(mapitemtype, 'level') or hasattr(mapitemtype, 'levels')
|
|
|
|
if has_level and level is None:
|
2016-11-27 23:51:44 +01:00
|
|
|
raise Http404('Missing level.')
|
2016-12-01 12:25:02 +01:00
|
|
|
elif not has_level and level is not None:
|
2016-11-28 15:46:58 +01:00
|
|
|
return redirect('editor.mapitems', mapitem_type=mapitem_type)
|
2016-11-27 23:51:44 +01:00
|
|
|
|
2016-12-04 01:49:49 +01:00
|
|
|
queryset = mapitemtype.objects.all().order_by('name')
|
2016-11-27 23:51:44 +01:00
|
|
|
if level is not None:
|
2016-12-01 12:25:02 +01:00
|
|
|
if hasattr(mapitemtype, 'level'):
|
|
|
|
queryset = queryset.filter(level__name=level)
|
|
|
|
elif hasattr(mapitemtype, 'levels'):
|
|
|
|
queryset = queryset.filter(levels__name=level)
|
2016-11-27 23:51:44 +01:00
|
|
|
|
2016-12-22 03:29:07 +01:00
|
|
|
queryset = filter_queryset_by_access(request, queryset)
|
2016-12-21 11:40:10 +01:00
|
|
|
|
2016-12-19 16:54:11 +01:00
|
|
|
if issubclass(mapitemtype, AreaLocation):
|
|
|
|
queryset = sorted(queryset, key=AreaLocation.get_sort_key)
|
|
|
|
|
2016-11-27 23:51:44 +01:00
|
|
|
return render(request, 'editor/mapitems.html', {
|
|
|
|
'mapitem_type': mapitem_type,
|
|
|
|
'title': mapitemtype._meta.verbose_name_plural,
|
|
|
|
'has_level': level is not None,
|
2016-11-29 01:21:18 +01:00
|
|
|
'has_elevator': hasattr(mapitemtype, 'elevator'),
|
2016-12-01 12:50:51 +01:00
|
|
|
'has_levels': hasattr(mapitemtype, 'levels'),
|
2016-12-04 01:49:49 +01:00
|
|
|
'has_altitude': hasattr(mapitemtype, 'altitude'),
|
|
|
|
'has_intermediate': hasattr(mapitemtype, 'intermediate'),
|
2016-11-27 23:51:44 +01:00
|
|
|
'level': level,
|
2016-12-21 11:40:10 +01:00
|
|
|
'items': queryset,
|
2016-11-27 23:51:44 +01:00
|
|
|
})
|
2016-09-23 15:23:02 +02:00
|
|
|
|
|
|
|
|
2016-11-27 23:51:44 +01:00
|
|
|
def edit_mapitem(request, mapitem_type, name=None):
|
2017-05-05 12:32:35 +02:00
|
|
|
mapitemtype = FEATURE_TYPES.get(mapitem_type)
|
2016-11-27 23:51:44 +01:00
|
|
|
if mapitemtype is None:
|
2016-10-13 15:55:15 +02:00
|
|
|
raise Http404()
|
|
|
|
|
2016-11-27 23:51:44 +01:00
|
|
|
mapitem = None
|
2016-10-04 13:28:09 +02:00
|
|
|
if name is not None:
|
2016-11-27 23:51:44 +01:00
|
|
|
# Edit existing map item
|
|
|
|
mapitem = get_object_or_404(mapitemtype, name=name)
|
2017-05-01 18:10:46 +02:00
|
|
|
if not can_access(request, mapitem):
|
2016-10-04 13:28:09 +02:00
|
|
|
raise PermissionDenied
|
2016-09-26 13:32:05 +02:00
|
|
|
|
2016-11-27 23:51:44 +01:00
|
|
|
new = mapitem is None
|
|
|
|
orig_name = mapitem.name if mapitem is not None else None
|
|
|
|
|
2016-09-26 13:32:05 +02:00
|
|
|
if request.method == 'POST':
|
2016-11-27 23:51:44 +01:00
|
|
|
if mapitem is not None and request.POST.get('delete') == '1':
|
|
|
|
# Delete this mapitem!
|
2016-09-26 13:32:05 +02:00
|
|
|
if request.POST.get('delete_confirm') == '1':
|
2016-09-26 13:36:09 +02:00
|
|
|
if not settings.DIRECT_EDITING:
|
2017-05-01 18:10:46 +02:00
|
|
|
# todo: suggest changes
|
|
|
|
raise NotImplementedError
|
2016-09-26 13:36:09 +02:00
|
|
|
|
2016-11-27 23:51:44 +01:00
|
|
|
mapitem.delete()
|
|
|
|
return render(request, 'editor/mapitem_success.html', {
|
|
|
|
'mapitem_type': mapitem_type
|
|
|
|
})
|
2016-09-26 13:32:05 +02:00
|
|
|
|
2016-11-27 23:51:44 +01:00
|
|
|
return render(request, 'editor/mapitem_delete.html', {
|
|
|
|
'name': mapitem.name,
|
|
|
|
'mapitem_type': mapitem_type,
|
2016-09-26 13:32:05 +02:00
|
|
|
'path': request.path
|
|
|
|
})
|
|
|
|
|
2016-11-27 23:51:44 +01:00
|
|
|
form = mapitemtype.EditorForm(instance=mapitem, data=request.POST, request=request)
|
2016-09-26 13:32:05 +02:00
|
|
|
if form.is_valid():
|
2016-11-27 23:51:44 +01:00
|
|
|
# Update/create mapitem
|
2016-12-01 12:25:02 +01:00
|
|
|
mapitem = form.save(commit=False)
|
2016-10-13 15:55:15 +02:00
|
|
|
|
|
|
|
if form.titles is not None:
|
2016-11-27 23:51:44 +01:00
|
|
|
mapitem.titles = {}
|
2016-10-13 15:55:15 +02:00
|
|
|
for language, title in form.titles.items():
|
|
|
|
if title:
|
2016-11-27 23:51:44 +01:00
|
|
|
mapitem.titles[language] = title
|
2016-09-26 16:44:17 +02:00
|
|
|
|
2016-09-26 13:32:05 +02:00
|
|
|
if not settings.DIRECT_EDITING:
|
2017-04-28 11:03:08 +02:00
|
|
|
# todo: suggest changes
|
2017-05-01 18:10:46 +02:00
|
|
|
raise NotImplementedError
|
2016-09-26 13:32:05 +02:00
|
|
|
|
2016-11-27 23:51:44 +01:00
|
|
|
mapitem.save()
|
2016-12-01 12:25:02 +01:00
|
|
|
form.save_m2m()
|
2016-09-26 13:32:05 +02:00
|
|
|
|
2016-11-27 23:51:44 +01:00
|
|
|
return render(request, 'editor/mapitem_success.html', {
|
|
|
|
'mapitem_type': mapitem_type
|
|
|
|
})
|
2016-09-26 13:32:05 +02:00
|
|
|
else:
|
2016-11-27 23:51:44 +01:00
|
|
|
form = mapitemtype.EditorForm(instance=mapitem, request=request)
|
2016-09-26 13:32:05 +02:00
|
|
|
|
2016-11-27 23:51:44 +01:00
|
|
|
return render(request, 'editor/mapitem.html', {
|
2016-09-26 13:32:05 +02:00
|
|
|
'form': form,
|
2016-11-27 23:51:44 +01:00
|
|
|
'mapitem_type': mapitem_type,
|
2016-12-01 12:42:51 +01:00
|
|
|
'title': mapitemtype._meta.verbose_name,
|
2016-11-27 23:51:44 +01:00
|
|
|
'has_geometry': hasattr(mapitemtype, 'geometry'),
|
|
|
|
'name': orig_name,
|
|
|
|
'geomtype': getattr(mapitemtype, 'geomtype', None),
|
2016-09-26 13:32:05 +02:00
|
|
|
'path': request.path,
|
2016-11-27 23:51:44 +01:00
|
|
|
'new': new
|
2016-09-26 13:32:05 +02:00
|
|
|
})
|