Browse Source

Fixes #944: Correct console and power connection form behavior

Jeremy Stretch 8 years ago
parent
commit
4b753b1610
2 changed files with 88 additions and 74 deletions
  1. 68 68
      netbox/dcim/forms.py
  2. 20 6
      netbox/dcim/views.py

+ 68 - 68
netbox/dcim/forms.py

@@ -934,28 +934,29 @@ class ConsolePortConnectionForm(BootstrapMixin, forms.ModelForm):
         if not self.instance.pk:
         if not self.instance.pk:
             raise RuntimeError("ConsolePortConnectionForm must be initialized with an existing ConsolePort instance.")
             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:
         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:
         else:
             self.fields['cs_port'].choices = []
             self.fields['cs_port'].choices = []
 
 
@@ -1033,27 +1034,27 @@ class ConsoleServerPortConnectionForm(BootstrapMixin, forms.Form):
             'connection_status': 'Status',
             'connection_status': 'Status',
         }
         }
 
 
-    def __init__(self, consoleserverport, *args, **kwargs):
+    def __init__(self, *args, **kwargs):
 
 
         super(ConsoleServerPortConnectionForm, self).__init__(*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 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['rack'].choices = []
 
 
-        # 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):
+        # 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'])
             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:
         else:
-            self.fields['device'].queryset = Device.objects.filter(site=consoleserverport.device.site,
-                                                                   rack__isnull=True)
+            self.fields['device'].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 port choices if device is set
+        if self.initial.get('device'):
+            self.fields['port'].queryset = ConsolePort.objects.filter(device=self.initial['device'])
         else:
         else:
             self.fields['port'].choices = []
             self.fields['port'].choices = []
 
 
@@ -1201,28 +1202,27 @@ class PowerPortConnectionForm(BootstrapMixin, forms.ModelForm):
         if not self.instance.pk:
         if not self.instance.pk:
             raise RuntimeError("PowerPortConnectionForm must be initialized with an existing PowerPort instance.")
             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:
         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:
         else:
             self.fields['power_outlet'].choices = []
             self.fields['power_outlet'].choices = []
 
 
@@ -1300,27 +1300,27 @@ class PowerOutletConnectionForm(BootstrapMixin, forms.Form):
             'connection_status': 'Status',
             'connection_status': 'Status',
         }
         }
 
 
-    def __init__(self, poweroutlet, *args, **kwargs):
+    def __init__(self, *args, **kwargs):
 
 
         super(PowerOutletConnectionForm, self).__init__(*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 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['rack'].choices = []
 
 
-        # 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):
+        # 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'])
             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:
         else:
-            self.fields['device'].queryset = Device.objects.filter(site=poweroutlet.device.site,
-                                                                   rack__isnull=True)
+            self.fields['device'].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 port choices if device is set
+        if self.initial.get('device'):
+            self.fields['port'].queryset = PowerPort.objects.filter(device=self.initial['device'])
         else:
         else:
             self.fields['port'].choices = []
             self.fields['port'].choices = []
 
 

+ 20 - 6
netbox/dcim/views.py

@@ -844,7 +844,9 @@ def consoleport_connect(request, pk):
 
 
     else:
     else:
         form = forms.ConsolePortConnectionForm(instance=consoleport, initial={
         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,
             'connection_status': CONNECTION_STATUS_CONNECTED,
         })
         })
 
 
@@ -927,7 +929,7 @@ def consoleserverport_connect(request, pk):
     consoleserverport = get_object_or_404(ConsoleServerPort, pk=pk)
     consoleserverport = get_object_or_404(ConsoleServerPort, pk=pk)
 
 
     if request.method == 'POST':
     if request.method == 'POST':
-        form = forms.ConsoleServerPortConnectionForm(consoleserverport, request.POST)
+        form = forms.ConsoleServerPortConnectionForm(request.POST)
         if form.is_valid():
         if form.is_valid():
             consoleport = form.cleaned_data['port']
             consoleport = form.cleaned_data['port']
             consoleport.cs_port = consoleserverport
             consoleport.cs_port = consoleserverport
@@ -942,7 +944,12 @@ def consoleserverport_connect(request, pk):
             return redirect('dcim:device', pk=consoleserverport.device.pk)
             return redirect('dcim:device', pk=consoleserverport.device.pk)
 
 
     else:
     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', {
     return render(request, 'dcim/consoleserverport_connect.html', {
         'consoleserverport': consoleserverport,
         'consoleserverport': consoleserverport,
@@ -1030,7 +1037,9 @@ def powerport_connect(request, pk):
 
 
     else:
     else:
         form = forms.PowerPortConnectionForm(instance=powerport, initial={
         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,
             'connection_status': CONNECTION_STATUS_CONNECTED,
         })
         })
 
 
@@ -1113,7 +1122,7 @@ def poweroutlet_connect(request, pk):
     poweroutlet = get_object_or_404(PowerOutlet, pk=pk)
     poweroutlet = get_object_or_404(PowerOutlet, pk=pk)
 
 
     if request.method == 'POST':
     if request.method == 'POST':
-        form = forms.PowerOutletConnectionForm(poweroutlet, request.POST)
+        form = forms.PowerOutletConnectionForm(request.POST)
         if form.is_valid():
         if form.is_valid():
             powerport = form.cleaned_data['port']
             powerport = form.cleaned_data['port']
             powerport.power_outlet = poweroutlet
             powerport.power_outlet = poweroutlet
@@ -1128,7 +1137,12 @@ def poweroutlet_connect(request, pk):
             return redirect('dcim:device', pk=poweroutlet.device.pk)
             return redirect('dcim:device', pk=poweroutlet.device.pk)
 
 
     else:
     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', {
     return render(request, 'dcim/poweroutlet_connect.html', {
         'poweroutlet': poweroutlet,
         'poweroutlet': poweroutlet,