diff --git a/netbox/dcim/forms.py b/netbox/dcim/forms.py index 8967936ad..80326b137 100644 --- a/netbox/dcim/forms.py +++ b/netbox/dcim/forms.py @@ -1713,7 +1713,7 @@ class IPAddressForm(BootstrapMixin, CustomFieldForm): self.fields['interface'].required = True # If this device has only one interface, select it by default. - if len(interfaces) == 1: + if 'interface' not in self.initial and len(interfaces) == 1: self.fields['interface'].initial = interfaces[0] # If this device does not have any IP addresses assigned, default to setting the first IP as its primary. diff --git a/netbox/dcim/views.py b/netbox/dcim/views.py index 8962d0219..edaa56d22 100644 --- a/netbox/dcim/views.py +++ b/netbox/dcim/views.py @@ -13,7 +13,7 @@ from django.shortcuts import get_object_or_404, redirect, render from django.utils.http import urlencode from django.views.generic import View -from ipam.models import Prefix, IPAddress, Service, VLAN +from ipam.models import Prefix, Service, VLAN from circuits.models import Circuit from extras.models import Graph, TopologyMap, GRAPH_TYPE_INTERFACE, GRAPH_TYPE_SITE from utilities.forms import ConfirmationForm @@ -700,19 +700,15 @@ def device(request, pk): interfaces = Interface.objects.order_naturally(device.device_type.interface_ordering)\ .filter(device=device, mgmt_only=False)\ .select_related('connected_as_a__interface_b__device', 'connected_as_b__interface_a__device', - 'circuit_termination__circuit') + 'circuit_termination__circuit').prefetch_related('ip_addresses') mgmt_interfaces = Interface.objects.order_naturally(device.device_type.interface_ordering)\ .filter(device=device, mgmt_only=True)\ .select_related('connected_as_a__interface_b__device', 'connected_as_b__interface_a__device', - 'circuit_termination__circuit') + 'circuit_termination__circuit').prefetch_related('ip_addresses') device_bays = natsorted( DeviceBay.objects.filter(device=device).select_related('installed_device__device_type__manufacturer'), key=attrgetter('name') ) - - # Gather relevant device objects - ip_addresses = IPAddress.objects.filter(interface__device=device).select_related('interface', 'vrf')\ - .order_by('address') services = Service.objects.filter(device=device) secrets = device.secrets.all() @@ -743,7 +739,6 @@ def device(request, pk): 'interfaces': interfaces, 'mgmt_interfaces': mgmt_interfaces, 'device_bays': device_bays, - 'ip_addresses': ip_addresses, 'services': services, 'secrets': secrets, 'related_devices': related_devices, @@ -1599,7 +1594,7 @@ def ipaddress_assign(request, pk): return redirect('dcim:device', pk=device.pk) else: - form = forms.IPAddressForm(device) + form = forms.IPAddressForm(device, initial=request.GET) return render(request, 'dcim/ipaddress_assign.html', { 'device': device, diff --git a/netbox/project-static/css/base.css b/netbox/project-static/css/base.css index 11ea04b72..0b740159a 100644 --- a/netbox/project-static/css/base.css +++ b/netbox/project-static/css/base.css @@ -313,6 +313,16 @@ li.occupied + li.available { border-top: 1px solid #474747; } +/* Devices */ +table.component-list tr.ipaddress td { + background-color: #eeffff; + padding-bottom: 4px; + padding-top: 4px; +} +table.component-list tr.ipaddress:hover td { + background-color: #e6f7f7; +} + /* Misc */ .banner-bottom { margin-bottom: 50px; diff --git a/netbox/templates/dcim/device.html b/netbox/templates/dcim/device.html index d38f60cb3..2aa1666c8 100644 --- a/netbox/templates/dcim/device.html +++ b/netbox/templates/dcim/device.html @@ -194,35 +194,6 @@ {% endif %} {% endif %} -
@@ -16,9 +16,6 @@
{{ iface.member_interfaces.all|join:", "|default:"No members" }} {% endif %} |
- - {{ iface.mac_address|default:'' }} - | {% if iface.is_lag %}LAG interface | {% elif iface.is_virtual %} @@ -53,7 +50,7 @@ Not connected {% endif %} -+ | {% if show_graphs %} {% if iface.circuit_termination or iface.connection %} {% endif %} {% endif %} + {% if perms.ipam.add_ipaddress %} + + + + {% endif %} {% if perms.dcim.change_interface %} {% if not iface.is_virtual %} {% if iface.connection %} @@ -73,19 +75,19 @@ {% endif %} - - + + {% elif iface.circuit_termination and perms.circuits.change_circuittermination %} - + {% else %} - + {% endif %} {% endif %} @@ -106,3 +108,41 @@ {% endif %} | ||
+ {% endif %} + | + {{ ip }} + {% if ip.description %} + + {% endif %} + {% if device.primary_ip4 == ip or device.primary_ip6 == ip %} + Primary + {% endif %} + | ++ {% if ip.vrf %} + {{ ip.vrf }} + {% else %} + Global + {% endif %} + | ++ {{ ip.get_status_display }} + | ++ {% if perms.ipam.edit_ipaddress %} + + + + {% endif %} + {% if perms.ipam.delete_ipaddress %} + + + + {% endif %} + | +||
- {{ ip }} - | -- {{ ip.vrf|default:"Global" }} - | -{{ ip.interface }} | -- {% if device.primary_ip4 == ip or device.primary_ip6 == ip %} - Primary - {% endif %} - | -- {% if perms.ipam.delete_ipaddress %} - - - - {% endif %} - | -