120 lines
3.7 KiB
Python
120 lines
3.7 KiB
Python
from functools import wraps
|
|
|
|
from django.conf import settings
|
|
from django.core.exceptions import PermissionDenied
|
|
from django.http import HttpResponseRedirect
|
|
from django.shortcuts import get_object_or_404, redirect, render
|
|
from django.urls import reverse
|
|
from django.views.decorators.cache import never_cache
|
|
|
|
from c3nav.mapdata.models import Section
|
|
from c3nav.mapdata.models.base import EDITOR_FORM_MODELS
|
|
|
|
|
|
def sidebar_view(func):
|
|
@wraps(func)
|
|
def with_ajax_check(request, *args, **kwargs):
|
|
response = func(request, *args, **kwargs)
|
|
if request.is_ajax():
|
|
if isinstance(response, HttpResponseRedirect):
|
|
return render(request, 'editor/redirect.html', {'target': response['location']})
|
|
return response
|
|
return render(request, 'editor/map.html', {'content': response.content})
|
|
return never_cache(with_ajax_check)
|
|
|
|
|
|
@sidebar_view
|
|
def main_index(request):
|
|
return render(request, 'editor/index.html', {
|
|
'sections': Section.objects.all(),
|
|
})
|
|
|
|
|
|
@sidebar_view
|
|
def section_detail(request, pk):
|
|
pk = get_object_or_404(Section, pk=pk)
|
|
|
|
return render(request, 'editor/section.html', {
|
|
'sections': Section.objects.all(),
|
|
'section': pk,
|
|
'section_url': 'editor.section',
|
|
})
|
|
|
|
|
|
@sidebar_view
|
|
def edit(request, pk=None, model=None):
|
|
model = EDITOR_FORM_MODELS[model]
|
|
|
|
obj = None
|
|
if pk is not None:
|
|
# Edit existing map item
|
|
obj = get_object_or_404(model, pk=pk)
|
|
if False: # todo can access
|
|
raise PermissionDenied
|
|
|
|
new = obj is None
|
|
# noinspection PyProtectedMember
|
|
ctx = {
|
|
'path': request.path,
|
|
'pk': pk,
|
|
'model_title': model._meta.verbose_name,
|
|
'new': new,
|
|
'title': obj.title if obj else None,
|
|
}
|
|
|
|
if model == Section:
|
|
ctx.update({
|
|
'section': obj,
|
|
'back_url': reverse('editor.index') if new else reverse('editor.section', kwargs={'pk': pk}),
|
|
})
|
|
elif hasattr(obj, 'section'):
|
|
ctx.update({
|
|
'section': obj.section,
|
|
'back_url': reverse('editor.space', kwargs={'pk': pk}),
|
|
})
|
|
elif hasattr(obj, 'space'):
|
|
ctx.update({
|
|
'section': obj.space.section,
|
|
'back_url': reverse('editor.space', kwargs={'pk': obj.space.pk}),
|
|
})
|
|
|
|
if request.method == 'POST':
|
|
if obj is not None and request.POST.get('delete') == '1':
|
|
# Delete this mapitem!
|
|
if request.POST.get('delete_confirm') == '1':
|
|
if not settings.DIRECT_EDITING:
|
|
# todo: suggest changes
|
|
raise NotImplementedError
|
|
obj.delete()
|
|
if model == Section:
|
|
ctx.update({'target': reverse('editor.index')})
|
|
return redirect(reverse('editor.index') if model == Section else ctx['back_url'])
|
|
return render(request, 'editor/delete.html', ctx)
|
|
|
|
form = model.EditorForm(instance=obj, data=request.POST, request=request)
|
|
if form.is_valid():
|
|
# Update/create objects
|
|
obj = form.save(commit=False)
|
|
|
|
if form.titles is not None:
|
|
obj.titles = {}
|
|
for language, title in form.titles.items():
|
|
if title:
|
|
obj.titles[language] = title
|
|
|
|
if not settings.DIRECT_EDITING:
|
|
# todo: suggest changes
|
|
raise NotImplementedError
|
|
|
|
obj.save()
|
|
form.save_m2m()
|
|
|
|
return redirect(ctx['back_url'])
|
|
else:
|
|
form = model.EditorForm(instance=obj, request=request)
|
|
|
|
ctx.update({
|
|
'form': form,
|
|
})
|
|
|
|
return render(request, 'editor/edit.html', ctx)
|