diff --git a/src/c3nav/editor/forms.py b/src/c3nav/editor/forms.py index 8770710c..ef6378d9 100644 --- a/src/c3nav/editor/forms.py +++ b/src/c3nav/editor/forms.py @@ -257,7 +257,7 @@ class GraphEditorSettingsForm(Form): ('noop', _('do nothing')), ), initial='connect') - create_edge = ChoiceField(label=_('when connecting two nodes…'), choices=( + connect_nodes = 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')), @@ -273,7 +273,7 @@ class GraphEditorSettingsForm(Form): ('delete', _('delete')), ), initial='overwrite_toggle') - after_create_edge = ChoiceField(label=_('after creating a new edge…'), choices=( + after_connect_nodes = ChoiceField(label=_('after connecting two nodes…'), choices=( ('reset', _('deactivate active node')), ('keep_first_active', _('keep first node active')), ('set_second_active', _('set second node as active')), diff --git a/src/c3nav/editor/views/edit.py b/src/c3nav/editor/views/edit.py index 827c35c4..66bf9b3c 100644 --- a/src/c3nav/editor/views/edit.py +++ b/src/c3nav/editor/views/edit.py @@ -335,7 +335,62 @@ def list_objects(request, model=None, level=None, space=None, explicit_edit=Fals def connect_nodes(request, active_node, to_node, edge_settings_form, graph_editing_settings): - messages.info(request, _('Nodes connected.')) + connect_nodes_setting = graph_editing_settings['connect_nodes'] + create_existing_edge_setting = graph_editing_settings['create_existing_edge'] + after_connect_nodes_setting = graph_editing_settings['after_connect_nodes'] + + new_connections = [] + if connect_nodes_setting in ('bidirectional', 'unidirectional', 'unidirectional_force'): + new_connections.append((active_node, to_node, False)) + if connect_nodes_setting == 'bidirectional': + new_connections.append((to_node, active_node, True)) + + if new_connections: + instance = edge_settings_form.instance + for from_node, to_node, is_reverse in new_connections: + existing = from_node.edges_from_here.filter(to_node=to_node).first() + if existing is None: + instance.pk = None + instance.from_node = from_node + instance.to_node = to_node + instance.save() + messages.success(request, _('Reverse edge created.') if is_reverse else _('Edge created.')) + elif create_existing_edge_setting == 'delete': + existing.delete() + messages.success(request, _('Reverse edge deleted.') if is_reverse else _('Edge deleted.')) + elif create_existing_edge_setting == 'overwrite_toggle': + if existing.waytype == instance.waytype and existing.access_restriction == instance.access_restriction: + existing.delete() + messages.success(request, _('Reverse edge deleted.') if is_reverse else _('Edge deleted.')) + else: + existing.waytype = instance.waytype + existing.access_restriction = instance.access_restriction + existing.save() + messages.success(request, _('Reverse edge overwritten.') if is_reverse else _('Edge overwritten.')) + elif create_existing_edge_setting in ('overwrite_always', 'overwrite_waytype', 'overwrite_access'): + if create_existing_edge_setting in ('overwrite_always', 'overwrite_waytype'): + existing.waytype = instance.waytype + if create_existing_edge_setting in ('overwrite_always', 'overwrite_access'): + existing.access_restriction = instance.access_restriction + existing.save() + messages.success(request, _('Reverse edge overwritten.') if is_reverse else _('Edge overwritten.')) + + if connect_nodes_setting in ('delete_unidirectional', 'delete_bidirectional'): + existing = active_node.edges_from_here.filter(to_node=to_node).first() + if existing is not None: + existing.delete() + messages.success(request, _('Edge deleted.')) + + if connect_nodes_setting in ('unidirectional_force', 'delete_bidirectional'): + existing = to_node.edges_from_here.filter(to_node=active_node).first() + if existing is not None: + existing.delete() + messages.success(request, _('Reverse edge deleted.')) + + if after_connect_nodes_setting == 'reset': + return None, True + elif after_connect_nodes_setting == 'set_second_active': + return to_node, True return active_node, False