connect nodes
This commit is contained in:
parent
bd5e0ca264
commit
6c33a8a41b
2 changed files with 58 additions and 3 deletions
|
@ -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')),
|
||||
|
|
|
@ -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
|
||||
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue