mirror of
				https://github.com/netbox-community/netbox.git
				synced 2024-05-10 07:54:54 +00:00 
			
		
		
		
	Fixes #944: Correct console and power connection form behavior
This commit is contained in:
		@@ -934,28 +934,29 @@ class ConsolePortConnectionForm(BootstrapMixin, forms.ModelForm):
 | 
			
		||||
        if not self.instance.pk:
 | 
			
		||||
            raise RuntimeError("ConsolePortConnectionForm must be initialized with an existing ConsolePort instance.")
 | 
			
		||||
 | 
			
		||||
        self.initial['site'] = self.instance.device.site
 | 
			
		||||
        self.fields['rack'].queryset = Rack.objects.filter(site=self.instance.device.site)
 | 
			
		||||
        self.fields['cs_port'].required = True
 | 
			
		||||
        self.fields['connection_status'].choices = CONNECTION_STATUS_CHOICES
 | 
			
		||||
 | 
			
		||||
        # Initialize console server choices
 | 
			
		||||
        if self.is_bound and self.data.get('rack'):
 | 
			
		||||
            self.fields['console_server'].queryset = Device.objects.filter(rack=self.data['rack'],
 | 
			
		||||
                                                                           device_type__is_console_server=True)
 | 
			
		||||
        elif self.initial.get('rack'):
 | 
			
		||||
            self.fields['console_server'].queryset = Device.objects.filter(rack=self.initial['rack'],
 | 
			
		||||
                                                                           device_type__is_console_server=True)
 | 
			
		||||
        # Initialize rack choices if site is set
 | 
			
		||||
        if self.initial.get('site'):
 | 
			
		||||
            self.fields['rack'].queryset = Rack.objects.filter(site=self.initial['site'])
 | 
			
		||||
        else:
 | 
			
		||||
            self.fields['console_server'].queryset = Device.objects.filter(site=self.instance.device.site,
 | 
			
		||||
                                                                           rack__isnull=True,
 | 
			
		||||
                                                                           device_type__is_console_server=True)
 | 
			
		||||
            self.fields['rack'].choices = []
 | 
			
		||||
 | 
			
		||||
        # Initialize CS port choices
 | 
			
		||||
        if self.is_bound:
 | 
			
		||||
            self.fields['cs_port'].queryset = ConsoleServerPort.objects.filter(device__pk=self.data['console_server'])
 | 
			
		||||
        elif self.initial.get('console_server', None):
 | 
			
		||||
            self.fields['cs_port'].queryset = ConsoleServerPort.objects.filter(device__pk=self.initial['console_server'])
 | 
			
		||||
        # Initialize console_server choices if rack or site is set
 | 
			
		||||
        if self.initial.get('rack'):
 | 
			
		||||
            self.fields['console_server'].queryset = Device.objects.filter(
 | 
			
		||||
                rack=self.initial['rack'], device_type__is_console_server=True
 | 
			
		||||
            )
 | 
			
		||||
        elif self.initial.get('site'):
 | 
			
		||||
            self.fields['console_server'].queryset = Device.objects.filter(
 | 
			
		||||
                site=self.initial['site'], rack__isnull=True, device_type__is_console_server=True
 | 
			
		||||
            )
 | 
			
		||||
        else:
 | 
			
		||||
            self.fields['console_server'].choices = []
 | 
			
		||||
 | 
			
		||||
        # Initialize CS port choices if console_server is set
 | 
			
		||||
        if self.initial.get('console_server'):
 | 
			
		||||
            self.fields['cs_port'].queryset = ConsoleServerPort.objects.filter(
 | 
			
		||||
                device=self.initial['console_server']
 | 
			
		||||
            )
 | 
			
		||||
        else:
 | 
			
		||||
            self.fields['cs_port'].choices = []
 | 
			
		||||
 | 
			
		||||
