team-3/src/c3nav/editor/views.py

171 lines
5.5 KiB
Python
Raw Normal View History

2017-05-14 20:21:33 +02:00
from functools import wraps
2016-09-23 17:02:17 +02:00
from django.conf import settings
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
2017-05-14 20:21:33 +02:00
from django.urls import reverse
2016-09-23 15:23:02 +02:00
2017-05-10 21:31:54 +02:00
from c3nav.mapdata.models import Section
2017-05-09 09:36:08 +02:00
from c3nav.mapdata.models.base import EDITOR_FORM_MODELS
2016-11-27 23:51:44 +01:00
2017-05-14 20:21:33 +02:00
def sidebar_view(func):
@wraps(func)
def with_ajax_check(request, *args, **kwargs):
if not request.is_ajax():
return render(request, 'editor/map.html', {})
return func(request, *args, **kwargs)
return with_ajax_check
@sidebar_view
def main_index(request, section=None):
if section is None:
first_section = Section.objects.first()
if first_section:
return render(request, 'editor/redirect.html', {
'target': reverse('editor.index', kwargs={'section': first_section.id})
})
else:
return render(request, 'editor/redirect.html', {
'target': reverse('editor.sections')
})
else:
section = get_object_or_404(Section, pk=section)
return render(request, 'editor/index.html', {
'sections': Section.objects.all(),
'section': section,
'section_url': 'editor.index',
})
@sidebar_view
def sections_list(request):
return render(request, 'editor/sections.html', {})
2017-05-07 12:06:13 +02:00
def list_mapitemtypes(request, section):
section = get_object_or_404(Section, pk=section)
2017-05-05 16:37:03 +02:00
2016-11-27 23:51:44 +01:00
def get_item_count(mapitemtype):
2017-05-07 12:06:13 +02:00
if hasattr(mapitemtype, 'section'):
return filter_queryset_by_access(request, mapitemtype.objects.filter(section=section)).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', {
2017-05-07 12:06:13 +02:00
'section': section,
2016-11-27 23:51:44 +01:00
'mapitemtypes': [
{
'name': name,
'title': mapitemtype._meta.verbose_name_plural,
2017-05-07 12:06:13 +02:00
'has_section': hasattr(mapitemtype, 'section'),
2016-11-27 23:51:44 +01:00
'count': get_item_count(mapitemtype),
2017-05-09 09:36:08 +02:00
} for name, mapitemtype in EDITOR_FORM_MODELS.items()
2016-11-27 23:51:44 +01:00
],
})
2017-05-07 12:06:13 +02:00
def list_mapitems(request, mapitem_type, section=None):
2017-05-09 09:36:08 +02:00
mapitemtype = EDITOR_FORM_MODELS.get(mapitem_type)
2016-11-27 23:51:44 +01:00
if mapitemtype is None:
raise Http404('Unknown mapitemtype.')
2017-05-07 12:06:13 +02:00
has_section = hasattr(mapitemtype, 'section')
if has_section and section is None:
raise Http404('Missing section.')
elif not has_section and section 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')
2017-05-07 12:06:13 +02:00
if section is not None:
section = get_object_or_404(Section, section)
if hasattr(mapitemtype, 'section'):
queryset = queryset.filter(section=section)
2016-11-27 23:51:44 +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,
2017-05-07 12:06:13 +02:00
'has_section': section is not None,
2016-12-04 01:49:49 +01:00
'has_altitude': hasattr(mapitemtype, 'altitude'),
2017-05-07 12:06:13 +02:00
'section': section.id,
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-09 09:36:08 +02:00
mapitemtype = EDITOR_FORM_MODELS.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
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)
if not can_access(request, mapitem):
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':
if not settings.DIRECT_EDITING:
# todo: suggest changes
raise NotImplementedError
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 13:32:05 +02:00
if not settings.DIRECT_EDITING:
2017-04-28 11:03:08 +02:00
# todo: suggest changes
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
})