From fb379b63ec19345b1707ebd0f5638afe5c08f50c Mon Sep 17 00:00:00 2001 From: jeremystretch Date: Mon, 21 Jun 2021 08:38:46 -0400 Subject: [PATCH 1/6] Fixes #6626: Fix site field on VM search form; add site group --- docs/release-notes/version-2.11.md | 8 ++++++++ netbox/virtualization/forms.py | 14 ++++++++++---- 2 files changed, 18 insertions(+), 4 deletions(-) diff --git a/docs/release-notes/version-2.11.md b/docs/release-notes/version-2.11.md index aabc726f0..963c64b91 100644 --- a/docs/release-notes/version-2.11.md +++ b/docs/release-notes/version-2.11.md @@ -1,5 +1,13 @@ # NetBox v2.11 +## v2.11.8 (FUTURE) + +### Bug Fixes + +* [#6626](https://github.com/netbox-community/netbox/issues/6626) - Fix site field on VM search form; add site group + +--- + ## v2.11.7 (2021-06-16) ### Enhancements diff --git a/netbox/virtualization/forms.py b/netbox/virtualization/forms.py index 84a7728c2..f6bbd5b0d 100644 --- a/netbox/virtualization/forms.py +++ b/netbox/virtualization/forms.py @@ -527,8 +527,8 @@ class VirtualMachineBulkEditForm(BootstrapMixin, AddRemoveTagsForm, CustomFieldB class VirtualMachineFilterForm(BootstrapMixin, TenancyFilterForm, CustomFieldFilterForm): model = VirtualMachine field_order = [ - 'q', 'cluster_group_id', 'cluster_type_id', 'cluster_id', 'status', 'role_id', 'region_id', 'site_id', - 'tenant_group_id', 'tenant_id', 'platform_id', 'mac_address', + 'q', 'cluster_group_id', 'cluster_type_id', 'cluster_id', 'status', 'role_id', 'region_id', 'site_group_id', + 'site_id', 'tenant_group_id', 'tenant_id', 'platform_id', 'mac_address', ] q = forms.CharField( required=False, @@ -556,14 +556,20 @@ class VirtualMachineFilterForm(BootstrapMixin, TenancyFilterForm, CustomFieldFil required=False, label=_('Region') ) + site_group_id = DynamicModelMultipleChoiceField( + queryset=SiteGroup.objects.all(), + required=False, + label=_('Site group') + ) site_id = DynamicModelMultipleChoiceField( queryset=Site.objects.all(), required=False, null_option='None', query_params={ - 'region_id': '$region_id' + 'region_id': '$region_id', + 'group_id': '$site_group_id', }, - label=_('Cluster') + label=_('Site') ) role_id = DynamicModelMultipleChoiceField( queryset=DeviceRole.objects.all(), From 607039f043f0a43437db05aae18bae6f1ef49f85 Mon Sep 17 00:00:00 2001 From: jeremystretch Date: Mon, 21 Jun 2021 08:46:20 -0400 Subject: [PATCH 2/6] Cleanup for #5139 --- netbox/ipam/views.py | 1 - netbox/templates/ipam/rir_list.html | 23 ----------------------- 2 files changed, 24 deletions(-) delete mode 100644 netbox/templates/ipam/rir_list.html diff --git a/netbox/ipam/views.py b/netbox/ipam/views.py index 919b09b79..596810b0f 100644 --- a/netbox/ipam/views.py +++ b/netbox/ipam/views.py @@ -145,7 +145,6 @@ class RIRListView(generic.ObjectListView): filterset = filtersets.RIRFilterSet filterset_form = forms.RIRFilterForm table = tables.RIRTable - template_name = 'ipam/rir_list.html' class RIRView(generic.ObjectView): diff --git a/netbox/templates/ipam/rir_list.html b/netbox/templates/ipam/rir_list.html deleted file mode 100644 index 89d31ae7d..000000000 --- a/netbox/templates/ipam/rir_list.html +++ /dev/null @@ -1,23 +0,0 @@ -{% extends 'generic/object_list.html' %} - -{% block buttons %} - {% if request.GET.family == '6' %} - - - IPv4 Stats - - {% else %} - - - IPv6 Stats - - {% endif %} -{% endblock %} - -{% block sidebar %} - {% if request.GET.family == '6' %} -
- Numbers shown indicate /64 prefixes. -
- {% endif %} -{% endblock %} From ebb2918a88894695cf113d2ce45163a7102d15c6 Mon Sep 17 00:00:00 2001 From: jeremystretch Date: Tue, 22 Jun 2021 13:54:03 -0400 Subject: [PATCH 3/6] Fixes #6652: Fix exception when adding components in bulk to multiple devices --- docs/release-notes/version-2.11.md | 1 + netbox/netbox/views/generic.py | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/docs/release-notes/version-2.11.md b/docs/release-notes/version-2.11.md index 963c64b91..34c848267 100644 --- a/docs/release-notes/version-2.11.md +++ b/docs/release-notes/version-2.11.md @@ -5,6 +5,7 @@ ### Bug Fixes * [#6626](https://github.com/netbox-community/netbox/issues/6626) - Fix site field on VM search form; add site group +* [#6652](https://github.com/netbox-community/netbox/issues/6652) - Fix exception when adding components in bulk to multiple devices --- diff --git a/netbox/netbox/views/generic.py b/netbox/netbox/views/generic.py index 8a2bae4fa..957979e4c 100644 --- a/netbox/netbox/views/generic.py +++ b/netbox/netbox/views/generic.py @@ -1229,7 +1229,7 @@ class BulkComponentCreateView(GetReturnURLMixin, ObjectPermissionRequiredMixin, component_form = self.model_form(component_data) if component_form.is_valid(): instance = component_form.save() - logger.debug(f"Created {instance} on {instance.parent}") + logger.debug(f"Created {instance} on {instance.parent_object}") new_components.append(instance) else: for field, errors in component_form.errors.as_data().items(): From efa0fc2b0996cea4c6b823f76aec52b9b339ef8e Mon Sep 17 00:00:00 2001 From: jeremystretch Date: Tue, 22 Jun 2021 14:00:54 -0400 Subject: [PATCH 4/6] Fixes #6640: Disallow numeric values in custom text fields --- docs/release-notes/version-2.11.md | 1 + netbox/extras/models/customfields.py | 6 ++++-- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/docs/release-notes/version-2.11.md b/docs/release-notes/version-2.11.md index 34c848267..06020a9ac 100644 --- a/docs/release-notes/version-2.11.md +++ b/docs/release-notes/version-2.11.md @@ -5,6 +5,7 @@ ### Bug Fixes * [#6626](https://github.com/netbox-community/netbox/issues/6626) - Fix site field on VM search form; add site group +* [#6640](https://github.com/netbox-community/netbox/issues/6640) - Disallow numeric values in custom text fields * [#6652](https://github.com/netbox-community/netbox/issues/6652) - Fix exception when adding components in bulk to multiple devices --- diff --git a/netbox/extras/models/customfields.py b/netbox/extras/models/customfields.py index b88c73531..60c6adce9 100644 --- a/netbox/extras/models/customfields.py +++ b/netbox/extras/models/customfields.py @@ -280,8 +280,10 @@ class CustomField(BigIDModel): if value not in [None, '']: # Validate text field - if self.type == CustomFieldTypeChoices.TYPE_TEXT and self.validation_regex: - if not re.match(self.validation_regex, value): + if self.type == CustomFieldTypeChoices.TYPE_TEXT: + if type(value) is not str: + raise ValidationError(f"Value must be a string.") + if self.validation_regex and not re.match(self.validation_regex, value): raise ValidationError(f"Value must match regex '{self.validation_regex}'") # Validate integer From a8af24d7ca5af79987a8b2fb68a7e389638e7461 Mon Sep 17 00:00:00 2001 From: jeremystretch Date: Tue, 22 Jun 2021 14:16:16 -0400 Subject: [PATCH 5/6] Fixes #6637: Fix group assignment in 'available VLANs' link under VLAN group view --- docs/release-notes/version-2.11.md | 1 + netbox/ipam/tables.py | 2 +- netbox/ipam/utils.py | 26 +++++++++++++++++++++----- netbox/ipam/views.py | 2 +- 4 files changed, 24 insertions(+), 7 deletions(-) diff --git a/docs/release-notes/version-2.11.md b/docs/release-notes/version-2.11.md index 06020a9ac..f03271c3b 100644 --- a/docs/release-notes/version-2.11.md +++ b/docs/release-notes/version-2.11.md @@ -5,6 +5,7 @@ ### Bug Fixes * [#6626](https://github.com/netbox-community/netbox/issues/6626) - Fix site field on VM search form; add site group +* [#6637](https://github.com/netbox-community/netbox/issues/6637) - Fix group assignment in "available VLANs" link under VLAN group view * [#6640](https://github.com/netbox-community/netbox/issues/6640) - Disallow numeric values in custom text fields * [#6652](https://github.com/netbox-community/netbox/issues/6652) - Fix exception when adding components in bulk to multiple devices diff --git a/netbox/ipam/tables.py b/netbox/ipam/tables.py index c564985f7..728969738 100644 --- a/netbox/ipam/tables.py +++ b/netbox/ipam/tables.py @@ -65,7 +65,7 @@ VLAN_LINK = """ {% if record.pk %} {{ record.vid }} {% elif perms.ipam.add_vlan %} - {{ record.available }} VLAN{{ record.available|pluralize }} available + {{ record.available }} VLAN{{ record.available|pluralize }} available {% else %} {{ record.available }} VLAN{{ record.available|pluralize }} available {% endif %} diff --git a/netbox/ipam/utils.py b/netbox/ipam/utils.py index 18a470253..0e79e7f78 100644 --- a/netbox/ipam/utils.py +++ b/netbox/ipam/utils.py @@ -68,24 +68,40 @@ def add_available_ipaddresses(prefix, ipaddress_list, is_pool=False): return output -def add_available_vlans(vlan_group, vlans): +def add_available_vlans(vlans, vlan_group=None): """ Create fake records for all gaps between used VLANs """ if not vlans: - return [{'vid': VLAN_VID_MIN, 'available': VLAN_VID_MAX - VLAN_VID_MIN + 1}] + return [{ + 'vid': VLAN_VID_MIN, + 'vlan_group': vlan_group, + 'available': VLAN_VID_MAX - VLAN_VID_MIN + 1 + }] prev_vid = VLAN_VID_MAX new_vlans = [] for vlan in vlans: if vlan.vid - prev_vid > 1: - new_vlans.append({'vid': prev_vid + 1, 'available': vlan.vid - prev_vid - 1}) + new_vlans.append({ + 'vid': prev_vid + 1, + 'vlan_group': vlan_group, + 'available': vlan.vid - prev_vid - 1, + }) prev_vid = vlan.vid if vlans[0].vid > VLAN_VID_MIN: - new_vlans.append({'vid': VLAN_VID_MIN, 'available': vlans[0].vid - VLAN_VID_MIN}) + new_vlans.append({ + 'vid': VLAN_VID_MIN, + 'vlan_group': vlan_group, + 'available': vlans[0].vid - VLAN_VID_MIN, + }) if prev_vid < VLAN_VID_MAX: - new_vlans.append({'vid': prev_vid + 1, 'available': VLAN_VID_MAX - prev_vid}) + new_vlans.append({ + 'vid': prev_vid + 1, + 'vlan_group': vlan_group, + 'available': VLAN_VID_MAX - prev_vid, + }) vlans = list(vlans) + new_vlans vlans.sort(key=lambda v: v.vid if type(v) == VLAN else v['vid']) diff --git a/netbox/ipam/views.py b/netbox/ipam/views.py index 596810b0f..95546fcc6 100644 --- a/netbox/ipam/views.py +++ b/netbox/ipam/views.py @@ -675,7 +675,7 @@ class VLANGroupView(generic.ObjectView): Prefetch('prefixes', queryset=Prefix.objects.restrict(request.user)) ).order_by('vid') vlans_count = vlans.count() - vlans = add_available_vlans(instance, vlans) + vlans = add_available_vlans(vlans, vlan_group=instance) vlans_table = tables.VLANDetailTable(vlans) if request.user.has_perm('ipam.change_vlan') or request.user.has_perm('ipam.delete_vlan'): From 4292d88a9230789ef0c5af627e7245d2d3dd4bda Mon Sep 17 00:00:00 2001 From: jeremystretch Date: Tue, 22 Jun 2021 14:21:41 -0400 Subject: [PATCH 6/6] Closes #6620: Show assigned VMs count under device role view --- docs/release-notes/version-2.11.md | 4 ++++ netbox/dcim/views.py | 2 ++ netbox/templates/dcim/devicerole.html | 12 +++++++++++- 3 files changed, 17 insertions(+), 1 deletion(-) diff --git a/docs/release-notes/version-2.11.md b/docs/release-notes/version-2.11.md index f03271c3b..e1840319e 100644 --- a/docs/release-notes/version-2.11.md +++ b/docs/release-notes/version-2.11.md @@ -2,6 +2,10 @@ ## v2.11.8 (FUTURE) +### Enhancements + +* [#6620](https://github.com/netbox-community/netbox/issues/6620) - Show assigned VMs count under device role view + ### Bug Fixes * [#6626](https://github.com/netbox-community/netbox/issues/6626) - Fix site field on VM search form; add site group diff --git a/netbox/dcim/views.py b/netbox/dcim/views.py index 4ed80d6c8..50b55ee3f 100644 --- a/netbox/dcim/views.py +++ b/netbox/dcim/views.py @@ -1169,6 +1169,8 @@ class DeviceRoleView(generic.ObjectView): return { 'devices_table': devices_table, + 'device_count': Device.objects.filter(device_role=instance).count(), + 'virtualmachine_count': VirtualMachine.objects.filter(role=instance).count(), } diff --git a/netbox/templates/dcim/devicerole.html b/netbox/templates/dcim/devicerole.html index c6cbf4952..664bb00c6 100644 --- a/netbox/templates/dcim/devicerole.html +++ b/netbox/templates/dcim/devicerole.html @@ -42,7 +42,17 @@ Devices - {{ devices_table.rows|length }} + {{ device_count }} + + + + Virtual Machines + + {% if object.vm_role %} + {{ virtualmachine_count }} + {% else %} + — + {% endif %}