show graph node connections in editor

This commit is contained in:
Laura Klünder 2017-11-25 20:32:05 +01:00
parent 20cacfa507
commit 94445edfc0
2 changed files with 58 additions and 8 deletions

View file

@ -28,16 +28,43 @@
{% if set_active_node %} {% if set_active_node %}
<div data-active-node="{% if active_node %}{{ active_node.pk }}{% else %}null{% endif %}" class="well well-sm"> <div data-active-node="{% if active_node %}{{ active_node.pk }}{% else %}null{% endif %}" class="well well-sm">
<p>
<strong>{% trans 'Active node:' %} {{ active_node.pk }}</strong><br> <strong>{% trans 'Active node:' %} {{ active_node.pk }}</strong><br>
{% with space_title=active_node.space.title level_title=active_node.space.level.title %} {% with space_title=active_node.space.title level_title=active_node.space.level.title %}
{% blocktrans %}in space {{ space_title }}{% endblocktrans %}<br> {% blocktrans %}in space {{ space_title }}{% endblocktrans %}<br>
{% blocktrans %}on level {{ level_title }}{% endblocktrans %} {% blocktrans %}on level {{ level_title }}{% endblocktrans %}
{% endwith %} {% endwith %}
</p>
<form action="{{ request.path }}" method="post"> <form action="{{ request.path }}" method="post">
{% csrf_token %} {% csrf_token %}
<input type="hidden" name="pk" value="{{ active_node.pk }}"> <input type="hidden" name="pk" value="{{ active_node.pk }}">
<button type="submit" class="btn btn-danger btn-xs" name="delete" value="1">{% trans 'Delete Node' %}</button> <button type="submit" class="btn btn-danger btn-xs" name="delete" value="1">{% trans 'Delete Node' %}</button>
</form> </form><br>
<strong>{% trans 'Connections:' %}</strong><br>
{% for connections in active_node_connections %}
<small>
<strong>
{% with space_title=connections.0.other_node.space.title level_title=connections.0.other_node.space.level.title %}
{% blocktrans %}Space {{ space_title }}{% endblocktrans %}<br>
{% blocktrans %}on level {{ level_title }}{% endblocktrans %}
{% endwith %}
</strong>
<br>
{% for connection in connections %}
{% if connection.from_node_id == active_node.pk %}
{{ connection.other_node.pk }}{% if connection.waytype %}{{ connection.waytype.title }}{% endif %},
{% endif %}
{% endfor %}
<br>
{% for connection in connections %}
{% if connection.from_node_id != active_node.pk %}
{{ connection.other_node.pk }}{% if connection.waytype %}{{ connection.waytype.title }}{% endif %},
{% endif %}
{% endfor %}
</small><br><br>
{% endfor %}
</div> </div>
{% else %} {% else %}
<div data-active-node class="well well-sm"></div> <div data-active-node class="well well-sm"></div>

View file

@ -4,6 +4,7 @@ from contextlib import suppress
from django.contrib import messages from django.contrib import messages
from django.core.exceptions import FieldDoesNotExist, ObjectDoesNotExist from django.core.exceptions import FieldDoesNotExist, ObjectDoesNotExist
from django.db import models from django.db import models
from django.db.models import Q
from django.shortcuts import get_object_or_404, redirect, render from django.shortcuts import get_object_or_404, redirect, render
from django.urls import reverse from django.urls import reverse
from django.utils.translation import ugettext_lazy as _ from django.utils.translation import ugettext_lazy as _
@ -11,6 +12,7 @@ from django.views.decorators.http import etag
from c3nav.editor.forms import GraphEdgeSettingsForm, GraphEditorActionForm from c3nav.editor.forms import GraphEdgeSettingsForm, GraphEditorActionForm
from c3nav.editor.views.base import etag_func, sidebar_view from c3nav.editor.views.base import etag_func, sidebar_view
from c3nav.mapdata.models.access import AccessPermission
def child_model(request, model: typing.Union[str, models.Model], kwargs=None, parent=None): def child_model(request, model: typing.Union[str, models.Model], kwargs=None, parent=None):
@ -407,12 +409,13 @@ def graph_edit(request, level=None, space=None):
elif space is not None: elif space is not None:
queryset = Space.objects.filter(Space.q_for_request(request)).select_related('level').defer('geometry') queryset = Space.objects.filter(Space.q_for_request(request)).select_related('level').defer('geometry')
space = get_object_or_404(queryset, pk=space) space = get_object_or_404(queryset, pk=space)
level = space.level
ctx.update({ ctx.update({
'space': space, 'space': space,
'level': space.level, 'level': space.level,
'back_url': reverse('editor.spaces.detail', kwargs={'level': space.level.pk, 'pk': space.pk}), 'back_url': reverse('editor.spaces.detail', kwargs={'level': level.pk, 'pk': space.pk}),
'back_title': _('back to space'), 'back_title': _('back to space'),
'parent_url': reverse('editor.levels.graph', kwargs={'level': space.level.pk}), 'parent_url': reverse('editor.levels.graph', kwargs={'level': level.pk}),
'parent_title': _('to level graph'), 'parent_title': _('to level graph'),
'geometry_url': '/api/editor/geometries/?space='+str(space.pk), 'geometry_url': '/api/editor/geometries/?space='+str(space.pk),
}) })
@ -440,6 +443,7 @@ def graph_edit(request, level=None, space=None):
'obj_title': node.title 'obj_title': node.title
}) })
permissions = AccessPermission.get_for_request(request) | set([None])
edge_settings_form = GraphEdgeSettingsForm(instance=GraphEdge(), request=request, data=request.POST) edge_settings_form = GraphEdgeSettingsForm(instance=GraphEdge(), request=request, data=request.POST)
graph_action_form = GraphEditorActionForm(request=request, allow_clicked_position=create_nodes, graph_action_form = GraphEditorActionForm(request=request, allow_clicked_position=create_nodes,
data=request.POST) data=request.POST)
@ -482,9 +486,28 @@ def graph_edit(request, level=None, space=None):
messages.error(request, _('You can not edit changes on this changeset.')) messages.error(request, _('You can not edit changes on this changeset.'))
if set_active_node: if set_active_node:
if active_node:
connections = {}
for self_node, other_node in (('from_node', 'to_node'), ('to_node', 'from_node')):
conn_qs = GraphEdge.objects.filter(Q(**{self_node+'__pk': active_node.pk}))
conn_qs = conn_qs.select_related(other_node+'__space', other_node+'__space__level', 'waytype')
for edge in conn_qs:
edge.other_node = getattr(edge, other_node)
if (edge.other_node.space.access_restriction_id not in permissions
or edge.other_node.space.level.access_restriction_id not in permissions):
continue
connections.setdefault(edge.other_node.space_id, []).append(edge)
connections = sorted(
connections.values(),
key=lambda c: (c[0].other_node.space.level == level,
c[0].other_node.space == space,
c[0].other_node.space.level.base_altitude)
)
ctx.update({ ctx.update({
'set_active_node': set_active_node, 'set_active_node': set_active_node,
'active_node': active_node, 'active_node': active_node,
'active_node_connections': connections,
}) })
else: else:
edge_settings_form = GraphEdgeSettingsForm(request=request) edge_settings_form = GraphEdgeSettingsForm(request=request)