diff --git a/src/c3nav/editor/forms.py b/src/c3nav/editor/forms.py index 1ab69a2a..5bd37f11 100644 --- a/src/c3nav/editor/forms.py +++ b/src/c3nav/editor/forms.py @@ -5,7 +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 +from django.forms import BooleanField, CharField, ChoiceField, Form, ModelForm, MultipleChoiceField, ValidationError, \ + ModelChoiceField from django.forms.widgets import HiddenInput from django.utils.text import format_lazy from django.utils.translation import ugettext_lazy as _ @@ -13,6 +14,8 @@ from django.utils.translation import get_language_info 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 class EditorFormBase(ModelForm): @@ -160,7 +163,7 @@ def create_editor_form(editor_model): possible_fields = ['slug', 'name', 'altitude', 'category', 'width', 'groups', 'color', 'priority', 'waytype', 'access_restriction', 'space_transfer', 'can_search', 'can_describe', 'outside', 'geometry', 'single', 'allow_levels', 'allow_spaces', 'allow_areas', 'allow_pois', - 'left', 'top', 'right', 'bottom', 'from_node', 'to_node'] + 'left', 'top', 'right', 'bottom'] field_names = [field.name for field in editor_model._meta.get_fields() if not field.one_to_many] existing_fields = [name for name in possible_fields if name in field_names] @@ -187,6 +190,43 @@ class RejectForm(ModelForm): fields = ('comment', ) +class GraphNodeSettingsForm(ModelForm): + class Meta: + model = GraphNode + fields = ('space_transfer', ) + + +class GraphEdgeSettingsForm(ModelForm): + class Meta: + model = GraphEdge + fields = ('waytype', 'access_restriction', ) + + def __init__(self, *args, request=None, **kwargs): + self.request = request + super().__init__(*args, **kwargs) + + AccessRestriction = self.request.changeset.wrap_model('AccessRestriction') + self.fields['access_restriction'].label_from_instance = lambda obj: obj.title + self.fields['access_restriction'].queryset = AccessRestriction.qs_for_request(self.request) + + +class GraphEditorActionForm(Form): + def __init__(self, *args, request=None, allow_clicked_position=False, **kwargs): + self.request = request + super().__init__(*args, **kwargs) + + GraphNode = self.request.changeset.wrap_model('GraphNode') + graph_node_qs = GraphNode.objects.all() + self.fields['active_node'] = ModelChoiceField(graph_node_qs, widget=HiddenInput(), required=True) + self.fields['clicked_node'] = ModelChoiceField(graph_node_qs, widget=HiddenInput(), required=False) + + if allow_clicked_position: + self.fields['clicked_position'] = CharField(widget=HiddenInput(), required=False) + + def clean_clicked_position(self): + return GeometryField(geomtype='point').to_python(self.cleaned_data['clicked_position']) + + class GraphEditorSettingsForm(Form): node_click = ChoiceField(label=_('when clicking on an existing node…'), choices=( ('connect_or_toggle', _('connect if possible, otherwise toggle')), diff --git a/src/c3nav/editor/templates/editor/graph.html b/src/c3nav/editor/templates/editor/graph.html index b6c56d8e..e81afd4b 100644 --- a/src/c3nav/editor/templates/editor/graph.html +++ b/src/c3nav/editor/templates/editor/graph.html @@ -23,8 +23,12 @@

{% bootstrap_messages %} -

{% trans 'Default node properties' %}

-{% bootstrap_form node_form %} +
+

{% trans 'Default node properties' %}

+ {% bootstrap_form node_settings_form %} -

{% trans 'Default edge properties' %}

-{% bootstrap_form edge_form %} +

{% trans 'Default edge properties' %}

+ {% bootstrap_form edge_settings_form %} + + {% bootstrap_form graph_action_form %} +
diff --git a/src/c3nav/editor/views/edit.py b/src/c3nav/editor/views/edit.py index 5d773eeb..3dd120a4 100644 --- a/src/c3nav/editor/views/edit.py +++ b/src/c3nav/editor/views/edit.py @@ -8,7 +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 +from c3nav.editor.forms import GraphEditorSettingsForm, GraphEdgeSettingsForm, GraphNodeSettingsForm, \ + GraphEditorActionForm from c3nav.editor.views.base import sidebar_view @@ -351,6 +352,7 @@ def graph_edit(request, level=None, space=None): graph_editing_settings.update(request.session.get('graph_editing_settings', {})) graph_editing = 'edit-nodes' + allow_clicked_position = False if level is not None: level = get_object_or_404(Level.objects.filter(Level.q_for_request(request)), pk=level) @@ -374,11 +376,24 @@ def graph_edit(request, level=None, space=None): }) if graph_editing_settings['click_anywhere'] != 'noop': graph_editing = 'edit-create-nodes' + allow_clicked_position = True + + if request.method == 'POST': + node_settings_form = GraphNodeSettingsForm(data=request.POST) + edge_settings_form = GraphEdgeSettingsForm(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!')) + else: + node_settings_form = GraphNodeSettingsForm() + edge_settings_form = GraphEdgeSettingsForm(request=request) + graph_action_form = GraphEditorActionForm(request=request, allow_clicked_position=allow_clicked_position) ctx.update({ - 'node_form': GraphNode.EditorForm(request=request), - 'edge_form': GraphEdge.EditorForm(request=request), - 'settings_form': GraphEditorSettingsForm(), + 'node_settings_form': node_settings_form, + 'edge_settings_form': edge_settings_form, + 'graph_action_form': graph_action_form, 'graph_editing': graph_editing, })