Browse Source

#49: Allow selection of devices at other sites when connecting an interface

Jeremy Stretch 8 years ago
parent
commit
bd40f72ad5

+ 13 - 4
netbox/dcim/forms.py

@@ -1045,8 +1045,11 @@ class InterfaceBulkEditForm(BootstrapMixin, BulkEditForm):
 
 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 @@ class InterfaceConnectionForm(forms.ModelForm, BootstrapMixin):
             (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'])

+ 3 - 1
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', {

+ 1 - 1
netbox/templates/dcim/inc/_interface.html

@@ -61,7 +61,7 @@
                         <i class="glyphicon glyphicon-remove" aria-hidden="true"></i>
                     </a>
                 {% else %}
-                    <a href="{% url 'dcim:interfaceconnection_add' pk=device.pk %}?interface={{ iface.pk }}" class="btn btn-success btn-xs" title="Connect">
+                    <a href="{% url 'dcim:interfaceconnection_add' pk=device.pk %}?interface_a={{ iface.pk }}" class="btn btn-success btn-xs" title="Connect">
                         <i class="glyphicon glyphicon-plus" aria-hidden="true"></i>
                     </a>
                 {% endif %}

+ 9 - 2
netbox/templates/dcim/interfaceconnection_edit.html

@@ -28,6 +28,12 @@
             </div>
             <div class="panel-body">
                 <div class="form-group">
+                    <label class="col-md-3 control-label required">Site</label>
+                    <div class="col-md-9">
+                        <p class="form-control-static">{{ device.rack.site }}</p>
+                    </div>
+                </div>
+                <div class="form-group">
                     <label class="col-md-3 control-label required">Rack</label>
                     <div class="col-md-9">
                         <p class="form-control-static">{{ device.rack }}</p>
@@ -61,6 +67,7 @@
                         {% render_field form.livesearch %}
                     </div>
                     <div class="tab-pane" id="select">
+                        {% render_field form.site_b %}
                         {% render_field form.rack_b %}
                         {% render_field form.device_b %}
                     </div>
@@ -77,8 +84,8 @@
 </div>
 <div class="text-center">
     <div class="form-group">
-        <button type="submit" name="_create" class="btn btn-primary">Create</button>
-        <button type="submit" name="_addanother" class="btn btn-primary">Create and Connect Another</button>
+        <button type="submit" name="_create" class="btn btn-primary">Connect</button>
+        <button type="submit" name="_addanother" class="btn btn-primary">Connect and Add Another</button>
         <a href="{{ cancel_url }}" class="btn btn-default">Cancel</a>
     </div>
 </div>