Fix component bulk edit views

This commit is contained in:
Jeremy Stretch 2020-02-05 10:26:22 -05:00
parent f8ce67c69f
commit 57a0cf0a33
4 changed files with 46 additions and 32 deletions

View File

@ -2499,6 +2499,10 @@ class PowerOutletBulkEditForm(BootstrapMixin, AddRemoveTagsForm, BulkEditForm):
queryset=PowerOutlet.objects.all(), queryset=PowerOutlet.objects.all(),
widget=forms.MultipleHiddenInput() widget=forms.MultipleHiddenInput()
) )
device = forms.ModelChoiceField(
queryset=Device.objects.all(),
widget=forms.HiddenInput()
)
type = forms.ChoiceField( type = forms.ChoiceField(
choices=PowerOutletTypeChoices, choices=PowerOutletTypeChoices,
required=False required=False
@ -2528,8 +2532,6 @@ class PowerOutletBulkEditForm(BootstrapMixin, AddRemoveTagsForm, BulkEditForm):
if 'device' in self.initial: if 'device' in self.initial:
device = Device.objects.filter(pk=self.initial['device']).first() device = Device.objects.filter(pk=self.initial['device']).first()
self.fields['power_port'].queryset = PowerPort.objects.filter(device=device) self.fields['power_port'].queryset = PowerPort.objects.filter(device=device)
else:
self.fields['power_port'].queryset = PowerPort.objects.none()
class PowerOutletBulkRenameForm(BulkRenameForm): class PowerOutletBulkRenameForm(BulkRenameForm):
@ -2773,6 +2775,10 @@ class InterfaceBulkEditForm(BootstrapMixin, AddRemoveTagsForm, BulkEditForm):
queryset=Interface.objects.all(), queryset=Interface.objects.all(),
widget=forms.MultipleHiddenInput() widget=forms.MultipleHiddenInput()
) )
device = forms.ModelChoiceField(
queryset=Device.objects.all(),
widget=forms.HiddenInput()
)
type = forms.ChoiceField( type = forms.ChoiceField(
choices=add_blank_choice(InterfaceTypeChoices), choices=add_blank_choice(InterfaceTypeChoices),
required=False, required=False,
@ -2846,8 +2852,6 @@ class InterfaceBulkEditForm(BootstrapMixin, AddRemoveTagsForm, BulkEditForm):
device__in=[device, device.get_vc_master()], device__in=[device, device.get_vc_master()],
type=InterfaceTypeChoices.TYPE_LAG type=InterfaceTypeChoices.TYPE_LAG
) )
else:
self.fields['lag'].queryset = Interface.objects.none()
def clean(self): def clean(self):

View File

@ -619,6 +619,7 @@
{% if perms.dcim.delete_consoleserverport %} {% if perms.dcim.delete_consoleserverport %}
<form method="post"> <form method="post">
{% csrf_token %} {% csrf_token %}
<input type="hidden" name="device" value="{{ device.pk }}" />
{% endif %} {% endif %}
<div class="panel panel-default"> <div class="panel panel-default">
<div class="panel-heading"> <div class="panel-heading">
@ -679,6 +680,7 @@
{% if perms.dcim.delete_poweroutlet %} {% if perms.dcim.delete_poweroutlet %}
<form method="post"> <form method="post">
{% csrf_token %} {% csrf_token %}
<input type="hidden" name="device" value="{{ device.pk }}" />
{% endif %} {% endif %}
<div class="panel panel-default"> <div class="panel panel-default">
<div class="panel-heading"> <div class="panel-heading">
@ -738,7 +740,8 @@
{% endif %} {% endif %}
{% if front_ports %} {% if front_ports %}
<form method="post"> <form method="post">
{% csrf_token %} {% csrf_token %}
<input type="hidden" name="device" value="{{ device.pk }}" />
<div class="panel panel-default"> <div class="panel panel-default">
<div class="panel-heading"> <div class="panel-heading">
<strong>Front Ports</strong> <strong>Front Ports</strong>
@ -796,7 +799,8 @@
{% endif %} {% endif %}
{% if rear_ports %} {% if rear_ports %}
<form method="post"> <form method="post">
{% csrf_token %} {% csrf_token %}
<input type="hidden" name="device" value="{{ device.pk }}" />
<div class="panel panel-default"> <div class="panel panel-default">
<div class="panel-heading"> <div class="panel-heading">
<strong>Rear Ports</strong> <strong>Rear Ports</strong>

View File

