Ability to edit IP address and Interface from within devices

This commit is contained in:
Stephen Maunder 2017-04-07 15:42:53 +01:00
parent 4932e023a0
commit 67ba5a5954
5 changed files with 29 additions and 15 deletions

View File

@ -303,6 +303,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',
@ -312,10 +314,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')
}
@ -325,6 +328,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

View File

@ -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'

View File

@ -12,6 +12,11 @@
{% endif %}
</td>
<td class="text-right">
{% if perms.ipam.change_ipaddress %}
<a href="{% url 'ipam:ipaddress_edit' pk=ip.pk %}?return_url={{ device.get_absolute_url }}" class="btn btn-info btn-xs" title="Edit interface">
<i class="glyphicon glyphicon-pencil" aria-hidden="true"></i>
</a>
{% endif %}
{% if perms.ipam.delete_ipaddress %}
<a href="{% url 'ipam:ipaddress_delete' pk=ip.pk %}?return_url={{ device.get_absolute_url }}" class="btn btn-danger btn-xs">
<i class="glyphicon glyphicon-trash" aria-hidden="true" title="Delete IP address"></i>

View File

@ -9,6 +9,9 @@
{% endblock %}
{% block form %}
{% for field in form.hidden_fields %}
{{ field }}
{% endfor %}
<div class="panel panel-default">
<div class="panel-heading"><strong>IP Address</strong></div>
<div class="panel-body">
@ -33,18 +36,9 @@
</p>
</div>
</div>
<div class="form-group">
<label class="col-md-3 control-label">Interface</label>
<div class="col-md-9">
<p class="form-control-static">
{% if obj.interface %}
{{ obj.interface }}
{% else %}
<span class="text-muted">None</span>
{% endif %}
</p>
</div>
</div>
{% if obj.interface %}
{% render_field form.interface %}
{% endif %}
{% endif %}
{% render_field form.description %}
</div>

View File

@ -205,7 +205,13 @@ 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,