Graph forms

This commit is contained in:
Laura Klünder 2017-07-19 18:02:40 +02:00
parent d886b63452
commit 8973c2cbf4
3 changed files with 68 additions and 4 deletions

View file

@ -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')

View file

@ -16,7 +16,15 @@
{% endif %}
</small>
</h3>
<p>
<a href="{{ back_url }}">&laquo; {{ back_title }}</a>
</p>
{% bootstrap_messages %}
<h4>{% trans 'Default properties:' %}</h4>
{% bootstrap_form node_form %}
{% bootstrap_form edge_form %}
<h4>{% trans 'UI settings:' %}</h4>
{% bootstrap_form settings_form %}

View file

@ -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)