Thanks to visit codestin.com
Credit goes to github.com

Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 3 additions & 1 deletion ngen/models/common/mixins.py
Original file line number Diff line number Diff line change
Expand Up @@ -116,9 +116,10 @@ def fix_tree(cls):

def clean_fields(self, exclude=None):
# Check loops. This is not really performant, but it works
visited = set()
elem = self.parent
while elem:
if elem.pk == self.pk:
if elem.pk == self.pk or elem.pk in visited:
raise ValidationError(
{
"parent": [
Expand All @@ -128,6 +129,7 @@ def clean_fields(self, exclude=None):
]
}
)
visited.add(elem.pk)
elem = elem.parent
super().clean_fields(exclude=exclude)

Expand Down
52 changes: 47 additions & 5 deletions ngen/models/constituency.py
Original file line number Diff line number Diff line change
Expand Up @@ -114,8 +114,11 @@ def fix_tree(cls):
network.save()

def delete(self):
# Update the parent Network of the children
if self.get_children():
self.get_children().update(parent=self.parent)
# Update the network of the events
self.events.update(network=self.parent)
super().delete()

def clean(self):
Expand Down Expand Up @@ -146,14 +149,53 @@ def validate_unique(self, exclude=None):
{"__all__": [f"Network must have a valid address (cidr/domain)"]}
)

def _reorder_events_of_my_parent_and_me(self):
if self.parent:
# Events that truly belong to me
my_events = self.parent.events.children_of(self)

# Events that should remain with the parent
parent_events = self.events.exclude(pk__in=my_events)

# Bulk update
parent_events.update(network=self.parent)
my_events.update(network=self)
else:
Event.objects.children_of(self).filter(network=None).update(network=self)

def _reorder_networks_that_belongs_to_me(self):
Network.objects.direct_children_of(self).update(parent=self)

def save(self, *args, **kwargs):
self.full_clean()

# Check if the network is being updated
network_changed = False
old_parent = None
if self.pk:
# if the network is being updated
# Take old parent reference (if it existed in the DB)
old = Network.objects.filter(pk=self.pk).first()
if old:
network_changed = old.cidr != self.cidr or old.domain != self.domain
if network_changed:
old_parent = old.parent

super().save(*args, **kwargs)
Network.objects.direct_children_of(self).update(parent=self)
events = Event.objects.children_of(self)
if self.parent:
events = events.filter(network=self.parent)
events.update(network=self)

# Order networks and events on edit network
if network_changed:
# Order old events
if old_parent and old_parent.pk != self.parent_id:
# If I changed parents, return the events to the old parent
old_events = Event.objects.filter(network=self)
old_events.update(network=old_parent)

# Order networks
self._reorder_networks_that_belongs_to_me()

# Order events
self._reorder_events_of_my_parent_and_me()

def ancestors_email_contacts(self, priority):
return self.get_ancestors_related(
Expand Down
Loading