mirror of
https://github.com/netbox-community/netbox.git
synced 2025-08-18 05:28:16 -06:00
14081 fixed cached counters on delete for parent-child items
This commit is contained in:
parent
5b2f29480a
commit
acfde343c2
@ -1,6 +1,6 @@
|
|||||||
from django.apps import apps
|
from django.apps import apps
|
||||||
from django.db.models import F, Count, OuterRef, Subquery
|
from django.db.models import F, Count, OuterRef, Subquery
|
||||||
from django.db.models.signals import post_delete, post_save
|
from django.db.models.signals import post_delete, post_save, pre_delete
|
||||||
|
|
||||||
from netbox.registry import registry
|
from netbox.registry import registry
|
||||||
from .fields import CounterCacheField
|
from .fields import CounterCacheField
|
||||||
@ -62,6 +62,11 @@ def post_save_receiver(sender, instance, created, **kwargs):
|
|||||||
update_counter(parent_model, new_pk, counter_name, 1)
|
update_counter(parent_model, new_pk, counter_name, 1)
|
||||||
|
|
||||||
|
|
||||||
|
def pre_delete_receiver(sender, instance, origin, **kwargs):
|
||||||
|
if not type(instance).objects.filter(pk=instance.pk).exists():
|
||||||
|
instance._previously_removed = True
|
||||||
|
|
||||||
|
|
||||||
def post_delete_receiver(sender, instance, origin, **kwargs):
|
def post_delete_receiver(sender, instance, origin, **kwargs):
|
||||||
"""
|
"""
|
||||||
Update counter fields on related objects when a TrackingModelMixin subclass is deleted.
|
Update counter fields on related objects when a TrackingModelMixin subclass is deleted.
|
||||||
@ -71,10 +76,8 @@ def post_delete_receiver(sender, instance, origin, **kwargs):
|
|||||||
parent_pk = getattr(instance, field_name, None)
|
parent_pk = getattr(instance, field_name, None)
|
||||||
|
|
||||||
# Decrement the parent's counter by one
|
# Decrement the parent's counter by one
|
||||||
if parent_pk is not None:
|
if parent_pk is not None and not hasattr(instance, "_previously_removed"):
|
||||||
# MPTT sends two delete signals for child elements so guard against multiple decrements
|
update_counter(parent_model, parent_pk, counter_name, -1)
|
||||||
if not origin or origin == instance:
|
|
||||||
update_counter(parent_model, parent_pk, counter_name, -1)
|
|
||||||
|
|
||||||
|
|
||||||
#
|
#
|
||||||
@ -112,3 +115,9 @@ def connect_counters(*models):
|
|||||||
weak=False,
|
weak=False,
|
||||||
dispatch_uid=f'{model._meta.label}.{field.name}'
|
dispatch_uid=f'{model._meta.label}.{field.name}'
|
||||||
)
|
)
|
||||||
|
pre_delete.connect(
|
||||||
|
pre_delete_receiver,
|
||||||
|
sender=to_model,
|
||||||
|
weak=False,
|
||||||
|
dispatch_uid=f'{model._meta.label}.{field.name}'
|
||||||
|
)
|
||||||
|
Loading…
Reference in New Issue
Block a user