2016-09-23 17:02:17 +02:00
|
|
|
from django.conf import settings
|
2016-09-26 16:44:17 +02:00
|
|
|
from django.core import signing
|
2016-09-26 13:32:05 +02:00
|
|
|
from django.core.exceptions import PermissionDenied
|
2016-09-23 15:23:02 +02:00
|
|
|
from django.http.response import Http404
|
2016-09-26 13:32:05 +02:00
|
|
|
from django.shortcuts import get_object_or_404, render
|
2016-09-26 16:44:17 +02:00
|
|
|
from django.utils.translation import ugettext_lazy as _
|
|
|
|
from django.views.decorators.http import require_POST
|
2016-09-23 15:23:02 +02:00
|
|
|
|
|
|
|
from c3nav.editor.forms import FeatureForm
|
2016-09-26 16:44:17 +02:00
|
|
|
from c3nav.editor.hosters import get_hoster_for_package
|
2016-09-26 13:32:05 +02:00
|
|
|
from c3nav.mapdata.models.feature import FEATURE_TYPES, Feature
|
2016-09-26 16:44:17 +02:00
|
|
|
from c3nav.mapdata.models.package import Package
|
|
|
|
from c3nav.mapdata.packageio.write import json_encode
|
2016-09-26 13:32:05 +02:00
|
|
|
from c3nav.mapdata.permissions import can_access_package
|
2016-09-23 15:23:02 +02:00
|
|
|
|
|
|
|
|
|
|
|
def add_feature(request, feature_type):
|
|
|
|
feature_type = FEATURE_TYPES.get(feature_type)
|
|
|
|
if feature_type is None:
|
|
|
|
raise Http404()
|
|
|
|
|
|
|
|
if request.method == 'POST':
|
2016-09-26 17:23:08 +02:00
|
|
|
form = FeatureForm(request.POST, feature_type=feature_type, request=request)
|
2016-09-23 15:23:02 +02:00
|
|
|
if form.is_valid():
|
2016-09-26 16:44:17 +02:00
|
|
|
feature = form.instance
|
|
|
|
feature.feature_type = feature_type.name
|
|
|
|
feature.titles = {}
|
|
|
|
for language, title in form.titles.items():
|
|
|
|
if title:
|
|
|
|
feature.titles[language] = title
|
|
|
|
|
2016-09-23 17:02:17 +02:00
|
|
|
if not settings.DIRECT_EDITING:
|
2016-09-26 16:44:17 +02:00
|
|
|
return render(request, 'editor/feature_success.html', {
|
|
|
|
'data': signing.dumps((feature.package.name, feature.tofilename(), json_encode(feature.tofile())))
|
|
|
|
})
|
2016-09-23 15:23:02 +02:00
|
|
|
|
2016-09-26 16:44:17 +02:00
|
|
|
feature.save()
|
2016-09-23 17:02:17 +02:00
|
|
|
|
2016-09-23 15:23:02 +02:00
|
|
|
return render(request, 'editor/feature_success.html', {})
|
|
|
|
else:
|
2016-09-26 17:23:08 +02:00
|
|
|
form = FeatureForm(feature_type=feature_type, request=request)
|
2016-09-23 15:23:02 +02:00
|
|
|
|
|
|
|
return render(request, 'editor/feature.html', {
|
|
|
|
'form': form,
|
|
|
|
'feature_type': feature_type,
|
|
|
|
'path': request.path,
|
|
|
|
'new': True
|
|
|
|
})
|
2016-09-26 13:32:05 +02:00
|
|
|
|
|
|
|
|
|
|
|
def edit_feature(request, name):
|
|
|
|
feature = get_object_or_404(Feature, name=name)
|
2016-09-26 13:34:47 +02:00
|
|
|
if not can_access_package(request, feature.package):
|
2016-09-26 13:32:05 +02:00
|
|
|
raise PermissionDenied
|
|
|
|
feature_type = FEATURE_TYPES.get(feature.feature_type)
|
|
|
|
|
|
|
|
if request.method == 'POST':
|
|
|
|
if request.POST.get('delete') == '1':
|
|
|
|
if request.POST.get('delete_confirm') == '1':
|
2016-09-26 13:36:09 +02:00
|
|
|
if not settings.DIRECT_EDITING:
|
2016-09-26 16:44:17 +02:00
|
|
|
return render(request, 'editor/feature_success.html', {
|
|
|
|
'data': signing.dumps((feature.package.name, feature.tofilename(), None))
|
|
|
|
})
|
2016-09-26 13:36:09 +02:00
|
|
|
|
2016-09-26 13:32:05 +02:00
|
|
|
feature.delete()
|
|
|
|
return render(request, 'editor/feature_success.html', {})
|
|
|
|
|
|
|
|
return render(request, 'editor/feature_delete.html', {
|
|
|
|
'name': feature.name,
|
|
|
|
'feature_type': feature_type,
|
|
|
|
'path': request.path
|
|
|
|
})
|
|
|
|
|
2016-09-26 17:23:08 +02:00
|
|
|
form = FeatureForm(instance=feature, data=request.POST, feature_type=feature_type, request=request)
|
2016-09-26 13:32:05 +02:00
|
|
|
if form.is_valid():
|
2016-09-26 16:44:17 +02:00
|
|
|
feature = form.instance
|
|
|
|
feature.feature_type = feature_type.name
|
|
|
|
feature.titles = {}
|
|
|
|
for language, title in form.titles.items():
|
|
|
|
if title:
|
|
|
|
feature.titles[language] = title
|
|
|
|
|
2016-09-26 13:32:05 +02:00
|
|
|
if not settings.DIRECT_EDITING:
|
2016-09-26 16:44:17 +02:00
|
|
|
return render(request, 'editor/feature_success.html', {
|
|
|
|
'data': signing.dumps((feature.package.name, feature.tofilename(), json_encode(feature.tofile())))
|
|
|
|
})
|
2016-09-26 13:32:05 +02:00
|
|
|
|
2016-09-26 16:44:17 +02:00
|
|
|
feature.save()
|
2016-09-26 13:32:05 +02:00
|
|
|
|
|
|
|
return render(request, 'editor/feature_success.html', {})
|
|
|
|
else:
|
2016-09-26 17:23:08 +02:00
|
|
|
form = FeatureForm(instance=feature, feature_type=feature_type, request=request)
|
2016-09-26 13:32:05 +02:00
|
|
|
|
|
|
|
return render(request, 'editor/feature.html', {
|
|
|
|
'form': form,
|
|
|
|
'feature_type': feature_type,
|
|
|
|
'path': request.path,
|
|
|
|
'new': False
|
|
|
|
})
|
2016-09-26 16:44:17 +02:00
|
|
|
|
|
|
|
|
|
|
|
@require_POST
|
|
|
|
def finalize(request):
|
|
|
|
if 'data' not in request.POST:
|
|
|
|
return render(request, 'editor/error.html', {
|
|
|
|
'title': _('Missing data.'),
|
|
|
|
'description': _('Edit data is missing.')
|
|
|
|
}, status=400)
|
|
|
|
|
|
|
|
package_name, file_path, file_contents = signing.loads(request.POST['data'])
|
|
|
|
|
|
|
|
package = Package.objects.filter(name=package_name).first()
|
|
|
|
hoster = None
|
|
|
|
if package is not None:
|
|
|
|
hoster = get_hoster_for_package(package)
|
|
|
|
|
|
|
|
return render(request, 'editor/finalize.html', {
|
|
|
|
'package_name': package_name,
|
|
|
|
'hoster': hoster,
|
|
|
|
'file_path': file_path,
|
|
|
|
'file_contents': file_contents
|
|
|
|
})
|