forms in graph view
This commit is contained in:
parent
e5526cf88c
commit
9c8f65c4b1
3 changed files with 69 additions and 10 deletions
|
@ -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')),
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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,
|
||||
})
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue