From 0ec158d2c43f16dd727e82048b50dd0b23905aad Mon Sep 17 00:00:00 2001 From: Prince Kumar Date: Mon, 16 Oct 2023 19:35:20 +0530 Subject: [PATCH 1/5] Add manufacturer for filters in the virtual machine and device #12741 --- netbox/dcim/forms/filtersets.py | 7 +++++-- netbox/dcim/forms/model_forms.py | 13 ++++++++++++- netbox/templates/dcim/device_edit.html | 1 + netbox/virtualization/forms/filtersets.py | 14 +++++++++++--- netbox/virtualization/forms/model_forms.py | 17 ++++++++++++++--- 5 files changed, 43 insertions(+), 9 deletions(-) diff --git a/netbox/dcim/forms/filtersets.py b/netbox/dcim/forms/filtersets.py index 7f99d1ca499..ce600673c9b 100644 --- a/netbox/dcim/forms/filtersets.py +++ b/netbox/dcim/forms/filtersets.py @@ -643,7 +643,7 @@ class DeviceFilterForm( (None, ('q', 'filter_id', 'tag')), (_('Location'), ('region_id', 'site_group_id', 'site_id', 'location_id', 'rack_id')), (_('Operation'), ('status', 'role_id', 'airflow', 'serial', 'asset_tag', 'mac_address')), - (_('Hardware'), ('manufacturer_id', 'device_type_id', 'platform_id')), + (_('Hardware'), ('manufacturer_id', 'platform_id', 'device_type_id')), (_('Tenant'), ('tenant_group_id', 'tenant_id')), (_('Contacts'), ('contact', 'contact_role', 'contact_group')), (_('Components'), ( @@ -713,7 +713,10 @@ class DeviceFilterForm( queryset=Platform.objects.all(), required=False, null_option='None', - label=_('Platform') + label=_('Platform'), + query_params={ + "manufacturer_id": '$manufacturer_id' + } ) status = forms.MultipleChoiceField( label=_('Status'), diff --git a/netbox/dcim/forms/model_forms.py b/netbox/dcim/forms/model_forms.py index 93e21459873..d465f214c4c 100644 --- a/netbox/dcim/forms/model_forms.py +++ b/netbox/dcim/forms/model_forms.py @@ -439,10 +439,21 @@ class DeviceForm(TenancyForm, NetBoxModelForm): label=_('Device role'), queryset=DeviceRole.objects.all() ) + manufacturer = DynamicModelChoiceField( + label=_('Manufacturer'), + queryset=Manufacturer.objects.all(), + required=False, + initial_params={ + 'platforms': '$platform' + } + ) platform = DynamicModelChoiceField( label=_('Platform'), queryset=Platform.objects.all(), - required=False + required=False, + query_params={ + "manufacturer_id": '$manufacturer' + } ) cluster = DynamicModelChoiceField( label=_('Cluster'), diff --git a/netbox/templates/dcim/device_edit.html b/netbox/templates/dcim/device_edit.html index 4dbb2f477d9..af448c2f200 100644 --- a/netbox/templates/dcim/device_edit.html +++ b/netbox/templates/dcim/device_edit.html @@ -64,6 +64,7 @@
{% trans "Location" %}
{% trans "Management" %}
{% render_field form.status %} + {% render_field form.manufacturer %} {% render_field form.platform %} {% render_field form.config_template %} {% if object.pk %} diff --git a/netbox/virtualization/forms/filtersets.py b/netbox/virtualization/forms/filtersets.py index 99ac0cb774d..91d9f037581 100644 --- a/netbox/virtualization/forms/filtersets.py +++ b/netbox/virtualization/forms/filtersets.py @@ -1,7 +1,7 @@ from django import forms from django.utils.translation import gettext_lazy as _ -from dcim.models import Device, DeviceRole, Platform, Region, Site, SiteGroup +from dcim.models import Device, DeviceRole, Manufacturer, Platform, Region, Site, SiteGroup from extras.forms import LocalConfigContextFilterForm from extras.models import ConfigTemplate from ipam.models import L2VPN, VRF @@ -94,7 +94,7 @@ class VirtualMachineFilterForm( (None, ('q', 'filter_id', 'tag')), (_('Cluster'), ('cluster_group_id', 'cluster_type_id', 'cluster_id', 'device_id')), (_('Location'), ('region_id', 'site_group_id', 'site_id')), - (_('Attributes'), ('status', 'role_id', 'platform_id', 'mac_address', 'has_primary_ip', 'config_template_id', 'local_context_data')), + (_('Attributes'), ('status', 'role_id', 'manufacturer_id', 'platform_id', 'mac_address', 'has_primary_ip', 'config_template_id', 'local_context_data')), (_('Tenant'), ('tenant_group_id', 'tenant_id')), (_('Contacts'), ('contact', 'contact_role', 'contact_group')), ) @@ -154,11 +154,19 @@ class VirtualMachineFilterForm( choices=VirtualMachineStatusChoices, required=False ) + manufacturer_id = DynamicModelMultipleChoiceField( + queryset=Manufacturer.objects.all(), + required=False, + label=_('Manufacturer'), + ) platform_id = DynamicModelMultipleChoiceField( queryset=Platform.objects.all(), required=False, null_option='None', - label=_('Platform') + label=_('Platform'), + query_params = { + "manufacturer_id": '$manufacturer_id' + } ) mac_address = forms.CharField( required=False, diff --git a/netbox/virtualization/forms/model_forms.py b/netbox/virtualization/forms/model_forms.py index 21dbc895a76..3c03bc96a94 100644 --- a/netbox/virtualization/forms/model_forms.py +++ b/netbox/virtualization/forms/model_forms.py @@ -4,7 +4,7 @@ from django.utils.translation import gettext_lazy as _ from dcim.forms.common import InterfaceCommonForm -from dcim.models import Device, DeviceRole, Platform, Rack, Region, Site, SiteGroup +from dcim.models import Device, DeviceRole, Manufacturer, Platform, Rack, Region, Site, SiteGroup from extras.models import ConfigTemplate from ipam.models import IPAddress, VLAN, VLANGroup, VRF from netbox.forms import NetBoxModelForm @@ -197,10 +197,21 @@ class VirtualMachineForm(TenancyForm, NetBoxModelForm): "vm_role": "True" } ) + manufacturer = DynamicModelChoiceField( + label=_('Manufacturer'), + queryset=Manufacturer.objects.all(), + required=False, + initial_params={ + 'platforms': '$platform' + } + ) platform = DynamicModelChoiceField( label=_('Platform'), queryset=Platform.objects.all(), - required=False + required=False, + query_params={ + "manufacturer_id": '$manufacturer' + } ) local_context_data = JSONField( required=False, @@ -217,7 +228,7 @@ class VirtualMachineForm(TenancyForm, NetBoxModelForm): (_('Virtual Machine'), ('name', 'role', 'status', 'description', 'tags')), (_('Site/Cluster'), ('site', 'cluster', 'device')), (_('Tenancy'), ('tenant_group', 'tenant')), - (_('Management'), ('platform', 'primary_ip4', 'primary_ip6', 'config_template')), + (_('Management'), ('manufacturer', 'platform', 'primary_ip4', 'primary_ip6', 'config_template')), (_('Resources'), ('vcpus', 'memory', 'disk')), (_('Config Context'), ('local_context_data',)), ) From 94b7319370fcaea6fe926878fcc8aa13979841d4 Mon Sep 17 00:00:00 2001 From: Prince Kumar Date: Wed, 18 Oct 2023 10:25:59 +0530 Subject: [PATCH 2/5] reverse the filtersets of device and vm --- netbox/dcim/forms/filtersets.py | 7 ++----- netbox/virtualization/forms/filtersets.py | 7 +------ 2 files changed, 3 insertions(+), 11 deletions(-) diff --git a/netbox/dcim/forms/filtersets.py b/netbox/dcim/forms/filtersets.py index ce600673c9b..7f99d1ca499 100644 --- a/netbox/dcim/forms/filtersets.py +++ b/netbox/dcim/forms/filtersets.py @@ -643,7 +643,7 @@ class DeviceFilterForm( (None, ('q', 'filter_id', 'tag')), (_('Location'), ('region_id', 'site_group_id', 'site_id', 'location_id', 'rack_id')), (_('Operation'), ('status', 'role_id', 'airflow', 'serial', 'asset_tag', 'mac_address')), - (_('Hardware'), ('manufacturer_id', 'platform_id', 'device_type_id')), + (_('Hardware'), ('manufacturer_id', 'device_type_id', 'platform_id')), (_('Tenant'), ('tenant_group_id', 'tenant_id')), (_('Contacts'), ('contact', 'contact_role', 'contact_group')), (_('Components'), ( @@ -713,10 +713,7 @@ class DeviceFilterForm( queryset=Platform.objects.all(), required=False, null_option='None', - label=_('Platform'), - query_params={ - "manufacturer_id": '$manufacturer_id' - } + label=_('Platform') ) status = forms.MultipleChoiceField( label=_('Status'), diff --git a/netbox/virtualization/forms/filtersets.py b/netbox/virtualization/forms/filtersets.py index 91d9f037581..009d67fadc2 100644 --- a/netbox/virtualization/forms/filtersets.py +++ b/netbox/virtualization/forms/filtersets.py @@ -94,7 +94,7 @@ class VirtualMachineFilterForm( (None, ('q', 'filter_id', 'tag')), (_('Cluster'), ('cluster_group_id', 'cluster_type_id', 'cluster_id', 'device_id')), (_('Location'), ('region_id', 'site_group_id', 'site_id')), - (_('Attributes'), ('status', 'role_id', 'manufacturer_id', 'platform_id', 'mac_address', 'has_primary_ip', 'config_template_id', 'local_context_data')), + (_('Attributes'), ('status', 'role_id', 'platform_id', 'mac_address', 'has_primary_ip', 'config_template_id', 'local_context_data')), (_('Tenant'), ('tenant_group_id', 'tenant_id')), (_('Contacts'), ('contact', 'contact_role', 'contact_group')), ) @@ -154,11 +154,6 @@ class VirtualMachineFilterForm( choices=VirtualMachineStatusChoices, required=False ) - manufacturer_id = DynamicModelMultipleChoiceField( - queryset=Manufacturer.objects.all(), - required=False, - label=_('Manufacturer'), - ) platform_id = DynamicModelMultipleChoiceField( queryset=Platform.objects.all(), required=False, From ca06c4c5bf6d31e8c96d5d42d13160d7ba556b37 Mon Sep 17 00:00:00 2001 From: Prince Kumar Date: Wed, 18 Oct 2023 10:27:45 +0530 Subject: [PATCH 3/5] revert the filtersets of vm --- netbox/virtualization/forms/filtersets.py | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/netbox/virtualization/forms/filtersets.py b/netbox/virtualization/forms/filtersets.py index 009d67fadc2..99ac0cb774d 100644 --- a/netbox/virtualization/forms/filtersets.py +++ b/netbox/virtualization/forms/filtersets.py @@ -1,7 +1,7 @@ from django import forms from django.utils.translation import gettext_lazy as _ -from dcim.models import Device, DeviceRole, Manufacturer, Platform, Region, Site, SiteGroup +from dcim.models import Device, DeviceRole, Platform, Region, Site, SiteGroup from extras.forms import LocalConfigContextFilterForm from extras.models import ConfigTemplate from ipam.models import L2VPN, VRF @@ -158,10 +158,7 @@ class VirtualMachineFilterForm( queryset=Platform.objects.all(), required=False, null_option='None', - label=_('Platform'), - query_params = { - "manufacturer_id": '$manufacturer_id' - } + label=_('Platform') ) mac_address = forms.CharField( required=False, From 85266a4db8189dc09353508a2ee2acc3490e2ebe Mon Sep 17 00:00:00 2001 From: Prince Kumar Date: Thu, 2 Nov 2023 15:12:11 +0530 Subject: [PATCH 4/5] add advance selector in platform --- netbox/dcim/forms/model_forms.py | 12 +----------- netbox/virtualization/forms/model_forms.py | 12 +----------- 2 files changed, 2 insertions(+), 22 deletions(-) diff --git a/netbox/dcim/forms/model_forms.py b/netbox/dcim/forms/model_forms.py index d465f214c4c..219e1f6c3bf 100644 --- a/netbox/dcim/forms/model_forms.py +++ b/netbox/dcim/forms/model_forms.py @@ -439,21 +439,11 @@ class DeviceForm(TenancyForm, NetBoxModelForm): label=_('Device role'), queryset=DeviceRole.objects.all() ) - manufacturer = DynamicModelChoiceField( - label=_('Manufacturer'), - queryset=Manufacturer.objects.all(), - required=False, - initial_params={ - 'platforms': '$platform' - } - ) platform = DynamicModelChoiceField( label=_('Platform'), queryset=Platform.objects.all(), required=False, - query_params={ - "manufacturer_id": '$manufacturer' - } + selector=True ) cluster = DynamicModelChoiceField( label=_('Cluster'), diff --git a/netbox/virtualization/forms/model_forms.py b/netbox/virtualization/forms/model_forms.py index 3c03bc96a94..698d9dc7059 100644 --- a/netbox/virtualization/forms/model_forms.py +++ b/netbox/virtualization/forms/model_forms.py @@ -197,21 +197,11 @@ class VirtualMachineForm(TenancyForm, NetBoxModelForm): "vm_role": "True" } ) - manufacturer = DynamicModelChoiceField( - label=_('Manufacturer'), - queryset=Manufacturer.objects.all(), - required=False, - initial_params={ - 'platforms': '$platform' - } - ) platform = DynamicModelChoiceField( label=_('Platform'), queryset=Platform.objects.all(), required=False, - query_params={ - "manufacturer_id": '$manufacturer' - } + selector=True ) local_context_data = JSONField( required=False, From 7522d23933d2e6af43c1c76b843123ec7588e74b Mon Sep 17 00:00:00 2001 From: Prince Kumar Date: Thu, 2 Nov 2023 17:07:50 +0530 Subject: [PATCH 5/5] remove manufacture from imports --- netbox/templates/dcim/device_edit.html | 1 - netbox/virtualization/forms/model_forms.py | 4 ++-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/netbox/templates/dcim/device_edit.html b/netbox/templates/dcim/device_edit.html index af448c2f200..4dbb2f477d9 100644 --- a/netbox/templates/dcim/device_edit.html +++ b/netbox/templates/dcim/device_edit.html @@ -64,7 +64,6 @@
{% trans "Location" %}
{% trans "Management" %}
{% render_field form.status %} - {% render_field form.manufacturer %} {% render_field form.platform %} {% render_field form.config_template %} {% if object.pk %} diff --git a/netbox/virtualization/forms/model_forms.py b/netbox/virtualization/forms/model_forms.py index 698d9dc7059..91f5b06ad1c 100644 --- a/netbox/virtualization/forms/model_forms.py +++ b/netbox/virtualization/forms/model_forms.py @@ -4,7 +4,7 @@ from django.utils.translation import gettext_lazy as _ from dcim.forms.common import InterfaceCommonForm -from dcim.models import Device, DeviceRole, Manufacturer, Platform, Rack, Region, Site, SiteGroup +from dcim.models import Device, DeviceRole, Platform, Rack, Region, Site, SiteGroup from extras.models import ConfigTemplate from ipam.models import IPAddress, VLAN, VLANGroup, VRF from netbox.forms import NetBoxModelForm @@ -218,7 +218,7 @@ class VirtualMachineForm(TenancyForm, NetBoxModelForm): (_('Virtual Machine'), ('name', 'role', 'status', 'description', 'tags')), (_('Site/Cluster'), ('site', 'cluster', 'device')), (_('Tenancy'), ('tenant_group', 'tenant')), - (_('Management'), ('manufacturer', 'platform', 'primary_ip4', 'primary_ip6', 'config_template')), + (_('Management'), ('platform', 'primary_ip4', 'primary_ip6', 'config_template')), (_('Resources'), ('vcpus', 'memory', 'disk')), (_('Config Context'), ('local_context_data',)), )