mirror of
https://github.com/netbox-community/netbox.git
synced 2025-07-23 17:08:41 -06:00
#49: Allow selection of devices at other sites when connecting an interface
This commit is contained in:
parent
a0eff04185
commit
bd40f72ad5
@ -1045,8 +1045,11 @@ class InterfaceBulkEditForm(BootstrapMixin, BulkEditForm):
|
|||||||
|
|
||||||
class InterfaceConnectionForm(forms.ModelForm, BootstrapMixin):
|
class InterfaceConnectionForm(forms.ModelForm, BootstrapMixin):
|
||||||
interface_a = forms.ChoiceField(choices=[], widget=SelectWithDisabled, label='Interface')
|
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,
|
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,
|
device_b = forms.ModelChoiceField(queryset=Device.objects.all(), label='Device', required=False,
|
||||||
widget=APISelect(api_url='/api/dcim/devices/?rack_id={{rack_b}}',
|
widget=APISelect(api_url='/api/dcim/devices/?rack_id={{rack_b}}',
|
||||||
display_field='display_name',
|
display_field='display_name',
|
||||||
@ -1060,14 +1063,12 @@ class InterfaceConnectionForm(forms.ModelForm, BootstrapMixin):
|
|||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
model = InterfaceConnection
|
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):
|
def __init__(self, device_a, *args, **kwargs):
|
||||||
|
|
||||||
super(InterfaceConnectionForm, self).__init__(*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
|
# Initialize interface A choices
|
||||||
device_a_interfaces = Interface.objects.filter(device=device_a).exclude(form_factor=IFACE_FF_VIRTUAL) \
|
device_a_interfaces = Interface.objects.filter(device=device_a).exclude(form_factor=IFACE_FF_VIRTUAL) \
|
||||||
.select_related('circuit', 'connected_as_a', 'connected_as_b')
|
.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
|
(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
|
# Initialize device_b choices if rack_b is set
|
||||||
if self.is_bound and self.data.get('rack_b'):
|
if self.is_bound and self.data.get('rack_b'):
|
||||||
self.fields['device_b'].queryset = Device.objects.filter(rack__pk=self.data['rack_b'])
|
self.fields['device_b'].queryset = Device.objects.filter(rack__pk=self.data['rack_b'])
|
||||||
|
@ -1467,9 +1467,11 @@ def interfaceconnection_add(request, pk):
|
|||||||
|
|
||||||
else:
|
else:
|
||||||
form = forms.InterfaceConnectionForm(device, initial={
|
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),
|
'rack_b': request.GET.get('rack_b', None),
|
||||||
'device_b': request.GET.get('device_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', {
|
return render(request, 'dcim/interfaceconnection_edit.html', {
|
||||||
|
@ -61,7 +61,7 @@
|
|||||||
<i class="glyphicon glyphicon-remove" aria-hidden="true"></i>
|
<i class="glyphicon glyphicon-remove" aria-hidden="true"></i>
|
||||||
</a>
|
</a>
|
||||||
{% else %}
|
{% 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>
|
<i class="glyphicon glyphicon-plus" aria-hidden="true"></i>
|
||||||
</a>
|
</a>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
@ -27,6 +27,12 @@
|
|||||||
<strong>A Side</strong>
|
<strong>A Side</strong>
|
||||||
</div>
|
</div>
|
||||||
<div class="panel-body">
|
<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">
|
<div class="form-group">
|
||||||
<label class="col-md-3 control-label required">Rack</label>
|
<label class="col-md-3 control-label required">Rack</label>
|
||||||
<div class="col-md-9">
|
<div class="col-md-9">
|
||||||
@ -61,6 +67,7 @@
|
|||||||
{% render_field form.livesearch %}
|
{% render_field form.livesearch %}
|
||||||
</div>
|
</div>
|
||||||
<div class="tab-pane" id="select">
|
<div class="tab-pane" id="select">
|
||||||
|
{% render_field form.site_b %}
|
||||||
{% render_field form.rack_b %}
|
{% render_field form.rack_b %}
|
||||||
{% render_field form.device_b %}
|
{% render_field form.device_b %}
|
||||||
</div>
|
</div>
|
||||||
@ -77,8 +84,8 @@
|
|||||||
</div>
|
</div>
|
||||||
<div class="text-center">
|
<div class="text-center">
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<button type="submit" name="_create" class="btn btn-primary">Create</button>
|
<button type="submit" name="_create" class="btn btn-primary">Connect</button>
|
||||||
<button type="submit" name="_addanother" class="btn btn-primary">Create and Connect Another</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>
|
<a href="{{ cancel_url }}" class="btn btn-default">Cancel</a>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
Loading…
Reference in New Issue
Block a user