From 8973c2cbf447e7a0bb8eb96be5007681144f1cef Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Laura=20Kl=C3=BCnder?= Date: Wed, 19 Jul 2017 18:02:40 +0200 Subject: [PATCH] Graph forms --- src/c3nav/editor/forms.py | 55 ++++++++++++++++++-- src/c3nav/editor/templates/editor/graph.html | 8 +++ src/c3nav/editor/views/edit.py | 9 ++++ 3 files changed, 68 insertions(+), 4 deletions(-) diff --git a/src/c3nav/editor/forms.py b/src/c3nav/editor/forms.py index 68f35e41..1ab69a2a 100644 --- a/src/c3nav/editor/forms.py +++ b/src/c3nav/editor/forms.py @@ -5,7 +5,7 @@ from functools import reduce from django.conf import settings from django.core.exceptions import FieldDoesNotExist -from django.forms import BooleanField, CharField, ChoiceField, ModelForm, MultipleChoiceField, ValidationError +from django.forms import BooleanField, CharField, ChoiceField, Form, ModelForm, MultipleChoiceField, ValidationError from django.forms.widgets import HiddenInput from django.utils.text import format_lazy from django.utils.translation import ugettext_lazy as _ @@ -103,6 +103,12 @@ class EditorFormBase(ModelForm): self.fields.move_to_end('redirect_slugs', last=False) self.fields.move_to_end('slug', last=False) + if 'from_node' in self.fields: + self.fields['from_node'].widget = HiddenInput() + + if 'to_node' in self.fields: + self.fields['to_node'].widget = HiddenInput() + def clean_redirect_slugs(self): old_redirect_slugs = set(self.redirect_slugs) new_redirect_slugs = set(s for s in (s.strip() for s in self.cleaned_data['redirect_slugs'].split(',')) if s) @@ -151,10 +157,10 @@ class EditorFormBase(ModelForm): def create_editor_form(editor_model): - possible_fields = ['slug', 'name', 'altitude', 'category', 'width', 'groups', 'color', 'priority', - 'access_restriction', 'can_search', 'can_describe', 'outside', 'geometry', + 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'] + 'left', 'top', 'right', 'bottom', 'from_node', 'to_node'] 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] @@ -179,3 +185,44 @@ class RejectForm(ModelForm): class Meta: model = ChangeSetUpdate fields = ('comment', ) + + +class GraphEditorSettingsForm(Form): + node_click = ChoiceField(label=_('when clicking on an existing node…'), choices=( + ('connect_or_toggle', _('connect if possible, otherwise toggle')), + ('connect', _('connect if possible')), + ('activate', _('activate')), + ('deactivate', _('deactivate')), + ('toggle', _('toggle')), + ('set_space_transfer', _('set space transfer')), + ('noop', _('do nothing')), + ), initial='connect_or_toggle') + + click_anywhere = ChoiceField(label=_('when clicking anywhere…'), choices=( + ('create_connect_node', _('create node and connect if possible')), + ('create_node_if_none_active', _('create node if no node is active')), + ('create_node', _('create node')), + ('noop', _('do nothing')), + ), initial='create_connect_node') + + create_edge = ChoiceField(label=_('when connecting two nodes…'), choices=( + ('bidirectional', _('create edge in both directions')), + ('unidirectional', _('create edge in one direction')), + ('unidirectional_force', _('create edge, delete other direction')), + ('delete_bidirectional', _('delete edges in both directions')), + ('delete_unidirectional', _('delete edge in one direction')), + ), initial='bidirectional') + + create_existing_edge = ChoiceField(label=_('when creating an already existing edge…'), choices=( + ('overwrite_toggle', _('overwrite if not identical, otherwise delete')), + ('overwrite_always', _('overwrite')), + ('overwrite_waytype', _('overwrite waytype')), + ('overwrite_access', _('overwrite access restriction')), + ('delete', _('delete')), + ), initial='overwrite_toggle') + + after_create_edge = ChoiceField(label=_('after creating a new edge…'), choices=( + ('reset', _('deactivate active node')), + ('keep_first_active', _('keep first node active')), + ('set_second_active', _('set second node as active')), + ), initial='reset') diff --git a/src/c3nav/editor/templates/editor/graph.html b/src/c3nav/editor/templates/editor/graph.html index 0567796c..06fa8cb8 100644 --- a/src/c3nav/editor/templates/editor/graph.html +++ b/src/c3nav/editor/templates/editor/graph.html @@ -16,7 +16,15 @@ {% endif %} +

« {{ back_title }}

{% bootstrap_messages %} + +

{% trans 'Default properties:' %}

+{% bootstrap_form node_form %} +{% bootstrap_form edge_form %} + +

{% trans 'UI settings:' %}

+{% bootstrap_form settings_form %} diff --git a/src/c3nav/editor/views/edit.py b/src/c3nav/editor/views/edit.py index 42491552..1f342eec 100644 --- a/src/c3nav/editor/views/edit.py +++ b/src/c3nav/editor/views/edit.py @@ -8,6 +8,7 @@ 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.views.base import sidebar_view @@ -336,6 +337,8 @@ def list_objects(request, model=None, level=None, space=None, explicit_edit=Fals def graph_edit(request, level=None, space=None): Level = request.changeset.wrap_model('Level') Space = request.changeset.wrap_model('Space') + GraphNode = request.changeset.wrap_model('GraphNode') + GraphEdge = request.changeset.wrap_model('GraphEdge') can_edit = request.changeset.can_edit(request) @@ -365,4 +368,10 @@ def graph_edit(request, level=None, space=None): 'geometry_url': '/api/editor/geometries/?space='+str(space.pk), }) + ctx.update({ + 'node_form': GraphNode.EditorForm(request=request), + 'edge_form': GraphEdge.EditorForm(request=request), + 'settings_form': GraphEditorSettingsForm(), + }) + return render(request, 'editor/graph.html', ctx)