diff --git a/netbox/dcim/views.py b/netbox/dcim/views.py index 8962d0219..cd1e0cd75 100644 --- a/netbox/dcim/views.py +++ b/netbox/dcim/views.py @@ -1599,7 +1599,9 @@ def ipaddress_assign(request, pk): return redirect('dcim:device', pk=device.pk) else: - form = forms.IPAddressForm(device) + form = forms.IPAddressForm(device, initial={ + 'interface': request.GET.get('interface', None) + }) return render(request, 'dcim/ipaddress_assign.html', { 'device': device, diff --git a/netbox/ipam/forms.py b/netbox/ipam/forms.py index ec324a8b0..d31c1aa41 100644 --- a/netbox/ipam/forms.py +++ b/netbox/ipam/forms.py @@ -308,6 +308,8 @@ class PrefixFilterForm(BootstrapMixin, CustomFieldFilterForm): # class IPAddressForm(BootstrapMixin, CustomFieldForm): + interface = forms.ModelChoiceField(queryset=Interface.objects.all(), label='Interface', + widget=APISelect(api_url='/api/dcim/devices/{{device}}/interfaces/')) nat_site = forms.ModelChoiceField(queryset=Site.objects.all(), required=False, label='Site', widget=forms.Select(attrs={'filter-for': 'nat_device'})) nat_device = forms.ModelChoiceField(queryset=Device.objects.all(), required=False, label='Device', @@ -317,10 +319,11 @@ class IPAddressForm(BootstrapMixin, CustomFieldForm): livesearch = forms.CharField(required=False, label='IP Address', widget=Livesearch( query_key='q', query_url='ipam-api:ipaddress_list', field_to_update='nat_inside', obj_label='address') ) + return_url = forms.CharField(required=False, widget=forms.HiddenInput()) class Meta: model = IPAddress - fields = ['address', 'vrf', 'tenant', 'status', 'nat_inside', 'description'] + fields = ['address', 'vrf', 'tenant', 'status', 'interface', 'nat_inside', 'description'] widgets = { 'nat_inside': APISelect(api_url='/api/ipam/ip-addresses/?device_id={{nat_device}}', display_field='address') } @@ -330,6 +333,12 @@ class IPAddressForm(BootstrapMixin, CustomFieldForm): self.fields['vrf'].empty_label = 'Global' + interfaces = Interface.objects.filter(device=self.instance.device) + + self.fields['interface'].choices = [ + (iface.id, {'label': iface.name, 'disabled': ''}) for iface in interfaces + ] + if self.instance.nat_inside: nat_inside = self.instance.nat_inside diff --git a/netbox/ipam/views.py b/netbox/ipam/views.py index 864909878..b2574a0b9 100644 --- a/netbox/ipam/views.py +++ b/netbox/ipam/views.py @@ -645,7 +645,7 @@ class IPAddressEditView(PermissionRequiredMixin, ObjectEditView): permission_required = 'ipam.change_ipaddress' model = IPAddress form_class = forms.IPAddressForm - fields_initial = ['address', 'vrf'] + fields_initial = ['address', 'vrf', 'return_url'] template_name = 'ipam/ipaddress_edit.html' default_return_url = 'ipam:ipaddress_list' diff --git a/netbox/templates/dcim/inc/interface.html b/netbox/templates/dcim/inc/interface.html index a74fee5ac..fd912ba73 100644 --- a/netbox/templates/dcim/inc/interface.html +++ b/netbox/templates/dcim/inc/interface.html @@ -61,6 +61,11 @@ {% endif %} {% endif %} + {% if perms.ipam.add_ipaddress %} + + + + {% endif %} {% if perms.dcim.change_interface %} {% if not iface.is_virtual %} {% if iface.connection %} @@ -74,7 +79,7 @@ {% endif %} - + {% elif iface.circuit_termination and perms.circuits.change_circuittermination %} @@ -85,7 +90,7 @@ {% else %} - + {% endif %} {% endif %} @@ -106,3 +111,19 @@ {% endif %} +{% if ip_addresses %} + {% for ip in ip_addresses %} + {% if ip.interface_id == iface.id %} + + + {{ ip }} + {{ ip.vrf|default:"Global" }} + {% if device.primary_ip4 == ip or device.primary_ip6 == ip %} + Primary + {% endif %} + + {{ ip.description }} + + {% endif %} + {% endfor %} +{% endif %} diff --git a/netbox/templates/dcim/inc/ipaddress.html b/netbox/templates/dcim/inc/ipaddress.html index 72920986e..9a91434c6 100644 --- a/netbox/templates/dcim/inc/ipaddress.html +++ b/netbox/templates/dcim/inc/ipaddress.html @@ -12,6 +12,11 @@ {% endif %} + {% if perms.ipam.change_ipaddress %} + + + + {% endif %} {% if perms.ipam.delete_ipaddress %} diff --git a/netbox/templates/ipam/ipaddress_edit.html b/netbox/templates/ipam/ipaddress_edit.html index 7226a75fc..c53b93b5e 100644 --- a/netbox/templates/ipam/ipaddress_edit.html +++ b/netbox/templates/ipam/ipaddress_edit.html @@ -9,6 +9,9 @@ {% endblock %} {% block form %} + {% for field in form.hidden_fields %} + {{ field }} + {% endfor %} IP Address @@ -33,18 +36,9 @@ - - Interface - - - {% if obj.interface %} - {{ obj.interface }} - {% else %} - None - {% endif %} - - - + {% if obj.interface %} + {% render_field form.interface %} + {% endif %} {% endif %} {% render_field form.description %} diff --git a/netbox/utilities/views.py b/netbox/utilities/views.py index 6f0895734..4edf87ce8 100644 --- a/netbox/utilities/views.py +++ b/netbox/utilities/views.py @@ -207,7 +207,12 @@ class ObjectEditView(View): if '_addanother' in request.POST: return redirect(request.path) - return redirect(self.get_return_url(obj)) + + return_url = form.cleaned_data['return_url'] + if return_url and is_safe_url(url=return_url, host=request.get_host()): + return redirect(return_url) + else: + return redirect(self.get_return_url(obj)) return render(request, self.template_name, { 'obj': obj,
- {% if obj.interface %} - {{ obj.interface }} - {% else %} - None - {% endif %} -