forked from enviPath/enviPy
Delete Stale Edges when removing a Node from a Pathway (#41)
Co-authored-by: Tim Lorsbach <tim@lorsba.ch> Reviewed-on: enviPath/enviPy#41
This commit is contained in:
@ -4,3 +4,6 @@ from django.apps import AppConfig
|
||||
class EPDBConfig(AppConfig):
|
||||
default_auto_field = 'django.db.models.BigAutoField'
|
||||
name = 'epdb'
|
||||
|
||||
def ready(self):
|
||||
import epdb.signals # noqa: F401
|
||||
|
||||
@ -1044,7 +1044,7 @@ class Node(EnviPathModel, AliasMixin, ScenarioMixin):
|
||||
return IndigoUtils.mol_to_svg(self.default_node_label.smiles)
|
||||
|
||||
|
||||
class Edge(PolymorphicModel, EnviPathModel, AliasMixin, ScenarioMixin):
|
||||
class Edge(EnviPathModel, AliasMixin, ScenarioMixin):
|
||||
pathway = models.ForeignKey('epdb.Pathway', verbose_name='belongs to', on_delete=models.CASCADE, db_index=True)
|
||||
edge_label = models.ForeignKey('epdb.Reaction', verbose_name='Edge label', null=True, on_delete=models.SET_NULL)
|
||||
start_nodes = models.ManyToManyField('epdb.Node', verbose_name='Start Nodes', related_name='edge_educts')
|
||||
|
||||
20
epdb/signals.py
Normal file
20
epdb/signals.py
Normal file
@ -0,0 +1,20 @@
|
||||
from django.db import transaction
|
||||
from django.db.models.signals import pre_delete
|
||||
from django.dispatch import receiver
|
||||
|
||||
from epdb.models import Node, Edge
|
||||
|
||||
|
||||
@receiver(pre_delete, sender=Node)
|
||||
@transaction.atomic
|
||||
def delete_orphan_edges(sender, instance, **kwargs):
|
||||
# check if the node that is about to be deleted is the only start node
|
||||
for edge in Edge.objects.filter(start_nodes=instance):
|
||||
if edge.start_nodes.count() == 1:
|
||||
edge.delete()
|
||||
|
||||
# same for end_nodes
|
||||
for edge in Edge.objects.filter(end_nodes=instance):
|
||||
# check if the node that is about to be deleted is the only start node
|
||||
if edge.end_nodes.count() == 1:
|
||||
edge.delete()
|
||||
@ -1417,15 +1417,20 @@ def package_pathway_node(request, package_uuid, pathway_uuid, node_uuid):
|
||||
return render(request, 'objects/node.html', context)
|
||||
|
||||
elif request.method == 'POST':
|
||||
if s.DEBUG:
|
||||
for k, v in request.POST.items():
|
||||
print(k, v)
|
||||
|
||||
log_post_params(request)
|
||||
|
||||
if hidden := request.POST.get('hidden', None):
|
||||
if hidden == 'delete-node':
|
||||
current_node.delete()
|
||||
return redirect(current_pathway.url)
|
||||
|
||||
# pre_delete signal will take care of edge deletion
|
||||
current_node.delete()
|
||||
|
||||
return redirect(current_pathway.url)
|
||||
else:
|
||||
return HttpResponseBadRequest()
|
||||
else:
|
||||
return HttpResponseBadRequest()
|
||||
else:
|
||||
return HttpResponseNotAllowed(['GET', 'POST'])
|
||||
|
||||
@ -1474,6 +1479,8 @@ def package_pathway_edges(request, package_uuid, pathway_uuid):
|
||||
|
||||
elif request.method == 'POST':
|
||||
|
||||
log_post_params(request)
|
||||
|
||||
edge_name = request.POST.get('edge-name')
|
||||
edge_description = request.POST.get('edge-description')
|
||||
edge_substrates = request.POST.getlist('edge-substrates')
|
||||
@ -1517,9 +1524,8 @@ def package_pathway_edge(request, package_uuid, pathway_uuid, edge_uuid):
|
||||
return render(request, 'objects/edge.html', context)
|
||||
|
||||
elif request.method == 'POST':
|
||||
if s.DEBUG:
|
||||
for k, v in request.POST.items():
|
||||
print(k, v)
|
||||
|
||||
log_post_params(request)
|
||||
|
||||
if hidden := request.POST.get('hidden', None):
|
||||
if hidden == 'delete-edge':
|
||||
|
||||
Reference in New Issue
Block a user