@ -288,7 +288,7 @@
<button type="submit" name="_rename" formaction="{% url 'dcim:interface_bulk_rename' %}?return_url={{ virtualmachine.get_absolute_url }}" class="btn btn-warning btn-xs"> <button type="submit" name="_rename" formaction="{% url 'dcim:interface_bulk_rename' %}?return_url={{ virtualmachine.get_absolute_url }}" class="btn btn-warning btn-xs">
<span class="glyphicon glyphicon-pencil" aria-hidden="true"></span> Rename <span class="glyphicon glyphicon-pencil" aria-hidden="true"></span> Rename
</button> </button>
<button type="submit" name="_edit" formaction="{% url 'virtualization:interface_bulk_edit' %}?virtual_machine={{ virtualmachine.pk }}&return_url={{ virtualmachine.get_absolute_url }}" class="btn btn-warning btn-xs"> <button type="submit" name="_edit" formaction="{% url 'virtualization:interface_bulk_edit' %}?return_url={{ virtualmachine.get_absolute_url }}" class="btn btn-warning btn-xs">
<span class="glyphicon glyphicon-pencil" aria-hidden="true"></span> Edit <span class="glyphicon glyphicon-pencil" aria-hidden="true"></span> Edit
</button> </button>
{% endif %} {% endif %}

View File

@ -835,6 +835,10 @@ class InterfaceBulkEditForm(BootstrapMixin, BulkEditForm):
queryset=Interface.objects.all(), queryset=Interface.objects.all(),
widget=forms.MultipleHiddenInput() widget=forms.MultipleHiddenInput()
) )
virtual_machine = forms.ModelChoiceField(
queryset=VirtualMachine.objects.all(),
widget=forms.HiddenInput()
)
enabled = forms.NullBooleanField( enabled = forms.NullBooleanField(
required=False, required=False,
widget=BulkEditNullBooleanSelect() widget=BulkEditNullBooleanSelect()
@ -881,37 +885,39 @@ class InterfaceBulkEditForm(BootstrapMixin, BulkEditForm):
def __init__(self, *args, **kwargs): def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs) super().__init__(*args, **kwargs)
parent_obj = VirtualMachine.objects.filter(pk=self.initial.get('virtual_machine')).first() # Limit available VLANs based on the parent VirtualMachine
if 'virtual_machine' in self.initial:
parent_obj = VirtualMachine.objects.filter(pk=self.initial['virtual_machine']).first()
# Limit VLan choices to those in: global vlans, global groups, the current site's group, the current site # Limit VLAN choices to global VLANs, VLANs in global groups, the current site's group, the current site
vlan_choices = [] vlan_choices = []
global_vlans = VLAN.objects.filter(site=None, group=None) global_vlans = VLAN.objects.filter(site=None, group=None)
vlan_choices.append(
('Global', [(vlan.pk, vlan) for vlan in global_vlans])
)
for group in VLANGroup.objects.filter(site=None):
global_group_vlans = VLAN.objects.filter(group=group)
vlan_choices.append( vlan_choices.append(
(group.name, [(vlan.pk, vlan) for vlan in global_group_vlans]) ('Global', [(vlan.pk, vlan) for vlan in global_vlans])
) )
if parent_obj.cluster is not None: for group in VLANGroup.objects.filter(site=None):
site = getattr(parent_obj.cluster, 'site', None) global_group_vlans = VLAN.objects.filter(group=group)
if site is not None: vlan_choices.append(
(group.name, [(vlan.pk, vlan) for vlan in global_group_vlans])
)
if parent_obj.cluster is not None:
site = getattr(parent_obj.cluster, 'site', None)
if site is not None:
# Add non-grouped site VLANs # Add non-grouped site VLANs
site_vlans = VLAN.objects.filter(site=site, group=None) site_vlans = VLAN.objects.filter(site=site, group=None)
vlan_choices.append((site.name, [(vlan.pk, vlan) for vlan in site_vlans])) vlan_choices.append((site.name, [(vlan.pk, vlan) for vlan in site_vlans]))
# Add grouped site VLANs # Add grouped site VLANs
for group in VLANGroup.objects.filter(site=site): for group in VLANGroup.objects.filter(site=site):
site_group_vlans = VLAN.objects.filter(group=group) site_group_vlans = VLAN.objects.filter(group=group)
vlan_choices.append(( vlan_choices.append((
'{} / {}'.format(group.site.name, group.name), '{} / {}'.format(group.site.name, group.name),
[(vlan.pk, vlan) for vlan in site_group_vlans] [(vlan.pk, vlan) for vlan in site_group_vlans]
)) ))
self.fields['untagged_vlan'].choices = [(None, '---------')] + vlan_choices self.fields['untagged_vlan'].choices = [(None, '---------')] + vlan_choices
self.fields['tagged_vlans'].choices = vlan_choices self.fields['tagged_vlans'].choices = vlan_choices
# #