From e4b60c1ac2ea171a80db05dd1d87d7a5a3464ae8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Laura=20Kl=C3=BCnder?= Date: Tue, 4 Oct 2016 13:28:09 +0200 Subject: [PATCH] merge edit_feature and add_feature into one view --- src/c3nav/editor/urls.py | 4 +- src/c3nav/editor/views.py | 79 +++++++---------------------- src/c3nav/mapdata/models/feature.py | 10 +++- 3 files changed, 30 insertions(+), 63 deletions(-) diff --git a/src/c3nav/editor/urls.py b/src/c3nav/editor/urls.py index 6be5050c..d6502692 100644 --- a/src/c3nav/editor/urls.py +++ b/src/c3nav/editor/urls.py @@ -1,12 +1,12 @@ from django.conf.urls import url from django.views.generic import TemplateView -from c3nav.editor.views import (add_feature, edit_feature, finalize, finalize_oauth_callback, finalize_oauth_progress, +from c3nav.editor.views import (edit_feature, finalize, finalize_oauth_callback, finalize_oauth_progress, finalize_oauth_redirect) urlpatterns = [ url(r'^$', TemplateView.as_view(template_name='editor/map.html'), name='editor.index'), - url(r'^features/(?P[^/]+)/add/$', add_feature, name='editor.feature.add'), + url(r'^features/(?P[^/]+)/add/$', edit_feature, name='editor.feature.add'), url(r'^features/edit/(?P[^/]+)/$', edit_feature, name='editor.feature.edit'), url(r'^finalize/$', finalize, name='editor.finalize'), url(r'^finalize/oauth/$', finalize_oauth_redirect, name='editor.finalize.oauth'), diff --git a/src/c3nav/editor/views.py b/src/c3nav/editor/views.py index 51827a54..1b67beb0 100644 --- a/src/c3nav/editor/views.py +++ b/src/c3nav/editor/views.py @@ -3,7 +3,6 @@ from django.core import signing from django.core.exceptions import PermissionDenied, SuspiciousOperation from django.http.response import Http404 from django.shortcuts import get_object_or_404, redirect, render -from django.utils.translation import activate, get_language from django.views.decorators.http import require_POST from c3nav.editor.forms import CommitForm, FeatureForm @@ -14,67 +13,27 @@ from c3nav.mapdata.packageio.write import json_encode from c3nav.mapdata.permissions import can_access_package -def add_feature(request, feature_type): - feature_type = FEATURE_TYPES.get(feature_type) - if feature_type is None: - raise Http404() - - if request.method == 'POST': - form = FeatureForm(request.POST, feature_type=feature_type, request=request) - if form.is_valid(): - feature = form.instance - feature.feature_type = feature_type.name - feature.titles = {} - for language, title in form.titles.items(): - if title: - feature.titles[language] = title - - if not settings.DIRECT_EDITING: - content = json_encode(feature.tofile()) - language = get_language() - title_en = feature.titles.get('en', next(iter(feature.titles.values()))) - commit_msg = 'Added %s: %s' % (str(feature_type.title).lower(), title_en) - activate(language) - return render(request, 'editor/feature_success.html', { - 'data': signing.dumps({ - 'type': 'editor.edit', - 'action': 'create', - 'package_name': feature.package.name, - 'commit_id': feature.package.commit_id, - 'commit_msg': commit_msg, - 'file_path': feature.tofilename(), - 'content': content, - }) - }) - - feature.save() - - return render(request, 'editor/feature_success.html', {}) +def edit_feature(request, feature_type=None, name=None): + if name is not None: + # Edit existing feature + feature = get_object_or_404(Feature, name=name) + if not can_access_package(request, feature.package): + raise PermissionDenied + feature_type = FEATURE_TYPES.get(feature.feature_type) else: - form = FeatureForm(feature_type=feature_type, request=request) - - return render(request, 'editor/feature.html', { - 'form': form, - 'feature_type': feature_type, - 'path': request.path, - 'new': True - }) - - -def edit_feature(request, name): - feature = get_object_or_404(Feature, name=name) - if not can_access_package(request, feature.package): - raise PermissionDenied - feature_type = FEATURE_TYPES.get(feature.feature_type) + # Create new feature + feature = None + feature_type = FEATURE_TYPES.get(feature_type) + if feature_type is None: + raise Http404() if request.method == 'POST': - if request.POST.get('delete') == '1': + if feature is not None and request.POST.get('delete') == '1': + # Delete this feature! if request.POST.get('delete_confirm') == '1': if not settings.DIRECT_EDITING: - language = get_language() title_en = feature.titles.get('en', next(iter(feature.titles.values()))) - commit_msg = 'Deleted %s: %s' % (str(feature_type.title).lower(), title_en) - activate(language) + commit_msg = 'Deleted %s: %s' % (feature_type.title_en.lower(), title_en) return render(request, 'editor/feature_success.html', { 'data': signing.dumps({ 'type': 'editor.edit', @@ -97,6 +56,8 @@ def edit_feature(request, name): form = FeatureForm(instance=feature, data=request.POST, feature_type=feature_type, request=request) if form.is_valid(): + # Update/create feature + commit_type = 'Created' if feature is None else 'Updated' feature = form.instance feature.feature_type = feature_type.name feature.titles = {} @@ -106,10 +67,8 @@ def edit_feature(request, name): if not settings.DIRECT_EDITING: content = json_encode(feature.tofile()) - language = get_language() title_en = feature.titles.get('en', next(iter(feature.titles.values()))) - commit_msg = 'Updated %s: %s' % (str(feature_type.title).lower(), title_en) - activate(language) + commit_msg = '%s %s: %s' % (commit_type, feature_type.title_en.lower(), title_en) return render(request, 'editor/feature_success.html', { 'data': signing.dumps({ 'type': 'editor.edit', @@ -132,7 +91,7 @@ def edit_feature(request, name): 'form': form, 'feature_type': feature_type, 'path': request.path, - 'new': False + 'new': feature is None }) diff --git a/src/c3nav/mapdata/models/feature.py b/src/c3nav/mapdata/models/feature.py index 111b9bce..817f0153 100644 --- a/src/c3nav/mapdata/models/feature.py +++ b/src/c3nav/mapdata/models/feature.py @@ -3,7 +3,7 @@ from collections import OrderedDict, namedtuple from django.db import models from django.utils.translation import ugettext_lazy as _ -from django.utils.translation import get_language +from django.utils.translation import activate, get_language from shapely.geometry import mapping, shape from c3nav.mapdata.fields import GeometryField, JSONField @@ -16,6 +16,14 @@ class FeatureType(namedtuple('FeatureType', ('name', 'title', 'title_plural', 'g super().__init__() FEATURE_TYPES[self.name] = self + @property + def title_en(self): + language = get_language() + activate('en') + title = str(self.title) + activate(language) + return title + FEATURE_TYPES = OrderedDict() FeatureType('building', _('Building'), _('Buildings'), 'polygon', '#333333')