forms in graph view

This commit is contained in:
Laura Klünder 2017-07-26 13:20:55 +02:00
parent e5526cf88c
commit 9c8f65c4b1
3 changed files with 69 additions and 10 deletions

View file

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

View file

@ -23,8 +23,12 @@
</p>
{% bootstrap_messages %}
<h4>{% trans 'Default node properties' %}</h4>
{% bootstrap_form node_form %}
<form action="{{ request.path }}" method="post">
<h4>{% trans 'Default node properties' %}</h4>
{% bootstrap_form node_settings_form %}
<h4>{% trans 'Default edge properties' %}</h4>
{% bootstrap_form edge_form %}
<h4>{% trans 'Default edge properties' %}</h4>
{% bootstrap_form edge_settings_form %}
{% bootstrap_form graph_action_form %}
</form>

View file

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