Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
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
3 changes: 3 additions & 0 deletions netbox/dcim/models/devices.py
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@
from .device_components import *
from .mixins import RenderConfigMixin
from .modules import Module
from ..utils import update_device_components


__all__ = (
Expand Down Expand Up @@ -1012,6 +1013,8 @@ def save(self, *args, **kwargs):
self._instantiate_components(self.device_type.inventoryitemtemplates.all(), bulk_create=False)
# Interface bridges have to be set after interface instantiation
update_interface_bridges(self, self.device_type.interfacetemplates.all())
# Update denormalized fields for all components
update_device_components(self)

# Update Site and Rack assignment for any child Devices
devices = Device.objects.filter(parent_bay__device=self)
Expand Down
3 changes: 3 additions & 0 deletions netbox/dcim/models/modules.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
from utilities.jsonschema import validate_schema
from utilities.string import title
from .device_components import *
from ..utils import update_device_components

__all__ = (
'Module',
Expand Down Expand Up @@ -347,3 +348,5 @@ def save(self, *args, **kwargs):

# Interface bridges have to be set after interface instantiation
update_interface_bridges(self.device, self.module_type.interfacetemplates, self)
# Update denormalized fields for all components
update_device_components(self.device)
31 changes: 9 additions & 22 deletions netbox/dcim/signals.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,25 +6,11 @@
from dcim.choices import CableEndChoices, LinkStatusChoices
from virtualization.models import VMInterface
from .models import (
Cable, CablePath, CableTermination, ConsolePort, ConsoleServerPort, Device, DeviceBay, FrontPort, Interface,
InventoryItem, ModuleBay, PathEndpoint, PowerOutlet, PowerPanel, PowerPort, Rack, RearPort, Location,
Cable, CablePath, CableTermination, Device, FrontPort, Interface, PathEndpoint, PowerPanel, Rack, Location,
VirtualChassis,
)
from .models.cables import trace_paths
from .utils import create_cablepath, rebuild_paths

COMPONENT_MODELS = (
ConsolePort,
ConsoleServerPort,
DeviceBay,
FrontPort,
Interface,
InventoryItem,
ModuleBay,
PowerOutlet,
PowerPort,
RearPort,
)
from .utils import create_cablepath, rebuild_paths, update_device_components


#
Expand All @@ -44,6 +30,9 @@ def handle_location_site_change(instance, created, **kwargs):
Device.objects.filter(location__in=locations).update(site=instance.site)
PowerPanel.objects.filter(location__in=locations).update(site=instance.site)
CableTermination.objects.filter(_location__in=locations).update(_site=instance.site)
# Update component models for devices in these locations
for device in Device.objects.filter(location__in=locations):
update_device_components(device)


@receiver(post_save, sender=Rack)
Expand All @@ -53,6 +42,9 @@ def handle_rack_site_change(instance, created, **kwargs):
"""
if not created:
Device.objects.filter(rack=instance).update(site=instance.site, location=instance.location)
# Update component models for devices in this rack
for device in Device.objects.filter(rack=instance):
update_device_components(device)


@receiver(post_save, sender=Device)
Expand All @@ -61,12 +53,7 @@ def handle_device_site_change(instance, created, **kwargs):
Update child components to update the parent Site, Location, and Rack when a Device is saved.
"""
if not created:
for model in COMPONENT_MODELS:
model.objects.filter(device=instance).update(
_site=instance.site,
_location=instance.location,
_rack=instance.rack,
)
update_device_components(instance)


#
Expand Down
33 changes: 33 additions & 0 deletions netbox/dcim/utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -76,3 +76,36 @@ def update_interface_bridges(device, interface_templates, module=None):
)
interface.full_clean()
interface.save()


def update_device_components(device):
"""
Update denormalized fields (_site, _location, _rack) for all component models
associated with the specified device.

:param device: Device instance whose components should be updated
"""
from dcim.models import (
ConsolePort, ConsoleServerPort, DeviceBay, FrontPort, Interface,
InventoryItem, ModuleBay, PowerOutlet, PowerPort, RearPort,
)

COMPONENT_MODELS = (
ConsolePort,
ConsoleServerPort,
DeviceBay,
FrontPort,
Interface,
InventoryItem,
ModuleBay,
PowerOutlet,
PowerPort,
RearPort,
)

for model in COMPONENT_MODELS:
model.objects.filter(device=device).update(
_site=device.site,
_location=device.location,
_rack=device.rack,
)
Loading