@@ -1033,27 +1034,27 @@ class ConsoleServerPortConnectionForm(BootstrapMixin, forms.Form):
 | 
			
		||||
            'connection_status': 'Status',
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
    def __init__(self, consoleserverport, *args, **kwargs):
 | 
			
		||||
    def __init__(self, *args, **kwargs):
 | 
			
		||||
 | 
			
		||||
        super(ConsoleServerPortConnectionForm, self).__init__(*args, **kwargs)
 | 
			
		||||
 | 
			
		||||
        self.initial['site'] = consoleserverport.device.site
 | 
			
		||||
        self.fields['rack'].queryset = Rack.objects.filter(site=consoleserverport.device.site)
 | 
			
		||||
 | 
			
		||||
        # Initialize device choices
 | 
			
		||||
        if self.is_bound and self.data.get('rack'):
 | 
			
		||||
            self.fields['device'].queryset = Device.objects.filter(rack=self.data['rack'])
 | 
			
		||||
        elif self.initial.get('rack', None):
 | 
			
		||||
            self.fields['device'].queryset = Device.objects.filter(rack=self.initial['rack'])
 | 
			
		||||
        # Initialize rack choices if site is set
 | 
			
		||||
        if self.initial.get('site'):
 | 
			
		||||
            self.fields['rack'].queryset = Rack.objects.filter(site=self.initial['site'])
 | 
			
		||||
        else:
 | 
			
		||||
            self.fields['device'].queryset = Device.objects.filter(site=consoleserverport.device.site,
 | 
			
		||||
                                                                   rack__isnull=True)
 | 
			
		||||
            self.fields['rack'].choices = []
 | 
			
		||||
 | 
			
		||||
        # Initialize port choices
 | 
			
		||||
        if self.is_bound:
 | 
			
		||||
            self.fields['port'].queryset = ConsolePort.objects.filter(device__pk=self.data['device'])
 | 
			
		||||
        elif self.initial.get('device', None):
 | 
			
		||||
            self.fields['port'].queryset = ConsolePort.objects.filter(device_pk=self.initial['device'])
 | 
			
		||||
        # Initialize device choices if rack or site is set
 | 
			
		||||
        if self.initial.get('rack'):
 | 
			
		||||
            self.fields['device'].queryset = Device.objects.filter(rack=self.initial['rack'])
 | 
			
		||||
        elif self.initial.get('site'):
 | 
			
		||||
            self.fields['device'].queryset = Device.objects.filter(site=self.initial['site'], rack__isnull=True)
 | 
			
		||||
        else:
 | 
			
		||||
            self.fields['device'].choices = []
 | 
			
		||||
 | 
			
		||||
        # Initialize port choices if device is set
 | 
			
		||||
        if self.initial.get('device'):
 | 
			
		||||
            self.fields['port'].queryset = ConsolePort.objects.filter(device=self.initial['device'])
 | 
			
		||||
        else:
 | 
			
		||||
            self.fields['port'].choices = []
 | 
			
		||||
 | 
			
		||||
@@ -1201,28 +1202,27 @@ class PowerPortConnectionForm(BootstrapMixin, forms.ModelForm):
 | 
			
		||||
        if not self.instance.pk:
 | 
			
		||||
            raise RuntimeError("PowerPortConnectionForm must be initialized with an existing PowerPort instance.")
 | 
			
		||||
 | 
			
		||||
        self.initial['site'] = self.instance.device.site
 | 
			
		||||
        self.fields['rack'].queryset = Rack.objects.filter(site=self.instance.device.site)
 | 
			
		||||
        self.fields['power_outlet'].required = True
 | 
			
		||||
        self.fields['connection_status'].choices = CONNECTION_STATUS_CHOICES
 | 
			
		||||
 | 
			
		||||
        # Initialize PDU choices
 | 
			
		||||
        if self.is_bound and self.data.get('rack'):
 | 
			
		||||
            self.fields['pdu'].queryset = Device.objects.filter(rack=self.data['rack'],
 | 
			
		||||
                                                                device_type__is_pdu=True)
 | 
			
		||||
        elif self.initial.get('rack', None):
 | 
			
		||||
            self.fields['pdu'].queryset = Device.objects.filter(rack=self.initial['rack'],
 | 
			
		||||
                                                                device_type__is_pdu=True)
 | 
			
		||||
        # Initialize rack choices if site is set
 | 
			
		||||
        if self.initial.get('site'):
 | 
			
		||||
            self.fields['rack'].queryset = Rack.objects.filter(site=self.initial['site'])
 | 
			
		||||
        else:
 | 
			
		||||
            self.fields['pdu'].queryset = Device.objects.filter(site=self.instance.device.site,
 | 
			
		||||
                                                                rack__isnull=True,
 | 
			
		||||
                                                                device_type__is_pdu=True)
 | 
			
		||||
            self.fields['rack'].choices = []
 | 
			
		||||
 | 
			
		||||
        # Initialize power outlet choices
 | 
			
		||||
        if self.is_bound:
 | 
			
		||||
            self.fields['power_outlet'].queryset = PowerOutlet.objects.filter(device__pk=self.data['pdu'])
 | 
			
		||||
        elif self.initial.get('pdu', None):
 | 
			
		||||
            self.fields['power_outlet'].queryset = PowerOutlet.objects.filter(device__pk=self.initial['pdu'])
 | 
			
		||||
        # Initialize pdu choices if rack or site is set
 | 
			
		||||
        if self.initial.get('rack'):
 | 
			
		||||
            self.fields['pdu'].queryset = Device.objects.filter(
 | 
			
		||||
                rack=self.initial['rack'], device_type__is_pdu=True
 | 
			
		||||
            )
 | 
			
		||||
        elif self.initial.get('site'):
 | 
			
		||||
            self.fields['pdu'].queryset = Device.objects.filter(
 | 
			
		||||
                site=self.initial['site'], rack__isnull=True, device_type__is_pdu=True
 | 
			
		||||
            )
 | 
			
		||||
        else:
 | 
			
		||||
            self.fields['pdu'].choices = []
 | 
			
		||||
 | 
			
		||||
        # Initialize power outlet choices if pdu is set
 | 
			
		||||
        if self.initial.get('pdu'):
 | 
			
		||||
            self.fields['power_outlet'].queryset = PowerOutlet.objects.filter(device=self.initial['pdu'])
 | 
			
		||||
        else:
 | 
			
		||||
            self.fields['power_outlet'].choices = []
 | 
			
		||||
 | 
			
		||||
