diff --git a/src/c3nav/editor/forms.py b/src/c3nav/editor/forms.py index 0fbc725d..45f486ab 100644 --- a/src/c3nav/editor/forms.py +++ b/src/c3nav/editor/forms.py @@ -5,8 +5,8 @@ from functools import reduce from django.conf import settings from django.core.exceptions import FieldDoesNotExist -from django.forms import BooleanField, CharField, ChoiceField, Form, ModelForm, MultipleChoiceField, ValidationError, \ - ModelChoiceField +from django.forms import (BooleanField, CharField, ChoiceField, Form, ModelChoiceField, ModelForm, MultipleChoiceField, + ValidationError) from django.forms.widgets import HiddenInput from django.utils.text import format_lazy from django.utils.translation import ugettext_lazy as _ @@ -15,7 +15,7 @@ from shapely.geometry.geo import mapping from c3nav.editor.models import ChangeSet, ChangeSetUpdate from c3nav.mapdata.fields import GeometryField -from c3nav.mapdata.models import GraphNode, GraphEdge +from c3nav.mapdata.models import GraphEdge, GraphNode class EditorFormBase(ModelForm): diff --git a/src/c3nav/editor/templates/editor/graph.html b/src/c3nav/editor/templates/editor/graph.html index f5e2f280..1f097e39 100644 --- a/src/c3nav/editor/templates/editor/graph.html +++ b/src/c3nav/editor/templates/editor/graph.html @@ -17,13 +17,13 @@ -{% trans 'Settings' %} +{% trans 'Settings' %}

« {{ back_title }}

{% bootstrap_messages %} -
+ {% csrf_token %}

{% trans 'Default node properties' %}

diff --git a/src/c3nav/editor/views/edit.py b/src/c3nav/editor/views/edit.py index 3dd120a4..d2c14c5b 100644 --- a/src/c3nav/editor/views/edit.py +++ b/src/c3nav/editor/views/edit.py @@ -8,8 +8,8 @@ from django.shortcuts import get_object_or_404, redirect, render from django.urls import reverse from django.utils.translation import ugettext_lazy as _ -from c3nav.editor.forms import GraphEditorSettingsForm, GraphEdgeSettingsForm, GraphNodeSettingsForm, \ - GraphEditorActionForm +from c3nav.editor.forms import (GraphEdgeSettingsForm, GraphEditorActionForm, GraphEditorSettingsForm, + GraphNodeSettingsForm) from c3nav.editor.views.base import sidebar_view @@ -379,16 +379,37 @@ def graph_edit(request, level=None, space=None): allow_clicked_position = True if request.method == 'POST': - node_settings_form = GraphNodeSettingsForm(data=request.POST) - edge_settings_form = GraphEdgeSettingsForm(request=request, data=request.POST) + node_settings_form = GraphNodeSettingsForm(instance=GraphNode(), data=request.POST) + edge_settings_form = GraphEdgeSettingsForm(instance=GraphEdge(), request=request, data=request.POST) graph_action_form = GraphEditorActionForm(request=request, allow_clicked_position=allow_clicked_position, data=request.POST) if node_settings_form.is_valid() and edge_settings_form.is_valid() and graph_action_form.is_valid(): - messages.success(request, _('Forms valid!')) + active_node = graph_action_form.cleaned_data['active_node'] + clicked_node = graph_action_form.cleaned_data['clicked_node'] + clicked_position = graph_action_form.cleaned_data.get('clicked_position') + if clicked_node is not None and clicked_position is None: + raise NotImplementedError + elif clicked_node is None and clicked_position is not None: + click_anywhere_setting = graph_editing_settings['click_anywhere'] + if click_anywhere_setting != 'create_node_if_none_active' or active_node is None: + node = node_settings_form.instance + node.space = space + node.geometry = clicked_position + if space.geometry.contains(clicked_position): + with request.changeset.lock_to_edit(request) as changeset: + if changeset.can_edit(request): + node.save() + else: + messages.error(request, _('You can not edit changes on this changeset.')) + messages.success(request, _('New graph node created!')) + + ctx.update({ + 'nozoom': True, + }) else: node_settings_form = GraphNodeSettingsForm() edge_settings_form = GraphEdgeSettingsForm(request=request) - graph_action_form = GraphEditorActionForm(request=request, allow_clicked_position=allow_clicked_position) + graph_action_form = GraphEditorActionForm(request=request, allow_clicked_position=allow_clicked_position) ctx.update({ 'node_settings_form': node_settings_form,