diff --git a/netbox/circuits/forms/bulk_edit.py b/netbox/circuits/forms/bulk_edit.py index 8d6e8dec1..58b2642ea 100644 --- a/netbox/circuits/forms/bulk_edit.py +++ b/netbox/circuits/forms/bulk_edit.py @@ -11,11 +11,11 @@ from circuits.models import * from dcim.models import Site from ipam.models import ASN from netbox.choices import DistanceUnitChoices -from netbox.forms import NetBoxModelBulkEditForm +from netbox.forms import NetBoxModelBulkEditForm, OrganizationalModelBulkEditForm, PrimaryModelBulkEditForm from tenancy.models import Tenant from utilities.forms import add_blank_choice, get_field_value from utilities.forms.fields import ( - ColorField, CommentField, ContentTypeChoiceField, DynamicModelChoiceField, DynamicModelMultipleChoiceField, + ColorField, ContentTypeChoiceField, DynamicModelChoiceField, DynamicModelMultipleChoiceField, ) from utilities.forms.rendering import FieldSet from utilities.forms.widgets import BulkEditNullBooleanSelect, DatePicker, HTMXSelect, NumberWithOptions @@ -36,18 +36,12 @@ __all__ = ( ) -class ProviderBulkEditForm(NetBoxModelBulkEditForm): +class ProviderBulkEditForm(PrimaryModelBulkEditForm): asns = DynamicModelMultipleChoiceField( queryset=ASN.objects.all(), label=_('ASNs'), required=False ) - description = forms.CharField( - label=_('Description'), - max_length=200, - required=False - ) - comments = CommentField() model = Provider fieldsets = ( @@ -58,18 +52,12 @@ class ProviderBulkEditForm(NetBoxModelBulkEditForm): ) -class ProviderAccountBulkEditForm(NetBoxModelBulkEditForm): +class ProviderAccountBulkEditForm(PrimaryModelBulkEditForm): provider = DynamicModelChoiceField( label=_('Provider'), queryset=Provider.objects.all(), required=False ) - description = forms.CharField( - label=_('Description'), - max_length=200, - required=False - ) - comments = CommentField() model = ProviderAccount fieldsets = ( @@ -80,7 +68,7 @@ class ProviderAccountBulkEditForm(NetBoxModelBulkEditForm): ) -class ProviderNetworkBulkEditForm(NetBoxModelBulkEditForm): +class ProviderNetworkBulkEditForm(PrimaryModelBulkEditForm): provider = DynamicModelChoiceField( label=_('Provider'), queryset=Provider.objects.all(), @@ -91,12 +79,6 @@ class ProviderNetworkBulkEditForm(NetBoxModelBulkEditForm): required=False, label=_('Service ID') ) - description = forms.CharField( - label=_('Description'), - max_length=200, - required=False - ) - comments = CommentField() model = ProviderNetwork fieldsets = ( @@ -107,16 +89,11 @@ class ProviderNetworkBulkEditForm(NetBoxModelBulkEditForm): ) -class CircuitTypeBulkEditForm(NetBoxModelBulkEditForm): +class CircuitTypeBulkEditForm(OrganizationalModelBulkEditForm): color = ColorField( label=_('Color'), required=False ) - description = forms.CharField( - label=_('Description'), - max_length=200, - required=False - ) model = CircuitType fieldsets = ( @@ -125,7 +102,7 @@ class CircuitTypeBulkEditForm(NetBoxModelBulkEditForm): nullable_fields = ('color', 'description') -class CircuitBulkEditForm(NetBoxModelBulkEditForm): +class CircuitBulkEditForm(PrimaryModelBulkEditForm): type = DynamicModelChoiceField( label=_('Type'), queryset=CircuitType.objects.all(), @@ -183,12 +160,6 @@ class CircuitBulkEditForm(NetBoxModelBulkEditForm): required=False, initial='' ) - description = forms.CharField( - label=_('Description'), - max_length=100, - required=False - ) - comments = CommentField() model = Circuit fieldsets = ( @@ -261,12 +232,7 @@ class CircuitTerminationBulkEditForm(NetBoxModelBulkEditForm): pass -class CircuitGroupBulkEditForm(NetBoxModelBulkEditForm): - description = forms.CharField( - label=_('Description'), - max_length=200, - required=False - ) +class CircuitGroupBulkEditForm(OrganizationalModelBulkEditForm): tenant = DynamicModelChoiceField( label=_('Tenant'), queryset=Tenant.objects.all(), @@ -298,16 +264,11 @@ class CircuitGroupAssignmentBulkEditForm(NetBoxModelBulkEditForm): nullable_fields = ('priority',) -class VirtualCircuitTypeBulkEditForm(NetBoxModelBulkEditForm): +class VirtualCircuitTypeBulkEditForm(OrganizationalModelBulkEditForm): color = ColorField( label=_('Color'), required=False ) - description = forms.CharField( - label=_('Description'), - max_length=200, - required=False - ) model = VirtualCircuitType fieldsets = ( @@ -316,7 +277,7 @@ class VirtualCircuitTypeBulkEditForm(NetBoxModelBulkEditForm): nullable_fields = ('color', 'description') -class VirtualCircuitBulkEditForm(NetBoxModelBulkEditForm): +class VirtualCircuitBulkEditForm(PrimaryModelBulkEditForm): provider_network = DynamicModelChoiceField( label=_('Provider network'), queryset=ProviderNetwork.objects.all(), @@ -343,12 +304,6 @@ class VirtualCircuitBulkEditForm(NetBoxModelBulkEditForm): queryset=Tenant.objects.all(), required=False ) - description = forms.CharField( - label=_('Description'), - max_length=100, - required=False - ) - comments = CommentField() model = VirtualCircuit fieldsets = ( diff --git a/netbox/core/forms/bulk_edit.py b/netbox/core/forms/bulk_edit.py index 73618826d..3111ac268 100644 --- a/netbox/core/forms/bulk_edit.py +++ b/netbox/core/forms/bulk_edit.py @@ -3,9 +3,8 @@ from django.utils.translation import gettext_lazy as _ from core.choices import JobIntervalChoices from core.models import * -from netbox.forms import NetBoxModelBulkEditForm +from netbox.forms import PrimaryModelBulkEditForm from netbox.utils import get_data_backend_choices -from utilities.forms.fields import CommentField from utilities.forms.rendering import FieldSet from utilities.forms.widgets import BulkEditNullBooleanSelect @@ -14,7 +13,7 @@ __all__ = ( ) -class DataSourceBulkEditForm(NetBoxModelBulkEditForm): +class DataSourceBulkEditForm(PrimaryModelBulkEditForm): type = forms.ChoiceField( label=_('Type'), choices=get_data_backend_choices, @@ -25,17 +24,11 @@ class DataSourceBulkEditForm(NetBoxModelBulkEditForm): widget=BulkEditNullBooleanSelect(), label=_('Enabled') ) - description = forms.CharField( - label=_('Description'), - max_length=200, - required=False - ) sync_interval = forms.ChoiceField( choices=JobIntervalChoices, required=False, label=_('Sync interval') ) - comments = CommentField() parameters = forms.JSONField( label=_('Parameters'), required=False diff --git a/netbox/dcim/forms/bulk_edit.py b/netbox/dcim/forms/bulk_edit.py index 0f5550666..cfc614073 100644 --- a/netbox/dcim/forms/bulk_edit.py +++ b/netbox/dcim/forms/bulk_edit.py @@ -10,14 +10,14 @@ from extras.models import ConfigTemplate from ipam.choices import VLANQinQRoleChoices from ipam.models import ASN, VLAN, VLANGroup, VRF from netbox.choices import * -from netbox.forms import NetBoxModelBulkEditForm +from netbox.forms import ( + NestedGroupModelBulkEditForm, NetBoxModelBulkEditForm, OrganizationalModelBulkEditForm, PrimaryModelBulkEditForm, +) from netbox.forms.mixins import ChangelogMessageMixin from tenancy.models import Tenant from users.models import User from utilities.forms import BulkEditForm, add_blank_choice, form_from_model -from utilities.forms.fields import ( - ColorField, CommentField, DynamicModelChoiceField, DynamicModelMultipleChoiceField, JSONField, -) +from utilities.forms.fields import ColorField, DynamicModelChoiceField, DynamicModelMultipleChoiceField, JSONField from utilities.forms.rendering import FieldSet, InlineFields, TabbedGroups from utilities.forms.widgets import BulkEditNullBooleanSelect, NumberWithOptions from virtualization.models import Cluster @@ -71,18 +71,12 @@ __all__ = ( ) -class RegionBulkEditForm(NetBoxModelBulkEditForm): +class RegionBulkEditForm(NestedGroupModelBulkEditForm): parent = DynamicModelChoiceField( label=_('Parent'), queryset=Region.objects.all(), required=False ) - description = forms.CharField( - label=_('Description'), - max_length=200, - required=False - ) - comments = CommentField() model = Region fieldsets = ( @@ -91,18 +85,12 @@ class RegionBulkEditForm(NetBoxModelBulkEditForm): nullable_fields = ('parent', 'description', 'comments') -class SiteGroupBulkEditForm(NetBoxModelBulkEditForm): +class SiteGroupBulkEditForm(NestedGroupModelBulkEditForm): parent = DynamicModelChoiceField( label=_('Parent'), queryset=SiteGroup.objects.all(), required=False ) - description = forms.CharField( - label=_('Description'), - max_length=200, - required=False - ) - comments = CommentField() model = SiteGroup fieldsets = ( @@ -111,7 +99,7 @@ class SiteGroupBulkEditForm(NetBoxModelBulkEditForm): nullable_fields = ('parent', 'description', 'comments') -class SiteBulkEditForm(NetBoxModelBulkEditForm): +class SiteBulkEditForm(PrimaryModelBulkEditForm): status = forms.ChoiceField( label=_('Status'), choices=add_blank_choice(SiteStatusChoices), @@ -162,12 +150,6 @@ class SiteBulkEditForm(NetBoxModelBulkEditForm): choices=add_blank_choice(TimeZoneFormField().choices), required=False ) - description = forms.CharField( - label=_('Description'), - max_length=200, - required=False - ) - comments = CommentField() model = Site fieldsets = ( @@ -178,7 +160,7 @@ class SiteBulkEditForm(NetBoxModelBulkEditForm): ) -class LocationBulkEditForm(NetBoxModelBulkEditForm): +class LocationBulkEditForm(NestedGroupModelBulkEditForm): site = DynamicModelChoiceField( label=_('Site'), queryset=Site.objects.all(), @@ -208,12 +190,6 @@ class LocationBulkEditForm(NetBoxModelBulkEditForm): max_length=50, required=False ) - description = forms.CharField( - label=_('Description'), - max_length=200, - required=False - ) - comments = CommentField() model = Location fieldsets = ( @@ -222,16 +198,11 @@ class LocationBulkEditForm(NetBoxModelBulkEditForm): nullable_fields = ('parent', 'tenant', 'facility', 'description', 'comments') -class RackRoleBulkEditForm(NetBoxModelBulkEditForm): +class RackRoleBulkEditForm(OrganizationalModelBulkEditForm): color = ColorField( label=_('Color'), required=False ) - description = forms.CharField( - label=_('Description'), - max_length=200, - required=False - ) model = RackRole fieldsets = ( @@ -240,7 +211,7 @@ class RackRoleBulkEditForm(NetBoxModelBulkEditForm): nullable_fields = ('color', 'description') -class RackTypeBulkEditForm(NetBoxModelBulkEditForm): +class RackTypeBulkEditForm(PrimaryModelBulkEditForm): manufacturer = DynamicModelChoiceField( label=_('Manufacturer'), queryset=Manufacturer.objects.all(), @@ -310,12 +281,6 @@ class RackTypeBulkEditForm(NetBoxModelBulkEditForm): required=False, initial='' ) - description = forms.CharField( - label=_('Description'), - max_length=200, - required=False - ) - comments = CommentField() model = RackType fieldsets = ( @@ -334,7 +299,7 @@ class RackTypeBulkEditForm(NetBoxModelBulkEditForm): ) -class RackBulkEditForm(NetBoxModelBulkEditForm): +class RackBulkEditForm(PrimaryModelBulkEditForm): region = DynamicModelChoiceField( label=_('Region'), queryset=Region.objects.all(), @@ -464,12 +429,6 @@ class RackBulkEditForm(NetBoxModelBulkEditForm): required=False, initial='' ) - description = forms.CharField( - label=_('Description'), - max_length=200, - required=False - ) - comments = CommentField() model = Rack fieldsets = ( @@ -485,7 +444,7 @@ class RackBulkEditForm(NetBoxModelBulkEditForm): ) -class RackReservationBulkEditForm(NetBoxModelBulkEditForm): +class RackReservationBulkEditForm(PrimaryModelBulkEditForm): status = forms.ChoiceField( label=_('Status'), choices=add_blank_choice(RackReservationStatusChoices), @@ -502,12 +461,6 @@ class RackReservationBulkEditForm(NetBoxModelBulkEditForm): queryset=Tenant.objects.all(), required=False ) - description = forms.CharField( - label=_('Description'), - max_length=200, - required=False - ) - comments = CommentField() model = RackReservation fieldsets = ( @@ -516,13 +469,7 @@ class RackReservationBulkEditForm(NetBoxModelBulkEditForm): nullable_fields = ('comments',) -class ManufacturerBulkEditForm(NetBoxModelBulkEditForm): - description = forms.CharField( - label=_('Description'), - max_length=200, - required=False - ) - +class ManufacturerBulkEditForm(OrganizationalModelBulkEditForm): model = Manufacturer fieldsets = ( FieldSet('description'), @@ -530,7 +477,7 @@ class ManufacturerBulkEditForm(NetBoxModelBulkEditForm): nullable_fields = ('description',) -class DeviceTypeBulkEditForm(NetBoxModelBulkEditForm): +class DeviceTypeBulkEditForm(PrimaryModelBulkEditForm): manufacturer = DynamicModelChoiceField( label=_('Manufacturer'), queryset=Manufacturer.objects.all(), @@ -576,12 +523,6 @@ class DeviceTypeBulkEditForm(NetBoxModelBulkEditForm): required=False, initial='' ) - description = forms.CharField( - label=_('Description'), - max_length=200, - required=False - ) - comments = CommentField() model = DeviceType fieldsets = ( @@ -594,17 +535,11 @@ class DeviceTypeBulkEditForm(NetBoxModelBulkEditForm): nullable_fields = ('part_number', 'airflow', 'weight', 'weight_unit', 'description', 'comments') -class ModuleTypeProfileBulkEditForm(NetBoxModelBulkEditForm): +class ModuleTypeProfileBulkEditForm(PrimaryModelBulkEditForm): schema = JSONField( label=_('Schema'), required=False ) - description = forms.CharField( - label=_('Description'), - max_length=200, - required=False - ) - comments = CommentField() model = ModuleTypeProfile fieldsets = ( @@ -613,7 +548,7 @@ class ModuleTypeProfileBulkEditForm(NetBoxModelBulkEditForm): nullable_fields = ('description', 'comments') -class ModuleTypeBulkEditForm(NetBoxModelBulkEditForm): +class ModuleTypeBulkEditForm(PrimaryModelBulkEditForm): profile = DynamicModelChoiceField( label=_('Profile'), queryset=ModuleTypeProfile.objects.all(), @@ -644,12 +579,6 @@ class ModuleTypeBulkEditForm(NetBoxModelBulkEditForm): required=False, initial='' ) - description = forms.CharField( - label=_('Description'), - max_length=200, - required=False - ) - comments = CommentField() model = ModuleType fieldsets = ( @@ -663,7 +592,7 @@ class ModuleTypeBulkEditForm(NetBoxModelBulkEditForm): nullable_fields = ('part_number', 'weight', 'weight_unit', 'profile', 'description', 'comments') -class DeviceRoleBulkEditForm(NetBoxModelBulkEditForm): +class DeviceRoleBulkEditForm(NestedGroupModelBulkEditForm): parent = DynamicModelChoiceField( label=_('Parent'), queryset=DeviceRole.objects.all(), @@ -683,12 +612,6 @@ class DeviceRoleBulkEditForm(NetBoxModelBulkEditForm): queryset=ConfigTemplate.objects.all(), required=False ) - description = forms.CharField( - label=_('Description'), - max_length=200, - required=False - ) - comments = CommentField() model = DeviceRole fieldsets = ( @@ -697,7 +620,7 @@ class DeviceRoleBulkEditForm(NetBoxModelBulkEditForm): nullable_fields = ('parent', 'color', 'config_template', 'description', 'comments') -class PlatformBulkEditForm(NetBoxModelBulkEditForm): +class PlatformBulkEditForm(NestedGroupModelBulkEditForm): parent = DynamicModelChoiceField( label=_('Parent'), queryset=Platform.objects.all(), @@ -713,12 +636,6 @@ class PlatformBulkEditForm(NetBoxModelBulkEditForm): queryset=ConfigTemplate.objects.all(), required=False ) - description = forms.CharField( - label=_('Description'), - max_length=200, - required=False - ) - comments = CommentField() model = Platform fieldsets = ( @@ -727,7 +644,7 @@ class PlatformBulkEditForm(NetBoxModelBulkEditForm): nullable_fields = ('parent', 'manufacturer', 'config_template', 'description', 'comments') -class DeviceBulkEditForm(NetBoxModelBulkEditForm): +class DeviceBulkEditForm(PrimaryModelBulkEditForm): manufacturer = DynamicModelChoiceField( label=_('Manufacturer'), queryset=Manufacturer.objects.all(), @@ -787,11 +704,6 @@ class DeviceBulkEditForm(NetBoxModelBulkEditForm): required=False, label=_('Serial Number') ) - description = forms.CharField( - label=_('Description'), - max_length=200, - required=False - ) config_template = DynamicModelChoiceField( label=_('Config template'), queryset=ConfigTemplate.objects.all(), @@ -805,7 +717,6 @@ class DeviceBulkEditForm(NetBoxModelBulkEditForm): 'site_id': ['$site', 'null'] }, ) - comments = CommentField() model = Device fieldsets = ( @@ -820,7 +731,7 @@ class DeviceBulkEditForm(NetBoxModelBulkEditForm): ) -class ModuleBulkEditForm(NetBoxModelBulkEditForm): +class ModuleBulkEditForm(PrimaryModelBulkEditForm): manufacturer = DynamicModelChoiceField( label=_('Manufacturer'), queryset=Manufacturer.objects.all(), @@ -848,12 +759,6 @@ class ModuleBulkEditForm(NetBoxModelBulkEditForm): required=False, label=_('Serial Number') ) - description = forms.CharField( - label=_('Description'), - max_length=200, - required=False - ) - comments = CommentField() model = Module fieldsets = ( @@ -862,7 +767,7 @@ class ModuleBulkEditForm(NetBoxModelBulkEditForm): nullable_fields = ('serial', 'description', 'comments') -class CableBulkEditForm(NetBoxModelBulkEditForm): +class CableBulkEditForm(PrimaryModelBulkEditForm): type = forms.ChoiceField( label=_('Type'), choices=add_blank_choice(CableTypeChoices), @@ -900,12 +805,6 @@ class CableBulkEditForm(NetBoxModelBulkEditForm): required=False, initial='' ) - description = forms.CharField( - label=_('Description'), - max_length=200, - required=False - ) - comments = CommentField() model = Cable fieldsets = ( @@ -917,18 +816,12 @@ class CableBulkEditForm(NetBoxModelBulkEditForm): ) -class VirtualChassisBulkEditForm(NetBoxModelBulkEditForm): +class VirtualChassisBulkEditForm(PrimaryModelBulkEditForm): domain = forms.CharField( label=_('Domain'), max_length=30, required=False ) - description = forms.CharField( - label=_('Description'), - max_length=200, - required=False - ) - comments = CommentField() model = VirtualChassis fieldsets = ( @@ -937,7 +830,7 @@ class VirtualChassisBulkEditForm(NetBoxModelBulkEditForm): nullable_fields = ('domain', 'description', 'comments') -class PowerPanelBulkEditForm(NetBoxModelBulkEditForm): +class PowerPanelBulkEditForm(PrimaryModelBulkEditForm): region = DynamicModelChoiceField( label=_('Region'), queryset=Region.objects.all(), @@ -971,12 +864,6 @@ class PowerPanelBulkEditForm(NetBoxModelBulkEditForm): 'site_id': '$site' } ) - description = forms.CharField( - label=_('Description'), - max_length=200, - required=False - ) - comments = CommentField() model = PowerPanel fieldsets = ( @@ -985,7 +872,7 @@ class PowerPanelBulkEditForm(NetBoxModelBulkEditForm): nullable_fields = ('location', 'description', 'comments') -class PowerFeedBulkEditForm(NetBoxModelBulkEditForm): +class PowerFeedBulkEditForm(PrimaryModelBulkEditForm): power_panel = DynamicModelChoiceField( label=_('Power panel'), queryset=PowerPanel.objects.all(), @@ -1041,12 +928,6 @@ class PowerFeedBulkEditForm(NetBoxModelBulkEditForm): queryset=Tenant.objects.all(), required=False ) - description = forms.CharField( - label=_('Description'), - max_length=200, - required=False - ) - comments = CommentField() model = PowerFeed fieldsets = ( @@ -1818,16 +1699,11 @@ class InventoryItemBulkEditForm( # Device component roles # -class InventoryItemRoleBulkEditForm(NetBoxModelBulkEditForm): +class InventoryItemRoleBulkEditForm(OrganizationalModelBulkEditForm): color = ColorField( label=_('Color'), required=False ) - description = forms.CharField( - label=_('Description'), - max_length=200, - required=False - ) model = InventoryItemRole fieldsets = ( @@ -1836,7 +1712,7 @@ class InventoryItemRoleBulkEditForm(NetBoxModelBulkEditForm): nullable_fields = ('color', 'description') -class VirtualDeviceContextBulkEditForm(NetBoxModelBulkEditForm): +class VirtualDeviceContextBulkEditForm(PrimaryModelBulkEditForm): device = DynamicModelChoiceField( label=_('Device'), queryset=Device.objects.all(), @@ -1852,6 +1728,7 @@ class VirtualDeviceContextBulkEditForm(NetBoxModelBulkEditForm): queryset=Tenant.objects.all(), required=False ) + model = VirtualDeviceContext fieldsets = ( FieldSet('device', 'status', 'tenant'), @@ -1863,14 +1740,7 @@ class VirtualDeviceContextBulkEditForm(NetBoxModelBulkEditForm): # Addressing # -class MACAddressBulkEditForm(NetBoxModelBulkEditForm): - description = forms.CharField( - label=_('Description'), - max_length=200, - required=False - ) - comments = CommentField() - +class MACAddressBulkEditForm(PrimaryModelBulkEditForm): model = MACAddress fieldsets = ( FieldSet('description'), diff --git a/netbox/extras/forms/bulk_edit.py b/netbox/extras/forms/bulk_edit.py index 9cbfbae32..db0f95484 100644 --- a/netbox/extras/forms/bulk_edit.py +++ b/netbox/extras/forms/bulk_edit.py @@ -4,8 +4,8 @@ from django.utils.translation import gettext_lazy as _ from extras.choices import * from extras.models import * from netbox.events import get_event_type_choices -from netbox.forms import NetBoxModelBulkEditForm -from netbox.forms.mixins import ChangelogMessageMixin +from netbox.forms import NetBoxModelBulkEditForm, PrimaryModelBulkEditForm +from netbox.forms.mixins import ChangelogMessageMixin, OwnerMixin from utilities.forms import BulkEditForm, add_blank_choice from utilities.forms.fields import ColorField, CommentField, DynamicModelChoiceField from utilities.forms.rendering import FieldSet @@ -30,7 +30,7 @@ __all__ = ( ) -class CustomFieldBulkEditForm(ChangelogMessageMixin, BulkEditForm): +class CustomFieldBulkEditForm(ChangelogMessageMixin, OwnerMixin, BulkEditForm): pk = forms.ModelMultipleChoiceField( queryset=CustomField.objects.all(), widget=forms.MultipleHiddenInput @@ -98,7 +98,7 @@ class CustomFieldBulkEditForm(ChangelogMessageMixin, BulkEditForm): nullable_fields = ('group_name', 'description', 'choice_set') -class CustomFieldChoiceSetBulkEditForm(ChangelogMessageMixin, BulkEditForm): +class CustomFieldChoiceSetBulkEditForm(ChangelogMessageMixin, OwnerMixin, BulkEditForm): pk = forms.ModelMultipleChoiceField( queryset=CustomFieldChoiceSet.objects.all(), widget=forms.MultipleHiddenInput @@ -118,7 +118,7 @@ class CustomFieldChoiceSetBulkEditForm(ChangelogMessageMixin, BulkEditForm): nullable_fields = ('base_choices', 'description') -class CustomLinkBulkEditForm(ChangelogMessageMixin, BulkEditForm): +class CustomLinkBulkEditForm(ChangelogMessageMixin, OwnerMixin, BulkEditForm): pk = forms.ModelMultipleChoiceField( queryset=CustomLink.objects.all(), widget=forms.MultipleHiddenInput @@ -144,7 +144,7 @@ class CustomLinkBulkEditForm(ChangelogMessageMixin, BulkEditForm): ) -class ExportTemplateBulkEditForm(ChangelogMessageMixin, BulkEditForm): +class ExportTemplateBulkEditForm(ChangelogMessageMixin, OwnerMixin, BulkEditForm): pk = forms.ModelMultipleChoiceField( queryset=ExportTemplate.objects.all(), widget=forms.MultipleHiddenInput @@ -177,7 +177,7 @@ class ExportTemplateBulkEditForm(ChangelogMessageMixin, BulkEditForm): nullable_fields = ('description', 'mime_type', 'file_name', 'file_extension') -class SavedFilterBulkEditForm(ChangelogMessageMixin, BulkEditForm): +class SavedFilterBulkEditForm(ChangelogMessageMixin, OwnerMixin, BulkEditForm): pk = forms.ModelMultipleChoiceField( queryset=SavedFilter.objects.all(), widget=forms.MultipleHiddenInput @@ -233,7 +233,7 @@ class TableConfigBulkEditForm(BulkEditForm): nullable_fields = ('description',) -class WebhookBulkEditForm(NetBoxModelBulkEditForm): +class WebhookBulkEditForm(OwnerMixin, NetBoxModelBulkEditForm): model = Webhook pk = forms.ModelMultipleChoiceField( @@ -271,7 +271,7 @@ class WebhookBulkEditForm(NetBoxModelBulkEditForm): nullable_fields = ('secret', 'ca_file_path') -class EventRuleBulkEditForm(NetBoxModelBulkEditForm): +class EventRuleBulkEditForm(OwnerMixin, NetBoxModelBulkEditForm): model = EventRule pk = forms.ModelMultipleChoiceField( @@ -297,7 +297,7 @@ class EventRuleBulkEditForm(NetBoxModelBulkEditForm): nullable_fields = ('description', 'conditions') -class TagBulkEditForm(ChangelogMessageMixin, BulkEditForm): +class TagBulkEditForm(ChangelogMessageMixin, OwnerMixin, BulkEditForm): pk = forms.ModelMultipleChoiceField( queryset=Tag.objects.all(), widget=forms.MultipleHiddenInput @@ -319,17 +319,11 @@ class TagBulkEditForm(ChangelogMessageMixin, BulkEditForm): nullable_fields = ('description',) -class ConfigContextProfileBulkEditForm(NetBoxModelBulkEditForm): +class ConfigContextProfileBulkEditForm(PrimaryModelBulkEditForm): pk = forms.ModelMultipleChoiceField( queryset=ConfigContextProfile.objects.all(), widget=forms.MultipleHiddenInput ) - description = forms.CharField( - label=_('Description'), - required=False, - max_length=100 - ) - comments = CommentField() model = ConfigContextProfile fieldsets = ( @@ -338,7 +332,7 @@ class ConfigContextProfileBulkEditForm(NetBoxModelBulkEditForm): nullable_fields = ('description',) -class ConfigContextBulkEditForm(ChangelogMessageMixin, BulkEditForm): +class ConfigContextBulkEditForm(ChangelogMessageMixin, OwnerMixin, BulkEditForm): pk = forms.ModelMultipleChoiceField( queryset=ConfigContext.objects.all(), widget=forms.MultipleHiddenInput @@ -369,7 +363,7 @@ class ConfigContextBulkEditForm(ChangelogMessageMixin, BulkEditForm): nullable_fields = ('profile', 'description') -class ConfigTemplateBulkEditForm(ChangelogMessageMixin, BulkEditForm): +class ConfigTemplateBulkEditForm(ChangelogMessageMixin, OwnerMixin, BulkEditForm): pk = forms.ModelMultipleChoiceField( queryset=ConfigTemplate.objects.all(), widget=forms.MultipleHiddenInput diff --git a/netbox/ipam/forms/bulk_edit.py b/netbox/ipam/forms/bulk_edit.py index 864630bd4..8a85a908b 100644 --- a/netbox/ipam/forms/bulk_edit.py +++ b/netbox/ipam/forms/bulk_edit.py @@ -9,11 +9,11 @@ from ipam.choices import * from ipam.constants import * from ipam.models import * from ipam.models import ASN -from netbox.forms import NetBoxModelBulkEditForm +from netbox.forms import NetBoxModelBulkEditForm, OrganizationalModelBulkEditForm, PrimaryModelBulkEditForm from tenancy.models import Tenant from utilities.forms import add_blank_choice, get_field_value from utilities.forms.fields import ( - CommentField, ContentTypeChoiceField, DynamicModelChoiceField, DynamicModelMultipleChoiceField, NumericArrayField, + ContentTypeChoiceField, DynamicModelChoiceField, DynamicModelMultipleChoiceField, NumericArrayField, NumericRangeArrayField, ) from utilities.forms.rendering import FieldSet @@ -41,7 +41,7 @@ __all__ = ( ) -class VRFBulkEditForm(NetBoxModelBulkEditForm): +class VRFBulkEditForm(PrimaryModelBulkEditForm): tenant = DynamicModelChoiceField( label=_('Tenant'), queryset=Tenant.objects.all(), @@ -52,12 +52,6 @@ class VRFBulkEditForm(NetBoxModelBulkEditForm): widget=BulkEditNullBooleanSelect(), label=_('Enforce unique space') ) - description = forms.CharField( - label=_('Description'), - max_length=200, - required=False - ) - comments = CommentField() model = VRF fieldsets = ( @@ -66,18 +60,12 @@ class VRFBulkEditForm(NetBoxModelBulkEditForm): nullable_fields = ('tenant', 'description', 'comments') -class RouteTargetBulkEditForm(NetBoxModelBulkEditForm): +class RouteTargetBulkEditForm(PrimaryModelBulkEditForm): tenant = DynamicModelChoiceField( label=_('Tenant'), queryset=Tenant.objects.all(), required=False ) - description = forms.CharField( - label=_('Description'), - max_length=200, - required=False - ) - comments = CommentField() model = RouteTarget fieldsets = ( @@ -86,17 +74,12 @@ class RouteTargetBulkEditForm(NetBoxModelBulkEditForm): nullable_fields = ('tenant', 'description', 'comments') -class RIRBulkEditForm(NetBoxModelBulkEditForm): +class RIRBulkEditForm(OrganizationalModelBulkEditForm): is_private = forms.NullBooleanField( label=_('Is private'), required=False, widget=BulkEditNullBooleanSelect ) - description = forms.CharField( - label=_('Description'), - max_length=200, - required=False - ) model = RIR fieldsets = ( @@ -105,7 +88,7 @@ class RIRBulkEditForm(NetBoxModelBulkEditForm): nullable_fields = ('is_private', 'description') -class ASNRangeBulkEditForm(NetBoxModelBulkEditForm): +class ASNRangeBulkEditForm(OrganizationalModelBulkEditForm): rir = DynamicModelChoiceField( queryset=RIR.objects.all(), required=False, @@ -116,11 +99,6 @@ class ASNRangeBulkEditForm(NetBoxModelBulkEditForm): queryset=Tenant.objects.all(), required=False ) - description = forms.CharField( - label=_('Description'), - max_length=200, - required=False - ) model = ASNRange fieldsets = ( @@ -129,7 +107,7 @@ class ASNRangeBulkEditForm(NetBoxModelBulkEditForm): nullable_fields = ('description',) -class ASNBulkEditForm(NetBoxModelBulkEditForm): +class ASNBulkEditForm(PrimaryModelBulkEditForm): sites = DynamicModelMultipleChoiceField( label=_('Sites'), queryset=Site.objects.all(), @@ -145,12 +123,6 @@ class ASNBulkEditForm(NetBoxModelBulkEditForm): queryset=Tenant.objects.all(), required=False ) - description = forms.CharField( - label=_('Description'), - max_length=200, - required=False - ) - comments = CommentField() model = ASN fieldsets = ( @@ -159,7 +131,7 @@ class ASNBulkEditForm(NetBoxModelBulkEditForm): nullable_fields = ('tenant', 'description', 'comments') -class AggregateBulkEditForm(NetBoxModelBulkEditForm): +class AggregateBulkEditForm(PrimaryModelBulkEditForm): rir = DynamicModelChoiceField( queryset=RIR.objects.all(), required=False, @@ -174,12 +146,6 @@ class AggregateBulkEditForm(NetBoxModelBulkEditForm): label=_('Date added'), required=False ) - description = forms.CharField( - label=_('Description'), - max_length=200, - required=False - ) - comments = CommentField() model = Aggregate fieldsets = ( @@ -188,16 +154,11 @@ class AggregateBulkEditForm(NetBoxModelBulkEditForm): nullable_fields = ('date_added', 'description', 'comments') -class RoleBulkEditForm(NetBoxModelBulkEditForm): +class RoleBulkEditForm(OrganizationalModelBulkEditForm): weight = forms.IntegerField( label=_('Weight'), required=False ) - description = forms.CharField( - label=_('Description'), - max_length=200, - required=False - ) model = Role fieldsets = ( @@ -206,7 +167,7 @@ class RoleBulkEditForm(NetBoxModelBulkEditForm): nullable_fields = ('description',) -class PrefixBulkEditForm(ScopedBulkEditForm, NetBoxModelBulkEditForm): +class PrefixBulkEditForm(ScopedBulkEditForm, PrimaryModelBulkEditForm): vlan_group = DynamicModelChoiceField( queryset=VLANGroup.objects.all(), required=False, @@ -256,12 +217,6 @@ class PrefixBulkEditForm(ScopedBulkEditForm, NetBoxModelBulkEditForm): widget=BulkEditNullBooleanSelect(), label=_('Treat as fully utilized') ) - description = forms.CharField( - label=_('Description'), - max_length=200, - required=False - ) - comments = CommentField() model = Prefix fieldsets = ( @@ -275,7 +230,7 @@ class PrefixBulkEditForm(ScopedBulkEditForm, NetBoxModelBulkEditForm): ) -class IPRangeBulkEditForm(NetBoxModelBulkEditForm): +class IPRangeBulkEditForm(PrimaryModelBulkEditForm): vrf = DynamicModelChoiceField( queryset=VRF.objects.all(), required=False, @@ -306,12 +261,6 @@ class IPRangeBulkEditForm(NetBoxModelBulkEditForm): widget=BulkEditNullBooleanSelect(), label=_('Treat as fully utilized') ) - description = forms.CharField( - label=_('Description'), - max_length=200, - required=False - ) - comments = CommentField() model = IPRange fieldsets = ( @@ -322,7 +271,7 @@ class IPRangeBulkEditForm(NetBoxModelBulkEditForm): ) -class IPAddressBulkEditForm(NetBoxModelBulkEditForm): +class IPAddressBulkEditForm(PrimaryModelBulkEditForm): vrf = DynamicModelChoiceField( queryset=VRF.objects.all(), required=False, @@ -354,12 +303,6 @@ class IPAddressBulkEditForm(NetBoxModelBulkEditForm): required=False, label=_('DNS name') ) - description = forms.CharField( - label=_('Description'), - max_length=200, - required=False - ) - comments = CommentField() model = IPAddress fieldsets = ( @@ -371,7 +314,7 @@ class IPAddressBulkEditForm(NetBoxModelBulkEditForm): ) -class FHRPGroupBulkEditForm(NetBoxModelBulkEditForm): +class FHRPGroupBulkEditForm(PrimaryModelBulkEditForm): protocol = forms.ChoiceField( label=_('Protocol'), choices=add_blank_choice(FHRPGroupProtocolChoices), @@ -397,12 +340,6 @@ class FHRPGroupBulkEditForm(NetBoxModelBulkEditForm): max_length=100, required=False ) - description = forms.CharField( - label=_('Description'), - max_length=200, - required=False - ) - comments = CommentField() model = FHRPGroup fieldsets = ( @@ -412,12 +349,7 @@ class FHRPGroupBulkEditForm(NetBoxModelBulkEditForm): nullable_fields = ('auth_type', 'auth_key', 'name', 'description', 'comments') -class VLANGroupBulkEditForm(NetBoxModelBulkEditForm): - description = forms.CharField( - label=_('Description'), - max_length=200, - required=False - ) +class VLANGroupBulkEditForm(OrganizationalModelBulkEditForm): scope_type = ContentTypeChoiceField( queryset=ContentType.objects.filter(model__in=VLANGROUP_SCOPE_TYPES), widget=HTMXSelect(method='post', attrs={'hx-select': '#form_fields'}), @@ -464,7 +396,7 @@ class VLANGroupBulkEditForm(NetBoxModelBulkEditForm): pass -class VLANBulkEditForm(NetBoxModelBulkEditForm): +class VLANBulkEditForm(PrimaryModelBulkEditForm): region = DynamicModelChoiceField( label=_('Region'), queryset=Region.objects.all(), @@ -507,11 +439,6 @@ class VLANBulkEditForm(NetBoxModelBulkEditForm): queryset=Role.objects.all(), required=False ) - description = forms.CharField( - label=_('Description'), - max_length=200, - required=False - ) qinq_role = forms.ChoiceField( label=_('Q-in-Q role'), choices=add_blank_choice(VLANQinQRoleChoices), @@ -525,7 +452,6 @@ class VLANBulkEditForm(NetBoxModelBulkEditForm): 'qinq_role': VLANQinQRoleChoices.ROLE_SERVICE, } ) - comments = CommentField() model = VLAN fieldsets = ( @@ -538,13 +464,7 @@ class VLANBulkEditForm(NetBoxModelBulkEditForm): ) -class VLANTranslationPolicyBulkEditForm(NetBoxModelBulkEditForm): - description = forms.CharField( - label=_('Description'), - max_length=200, - required=False - ) - +class VLANTranslationPolicyBulkEditForm(PrimaryModelBulkEditForm): model = VLANTranslationPolicy fieldsets = ( FieldSet('description'), @@ -568,7 +488,7 @@ class VLANTranslationRuleBulkEditForm(NetBoxModelBulkEditForm): fields = ('policy', 'local_vid', 'remote_vid') -class ServiceTemplateBulkEditForm(NetBoxModelBulkEditForm): +class ServiceTemplateBulkEditForm(PrimaryModelBulkEditForm): protocol = forms.ChoiceField( label=_('Protocol'), choices=add_blank_choice(ServiceProtocolChoices), @@ -582,12 +502,6 @@ class ServiceTemplateBulkEditForm(NetBoxModelBulkEditForm): ), required=False ) - description = forms.CharField( - label=_('Description'), - max_length=200, - required=False - ) - comments = CommentField() model = ServiceTemplate fieldsets = ( diff --git a/netbox/netbox/forms/bulk_edit.py b/netbox/netbox/forms/bulk_edit.py index e0d3ad348..5ad95b150 100644 --- a/netbox/netbox/forms/bulk_edit.py +++ b/netbox/netbox/forms/bulk_edit.py @@ -5,15 +5,18 @@ from core.models import ObjectType from extras.choices import * from extras.models import Tag from utilities.forms import BulkEditForm -from utilities.forms.fields import DynamicModelMultipleChoiceField +from utilities.forms.fields import CommentField, DynamicModelMultipleChoiceField from .mixins import ChangelogMessageMixin, CustomFieldsMixin, OwnerMixin __all__ = ( + 'NestedGroupModelBulkEditForm', 'NetBoxModelBulkEditForm', + 'OrganizationalModelBulkEditForm', + 'PrimaryModelBulkEditForm', ) -class NetBoxModelBulkEditForm(ChangelogMessageMixin, CustomFieldsMixin, OwnerMixin, BulkEditForm): +class NetBoxModelBulkEditForm(ChangelogMessageMixin, CustomFieldsMixin, BulkEditForm): """ Base form for modifying multiple NetBox objects (of the same type) in bulk via the UI. Adds support for custom fields and adding/removing tags. @@ -65,3 +68,38 @@ class NetBoxModelBulkEditForm(ChangelogMessageMixin, CustomFieldsMixin, OwnerMix *nullable_common_fields, *nullable_custom_fields, ) + + +class PrimaryModelBulkEditForm(OwnerMixin, NetBoxModelBulkEditForm): + """ + Bulk edit form for models which inherit from PrimaryModel. + """ + description = forms.CharField( + label=_('Description'), + max_length=100, + required=False + ) + comments = CommentField() + + +class OrganizationalModelBulkEditForm(OwnerMixin, NetBoxModelBulkEditForm): + """ + Bulk edit form for models which inherit from OrganizationalModel. + """ + description = forms.CharField( + label=_('Description'), + max_length=200, + required=False + ) + + +class NestedGroupModelBulkEditForm(OwnerMixin, NetBoxModelBulkEditForm): + """ + Bulk edit form for models which inherit from NestedGroupModel. + """ + description = forms.CharField( + label=_('Description'), + max_length=200, + required=False + ) + comments = CommentField() diff --git a/netbox/tenancy/forms/bulk_edit.py b/netbox/tenancy/forms/bulk_edit.py index 22aba810f..2ad442d22 100644 --- a/netbox/tenancy/forms/bulk_edit.py +++ b/netbox/tenancy/forms/bulk_edit.py @@ -1,11 +1,13 @@ from django import forms from django.utils.translation import gettext_lazy as _ -from netbox.forms import NetBoxModelBulkEditForm +from netbox.forms import ( + NestedGroupModelBulkEditForm, NetBoxModelBulkEditForm, OrganizationalModelBulkEditForm, PrimaryModelBulkEditForm, +) from tenancy.choices import ContactPriorityChoices from tenancy.models import * from utilities.forms import add_blank_choice -from utilities.forms.fields import CommentField, DynamicModelChoiceField, DynamicModelMultipleChoiceField +from utilities.forms.fields import DynamicModelChoiceField, DynamicModelMultipleChoiceField from utilities.forms.rendering import FieldSet __all__ = ( @@ -22,34 +24,23 @@ __all__ = ( # Tenants # -class TenantGroupBulkEditForm(NetBoxModelBulkEditForm): +class TenantGroupBulkEditForm(NestedGroupModelBulkEditForm): parent = DynamicModelChoiceField( label=_('Parent'), queryset=TenantGroup.objects.all(), required=False ) - description = forms.CharField( - label=_('Description'), - max_length=200, - required=False - ) - comments = CommentField() model = TenantGroup nullable_fields = ('parent', 'description', 'comments') -class TenantBulkEditForm(NetBoxModelBulkEditForm): +class TenantBulkEditForm(PrimaryModelBulkEditForm): group = DynamicModelChoiceField( label=_('Group'), queryset=TenantGroup.objects.all(), required=False ) - description = forms.CharField( - label=_('Description'), - max_length=200, - required=False - ) model = Tenant fieldsets = ( @@ -62,18 +53,12 @@ class TenantBulkEditForm(NetBoxModelBulkEditForm): # Contacts # -class ContactGroupBulkEditForm(NetBoxModelBulkEditForm): +class ContactGroupBulkEditForm(NestedGroupModelBulkEditForm): parent = DynamicModelChoiceField( label=_('Parent'), queryset=ContactGroup.objects.all(), required=False ) - description = forms.CharField( - label=_('Description'), - max_length=200, - required=False - ) - comments = CommentField() model = ContactGroup fieldsets = ( @@ -82,13 +67,7 @@ class ContactGroupBulkEditForm(NetBoxModelBulkEditForm): nullable_fields = ('parent', 'description', 'comments') -class ContactRoleBulkEditForm(NetBoxModelBulkEditForm): - description = forms.CharField( - label=_('Description'), - max_length=200, - required=False - ) - +class ContactRoleBulkEditForm(OrganizationalModelBulkEditForm): model = ContactRole fieldsets = ( FieldSet('description'), @@ -96,7 +75,7 @@ class ContactRoleBulkEditForm(NetBoxModelBulkEditForm): nullable_fields = ('description',) -class ContactBulkEditForm(NetBoxModelBulkEditForm): +class ContactBulkEditForm(PrimaryModelBulkEditForm): add_groups = DynamicModelMultipleChoiceField( label=_('Add groups'), queryset=ContactGroup.objects.all(), @@ -131,12 +110,6 @@ class ContactBulkEditForm(NetBoxModelBulkEditForm): assume_scheme='https', required=False ) - description = forms.CharField( - label=_('Description'), - max_length=200, - required=False - ) - comments = CommentField() model = Contact fieldsets = ( diff --git a/netbox/virtualization/forms/bulk_edit.py b/netbox/virtualization/forms/bulk_edit.py index 80b665047..d72d7c2be 100644 --- a/netbox/virtualization/forms/bulk_edit.py +++ b/netbox/virtualization/forms/bulk_edit.py @@ -7,10 +7,10 @@ from dcim.forms.mixins import ScopedBulkEditForm from dcim.models import Device, DeviceRole, Platform, Site from extras.models import ConfigTemplate from ipam.models import VLAN, VLANGroup, VLANTranslationPolicy, VRF -from netbox.forms import NetBoxModelBulkEditForm +from netbox.forms import NetBoxModelBulkEditForm, OrganizationalModelBulkEditForm, PrimaryModelBulkEditForm from tenancy.models import Tenant from utilities.forms import BulkRenameForm, add_blank_choice -from utilities.forms.fields import CommentField, DynamicModelChoiceField, DynamicModelMultipleChoiceField +from utilities.forms.fields import DynamicModelChoiceField, DynamicModelMultipleChoiceField from utilities.forms.rendering import FieldSet from utilities.forms.widgets import BulkEditNullBooleanSelect from virtualization.choices import * @@ -28,13 +28,7 @@ __all__ = ( ) -class ClusterTypeBulkEditForm(NetBoxModelBulkEditForm): - description = forms.CharField( - label=_('Description'), - max_length=200, - required=False - ) - +class ClusterTypeBulkEditForm(OrganizationalModelBulkEditForm): model = ClusterType fieldsets = ( FieldSet('description'), @@ -42,13 +36,7 @@ class ClusterTypeBulkEditForm(NetBoxModelBulkEditForm): nullable_fields = ('description',) -class ClusterGroupBulkEditForm(NetBoxModelBulkEditForm): - description = forms.CharField( - label=_('Description'), - max_length=200, - required=False - ) - +class ClusterGroupBulkEditForm(OrganizationalModelBulkEditForm): model = ClusterGroup fieldsets = ( FieldSet('description'), @@ -56,7 +44,7 @@ class ClusterGroupBulkEditForm(NetBoxModelBulkEditForm): nullable_fields = ('description',) -class ClusterBulkEditForm(ScopedBulkEditForm, NetBoxModelBulkEditForm): +class ClusterBulkEditForm(ScopedBulkEditForm, PrimaryModelBulkEditForm): type = DynamicModelChoiceField( label=_('Type'), queryset=ClusterType.objects.all(), @@ -78,12 +66,6 @@ class ClusterBulkEditForm(ScopedBulkEditForm, NetBoxModelBulkEditForm): queryset=Tenant.objects.all(), required=False ) - description = forms.CharField( - label=_('Description'), - max_length=200, - required=False - ) - comments = CommentField() model = Cluster fieldsets = ( @@ -95,7 +77,7 @@ class ClusterBulkEditForm(ScopedBulkEditForm, NetBoxModelBulkEditForm): ) -class VirtualMachineBulkEditForm(NetBoxModelBulkEditForm): +class VirtualMachineBulkEditForm(PrimaryModelBulkEditForm): status = forms.ChoiceField( label=_('Status'), choices=add_blank_choice(VirtualMachineStatusChoices), @@ -155,16 +137,10 @@ class VirtualMachineBulkEditForm(NetBoxModelBulkEditForm): required=False, label=_('Disk (MB)') ) - description = forms.CharField( - label=_('Description'), - max_length=200, - required=False - ) config_template = DynamicModelChoiceField( queryset=ConfigTemplate.objects.all(), required=False ) - comments = CommentField() model = VirtualMachine fieldsets = ( diff --git a/netbox/vpn/forms/bulk_edit.py b/netbox/vpn/forms/bulk_edit.py index 700dadb70..487ca51c9 100644 --- a/netbox/vpn/forms/bulk_edit.py +++ b/netbox/vpn/forms/bulk_edit.py @@ -1,10 +1,10 @@ from django import forms from django.utils.translation import gettext_lazy as _ -from netbox.forms import NetBoxModelBulkEditForm +from netbox.forms import NetBoxModelBulkEditForm, OrganizationalModelBulkEditForm, PrimaryModelBulkEditForm from tenancy.models import Tenant from utilities.forms import add_blank_choice -from utilities.forms.fields import CommentField, DynamicModelChoiceField, DynamicModelMultipleChoiceField +from utilities.forms.fields import DynamicModelChoiceField, DynamicModelMultipleChoiceField from utilities.forms.rendering import FieldSet from vpn.choices import * from vpn.models import * @@ -23,18 +23,12 @@ __all__ = ( ) -class TunnelGroupBulkEditForm(NetBoxModelBulkEditForm): - description = forms.CharField( - label=_('Description'), - max_length=200, - required=False - ) - +class TunnelGroupBulkEditForm(OrganizationalModelBulkEditForm): model = TunnelGroup nullable_fields = ('description',) -class TunnelBulkEditForm(NetBoxModelBulkEditForm): +class TunnelBulkEditForm(PrimaryModelBulkEditForm): status = forms.ChoiceField( label=_('Status'), choices=add_blank_choice(TunnelStatusChoices), @@ -60,16 +54,10 @@ class TunnelBulkEditForm(NetBoxModelBulkEditForm): queryset=Tenant.objects.all(), required=False ) - description = forms.CharField( - label=_('Description'), - max_length=200, - required=False - ) tunnel_id = forms.IntegerField( label=_('Tunnel ID'), required=False ) - comments = CommentField() model = Tunnel fieldsets = ( @@ -92,7 +80,7 @@ class TunnelTerminationBulkEditForm(NetBoxModelBulkEditForm): model = TunnelTermination -class IKEProposalBulkEditForm(NetBoxModelBulkEditForm): +class IKEProposalBulkEditForm(PrimaryModelBulkEditForm): authentication_method = forms.ChoiceField( label=_('Authentication method'), choices=add_blank_choice(AuthenticationMethodChoices), @@ -117,12 +105,6 @@ class IKEProposalBulkEditForm(NetBoxModelBulkEditForm): label=_('SA lifetime'), required=False ) - description = forms.CharField( - label=_('Description'), - max_length=200, - required=False - ) - comments = CommentField() model = IKEProposal fieldsets = ( @@ -136,7 +118,7 @@ class IKEProposalBulkEditForm(NetBoxModelBulkEditForm): ) -class IKEPolicyBulkEditForm(NetBoxModelBulkEditForm): +class IKEPolicyBulkEditForm(PrimaryModelBulkEditForm): version = forms.ChoiceField( label=_('Version'), choices=add_blank_choice(IKEVersionChoices), @@ -151,12 +133,6 @@ class IKEPolicyBulkEditForm(NetBoxModelBulkEditForm): label=_('Pre-shared key'), required=False ) - description = forms.CharField( - label=_('Description'), - max_length=200, - required=False - ) - comments = CommentField() model = IKEPolicy fieldsets = ( @@ -167,7 +143,7 @@ class IKEPolicyBulkEditForm(NetBoxModelBulkEditForm): ) -class IPSecProposalBulkEditForm(NetBoxModelBulkEditForm): +class IPSecProposalBulkEditForm(PrimaryModelBulkEditForm): encryption_algorithm = forms.ChoiceField( label=_('Encryption algorithm'), choices=add_blank_choice(EncryptionAlgorithmChoices), @@ -186,12 +162,6 @@ class IPSecProposalBulkEditForm(NetBoxModelBulkEditForm): label=_('SA lifetime (KB)'), required=False ) - description = forms.CharField( - label=_('Description'), - max_length=200, - required=False - ) - comments = CommentField() model = IPSecProposal fieldsets = ( @@ -205,18 +175,12 @@ class IPSecProposalBulkEditForm(NetBoxModelBulkEditForm): ) -class IPSecPolicyBulkEditForm(NetBoxModelBulkEditForm): +class IPSecPolicyBulkEditForm(PrimaryModelBulkEditForm): pfs_group = forms.ChoiceField( label=_('PFS group'), choices=add_blank_choice(DHGroupChoices), required=False ) - description = forms.CharField( - label=_('Description'), - max_length=200, - required=False - ) - comments = CommentField() model = IPSecPolicy fieldsets = ( @@ -227,7 +191,7 @@ class IPSecPolicyBulkEditForm(NetBoxModelBulkEditForm): ) -class IPSecProfileBulkEditForm(NetBoxModelBulkEditForm): +class IPSecProfileBulkEditForm(PrimaryModelBulkEditForm): mode = forms.ChoiceField( label=_('Mode'), choices=add_blank_choice(IPSecModeChoices), @@ -243,12 +207,6 @@ class IPSecProfileBulkEditForm(NetBoxModelBulkEditForm): queryset=IPSecPolicy.objects.all(), required=False ) - description = forms.CharField( - label=_('Description'), - max_length=200, - required=False - ) - comments = CommentField() model = IPSecProfile fieldsets = ( @@ -259,7 +217,7 @@ class IPSecProfileBulkEditForm(NetBoxModelBulkEditForm): ) -class L2VPNBulkEditForm(NetBoxModelBulkEditForm): +class L2VPNBulkEditForm(PrimaryModelBulkEditForm): status = forms.ChoiceField( label=_('Status'), choices=L2VPNStatusChoices, @@ -274,12 +232,6 @@ class L2VPNBulkEditForm(NetBoxModelBulkEditForm): queryset=Tenant.objects.all(), required=False ) - description = forms.CharField( - label=_('Description'), - max_length=200, - required=False - ) - comments = CommentField() model = L2VPN fieldsets = ( diff --git a/netbox/wireless/forms/bulk_edit.py b/netbox/wireless/forms/bulk_edit.py index 1a75512e1..98645dfb8 100644 --- a/netbox/wireless/forms/bulk_edit.py +++ b/netbox/wireless/forms/bulk_edit.py @@ -5,10 +5,10 @@ from dcim.choices import LinkStatusChoices from dcim.forms.mixins import ScopedBulkEditForm from ipam.models import VLAN from netbox.choices import * -from netbox.forms import NetBoxModelBulkEditForm +from netbox.forms import NestedGroupModelBulkEditForm, PrimaryModelBulkEditForm from tenancy.models import Tenant from utilities.forms import add_blank_choice -from utilities.forms.fields import CommentField, DynamicModelChoiceField +from utilities.forms.fields import DynamicModelChoiceField from utilities.forms.rendering import FieldSet from wireless.choices import * from wireless.constants import SSID_MAX_LENGTH @@ -21,18 +21,12 @@ __all__ = ( ) -class WirelessLANGroupBulkEditForm(NetBoxModelBulkEditForm): +class WirelessLANGroupBulkEditForm(NestedGroupModelBulkEditForm): parent = DynamicModelChoiceField( label=_('Parent'), queryset=WirelessLANGroup.objects.all(), required=False ) - description = forms.CharField( - label=_('Description'), - max_length=200, - required=False - ) - comments = CommentField() model = WirelessLANGroup fieldsets = ( @@ -41,7 +35,7 @@ class WirelessLANGroupBulkEditForm(NetBoxModelBulkEditForm): nullable_fields = ('parent', 'description', 'comments') -class WirelessLANBulkEditForm(ScopedBulkEditForm, NetBoxModelBulkEditForm): +class WirelessLANBulkEditForm(ScopedBulkEditForm, PrimaryModelBulkEditForm): status = forms.ChoiceField( label=_('Status'), choices=add_blank_choice(WirelessLANStatusChoices), @@ -81,12 +75,6 @@ class WirelessLANBulkEditForm(ScopedBulkEditForm, NetBoxModelBulkEditForm): required=False, label=_('Pre-shared key') ) - description = forms.CharField( - label=_('Description'), - max_length=200, - required=False - ) - comments = CommentField() model = WirelessLAN fieldsets = ( @@ -99,7 +87,7 @@ class WirelessLANBulkEditForm(ScopedBulkEditForm, NetBoxModelBulkEditForm): ) -class WirelessLinkBulkEditForm(NetBoxModelBulkEditForm): +class WirelessLinkBulkEditForm(PrimaryModelBulkEditForm): ssid = forms.CharField( max_length=SSID_MAX_LENGTH, required=False, @@ -140,12 +128,6 @@ class WirelessLinkBulkEditForm(NetBoxModelBulkEditForm): required=False, initial='' ) - description = forms.CharField( - label=_('Description'), - max_length=200, - required=False - ) - comments = CommentField() model = WirelessLink fieldsets = (