@@ -1300,27 +1300,27 @@ class PowerOutletConnectionForm(BootstrapMixin, forms.Form):
 | 
			
		||||
            'connection_status': 'Status',
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
    def __init__(self, poweroutlet, *args, **kwargs):
 | 
			
		||||
    def __init__(self, *args, **kwargs):
 | 
			
		||||
 | 
			
		||||
        super(PowerOutletConnectionForm, self).__init__(*args, **kwargs)
 | 
			
		||||
 | 
			
		||||
        self.initial['site'] = poweroutlet.device.site
 | 
			
		||||
        self.fields['rack'].queryset = Rack.objects.filter(site=poweroutlet.device.site)
 | 
			
		||||
 | 
			
		||||
        # Initialize device choices
 | 
			
		||||
        if self.is_bound and self.data.get('rack'):
 | 
			
		||||
            self.fields['device'].queryset = Device.objects.filter(rack=self.data['rack'])
 | 
			
		||||
        elif self.initial.get('rack', None):
 | 
			
		||||
            self.fields['device'].queryset = Device.objects.filter(rack=self.initial['rack'])
 | 
			
		||||
        # Initialize rack choices if site is set
 | 
			
		||||
        if self.initial.get('site'):
 | 
			
		||||
            self.fields['rack'].queryset = Rack.objects.filter(site=self.initial['site'])
 | 
			
		||||
        else:
 | 
			
		||||
            self.fields['device'].queryset = Device.objects.filter(site=poweroutlet.device.site,
 | 
			
		||||
                                                                   rack__isnull=True)
 | 
			
		||||
            self.fields['rack'].choices = []
 | 
			
		||||
 | 
			
		||||
        # Initialize port choices
 | 
			
		||||
        if self.is_bound:
 | 
			
		||||
            self.fields['port'].queryset = PowerPort.objects.filter(device__pk=self.data['device'])
 | 
			
		||||
        elif self.initial.get('device', None):
 | 
			
		||||
            self.fields['port'].queryset = PowerPort.objects.filter(device_pk=self.initial['device'])
 | 
			
		||||
        # Initialize device choices if rack or site is set
 | 
			
		||||
        if self.initial.get('rack'):
 | 
			
		||||
            self.fields['device'].queryset = Device.objects.filter(rack=self.initial['rack'])
 | 
			
		||||
        elif self.initial.get('site'):
 | 
			
		||||
            self.fields['device'].queryset = Device.objects.filter(site=self.initial['site'], rack__isnull=True)
 | 
			
		||||
        else:
 | 
			
		||||
            self.fields['device'].choices = []
 | 
			
		||||
 | 
			
		||||
        # Initialize port choices if device is set
 | 
			
		||||
        if self.initial.get('device'):
 | 
			
		||||
            self.fields['port'].queryset = PowerPort.objects.filter(device=self.initial['device'])
 | 
			
		||||
        else:
 | 
			
		||||
            self.fields['port'].choices = []
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -844,7 +844,9 @@ def consoleport_connect(request, pk):
 | 
			
		||||
 | 
			
		||||
    else:
 | 
			
		||||
        form = forms.ConsolePortConnectionForm(instance=consoleport, initial={
 | 
			
		||||
            'rack': consoleport.device.rack,
 | 
			
		||||
            'site': request.GET.get('site', consoleport.device.site),
 | 
			
		||||
            'rack': request.GET.get('rack', None),
 | 
			
		||||
            'console_server': request.GET.get('console_server', None),
 | 
			
		||||
            'connection_status': CONNECTION_STATUS_CONNECTED,
 | 
			
		||||
        })
 | 
			
		||||
 | 
			
		||||
