From 900ba146908207dad5d1d4e765c5f2adbad244a8 Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Fri, 9 Dec 2016 11:43:50 -0500 Subject: [PATCH] #49: Allow selection of devices at other sites when connecting an interface --- netbox/dcim/forms.py | 17 +++++++++++++---- netbox/dcim/views.py | 4 +++- netbox/templates/dcim/inc/_interface.html | 2 +- .../dcim/interfaceconnection_edit.html | 11 +++++++++-- 4 files changed, 26 insertions(+), 8 deletions(-) diff --git a/netbox/dcim/forms.py b/netbox/dcim/forms.py index 961d224400c..f5cec6474ed 100644 --- a/netbox/dcim/forms.py +++ b/netbox/dcim/forms.py @@ -1045,8 +1045,11 @@ class Meta: class InterfaceConnectionForm(forms.ModelForm, BootstrapMixin): interface_a = forms.ChoiceField(choices=[], widget=SelectWithDisabled, label='Interface') + site_b = forms.ModelChoiceField(queryset=Site.objects.all(), label='Site', required=False, + widget=forms.Select(attrs={'filter-for': 'rack_b'})) rack_b = forms.ModelChoiceField(queryset=Rack.objects.all(), label='Rack', required=False, - widget=forms.Select(attrs={'filter-for': 'device_b'})) + widget=APISelect(api_url='/api/dcim/racks/?site_id={{site_b}}', + attrs={'filter-for': 'device_b'})) device_b = forms.ModelChoiceField(queryset=Device.objects.all(), label='Device', required=False, widget=APISelect(api_url='/api/dcim/devices/?rack_id={{rack_b}}', display_field='display_name', @@ -1060,14 +1063,12 @@ class InterfaceConnectionForm(forms.ModelForm, BootstrapMixin): class Meta: model = InterfaceConnection - fields = ['interface_a', 'rack_b', 'device_b', 'interface_b', 'livesearch', 'connection_status'] + fields = ['interface_a', 'site_b', 'rack_b', 'device_b', 'interface_b', 'livesearch', 'connection_status'] def __init__(self, device_a, *args, **kwargs): super(InterfaceConnectionForm, self).__init__(*args, **kwargs) - self.fields['rack_b'].queryset = Rack.objects.filter(site=device_a.rack.site) - # Initialize interface A choices device_a_interfaces = Interface.objects.filter(device=device_a).exclude(form_factor=IFACE_FF_VIRTUAL) \ .select_related('circuit', 'connected_as_a', 'connected_as_b') @@ -1075,6 +1076,14 @@ def __init__(self, device_a, *args, **kwargs): (iface.id, {'label': iface.name, 'disabled': iface.is_connected}) for iface in device_a_interfaces ] + # Initialize rack_b choices if site_b is set + if self.is_bound and self.data.get('site_b'): + self.fields['rack_b'].queryset = Rack.objects.filter(site__pk=self.data['site_b']) + elif self.initial.get('site_b'): + self.fields['rack_b'].queryset = Rack.objects.filter(site=self.initial['site_b']) + else: + self.fields['rack_b'].choices = [] + # Initialize device_b choices if rack_b is set if self.is_bound and self.data.get('rack_b'): self.fields['device_b'].queryset = Device.objects.filter(rack__pk=self.data['rack_b']) diff --git a/netbox/dcim/views.py b/netbox/dcim/views.py index d7fc2a88ba0..21a44c6b479 100644 --- a/netbox/dcim/views.py +++ b/netbox/dcim/views.py @@ -1467,9 +1467,11 @@ def interfaceconnection_add(request, pk): else: form = forms.InterfaceConnectionForm(device, initial={ - 'interface_a': request.GET.get('interface', None), + 'interface_a': request.GET.get('interface_a', None), + 'site_b': request.GET.get('site_b', device.rack.site), 'rack_b': request.GET.get('rack_b', None), 'device_b': request.GET.get('device_b', None), + 'interface_b': request.GET.get('interface_b', None), }) return render(request, 'dcim/interfaceconnection_edit.html', { diff --git a/netbox/templates/dcim/inc/_interface.html b/netbox/templates/dcim/inc/_interface.html index a48200c302c..4ecede5b03c 100644 --- a/netbox/templates/dcim/inc/_interface.html +++ b/netbox/templates/dcim/inc/_interface.html @@ -61,7 +61,7 @@ {% else %} - + {% endif %} diff --git a/netbox/templates/dcim/interfaceconnection_edit.html b/netbox/templates/dcim/interfaceconnection_edit.html index e477ba26d7e..5da19d4fa2e 100644 --- a/netbox/templates/dcim/interfaceconnection_edit.html +++ b/netbox/templates/dcim/interfaceconnection_edit.html @@ -27,6 +27,12 @@

Connect Interfaces

A Side
+
+ +
+

{{ device.rack.site }}

+
+
@@ -61,6 +67,7 @@

Connect Interfaces

{% render_field form.livesearch %}
+ {% render_field form.site_b %} {% render_field form.rack_b %} {% render_field form.device_b %}
@@ -77,8 +84,8 @@

Connect Interfaces

- - + + Cancel