1
0
mirror of https://github.com/netbox-community/netbox.git synced 2024-05-10 07:54:54 +00:00

Adapt component creation forms to infer parent device/VM from initial or bound data

This commit is contained in:
Jeremy Stretch
2020-02-05 15:29:35 -05:00
parent 0ad613e6b4
commit b0c0ad7c82
2 changed files with 21 additions and 15 deletions

View File

@ -2456,8 +2456,9 @@ class PowerOutletCreateForm(ComponentForm):
super().__init__(*args, **kwargs) super().__init__(*args, **kwargs)
# Limit power_port queryset to PowerPorts which belong to the parent Device # Limit power_port queryset to PowerPorts which belong to the parent Device
if 'device' in self.initial: device = Device.objects.get(
device = Device.objects.filter(pk=self.initial['device']).first() pk=self.initial.get('device') or self.data.get('device')
)
self.fields['power_port'].queryset = PowerPort.objects.filter(device=device) self.fields['power_port'].queryset = PowerPort.objects.filter(device=device)
@ -2707,8 +2708,9 @@ class InterfaceCreateForm(InterfaceCommonForm, ComponentForm, forms.Form):
super().__init__(*args, **kwargs) super().__init__(*args, **kwargs)
# Limit LAG choices to interfaces which belong to the parent device (or VC master) # Limit LAG choices to interfaces which belong to the parent device (or VC master)
if 'device' in self.initial: device = Device.objects.get(
device = Device.objects.filter(pk=self.initial['device']).first() pk=self.initial.get('device') or self.data.get('device')
)
self.fields['lag'].queryset = Interface.objects.filter( self.fields['lag'].queryset = Interface.objects.filter(
device__in=[device, device.get_vc_master()], device__in=[device, device.get_vc_master()],
type=InterfaceTypeChoices.TYPE_LAG type=InterfaceTypeChoices.TYPE_LAG
@ -2952,18 +2954,20 @@ class FrontPortCreateForm(ComponentForm):
def __init__(self, *args, **kwargs): def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs) super().__init__(*args, **kwargs)
parent = Device.objects.get(pk=self.initial.get('device')) device = Device.objects.get(
pk=self.initial.get('device') or self.data.get('device')
)
# Determine which rear port positions are occupied. These will be excluded from the list of available # Determine which rear port positions are occupied. These will be excluded from the list of available
# mappings. # mappings.
occupied_port_positions = [ occupied_port_positions = [
(front_port.rear_port_id, front_port.rear_port_position) (front_port.rear_port_id, front_port.rear_port_position)
for front_port in parent.frontports.all() for front_port in device.frontports.all()
] ]
# Populate rear port choices # Populate rear port choices
choices = [] choices = []
rear_ports = RearPort.objects.filter(device=parent) rear_ports = RearPort.objects.filter(device=device)
for rear_port in rear_ports: for rear_port in rear_ports:
for i in range(1, rear_port.positions + 1): for i in range(1, rear_port.positions + 1):
if (rear_port.pk, i) not in occupied_port_positions: if (rear_port.pk, i) not in occupied_port_positions:

View File

@ -797,9 +797,12 @@ class InterfaceCreateForm(ComponentForm):
) )
def __init__(self, *args, **kwargs): def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs) super().__init__(*args, **kwargs)
virtual_machine = VirtualMachine.objects.get(
pk=self.initial.get('virtual_machine') or self.data.get('virtual_machine')
)
# Limit VLAN choices to those in: global vlans, global groups, the current site's group, the current site # Limit VLAN choices to those in: global vlans, global groups, the current site's group, the current site
vlan_choices = [] vlan_choices = []
global_vlans = VLAN.objects.filter(site=None, group=None) global_vlans = VLAN.objects.filter(site=None, group=None)
@ -812,8 +815,7 @@ class InterfaceCreateForm(ComponentForm):
(group.name, [(vlan.pk, vlan) for vlan in global_group_vlans]) (group.name, [(vlan.pk, vlan) for vlan in global_group_vlans])
) )
parent = VirtualMachine.objects.get(pk=self.initial.get('virtual_machine')) site = getattr(virtual_machine.cluster, 'site', None)
site = getattr(parent.cluster, 'site', None)
if site is not None: if site is not None:
# Add non-grouped site VLANs # Add non-grouped site VLANs