mirror of
				https://github.com/netbox-community/netbox.git
				synced 2024-05-10 07:54:54 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			65 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			65 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| from django.db.models.signals import post_delete, post_save, pre_delete
 | |
| from django.dispatch import receiver
 | |
| 
 | |
| from dcim.models import Device
 | |
| from virtualization.models import VirtualMachine
 | |
| from .models import IPAddress, Prefix
 | |
| 
 | |
| 
 | |
| def update_parents_children(prefix):
 | |
|     """
 | |
|     Update depth on prefix & containing prefixes
 | |
|     """
 | |
|     parents = prefix.get_parents(include_self=True).annotate_hierarchy()
 | |
|     for parent in parents:
 | |
|         parent._children = parent.hierarchy_children
 | |
|     Prefix.objects.bulk_update(parents, ['_children'], batch_size=100)
 | |
| 
 | |
| 
 | |
| def update_children_depth(prefix):
 | |
|     """
 | |
|     Update children count on prefix & contained prefixes
 | |
|     """
 | |
|     children = prefix.get_children(include_self=True).annotate_hierarchy()
 | |
|     for child in children:
 | |
|         child._depth = child.hierarchy_depth
 | |
|     Prefix.objects.bulk_update(children, ['_depth'], batch_size=100)
 | |
| 
 | |
| 
 | |
| @receiver(post_save, sender=Prefix)
 | |
| def handle_prefix_saved(instance, created, **kwargs):
 | |
| 
 | |
|     # Prefix has changed (or new instance has been created)
 | |
|     if created or instance.vrf != instance._vrf or instance.prefix != instance._prefix:
 | |
| 
 | |
|         update_parents_children(instance)
 | |
|         update_children_depth(instance)
 | |
| 
 | |
|         # If this is not a new prefix, clean up parent/children of previous prefix
 | |
|         if not created:
 | |
|             old_prefix = Prefix(vrf=instance._vrf, prefix=instance._prefix)
 | |
|             update_parents_children(old_prefix)
 | |
|             update_children_depth(old_prefix)
 | |
| 
 | |
| 
 | |
| @receiver(post_delete, sender=Prefix)
 | |
| def handle_prefix_deleted(instance, **kwargs):
 | |
| 
 | |
|     update_parents_children(instance)
 | |
|     update_children_depth(instance)
 | |
| 
 | |
| 
 | |
| @receiver(pre_delete, sender=IPAddress)
 | |
| def clear_primary_ip(instance, **kwargs):
 | |
|     """
 | |
|     When an IPAddress is deleted, trigger save() on any Devices/VirtualMachines for which it
 | |
|     was a primary IP.
 | |
|     """
 | |
|     field_name = f'primary_ip{instance.family}'
 | |
|     device = Device.objects.filter(**{field_name: instance}).first()
 | |
|     if device:
 | |
|         device.save()
 | |
|     virtualmachine = VirtualMachine.objects.filter(**{field_name: instance}).first()
 | |
|     if virtualmachine:
 | |
|         virtualmachine.save()
 |