@@ -927,7 +929,7 @@ def consoleserverport_connect(request, pk):
 | 
			
		||||
    consoleserverport = get_object_or_404(ConsoleServerPort, pk=pk)
 | 
			
		||||
 | 
			
		||||
    if request.method == 'POST':
 | 
			
		||||
        form = forms.ConsoleServerPortConnectionForm(consoleserverport, request.POST)
 | 
			
		||||
        form = forms.ConsoleServerPortConnectionForm(request.POST)
 | 
			
		||||
        if form.is_valid():
 | 
			
		||||
            consoleport = form.cleaned_data['port']
 | 
			
		||||
            consoleport.cs_port = consoleserverport
 | 
			
		||||
@@ -942,7 +944,12 @@ def consoleserverport_connect(request, pk):
 | 
			
		||||
            return redirect('dcim:device', pk=consoleserverport.device.pk)
 | 
			
		||||
 | 
			
		||||
    else:
 | 
			
		||||
        form = forms.ConsoleServerPortConnectionForm(consoleserverport, initial={'rack': consoleserverport.device.rack})
 | 
			
		||||
        form = forms.ConsoleServerPortConnectionForm(initial={
 | 
			
		||||
            'site': request.GET.get('site', consoleserverport.device.site),
 | 
			
		||||
            'rack': request.GET.get('rack', None),
 | 
			
		||||
            'device': request.GET.get('device', None),
 | 
			
		||||
            'connection_status': CONNECTION_STATUS_CONNECTED,
 | 
			
		||||
        })
 | 
			
		||||
 | 
			
		||||
    return render(request, 'dcim/consoleserverport_connect.html', {
 | 
			
		||||
        'consoleserverport': consoleserverport,
 | 
			
		||||
@@ -1030,7 +1037,9 @@ def powerport_connect(request, pk):
 | 
			
		||||
 | 
			
		||||
    else:
 | 
			
		||||
        form = forms.PowerPortConnectionForm(instance=powerport, initial={
 | 
			
		||||
            'rack': powerport.device.rack,
 | 
			
		||||
            'site': request.GET.get('site', powerport.device.site),
 | 
			
		||||
            'rack': request.GET.get('rack', None),
 | 
			
		||||
            'pdu': request.GET.get('pdu', None),
 | 
			
		||||
            'connection_status': CONNECTION_STATUS_CONNECTED,
 | 
			
		||||
        })
 | 
			
		||||
 | 
			
		||||
@@ -1113,7 +1122,7 @@ def poweroutlet_connect(request, pk):
 | 
			
		||||
    poweroutlet = get_object_or_404(PowerOutlet, pk=pk)
 | 
			
		||||
 | 
			
		||||
    if request.method == 'POST':
 | 
			
		||||
        form = forms.PowerOutletConnectionForm(poweroutlet, request.POST)
 | 
			
		||||
        form = forms.PowerOutletConnectionForm(request.POST)
 | 
			
		||||
        if form.is_valid():
 | 
			
		||||
            powerport = form.cleaned_data['port']
 | 
			
		||||
            powerport.power_outlet = poweroutlet
 | 
			
		||||
@@ -1128,7 +1137,12 @@ def poweroutlet_connect(request, pk):
 | 
			
		||||
            return redirect('dcim:device', pk=poweroutlet.device.pk)
 | 
			
		||||
 | 
			
		||||
    else:
 | 
			
		||||
        form = forms.PowerOutletConnectionForm(poweroutlet, initial={'rack': poweroutlet.device.rack})
 | 
			
		||||
        form = forms.PowerOutletConnectionForm(initial={
 | 
			
		||||
            'site': request.GET.get('site', poweroutlet.device.site),
 | 
			
		||||
            'rack': request.GET.get('rack', None),
 | 
			
		||||
            'device': request.GET.get('device', None),
 | 
			
		||||
            'connection_status': CONNECTION_STATUS_CONNECTED,
 | 
			
		||||
        })
 | 
			
		||||
 | 
			
		||||
    return render(request, 'dcim/poweroutlet_connect.html', {
 | 
			
		||||
        'poweroutlet': poweroutlet,
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user