Просмотр исходного кода

Merge pull request #7878 from netbox-community/7877-bootstrapmixin-cleanup

Closes #7877: BootstrapMixin cleanup
Jeremy Stretch 4 лет назад
Родитель
Сommit
30a5c70260

+ 5 - 7
netbox/circuits/forms/bulk_edit.py

@@ -4,9 +4,7 @@ from circuits.choices import CircuitStatusChoices
 from circuits.models import *
 from extras.forms import AddRemoveTagsForm, CustomFieldModelBulkEditForm
 from tenancy.models import Tenant
-from utilities.forms import (
-    add_blank_choice, BootstrapMixin, CommentField, DynamicModelChoiceField, SmallTextarea, StaticSelect,
-)
+from utilities.forms import add_blank_choice, CommentField, DynamicModelChoiceField, SmallTextarea, StaticSelect
 
 __all__ = (
     'CircuitBulkEditForm',
@@ -16,7 +14,7 @@ __all__ = (
 )
 
 
-class ProviderBulkEditForm(BootstrapMixin, AddRemoveTagsForm, CustomFieldModelBulkEditForm):
+class ProviderBulkEditForm(AddRemoveTagsForm, CustomFieldModelBulkEditForm):
     pk = forms.ModelMultipleChoiceField(
         queryset=Provider.objects.all(),
         widget=forms.MultipleHiddenInput
@@ -55,7 +53,7 @@ class ProviderBulkEditForm(BootstrapMixin, AddRemoveTagsForm, CustomFieldModelBu
         ]
 
 
-class ProviderNetworkBulkEditForm(BootstrapMixin, AddRemoveTagsForm, CustomFieldModelBulkEditForm):
+class ProviderNetworkBulkEditForm(AddRemoveTagsForm, CustomFieldModelBulkEditForm):
     pk = forms.ModelMultipleChoiceField(
         queryset=ProviderNetwork.objects.all(),
         widget=forms.MultipleHiddenInput
@@ -79,7 +77,7 @@ class ProviderNetworkBulkEditForm(BootstrapMixin, AddRemoveTagsForm, CustomField
         ]
 
 
-class CircuitTypeBulkEditForm(BootstrapMixin, AddRemoveTagsForm, CustomFieldModelBulkEditForm):
+class CircuitTypeBulkEditForm(AddRemoveTagsForm, CustomFieldModelBulkEditForm):
     pk = forms.ModelMultipleChoiceField(
         queryset=CircuitType.objects.all(),
         widget=forms.MultipleHiddenInput
@@ -93,7 +91,7 @@ class CircuitTypeBulkEditForm(BootstrapMixin, AddRemoveTagsForm, CustomFieldMode
         nullable_fields = ['description']
 
 
-class CircuitBulkEditForm(BootstrapMixin, AddRemoveTagsForm, CustomFieldModelBulkEditForm):
+class CircuitBulkEditForm(AddRemoveTagsForm, CustomFieldModelBulkEditForm):
     pk = forms.ModelMultipleChoiceField(
         queryset=Circuit.objects.all(),
         widget=forms.MultipleHiddenInput

+ 5 - 5
netbox/circuits/forms/filtersets.py

@@ -6,7 +6,7 @@ from circuits.models import *
 from dcim.models import Region, Site, SiteGroup
 from extras.forms import CustomFieldModelFilterForm
 from tenancy.forms import TenancyFilterForm
-from utilities.forms import BootstrapMixin, DynamicModelMultipleChoiceField, StaticSelectMultiple, TagFilterField
+from utilities.forms import DynamicModelMultipleChoiceField, StaticSelectMultiple, TagFilterField
 
 __all__ = (
     'CircuitFilterForm',
@@ -16,7 +16,7 @@ __all__ = (
 )
 
 
-class ProviderFilterForm(BootstrapMixin, CustomFieldModelFilterForm):
+class ProviderFilterForm(CustomFieldModelFilterForm):
     model = Provider
     field_groups = [
         ['q', 'tag'],
@@ -57,7 +57,7 @@ class ProviderFilterForm(BootstrapMixin, CustomFieldModelFilterForm):
     tag = TagFilterField(model)
 
 
-class ProviderNetworkFilterForm(BootstrapMixin, CustomFieldModelFilterForm):
+class ProviderNetworkFilterForm(CustomFieldModelFilterForm):
     model = ProviderNetwork
     field_groups = (
         ('q', 'tag'),
@@ -77,7 +77,7 @@ class ProviderNetworkFilterForm(BootstrapMixin, CustomFieldModelFilterForm):
     tag = TagFilterField(model)
 
 
-class CircuitTypeFilterForm(BootstrapMixin, CustomFieldModelFilterForm):
+class CircuitTypeFilterForm(CustomFieldModelFilterForm):
     model = CircuitType
     q = forms.CharField(
         required=False,
@@ -87,7 +87,7 @@ class CircuitTypeFilterForm(BootstrapMixin, CustomFieldModelFilterForm):
     tag = TagFilterField(model)
 
 
-class CircuitFilterForm(BootstrapMixin, TenancyFilterForm, CustomFieldModelFilterForm):
+class CircuitFilterForm(TenancyFilterForm, CustomFieldModelFilterForm):
     model = Circuit
     field_groups = [
         ['q', 'tag'],

+ 4 - 4
netbox/circuits/forms/models.py

@@ -19,7 +19,7 @@ __all__ = (
 )
 
 
-class ProviderForm(BootstrapMixin, CustomFieldModelForm):
+class ProviderForm(CustomFieldModelForm):
     slug = SlugField()
     comments = CommentField()
     tags = DynamicModelMultipleChoiceField(
@@ -53,7 +53,7 @@ class ProviderForm(BootstrapMixin, CustomFieldModelForm):
         }
 
 
-class ProviderNetworkForm(BootstrapMixin, CustomFieldModelForm):
+class ProviderNetworkForm(CustomFieldModelForm):
     provider = DynamicModelChoiceField(
         queryset=Provider.objects.all()
     )
@@ -73,7 +73,7 @@ class ProviderNetworkForm(BootstrapMixin, CustomFieldModelForm):
         )
 
 
-class CircuitTypeForm(BootstrapMixin, CustomFieldModelForm):
+class CircuitTypeForm(CustomFieldModelForm):
     slug = SlugField()
     tags = DynamicModelMultipleChoiceField(
         queryset=Tag.objects.all(),
@@ -87,7 +87,7 @@ class CircuitTypeForm(BootstrapMixin, CustomFieldModelForm):
         ]
 
 
-class CircuitForm(BootstrapMixin, TenancyForm, CustomFieldModelForm):
+class CircuitForm(TenancyForm, CustomFieldModelForm):
     provider = DynamicModelChoiceField(
         queryset=Provider.objects.all()
     )

+ 2 - 2
netbox/dcim/forms/bulk_create.py

@@ -3,7 +3,7 @@ from django import forms
 from dcim.models import *
 from extras.forms import CustomFieldsMixin
 from extras.models import Tag
-from utilities.forms import BootstrapMixin, DynamicModelMultipleChoiceField, form_from_model
+from utilities.forms import DynamicModelMultipleChoiceField, form_from_model
 from .object_create import ComponentForm
 
 __all__ = (
@@ -23,7 +23,7 @@ __all__ = (
 # Device components
 #
 
-class DeviceBulkAddComponentForm(BootstrapMixin, CustomFieldsMixin, ComponentForm):
+class DeviceBulkAddComponentForm(CustomFieldsMixin, ComponentForm):
     pk = forms.ModelMultipleChoiceField(
         queryset=Device.objects.all(),
         widget=forms.MultipleHiddenInput()

+ 26 - 35
netbox/dcim/forms/bulk_edit.py

@@ -11,8 +11,8 @@ from ipam.constants import BGP_ASN_MIN, BGP_ASN_MAX
 from ipam.models import VLAN, ASN
 from tenancy.models import Tenant
 from utilities.forms import (
-    add_blank_choice, BootstrapMixin, BulkEditForm, BulkEditNullBooleanSelect, ColorField, CommentField,
-    DynamicModelChoiceField, DynamicModelMultipleChoiceField, form_from_model, SmallTextarea, StaticSelect,
+    add_blank_choice, BulkEditForm, BulkEditNullBooleanSelect, ColorField, CommentField, DynamicModelChoiceField,
+    DynamicModelMultipleChoiceField, form_from_model, SmallTextarea, StaticSelect,
 )
 
 __all__ = (
@@ -52,7 +52,7 @@ __all__ = (
 )
 
 
-class RegionBulkEditForm(BootstrapMixin, AddRemoveTagsForm, CustomFieldModelBulkEditForm):
+class RegionBulkEditForm(AddRemoveTagsForm, CustomFieldModelBulkEditForm):
     pk = forms.ModelMultipleChoiceField(
         queryset=Region.objects.all(),
         widget=forms.MultipleHiddenInput
@@ -70,7 +70,7 @@ class RegionBulkEditForm(BootstrapMixin, AddRemoveTagsForm, CustomFieldModelBulk
         nullable_fields = ['parent', 'description']
 
 
-class SiteGroupBulkEditForm(BootstrapMixin, AddRemoveTagsForm, CustomFieldModelBulkEditForm):
+class SiteGroupBulkEditForm(AddRemoveTagsForm, CustomFieldModelBulkEditForm):
     pk = forms.ModelMultipleChoiceField(
         queryset=SiteGroup.objects.all(),
         widget=forms.MultipleHiddenInput
@@ -88,7 +88,7 @@ class SiteGroupBulkEditForm(BootstrapMixin, AddRemoveTagsForm, CustomFieldModelB
         nullable_fields = ['parent', 'description']
 
 
-class SiteBulkEditForm(BootstrapMixin, AddRemoveTagsForm, CustomFieldModelBulkEditForm):
+class SiteBulkEditForm(AddRemoveTagsForm, CustomFieldModelBulkEditForm):
     pk = forms.ModelMultipleChoiceField(
         queryset=Site.objects.all(),
         widget=forms.MultipleHiddenInput
@@ -138,7 +138,7 @@ class SiteBulkEditForm(BootstrapMixin, AddRemoveTagsForm, CustomFieldModelBulkEd
         ]
 
 
-class LocationBulkEditForm(BootstrapMixin, AddRemoveTagsForm, CustomFieldModelBulkEditForm):
+class LocationBulkEditForm(AddRemoveTagsForm, CustomFieldModelBulkEditForm):
     pk = forms.ModelMultipleChoiceField(
         queryset=Location.objects.all(),
         widget=forms.MultipleHiddenInput
@@ -167,7 +167,7 @@ class LocationBulkEditForm(BootstrapMixin, AddRemoveTagsForm, CustomFieldModelBu
         nullable_fields = ['parent', 'tenant', 'description']
 
 
-class RackRoleBulkEditForm(BootstrapMixin, AddRemoveTagsForm, CustomFieldModelBulkEditForm):
+class RackRoleBulkEditForm(AddRemoveTagsForm, CustomFieldModelBulkEditForm):
     pk = forms.ModelMultipleChoiceField(
         queryset=RackRole.objects.all(),
         widget=forms.MultipleHiddenInput
@@ -184,7 +184,7 @@ class RackRoleBulkEditForm(BootstrapMixin, AddRemoveTagsForm, CustomFieldModelBu
         nullable_fields = ['color', 'description']
 
 
-class RackBulkEditForm(BootstrapMixin, AddRemoveTagsForm, CustomFieldModelBulkEditForm):
+class RackBulkEditForm(AddRemoveTagsForm, CustomFieldModelBulkEditForm):
     pk = forms.ModelMultipleChoiceField(
         queryset=Rack.objects.all(),
         widget=forms.MultipleHiddenInput
@@ -284,7 +284,7 @@ class RackBulkEditForm(BootstrapMixin, AddRemoveTagsForm, CustomFieldModelBulkEd
         ]
 
 
-class RackReservationBulkEditForm(BootstrapMixin, AddRemoveTagsForm, CustomFieldModelBulkEditForm):
+class RackReservationBulkEditForm(AddRemoveTagsForm, CustomFieldModelBulkEditForm):
     pk = forms.ModelMultipleChoiceField(
         queryset=RackReservation.objects.all(),
         widget=forms.MultipleHiddenInput()
@@ -309,7 +309,7 @@ class RackReservationBulkEditForm(BootstrapMixin, AddRemoveTagsForm, CustomField
         nullable_fields = []
 
 
-class ManufacturerBulkEditForm(BootstrapMixin, AddRemoveTagsForm, CustomFieldModelBulkEditForm):
+class ManufacturerBulkEditForm(AddRemoveTagsForm, CustomFieldModelBulkEditForm):
     pk = forms.ModelMultipleChoiceField(
         queryset=Manufacturer.objects.all(),
         widget=forms.MultipleHiddenInput
@@ -323,7 +323,7 @@ class ManufacturerBulkEditForm(BootstrapMixin, AddRemoveTagsForm, CustomFieldMod
         nullable_fields = ['description']
 
 
-class DeviceTypeBulkEditForm(BootstrapMixin, AddRemoveTagsForm, CustomFieldModelBulkEditForm):
+class DeviceTypeBulkEditForm(AddRemoveTagsForm, CustomFieldModelBulkEditForm):
     pk = forms.ModelMultipleChoiceField(
         queryset=DeviceType.objects.all(),
         widget=forms.MultipleHiddenInput()
@@ -351,7 +351,7 @@ class DeviceTypeBulkEditForm(BootstrapMixin, AddRemoveTagsForm, CustomFieldModel
         nullable_fields = ['airflow']
 
 
-class DeviceRoleBulkEditForm(BootstrapMixin, AddRemoveTagsForm, CustomFieldModelBulkEditForm):
+class DeviceRoleBulkEditForm(AddRemoveTagsForm, CustomFieldModelBulkEditForm):
     pk = forms.ModelMultipleChoiceField(
         queryset=DeviceRole.objects.all(),
         widget=forms.MultipleHiddenInput
@@ -373,7 +373,7 @@ class DeviceRoleBulkEditForm(BootstrapMixin, AddRemoveTagsForm, CustomFieldModel
         nullable_fields = ['color', 'description']
 
 
-class PlatformBulkEditForm(BootstrapMixin, AddRemoveTagsForm, CustomFieldModelBulkEditForm):
+class PlatformBulkEditForm(AddRemoveTagsForm, CustomFieldModelBulkEditForm):
     pk = forms.ModelMultipleChoiceField(
         queryset=Platform.objects.all(),
         widget=forms.MultipleHiddenInput
@@ -396,7 +396,7 @@ class PlatformBulkEditForm(BootstrapMixin, AddRemoveTagsForm, CustomFieldModelBu
         nullable_fields = ['manufacturer', 'napalm_driver', 'description']
 
 
-class DeviceBulkEditForm(BootstrapMixin, AddRemoveTagsForm, CustomFieldModelBulkEditForm):
+class DeviceBulkEditForm(AddRemoveTagsForm, CustomFieldModelBulkEditForm):
     pk = forms.ModelMultipleChoiceField(
         queryset=Device.objects.all(),
         widget=forms.MultipleHiddenInput()
@@ -457,7 +457,7 @@ class DeviceBulkEditForm(BootstrapMixin, AddRemoveTagsForm, CustomFieldModelBulk
         ]
 
 
-class CableBulkEditForm(BootstrapMixin, AddRemoveTagsForm, CustomFieldModelBulkEditForm):
+class CableBulkEditForm(AddRemoveTagsForm, CustomFieldModelBulkEditForm):
     pk = forms.ModelMultipleChoiceField(
         queryset=Cable.objects.all(),
         widget=forms.MultipleHiddenInput
@@ -513,7 +513,7 @@ class CableBulkEditForm(BootstrapMixin, AddRemoveTagsForm, CustomFieldModelBulkE
             })
 
 
-class VirtualChassisBulkEditForm(BootstrapMixin, AddRemoveTagsForm, CustomFieldModelBulkEditForm):
+class VirtualChassisBulkEditForm(AddRemoveTagsForm, CustomFieldModelBulkEditForm):
     pk = forms.ModelMultipleChoiceField(
         queryset=VirtualChassis.objects.all(),
         widget=forms.MultipleHiddenInput()
@@ -527,7 +527,7 @@ class VirtualChassisBulkEditForm(BootstrapMixin, AddRemoveTagsForm, CustomFieldM
         nullable_fields = ['domain']
 
 
-class PowerPanelBulkEditForm(BootstrapMixin, AddRemoveTagsForm, CustomFieldModelBulkEditForm):
+class PowerPanelBulkEditForm(AddRemoveTagsForm, CustomFieldModelBulkEditForm):
     pk = forms.ModelMultipleChoiceField(
         queryset=PowerPanel.objects.all(),
         widget=forms.MultipleHiddenInput
@@ -566,7 +566,7 @@ class PowerPanelBulkEditForm(BootstrapMixin, AddRemoveTagsForm, CustomFieldModel
         nullable_fields = ['location']
 
 
-class PowerFeedBulkEditForm(BootstrapMixin, AddRemoveTagsForm, CustomFieldModelBulkEditForm):
+class PowerFeedBulkEditForm(AddRemoveTagsForm, CustomFieldModelBulkEditForm):
     pk = forms.ModelMultipleChoiceField(
         queryset=PowerFeed.objects.all(),
         widget=forms.MultipleHiddenInput
@@ -631,7 +631,7 @@ class PowerFeedBulkEditForm(BootstrapMixin, AddRemoveTagsForm, CustomFieldModelB
 # Device component templates
 #
 
-class ConsolePortTemplateBulkEditForm(BootstrapMixin, BulkEditForm):
+class ConsolePortTemplateBulkEditForm(BulkEditForm):
     pk = forms.ModelMultipleChoiceField(
         queryset=ConsolePortTemplate.objects.all(),
         widget=forms.MultipleHiddenInput()
@@ -650,7 +650,7 @@ class ConsolePortTemplateBulkEditForm(BootstrapMixin, BulkEditForm):
         nullable_fields = ('label', 'type', 'description')
 
 
-class ConsoleServerPortTemplateBulkEditForm(BootstrapMixin, BulkEditForm):
+class ConsoleServerPortTemplateBulkEditForm(BulkEditForm):
     pk = forms.ModelMultipleChoiceField(
         queryset=ConsoleServerPortTemplate.objects.all(),
         widget=forms.MultipleHiddenInput()
@@ -672,7 +672,7 @@ class ConsoleServerPortTemplateBulkEditForm(BootstrapMixin, BulkEditForm):
         nullable_fields = ('label', 'type', 'description')
 
 
-class PowerPortTemplateBulkEditForm(BootstrapMixin, BulkEditForm):
+class PowerPortTemplateBulkEditForm(BulkEditForm):
     pk = forms.ModelMultipleChoiceField(
         queryset=PowerPortTemplate.objects.all(),
         widget=forms.MultipleHiddenInput()
@@ -704,7 +704,7 @@ class PowerPortTemplateBulkEditForm(BootstrapMixin, BulkEditForm):
         nullable_fields = ('label', 'type', 'maximum_draw', 'allocated_draw', 'description')
 
 
-class PowerOutletTemplateBulkEditForm(BootstrapMixin, BulkEditForm):
+class PowerOutletTemplateBulkEditForm(BulkEditForm):
     pk = forms.ModelMultipleChoiceField(
         queryset=PowerOutletTemplate.objects.all(),
         widget=forms.MultipleHiddenInput()
@@ -752,7 +752,7 @@ class PowerOutletTemplateBulkEditForm(BootstrapMixin, BulkEditForm):
             self.fields['power_port'].widget.attrs['disabled'] = True
 
 
-class InterfaceTemplateBulkEditForm(BootstrapMixin, BulkEditForm):
+class InterfaceTemplateBulkEditForm(BulkEditForm):
     pk = forms.ModelMultipleChoiceField(
         queryset=InterfaceTemplate.objects.all(),
         widget=forms.MultipleHiddenInput()
@@ -779,7 +779,7 @@ class InterfaceTemplateBulkEditForm(BootstrapMixin, BulkEditForm):
         nullable_fields = ('label', 'description')
 
 
-class FrontPortTemplateBulkEditForm(BootstrapMixin, BulkEditForm):
+class FrontPortTemplateBulkEditForm(BulkEditForm):
     pk = forms.ModelMultipleChoiceField(
         queryset=FrontPortTemplate.objects.all(),
         widget=forms.MultipleHiddenInput()
@@ -804,7 +804,7 @@ class FrontPortTemplateBulkEditForm(BootstrapMixin, BulkEditForm):
         nullable_fields = ('description',)
 
 
-class RearPortTemplateBulkEditForm(BootstrapMixin, BulkEditForm):
+class RearPortTemplateBulkEditForm(BulkEditForm):
     pk = forms.ModelMultipleChoiceField(
         queryset=RearPortTemplate.objects.all(),
         widget=forms.MultipleHiddenInput()
@@ -829,7 +829,7 @@ class RearPortTemplateBulkEditForm(BootstrapMixin, BulkEditForm):
         nullable_fields = ('description',)
 
 
-class DeviceBayTemplateBulkEditForm(BootstrapMixin, BulkEditForm):
+class DeviceBayTemplateBulkEditForm(BulkEditForm):
     pk = forms.ModelMultipleChoiceField(
         queryset=DeviceBayTemplate.objects.all(),
         widget=forms.MultipleHiddenInput()
@@ -852,7 +852,6 @@ class DeviceBayTemplateBulkEditForm(BootstrapMixin, BulkEditForm):
 
 class ConsolePortBulkEditForm(
     form_from_model(ConsolePort, ['label', 'type', 'speed', 'mark_connected', 'description']),
-    BootstrapMixin,
     AddRemoveTagsForm,
     CustomFieldModelBulkEditForm
 ):
@@ -871,7 +870,6 @@ class ConsolePortBulkEditForm(
 
 class ConsoleServerPortBulkEditForm(
     form_from_model(ConsoleServerPort, ['label', 'type', 'speed', 'mark_connected', 'description']),
-    BootstrapMixin,
     AddRemoveTagsForm,
     CustomFieldModelBulkEditForm
 ):
@@ -890,7 +888,6 @@ class ConsoleServerPortBulkEditForm(
 
 class PowerPortBulkEditForm(
     form_from_model(PowerPort, ['label', 'type', 'maximum_draw', 'allocated_draw', 'mark_connected', 'description']),
-    BootstrapMixin,
     AddRemoveTagsForm,
     CustomFieldModelBulkEditForm
 ):
@@ -909,7 +906,6 @@ class PowerPortBulkEditForm(
 
 class PowerOutletBulkEditForm(
     form_from_model(PowerOutlet, ['label', 'type', 'feed_leg', 'power_port', 'mark_connected', 'description']),
-    BootstrapMixin,
     AddRemoveTagsForm,
     CustomFieldModelBulkEditForm
 ):
@@ -948,7 +944,6 @@ class InterfaceBulkEditForm(
         'label', 'type', 'parent', 'bridge', 'lag', 'mac_address', 'wwn', 'mtu', 'mgmt_only', 'mark_connected',
         'description', 'mode', 'rf_role', 'rf_channel', 'rf_channel_frequency', 'rf_channel_width', 'tx_power',
     ]),
-    BootstrapMixin,
     AddRemoveTagsForm,
     CustomFieldModelBulkEditForm
 ):
@@ -1061,7 +1056,6 @@ class InterfaceBulkEditForm(
 
 class FrontPortBulkEditForm(
     form_from_model(FrontPort, ['label', 'type', 'color', 'mark_connected', 'description']),
-    BootstrapMixin,
     AddRemoveTagsForm,
     CustomFieldModelBulkEditForm
 ):
@@ -1076,7 +1070,6 @@ class FrontPortBulkEditForm(
 
 class RearPortBulkEditForm(
     form_from_model(RearPort, ['label', 'type', 'color', 'mark_connected', 'description']),
-    BootstrapMixin,
     AddRemoveTagsForm,
     CustomFieldModelBulkEditForm
 ):
@@ -1091,7 +1084,6 @@ class RearPortBulkEditForm(
 
 class DeviceBayBulkEditForm(
     form_from_model(DeviceBay, ['label', 'description']),
-    BootstrapMixin,
     AddRemoveTagsForm,
     CustomFieldModelBulkEditForm
 ):
@@ -1106,7 +1098,6 @@ class DeviceBayBulkEditForm(
 
 class InventoryItemBulkEditForm(
     form_from_model(InventoryItem, ['label', 'manufacturer', 'part_id', 'description']),
-    BootstrapMixin,
     AddRemoveTagsForm,
     CustomFieldModelBulkEditForm
 ):

+ 4 - 4
netbox/dcim/forms/connections.py

@@ -3,7 +3,7 @@ from dcim.models import *
 from extras.forms import CustomFieldModelForm
 from extras.models import Tag
 from tenancy.forms import TenancyForm
-from utilities.forms import BootstrapMixin, DynamicModelChoiceField, DynamicModelMultipleChoiceField, StaticSelect
+from utilities.forms import DynamicModelChoiceField, DynamicModelMultipleChoiceField, StaticSelect
 
 __all__ = (
     'ConnectCableToCircuitTerminationForm',
@@ -18,7 +18,7 @@ __all__ = (
 )
 
 
-class ConnectCableToDeviceForm(BootstrapMixin, TenancyForm, CustomFieldModelForm):
+class ConnectCableToDeviceForm(TenancyForm, CustomFieldModelForm):
     """
     Base form for connecting a Cable to a Device component
     """
@@ -171,7 +171,7 @@ class ConnectCableToRearPortForm(ConnectCableToDeviceForm):
     )
 
 
-class ConnectCableToCircuitTerminationForm(BootstrapMixin, TenancyForm, CustomFieldModelForm):
+class ConnectCableToCircuitTerminationForm(TenancyForm, CustomFieldModelForm):
     termination_b_provider = DynamicModelChoiceField(
         queryset=Provider.objects.all(),
         label='Provider',
@@ -229,7 +229,7 @@ class ConnectCableToCircuitTerminationForm(BootstrapMixin, TenancyForm, CustomFi
         return getattr(self.cleaned_data['termination_b_id'], 'pk', None)
 
 
-class ConnectCableToPowerFeedForm(BootstrapMixin, TenancyForm, CustomFieldModelForm):
+class ConnectCableToPowerFeedForm(TenancyForm, CustomFieldModelForm):
     termination_b_region = DynamicModelChoiceField(
         queryset=Region.objects.all(),
         label='Region',

+ 17 - 17
netbox/dcim/forms/filtersets.py

@@ -47,7 +47,7 @@ __all__ = (
 )
 
 
-class DeviceComponentFilterForm(BootstrapMixin, CustomFieldModelFilterForm):
+class DeviceComponentFilterForm(CustomFieldModelFilterForm):
     field_order = [
         'q', 'name', 'label', 'region_id', 'site_group_id', 'site_id',
     ]
@@ -112,7 +112,7 @@ class DeviceComponentFilterForm(BootstrapMixin, CustomFieldModelFilterForm):
     )
 
 
-class RegionFilterForm(BootstrapMixin, CustomFieldModelFilterForm):
+class RegionFilterForm(CustomFieldModelFilterForm):
     model = Region
     q = forms.CharField(
         required=False,
@@ -128,7 +128,7 @@ class RegionFilterForm(BootstrapMixin, CustomFieldModelFilterForm):
     tag = TagFilterField(model)
 
 
-class SiteGroupFilterForm(BootstrapMixin, CustomFieldModelFilterForm):
+class SiteGroupFilterForm(CustomFieldModelFilterForm):
     model = SiteGroup
     q = forms.CharField(
         required=False,
@@ -144,7 +144,7 @@ class SiteGroupFilterForm(BootstrapMixin, CustomFieldModelFilterForm):
     tag = TagFilterField(model)
 
 
-class SiteFilterForm(BootstrapMixin, TenancyFilterForm, CustomFieldModelFilterForm):
+class SiteFilterForm(TenancyFilterForm, CustomFieldModelFilterForm):
     model = Site
     field_order = ['q', 'status', 'region_id', 'tenant_group_id', 'tenant_id', 'asn_id']
     field_groups = [
@@ -184,7 +184,7 @@ class SiteFilterForm(BootstrapMixin, TenancyFilterForm, CustomFieldModelFilterFo
     tag = TagFilterField(model)
 
 
-class LocationFilterForm(BootstrapMixin, TenancyFilterForm, CustomFieldModelFilterForm):
+class LocationFilterForm(TenancyFilterForm, CustomFieldModelFilterForm):
     model = Location
     field_groups = [
         ['q'],
@@ -231,7 +231,7 @@ class LocationFilterForm(BootstrapMixin, TenancyFilterForm, CustomFieldModelFilt
     tag = TagFilterField(model)
 
 
-class RackRoleFilterForm(BootstrapMixin, CustomFieldModelFilterForm):
+class RackRoleFilterForm(CustomFieldModelFilterForm):
     model = RackRole
     q = forms.CharField(
         required=False,
@@ -241,7 +241,7 @@ class RackRoleFilterForm(BootstrapMixin, CustomFieldModelFilterForm):
     tag = TagFilterField(model)
 
 
-class RackFilterForm(BootstrapMixin, TenancyFilterForm, CustomFieldModelFilterForm):
+class RackFilterForm(TenancyFilterForm, CustomFieldModelFilterForm):
     model = Rack
     field_order = ['q', 'region_id', 'site_id', 'location_id', 'status', 'role_id', 'tenant_group_id', 'tenant_id']
     field_groups = [
@@ -329,7 +329,7 @@ class RackElevationFilterForm(RackFilterForm):
     )
 
 
-class RackReservationFilterForm(BootstrapMixin, TenancyFilterForm, CustomFieldModelFilterForm):
+class RackReservationFilterForm(TenancyFilterForm, CustomFieldModelFilterForm):
     model = RackReservation
     field_order = ['q', 'region_id', 'site_id', 'location_id', 'user_id', 'tenant_group_id', 'tenant_id']
     field_groups = [
@@ -377,7 +377,7 @@ class RackReservationFilterForm(BootstrapMixin, TenancyFilterForm, CustomFieldMo
     tag = TagFilterField(model)
 
 
-class ManufacturerFilterForm(BootstrapMixin, CustomFieldModelFilterForm):
+class ManufacturerFilterForm(CustomFieldModelFilterForm):
     model = Manufacturer
     q = forms.CharField(
         required=False,
@@ -387,7 +387,7 @@ class ManufacturerFilterForm(BootstrapMixin, CustomFieldModelFilterForm):
     tag = TagFilterField(model)
 
 
-class DeviceTypeFilterForm(BootstrapMixin, CustomFieldModelFilterForm):
+class DeviceTypeFilterForm(CustomFieldModelFilterForm):
     model = DeviceType
     field_groups = [
         ['q', 'tag'],
@@ -460,7 +460,7 @@ class DeviceTypeFilterForm(BootstrapMixin, CustomFieldModelFilterForm):
     tag = TagFilterField(model)
 
 
-class DeviceRoleFilterForm(BootstrapMixin, CustomFieldModelFilterForm):
+class DeviceRoleFilterForm(CustomFieldModelFilterForm):
     model = DeviceRole
     q = forms.CharField(
         required=False,
@@ -470,7 +470,7 @@ class DeviceRoleFilterForm(BootstrapMixin, CustomFieldModelFilterForm):
     tag = TagFilterField(model)
 
 
-class PlatformFilterForm(BootstrapMixin, CustomFieldModelFilterForm):
+class PlatformFilterForm(CustomFieldModelFilterForm):
     model = Platform
     q = forms.CharField(
         required=False,
@@ -486,7 +486,7 @@ class PlatformFilterForm(BootstrapMixin, CustomFieldModelFilterForm):
     tag = TagFilterField(model)
 
 
-class DeviceFilterForm(BootstrapMixin, LocalConfigContextFilterForm, TenancyFilterForm, CustomFieldModelFilterForm):
+class DeviceFilterForm(LocalConfigContextFilterForm, TenancyFilterForm, CustomFieldModelFilterForm):
     model = Device
     field_order = [
         'q', 'region_id', 'site_group_id', 'site_id', 'location_id', 'rack_id', 'status', 'role_id', 'tenant_group_id',
@@ -658,7 +658,7 @@ class DeviceFilterForm(BootstrapMixin, LocalConfigContextFilterForm, TenancyFilt
     tag = TagFilterField(model)
 
 
-class VirtualChassisFilterForm(BootstrapMixin, TenancyFilterForm, CustomFieldModelFilterForm):
+class VirtualChassisFilterForm(TenancyFilterForm, CustomFieldModelFilterForm):
     model = VirtualChassis
     field_order = ['q', 'region_id', 'site_group_id', 'site_id', 'tenant_group_id', 'tenant_id']
     field_groups = [
@@ -696,7 +696,7 @@ class VirtualChassisFilterForm(BootstrapMixin, TenancyFilterForm, CustomFieldMod
     tag = TagFilterField(model)
 
 
-class CableFilterForm(BootstrapMixin, TenancyFilterForm, CustomFieldModelFilterForm):
+class CableFilterForm(TenancyFilterForm, CustomFieldModelFilterForm):
     model = Cable
     field_groups = [
         ['q', 'tag'],
@@ -761,7 +761,7 @@ class CableFilterForm(BootstrapMixin, TenancyFilterForm, CustomFieldModelFilterF
     tag = TagFilterField(model)
 
 
-class PowerPanelFilterForm(BootstrapMixin, CustomFieldModelFilterForm):
+class PowerPanelFilterForm(CustomFieldModelFilterForm):
     model = PowerPanel
     field_groups = (
         ('q', 'tag'),
@@ -807,7 +807,7 @@ class PowerPanelFilterForm(BootstrapMixin, CustomFieldModelFilterForm):
     tag = TagFilterField(model)
 
 
-class PowerFeedFilterForm(BootstrapMixin, CustomFieldModelFilterForm):
+class PowerFeedFilterForm(CustomFieldModelFilterForm):
     model = PowerFeed
     field_groups = [
         ['q', 'tag'],

+ 25 - 25
netbox/dcim/forms/models.py

@@ -66,7 +66,7 @@ Tagged (All): Implies all VLANs are available (w/optional untagged VLAN)
 """
 
 
-class RegionForm(BootstrapMixin, CustomFieldModelForm):
+class RegionForm(CustomFieldModelForm):
     parent = DynamicModelChoiceField(
         queryset=Region.objects.all(),
         required=False
@@ -84,7 +84,7 @@ class RegionForm(BootstrapMixin, CustomFieldModelForm):
         )
 
 
-class SiteGroupForm(BootstrapMixin, CustomFieldModelForm):
+class SiteGroupForm(CustomFieldModelForm):
     parent = DynamicModelChoiceField(
         queryset=SiteGroup.objects.all(),
         required=False
@@ -102,7 +102,7 @@ class SiteGroupForm(BootstrapMixin, CustomFieldModelForm):
         )
 
 
-class SiteForm(BootstrapMixin, TenancyForm, CustomFieldModelForm):
+class SiteForm(TenancyForm, CustomFieldModelForm):
     region = DynamicModelChoiceField(
         queryset=Region.objects.all(),
         required=False
@@ -173,7 +173,7 @@ class SiteForm(BootstrapMixin, TenancyForm, CustomFieldModelForm):
         }
 
 
-class LocationForm(BootstrapMixin, TenancyForm, CustomFieldModelForm):
+class LocationForm(TenancyForm, CustomFieldModelForm):
     region = DynamicModelChoiceField(
         queryset=Region.objects.all(),
         required=False,
@@ -221,7 +221,7 @@ class LocationForm(BootstrapMixin, TenancyForm, CustomFieldModelForm):
         )
 
 
-class RackRoleForm(BootstrapMixin, CustomFieldModelForm):
+class RackRoleForm(CustomFieldModelForm):
     slug = SlugField()
     tags = DynamicModelMultipleChoiceField(
         queryset=Tag.objects.all(),
@@ -235,7 +235,7 @@ class RackRoleForm(BootstrapMixin, CustomFieldModelForm):
         ]
 
 
-class RackForm(BootstrapMixin, TenancyForm, CustomFieldModelForm):
+class RackForm(TenancyForm, CustomFieldModelForm):
     region = DynamicModelChoiceField(
         queryset=Region.objects.all(),
         required=False,
@@ -295,7 +295,7 @@ class RackForm(BootstrapMixin, TenancyForm, CustomFieldModelForm):
         }
 
 
-class RackReservationForm(BootstrapMixin, TenancyForm, CustomFieldModelForm):
+class RackReservationForm(TenancyForm, CustomFieldModelForm):
     region = DynamicModelChoiceField(
         queryset=Region.objects.all(),
         required=False,
@@ -365,7 +365,7 @@ class RackReservationForm(BootstrapMixin, TenancyForm, CustomFieldModelForm):
         )
 
 
-class ManufacturerForm(BootstrapMixin, CustomFieldModelForm):
+class ManufacturerForm(CustomFieldModelForm):
     slug = SlugField()
     tags = DynamicModelMultipleChoiceField(
         queryset=Tag.objects.all(),
@@ -379,7 +379,7 @@ class ManufacturerForm(BootstrapMixin, CustomFieldModelForm):
         ]
 
 
-class DeviceTypeForm(BootstrapMixin, CustomFieldModelForm):
+class DeviceTypeForm(CustomFieldModelForm):
     manufacturer = DynamicModelChoiceField(
         queryset=Manufacturer.objects.all()
     )
@@ -418,7 +418,7 @@ class DeviceTypeForm(BootstrapMixin, CustomFieldModelForm):
         }
 
 
-class DeviceRoleForm(BootstrapMixin, CustomFieldModelForm):
+class DeviceRoleForm(CustomFieldModelForm):
     slug = SlugField()
     tags = DynamicModelMultipleChoiceField(
         queryset=Tag.objects.all(),
@@ -432,7 +432,7 @@ class DeviceRoleForm(BootstrapMixin, CustomFieldModelForm):
         ]
 
 
-class PlatformForm(BootstrapMixin, CustomFieldModelForm):
+class PlatformForm(CustomFieldModelForm):
     manufacturer = DynamicModelChoiceField(
         queryset=Manufacturer.objects.all(),
         required=False
@@ -455,7 +455,7 @@ class PlatformForm(BootstrapMixin, CustomFieldModelForm):
         }
 
 
-class DeviceForm(BootstrapMixin, TenancyForm, CustomFieldModelForm):
+class DeviceForm(TenancyForm, CustomFieldModelForm):
     region = DynamicModelChoiceField(
         queryset=Region.objects.all(),
         required=False,
@@ -637,7 +637,7 @@ class DeviceForm(BootstrapMixin, TenancyForm, CustomFieldModelForm):
             self.fields['position'].widget.choices = [(position, f'U{position}')]
 
 
-class CableForm(BootstrapMixin, TenancyForm, CustomFieldModelForm):
+class CableForm(TenancyForm, CustomFieldModelForm):
     tags = DynamicModelMultipleChoiceField(
         queryset=Tag.objects.all(),
         required=False
@@ -660,7 +660,7 @@ class CableForm(BootstrapMixin, TenancyForm, CustomFieldModelForm):
         }
 
 
-class PowerPanelForm(BootstrapMixin, CustomFieldModelForm):
+class PowerPanelForm(CustomFieldModelForm):
     region = DynamicModelChoiceField(
         queryset=Region.objects.all(),
         required=False,
@@ -704,7 +704,7 @@ class PowerPanelForm(BootstrapMixin, CustomFieldModelForm):
         )
 
 
-class PowerFeedForm(BootstrapMixin, CustomFieldModelForm):
+class PowerFeedForm(CustomFieldModelForm):
     region = DynamicModelChoiceField(
         queryset=Region.objects.all(),
         required=False,
@@ -772,7 +772,7 @@ class PowerFeedForm(BootstrapMixin, CustomFieldModelForm):
 # Virtual chassis
 #
 
-class VirtualChassisForm(BootstrapMixin, CustomFieldModelForm):
+class VirtualChassisForm(CustomFieldModelForm):
     master = forms.ModelChoiceField(
         queryset=Device.objects.all(),
         required=False,
@@ -1005,7 +1005,7 @@ class DeviceBayTemplateForm(BootstrapMixin, forms.ModelForm):
 # Device components
 #
 
-class ConsolePortForm(BootstrapMixin, CustomFieldModelForm):
+class ConsolePortForm(CustomFieldModelForm):
     tags = DynamicModelMultipleChoiceField(
         queryset=Tag.objects.all(),
         required=False
@@ -1021,7 +1021,7 @@ class ConsolePortForm(BootstrapMixin, CustomFieldModelForm):
         }
 
 
-class ConsoleServerPortForm(BootstrapMixin, CustomFieldModelForm):
+class ConsoleServerPortForm(CustomFieldModelForm):
     tags = DynamicModelMultipleChoiceField(
         queryset=Tag.objects.all(),
         required=False
@@ -1037,7 +1037,7 @@ class ConsoleServerPortForm(BootstrapMixin, CustomFieldModelForm):
         }
 
 
-class PowerPortForm(BootstrapMixin, CustomFieldModelForm):
+class PowerPortForm(CustomFieldModelForm):
     tags = DynamicModelMultipleChoiceField(
         queryset=Tag.objects.all(),
         required=False
@@ -1054,7 +1054,7 @@ class PowerPortForm(BootstrapMixin, CustomFieldModelForm):
         }
 
 
-class PowerOutletForm(BootstrapMixin, CustomFieldModelForm):
+class PowerOutletForm(CustomFieldModelForm):
     power_port = forms.ModelChoiceField(
         queryset=PowerPort.objects.all(),
         required=False
@@ -1083,7 +1083,7 @@ class PowerOutletForm(BootstrapMixin, CustomFieldModelForm):
             )
 
 
-class InterfaceForm(BootstrapMixin, InterfaceCommonForm, CustomFieldModelForm):
+class InterfaceForm(InterfaceCommonForm, CustomFieldModelForm):
     parent = DynamicModelChoiceField(
         queryset=Interface.objects.all(),
         required=False,
@@ -1183,7 +1183,7 @@ class InterfaceForm(BootstrapMixin, InterfaceCommonForm, CustomFieldModelForm):
         self.fields['tagged_vlans'].widget.add_query_param('available_on_device', device.pk)
 
 
-class FrontPortForm(BootstrapMixin, CustomFieldModelForm):
+class FrontPortForm(CustomFieldModelForm):
     tags = DynamicModelMultipleChoiceField(
         queryset=Tag.objects.all(),
         required=False
@@ -1211,7 +1211,7 @@ class FrontPortForm(BootstrapMixin, CustomFieldModelForm):
             )
 
 
-class RearPortForm(BootstrapMixin, CustomFieldModelForm):
+class RearPortForm(CustomFieldModelForm):
     tags = DynamicModelMultipleChoiceField(
         queryset=Tag.objects.all(),
         required=False
@@ -1228,7 +1228,7 @@ class RearPortForm(BootstrapMixin, CustomFieldModelForm):
         }
 
 
-class DeviceBayForm(BootstrapMixin, CustomFieldModelForm):
+class DeviceBayForm(CustomFieldModelForm):
     tags = DynamicModelMultipleChoiceField(
         queryset=Tag.objects.all(),
         required=False
@@ -1264,7 +1264,7 @@ class PopulateDeviceBayForm(BootstrapMixin, forms.Form):
         ).exclude(pk=device_bay.device.pk)
 
 
-class InventoryItemForm(BootstrapMixin, CustomFieldModelForm):
+class InventoryItemForm(CustomFieldModelForm):
     device = DynamicModelChoiceField(
         queryset=Device.objects.all()
     )

+ 4 - 4
netbox/dcim/forms/object_create.py

@@ -35,7 +35,7 @@ __all__ = (
 )
 
 
-class ComponentForm(forms.Form):
+class ComponentForm(BootstrapMixin, forms.Form):
     """
     Subclass this form when facilitating the creation of one or more device component or component templates based on
     a name pattern.
@@ -63,7 +63,7 @@ class ComponentForm(forms.Form):
                 }, code='label_pattern_mismatch')
 
 
-class VirtualChassisCreateForm(BootstrapMixin, CustomFieldModelForm):
+class VirtualChassisCreateForm(CustomFieldModelForm):
     region = DynamicModelChoiceField(
         queryset=Region.objects.all(),
         required=False,
@@ -142,7 +142,7 @@ class VirtualChassisCreateForm(BootstrapMixin, CustomFieldModelForm):
 # Component templates
 #
 
-class ComponentTemplateCreateForm(BootstrapMixin, ComponentForm):
+class ComponentTemplateCreateForm(ComponentForm):
     """
     Base form for the creation of device component templates (subclassed from ComponentTemplateModel).
     """
@@ -335,7 +335,7 @@ class DeviceBayTemplateCreateForm(ComponentTemplateCreateForm):
 # Device components
 #
 
-class ComponentCreateForm(BootstrapMixin, CustomFieldsMixin, ComponentForm):
+class ComponentCreateForm(CustomFieldsMixin, ComponentForm):
     """
     Base form for the creation of device components (models subclassed from ComponentModel).
     """

+ 8 - 10
netbox/extras/forms/bulk_edit.py

@@ -4,9 +4,7 @@ from django.contrib.contenttypes.models import ContentType
 from extras.choices import *
 from extras.models import *
 from extras.utils import FeatureQuery
-from utilities.forms import (
-    BootstrapMixin, BulkEditForm, BulkEditNullBooleanSelect, ColorField, ContentTypeChoiceField, StaticSelect,
-)
+from utilities.forms import BulkEditForm, BulkEditNullBooleanSelect, ColorField, ContentTypeChoiceField, StaticSelect
 
 __all__ = (
     'ConfigContextBulkEditForm',
@@ -19,7 +17,7 @@ __all__ = (
 )
 
 
-class CustomFieldBulkEditForm(BootstrapMixin, BulkEditForm):
+class CustomFieldBulkEditForm(BulkEditForm):
     pk = forms.ModelMultipleChoiceField(
         queryset=CustomField.objects.all(),
         widget=forms.MultipleHiddenInput
@@ -39,7 +37,7 @@ class CustomFieldBulkEditForm(BootstrapMixin, BulkEditForm):
         nullable_fields = []
 
 
-class CustomLinkBulkEditForm(BootstrapMixin, BulkEditForm):
+class CustomLinkBulkEditForm(BulkEditForm):
     pk = forms.ModelMultipleChoiceField(
         queryset=CustomLink.objects.all(),
         widget=forms.MultipleHiddenInput
@@ -66,7 +64,7 @@ class CustomLinkBulkEditForm(BootstrapMixin, BulkEditForm):
         nullable_fields = []
 
 
-class ExportTemplateBulkEditForm(BootstrapMixin, BulkEditForm):
+class ExportTemplateBulkEditForm(BulkEditForm):
     pk = forms.ModelMultipleChoiceField(
         queryset=ExportTemplate.objects.all(),
         widget=forms.MultipleHiddenInput
@@ -97,7 +95,7 @@ class ExportTemplateBulkEditForm(BootstrapMixin, BulkEditForm):
         nullable_fields = ['description', 'mime_type', 'file_extension']
 
 
-class WebhookBulkEditForm(BootstrapMixin, BulkEditForm):
+class WebhookBulkEditForm(BulkEditForm):
     pk = forms.ModelMultipleChoiceField(
         queryset=Webhook.objects.all(),
         widget=forms.MultipleHiddenInput
@@ -140,7 +138,7 @@ class WebhookBulkEditForm(BootstrapMixin, BulkEditForm):
         nullable_fields = ['secret', 'conditions', 'ca_file_path']
 
 
-class TagBulkEditForm(BootstrapMixin, BulkEditForm):
+class TagBulkEditForm(BulkEditForm):
     pk = forms.ModelMultipleChoiceField(
         queryset=Tag.objects.all(),
         widget=forms.MultipleHiddenInput
@@ -157,7 +155,7 @@ class TagBulkEditForm(BootstrapMixin, BulkEditForm):
         nullable_fields = ['description']
 
 
-class ConfigContextBulkEditForm(BootstrapMixin, BulkEditForm):
+class ConfigContextBulkEditForm(BulkEditForm):
     pk = forms.ModelMultipleChoiceField(
         queryset=ConfigContext.objects.all(),
         widget=forms.MultipleHiddenInput
@@ -181,7 +179,7 @@ class ConfigContextBulkEditForm(BootstrapMixin, BulkEditForm):
         ]
 
 
-class JournalEntryBulkEditForm(BootstrapMixin, BulkEditForm):
+class JournalEntryBulkEditForm(BulkEditForm):
     pk = forms.ModelMultipleChoiceField(
         queryset=JournalEntry.objects.all(),
         widget=forms.MultipleHiddenInput

+ 3 - 3
netbox/extras/forms/customfields.py

@@ -4,7 +4,7 @@ from django.db.models import Q
 
 from extras.choices import *
 from extras.models import *
-from utilities.forms import BulkEditForm, CSVModelForm
+from utilities.forms import BootstrapMixin, BulkEditForm, CSVModelForm
 
 __all__ = (
     'CustomFieldModelCSVForm',
@@ -52,7 +52,7 @@ class CustomFieldsMixin:
             self.custom_fields.append(field_name)
 
 
-class CustomFieldModelForm(CustomFieldsMixin, forms.ModelForm):
+class CustomFieldModelForm(BootstrapMixin, CustomFieldsMixin, forms.ModelForm):
     """
     Extend ModelForm to include custom field support.
     """
@@ -105,7 +105,7 @@ class CustomFieldModelBulkEditForm(BulkEditForm):
             self.custom_fields.append(cf.name)
 
 
-class CustomFieldModelFilterForm(forms.Form):
+class CustomFieldModelFilterForm(BootstrapMixin, forms.Form):
 
     def __init__(self, *args, **kwargs):
 

+ 15 - 15
netbox/ipam/forms/bulk_edit.py

@@ -8,8 +8,8 @@ from ipam.models import *
 from ipam.models import ASN
 from tenancy.models import Tenant
 from utilities.forms import (
-    add_blank_choice, BootstrapMixin, BulkEditNullBooleanSelect, DatePicker, DynamicModelChoiceField, NumericArrayField,
-    StaticSelect, DynamicModelMultipleChoiceField,
+    add_blank_choice, BulkEditNullBooleanSelect, DatePicker, DynamicModelChoiceField, NumericArrayField, StaticSelect,
+    DynamicModelMultipleChoiceField,
 )
 
 __all__ = (
@@ -29,7 +29,7 @@ __all__ = (
 )
 
 
-class VRFBulkEditForm(BootstrapMixin, AddRemoveTagsForm, CustomFieldModelBulkEditForm):
+class VRFBulkEditForm(AddRemoveTagsForm, CustomFieldModelBulkEditForm):
     pk = forms.ModelMultipleChoiceField(
         queryset=VRF.objects.all(),
         widget=forms.MultipleHiddenInput()
@@ -54,7 +54,7 @@ class VRFBulkEditForm(BootstrapMixin, AddRemoveTagsForm, CustomFieldModelBulkEdi
         ]
 
 
-class RouteTargetBulkEditForm(BootstrapMixin, AddRemoveTagsForm, CustomFieldModelBulkEditForm):
+class RouteTargetBulkEditForm(AddRemoveTagsForm, CustomFieldModelBulkEditForm):
     pk = forms.ModelMultipleChoiceField(
         queryset=RouteTarget.objects.all(),
         widget=forms.MultipleHiddenInput()
@@ -74,7 +74,7 @@ class RouteTargetBulkEditForm(BootstrapMixin, AddRemoveTagsForm, CustomFieldMode
         ]
 
 
-class RIRBulkEditForm(BootstrapMixin, AddRemoveTagsForm, CustomFieldModelBulkEditForm):
+class RIRBulkEditForm(AddRemoveTagsForm, CustomFieldModelBulkEditForm):
     pk = forms.ModelMultipleChoiceField(
         queryset=RIR.objects.all(),
         widget=forms.MultipleHiddenInput
@@ -92,7 +92,7 @@ class RIRBulkEditForm(BootstrapMixin, AddRemoveTagsForm, CustomFieldModelBulkEdi
         nullable_fields = ['is_private', 'description']
 
 
-class ASNBulkEditForm(BootstrapMixin, AddRemoveTagsForm, CustomFieldModelBulkEditForm):
+class ASNBulkEditForm(AddRemoveTagsForm, CustomFieldModelBulkEditForm):
     pk = forms.ModelMultipleChoiceField(
         queryset=ASN.objects.all(),
         widget=forms.MultipleHiddenInput()
@@ -124,7 +124,7 @@ class ASNBulkEditForm(BootstrapMixin, AddRemoveTagsForm, CustomFieldModelBulkEdi
         }
 
 
-class AggregateBulkEditForm(BootstrapMixin, AddRemoveTagsForm, CustomFieldModelBulkEditForm):
+class AggregateBulkEditForm(AddRemoveTagsForm, CustomFieldModelBulkEditForm):
     pk = forms.ModelMultipleChoiceField(
         queryset=Aggregate.objects.all(),
         widget=forms.MultipleHiddenInput()
@@ -155,7 +155,7 @@ class AggregateBulkEditForm(BootstrapMixin, AddRemoveTagsForm, CustomFieldModelB
         }
 
 
-class RoleBulkEditForm(BootstrapMixin, AddRemoveTagsForm, CustomFieldModelBulkEditForm):
+class RoleBulkEditForm(AddRemoveTagsForm, CustomFieldModelBulkEditForm):
     pk = forms.ModelMultipleChoiceField(
         queryset=Role.objects.all(),
         widget=forms.MultipleHiddenInput
@@ -172,7 +172,7 @@ class RoleBulkEditForm(BootstrapMixin, AddRemoveTagsForm, CustomFieldModelBulkEd
         nullable_fields = ['description']
 
 
-class PrefixBulkEditForm(BootstrapMixin, AddRemoveTagsForm, CustomFieldModelBulkEditForm):
+class PrefixBulkEditForm(AddRemoveTagsForm, CustomFieldModelBulkEditForm):
     pk = forms.ModelMultipleChoiceField(
         queryset=Prefix.objects.all(),
         widget=forms.MultipleHiddenInput()
@@ -237,7 +237,7 @@ class PrefixBulkEditForm(BootstrapMixin, AddRemoveTagsForm, CustomFieldModelBulk
         ]
 
 
-class IPRangeBulkEditForm(BootstrapMixin, AddRemoveTagsForm, CustomFieldModelBulkEditForm):
+class IPRangeBulkEditForm(AddRemoveTagsForm, CustomFieldModelBulkEditForm):
     pk = forms.ModelMultipleChoiceField(
         queryset=IPRange.objects.all(),
         widget=forms.MultipleHiddenInput()
@@ -271,7 +271,7 @@ class IPRangeBulkEditForm(BootstrapMixin, AddRemoveTagsForm, CustomFieldModelBul
         ]
 
 
-class IPAddressBulkEditForm(BootstrapMixin, AddRemoveTagsForm, CustomFieldModelBulkEditForm):
+class IPAddressBulkEditForm(AddRemoveTagsForm, CustomFieldModelBulkEditForm):
     pk = forms.ModelMultipleChoiceField(
         queryset=IPAddress.objects.all(),
         widget=forms.MultipleHiddenInput()
@@ -315,7 +315,7 @@ class IPAddressBulkEditForm(BootstrapMixin, AddRemoveTagsForm, CustomFieldModelB
         ]
 
 
-class FHRPGroupBulkEditForm(BootstrapMixin, AddRemoveTagsForm, CustomFieldModelBulkEditForm):
+class FHRPGroupBulkEditForm(AddRemoveTagsForm, CustomFieldModelBulkEditForm):
     pk = forms.ModelMultipleChoiceField(
         queryset=FHRPGroup.objects.all(),
         widget=forms.MultipleHiddenInput()
@@ -350,7 +350,7 @@ class FHRPGroupBulkEditForm(BootstrapMixin, AddRemoveTagsForm, CustomFieldModelB
         nullable_fields = ['auth_type', 'auth_key', 'description']
 
 
-class VLANGroupBulkEditForm(BootstrapMixin, AddRemoveTagsForm, CustomFieldModelBulkEditForm):
+class VLANGroupBulkEditForm(AddRemoveTagsForm, CustomFieldModelBulkEditForm):
     pk = forms.ModelMultipleChoiceField(
         queryset=VLANGroup.objects.all(),
         widget=forms.MultipleHiddenInput
@@ -368,7 +368,7 @@ class VLANGroupBulkEditForm(BootstrapMixin, AddRemoveTagsForm, CustomFieldModelB
         nullable_fields = ['site', 'description']
 
 
-class VLANBulkEditForm(BootstrapMixin, AddRemoveTagsForm, CustomFieldModelBulkEditForm):
+class VLANBulkEditForm(AddRemoveTagsForm, CustomFieldModelBulkEditForm):
     pk = forms.ModelMultipleChoiceField(
         queryset=VLAN.objects.all(),
         widget=forms.MultipleHiddenInput()
@@ -420,7 +420,7 @@ class VLANBulkEditForm(BootstrapMixin, AddRemoveTagsForm, CustomFieldModelBulkEd
         ]
 
 
-class ServiceBulkEditForm(BootstrapMixin, AddRemoveTagsForm, CustomFieldModelBulkEditForm):
+class ServiceBulkEditForm(AddRemoveTagsForm, CustomFieldModelBulkEditForm):
     pk = forms.ModelMultipleChoiceField(
         queryset=Service.objects.all(),
         widget=forms.MultipleHiddenInput()

+ 15 - 17
netbox/ipam/forms/filtersets.py

@@ -1,4 +1,3 @@
-import django_filters
 from django import forms
 from django.utils.translation import gettext as _
 
@@ -9,10 +8,9 @@ from ipam.constants import *
 from ipam.models import *
 from ipam.models import ASN
 from tenancy.forms import TenancyFilterForm
-from tenancy.models import Tenant
 from utilities.forms import (
-    add_blank_choice, BootstrapMixin, DynamicModelChoiceField, DynamicModelMultipleChoiceField, StaticSelect,
-    StaticSelectMultiple, TagFilterField, BOOLEAN_WITH_BLANK_CHOICES,
+    add_blank_choice, DynamicModelChoiceField, DynamicModelMultipleChoiceField, StaticSelect, StaticSelectMultiple,
+    TagFilterField, BOOLEAN_WITH_BLANK_CHOICES,
 )
 
 __all__ = (
@@ -40,7 +38,7 @@ IPADDRESS_MASK_LENGTH_CHOICES = add_blank_choice([
 ])
 
 
-class VRFFilterForm(BootstrapMixin, TenancyFilterForm, CustomFieldModelFilterForm):
+class VRFFilterForm(TenancyFilterForm, CustomFieldModelFilterForm):
     model = VRF
     field_groups = [
         ['q', 'tag'],
@@ -67,7 +65,7 @@ class VRFFilterForm(BootstrapMixin, TenancyFilterForm, CustomFieldModelFilterFor
     tag = TagFilterField(model)
 
 
-class RouteTargetFilterForm(BootstrapMixin, TenancyFilterForm, CustomFieldModelFilterForm):
+class RouteTargetFilterForm(TenancyFilterForm, CustomFieldModelFilterForm):
     model = RouteTarget
     field_groups = [
         ['q', 'tag'],
@@ -94,7 +92,7 @@ class RouteTargetFilterForm(BootstrapMixin, TenancyFilterForm, CustomFieldModelF
     tag = TagFilterField(model)
 
 
-class RIRFilterForm(BootstrapMixin, CustomFieldModelFilterForm):
+class RIRFilterForm(CustomFieldModelFilterForm):
     model = RIR
     q = forms.CharField(
         required=False,
@@ -111,7 +109,7 @@ class RIRFilterForm(BootstrapMixin, CustomFieldModelFilterForm):
     tag = TagFilterField(model)
 
 
-class AggregateFilterForm(BootstrapMixin, TenancyFilterForm, CustomFieldModelFilterForm):
+class AggregateFilterForm(TenancyFilterForm, CustomFieldModelFilterForm):
     model = Aggregate
     field_groups = [
         ['q', 'tag'],
@@ -138,7 +136,7 @@ class AggregateFilterForm(BootstrapMixin, TenancyFilterForm, CustomFieldModelFil
     tag = TagFilterField(model)
 
 
-class ASNFilterForm(BootstrapMixin, TenancyFilterForm, CustomFieldModelFilterForm):
+class ASNFilterForm(TenancyFilterForm, CustomFieldModelFilterForm):
     model = ASN
     field_groups = [
         ['q'],
@@ -165,7 +163,7 @@ class ASNFilterForm(BootstrapMixin, TenancyFilterForm, CustomFieldModelFilterFor
     )
 
 
-class RoleFilterForm(BootstrapMixin, CustomFieldModelFilterForm):
+class RoleFilterForm(CustomFieldModelFilterForm):
     model = Role
     q = forms.CharField(
         required=False,
@@ -175,7 +173,7 @@ class RoleFilterForm(BootstrapMixin, CustomFieldModelFilterForm):
     tag = TagFilterField(model)
 
 
-class PrefixFilterForm(BootstrapMixin, TenancyFilterForm, CustomFieldModelFilterForm):
+class PrefixFilterForm(TenancyFilterForm, CustomFieldModelFilterForm):
     model = Prefix
     field_groups = [
         ['q', 'tag'],
@@ -277,7 +275,7 @@ class PrefixFilterForm(BootstrapMixin, TenancyFilterForm, CustomFieldModelFilter
     tag = TagFilterField(model)
 
 
-class IPRangeFilterForm(BootstrapMixin, TenancyFilterForm, CustomFieldModelFilterForm):
+class IPRangeFilterForm(TenancyFilterForm, CustomFieldModelFilterForm):
     model = IPRange
     field_groups = [
         ['q', 'tag'],
@@ -317,7 +315,7 @@ class IPRangeFilterForm(BootstrapMixin, TenancyFilterForm, CustomFieldModelFilte
     tag = TagFilterField(model)
 
 
-class IPAddressFilterForm(BootstrapMixin, TenancyFilterForm, CustomFieldModelFilterForm):
+class IPAddressFilterForm(TenancyFilterForm, CustomFieldModelFilterForm):
     model = IPAddress
     field_order = [
         'q', 'parent', 'family', 'mask_length', 'vrf_id', 'present_in_vrf_id', 'status', 'role',
@@ -388,7 +386,7 @@ class IPAddressFilterForm(BootstrapMixin, TenancyFilterForm, CustomFieldModelFil
     tag = TagFilterField(model)
 
 
-class FHRPGroupFilterForm(BootstrapMixin, CustomFieldModelFilterForm):
+class FHRPGroupFilterForm(CustomFieldModelFilterForm):
     model = FHRPGroup
     field_groups = (
         ('q', 'tag'),
@@ -423,7 +421,7 @@ class FHRPGroupFilterForm(BootstrapMixin, CustomFieldModelFilterForm):
     tag = TagFilterField(model)
 
 
-class VLANGroupFilterForm(BootstrapMixin, CustomFieldModelFilterForm):
+class VLANGroupFilterForm(CustomFieldModelFilterForm):
     field_groups = [
         ['q', 'tag'],
         ['region', 'sitegroup', 'site', 'location', 'rack']
@@ -467,7 +465,7 @@ class VLANGroupFilterForm(BootstrapMixin, CustomFieldModelFilterForm):
     tag = TagFilterField(model)
 
 
-class VLANFilterForm(BootstrapMixin, TenancyFilterForm, CustomFieldModelFilterForm):
+class VLANFilterForm(TenancyFilterForm, CustomFieldModelFilterForm):
     model = VLAN
     field_groups = [
         ['q', 'tag'],
@@ -531,7 +529,7 @@ class VLANFilterForm(BootstrapMixin, TenancyFilterForm, CustomFieldModelFilterFo
     tag = TagFilterField(model)
 
 
-class ServiceFilterForm(BootstrapMixin, CustomFieldModelFilterForm):
+class ServiceFilterForm(CustomFieldModelFilterForm):
     model = Service
     field_groups = (
         ('q', 'tag'),

+ 14 - 14
netbox/ipam/forms/models.py

@@ -37,7 +37,7 @@ __all__ = (
 )
 
 
-class VRFForm(BootstrapMixin, TenancyForm, CustomFieldModelForm):
+class VRFForm(TenancyForm, CustomFieldModelForm):
     import_targets = DynamicModelMultipleChoiceField(
         queryset=RouteTarget.objects.all(),
         required=False
@@ -70,7 +70,7 @@ class VRFForm(BootstrapMixin, TenancyForm, CustomFieldModelForm):
         }
 
 
-class RouteTargetForm(BootstrapMixin, TenancyForm, CustomFieldModelForm):
+class RouteTargetForm(TenancyForm, CustomFieldModelForm):
     tags = DynamicModelMultipleChoiceField(
         queryset=Tag.objects.all(),
         required=False
@@ -87,7 +87,7 @@ class RouteTargetForm(BootstrapMixin, TenancyForm, CustomFieldModelForm):
         )
 
 
-class RIRForm(BootstrapMixin, CustomFieldModelForm):
+class RIRForm(CustomFieldModelForm):
     slug = SlugField()
     tags = DynamicModelMultipleChoiceField(
         queryset=Tag.objects.all(),
@@ -101,7 +101,7 @@ class RIRForm(BootstrapMixin, CustomFieldModelForm):
         ]
 
 
-class AggregateForm(BootstrapMixin, TenancyForm, CustomFieldModelForm):
+class AggregateForm(TenancyForm, CustomFieldModelForm):
     rir = DynamicModelChoiceField(
         queryset=RIR.objects.all(),
         label='RIR'
@@ -129,7 +129,7 @@ class AggregateForm(BootstrapMixin, TenancyForm, CustomFieldModelForm):
         }
 
 
-class ASNForm(BootstrapMixin, TenancyForm, CustomFieldModelForm):
+class ASNForm(TenancyForm, CustomFieldModelForm):
     rir = DynamicModelChoiceField(
         queryset=RIR.objects.all(),
         label='RIR',
@@ -173,7 +173,7 @@ class ASNForm(BootstrapMixin, TenancyForm, CustomFieldModelForm):
         return instance
 
 
-class RoleForm(BootstrapMixin, CustomFieldModelForm):
+class RoleForm(CustomFieldModelForm):
     slug = SlugField()
     tags = DynamicModelMultipleChoiceField(
         queryset=Tag.objects.all(),
@@ -187,7 +187,7 @@ class RoleForm(BootstrapMixin, CustomFieldModelForm):
         ]
 
 
-class PrefixForm(BootstrapMixin, TenancyForm, CustomFieldModelForm):
+class PrefixForm(TenancyForm, CustomFieldModelForm):
     vrf = DynamicModelChoiceField(
         queryset=VRF.objects.all(),
         required=False,
@@ -262,7 +262,7 @@ class PrefixForm(BootstrapMixin, TenancyForm, CustomFieldModelForm):
         }
 
 
-class IPRangeForm(BootstrapMixin, TenancyForm, CustomFieldModelForm):
+class IPRangeForm(TenancyForm, CustomFieldModelForm):
     vrf = DynamicModelChoiceField(
         queryset=VRF.objects.all(),
         required=False,
@@ -291,7 +291,7 @@ class IPRangeForm(BootstrapMixin, TenancyForm, CustomFieldModelForm):
         }
 
 
-class IPAddressForm(BootstrapMixin, TenancyForm, CustomFieldModelForm):
+class IPAddressForm(TenancyForm, CustomFieldModelForm):
     device = DynamicModelChoiceField(
         queryset=Device.objects.all(),
         required=False,
@@ -499,7 +499,7 @@ class IPAddressForm(BootstrapMixin, TenancyForm, CustomFieldModelForm):
         return ipaddress
 
 
-class IPAddressBulkAddForm(BootstrapMixin, TenancyForm, CustomFieldModelForm):
+class IPAddressBulkAddForm(TenancyForm, CustomFieldModelForm):
     vrf = DynamicModelChoiceField(
         queryset=VRF.objects.all(),
         required=False,
@@ -533,7 +533,7 @@ class IPAddressAssignForm(BootstrapMixin, forms.Form):
     )
 
 
-class FHRPGroupForm(BootstrapMixin, CustomFieldModelForm):
+class FHRPGroupForm(CustomFieldModelForm):
     tags = DynamicModelMultipleChoiceField(
         queryset=Tag.objects.all(),
         required=False
@@ -613,7 +613,7 @@ class FHRPGroupAssignmentForm(BootstrapMixin, forms.ModelForm):
             self.fields['group'].widget.add_query_param('related_ip', ipaddress.pk)
 
 
-class VLANGroupForm(BootstrapMixin, CustomFieldModelForm):
+class VLANGroupForm(CustomFieldModelForm):
     scope_type = ContentTypeChoiceField(
         queryset=ContentType.objects.filter(model__in=VLANGROUP_SCOPE_TYPES),
         required=False,
@@ -720,7 +720,7 @@ class VLANGroupForm(BootstrapMixin, CustomFieldModelForm):
             self.instance.scope_id = None
 
 
-class VLANForm(BootstrapMixin, TenancyForm, CustomFieldModelForm):
+class VLANForm(TenancyForm, CustomFieldModelForm):
     # VLANGroup assignment fields
     scope_type = forms.ChoiceField(
         choices=(
@@ -801,7 +801,7 @@ class VLANForm(BootstrapMixin, TenancyForm, CustomFieldModelForm):
         }
 
 
-class ServiceForm(BootstrapMixin, CustomFieldModelForm):
+class ServiceForm(CustomFieldModelForm):
     ports = NumericArrayField(
         base_field=forms.IntegerField(
             min_value=SERVICE_PORT_MIN,

+ 6 - 6
netbox/tenancy/forms/bulk_edit.py

@@ -2,7 +2,7 @@ from django import forms
 
 from extras.forms import AddRemoveTagsForm, CustomFieldModelBulkEditForm
 from tenancy.models import *
-from utilities.forms import BootstrapMixin, DynamicModelChoiceField
+from utilities.forms import DynamicModelChoiceField
 
 __all__ = (
     'ContactBulkEditForm',
@@ -17,7 +17,7 @@ __all__ = (
 # Tenants
 #
 
-class TenantGroupBulkEditForm(BootstrapMixin, AddRemoveTagsForm, CustomFieldModelBulkEditForm):
+class TenantGroupBulkEditForm(AddRemoveTagsForm, CustomFieldModelBulkEditForm):
     pk = forms.ModelMultipleChoiceField(
         queryset=TenantGroup.objects.all(),
         widget=forms.MultipleHiddenInput
@@ -35,7 +35,7 @@ class TenantGroupBulkEditForm(BootstrapMixin, AddRemoveTagsForm, CustomFieldMode
         nullable_fields = ['parent', 'description']
 
 
-class TenantBulkEditForm(BootstrapMixin, AddRemoveTagsForm, CustomFieldModelBulkEditForm):
+class TenantBulkEditForm(AddRemoveTagsForm, CustomFieldModelBulkEditForm):
     pk = forms.ModelMultipleChoiceField(
         queryset=Tenant.objects.all(),
         widget=forms.MultipleHiddenInput()
@@ -55,7 +55,7 @@ class TenantBulkEditForm(BootstrapMixin, AddRemoveTagsForm, CustomFieldModelBulk
 # Contacts
 #
 
-class ContactGroupBulkEditForm(BootstrapMixin, AddRemoveTagsForm, CustomFieldModelBulkEditForm):
+class ContactGroupBulkEditForm(AddRemoveTagsForm, CustomFieldModelBulkEditForm):
     pk = forms.ModelMultipleChoiceField(
         queryset=ContactGroup.objects.all(),
         widget=forms.MultipleHiddenInput
@@ -73,7 +73,7 @@ class ContactGroupBulkEditForm(BootstrapMixin, AddRemoveTagsForm, CustomFieldMod
         nullable_fields = ['parent', 'description']
 
 
-class ContactRoleBulkEditForm(BootstrapMixin, AddRemoveTagsForm, CustomFieldModelBulkEditForm):
+class ContactRoleBulkEditForm(AddRemoveTagsForm, CustomFieldModelBulkEditForm):
     pk = forms.ModelMultipleChoiceField(
         queryset=ContactRole.objects.all(),
         widget=forms.MultipleHiddenInput
@@ -87,7 +87,7 @@ class ContactRoleBulkEditForm(BootstrapMixin, AddRemoveTagsForm, CustomFieldMode
         nullable_fields = ['description']
 
 
-class ContactBulkEditForm(BootstrapMixin, AddRemoveTagsForm, CustomFieldModelBulkEditForm):
+class ContactBulkEditForm(AddRemoveTagsForm, CustomFieldModelBulkEditForm):
     pk = forms.ModelMultipleChoiceField(
         queryset=Contact.objects.all(),
         widget=forms.MultipleHiddenInput()

+ 6 - 6
netbox/tenancy/forms/filtersets.py

@@ -3,7 +3,7 @@ from django.utils.translation import gettext as _
 
 from extras.forms import CustomFieldModelFilterForm
 from tenancy.models import *
-from utilities.forms import BootstrapMixin, DynamicModelMultipleChoiceField, TagFilterField
+from utilities.forms import DynamicModelMultipleChoiceField, TagFilterField
 
 __all__ = (
     'ContactFilterForm',
@@ -18,7 +18,7 @@ __all__ = (
 # Tenants
 #
 
-class TenantGroupFilterForm(BootstrapMixin, CustomFieldModelFilterForm):
+class TenantGroupFilterForm(CustomFieldModelFilterForm):
     model = TenantGroup
     q = forms.CharField(
         required=False,
@@ -34,7 +34,7 @@ class TenantGroupFilterForm(BootstrapMixin, CustomFieldModelFilterForm):
     tag = TagFilterField(model)
 
 
-class TenantFilterForm(BootstrapMixin, CustomFieldModelFilterForm):
+class TenantFilterForm(CustomFieldModelFilterForm):
     model = Tenant
     field_groups = (
         ('q', 'tag'),
@@ -59,7 +59,7 @@ class TenantFilterForm(BootstrapMixin, CustomFieldModelFilterForm):
 # Contacts
 #
 
-class ContactGroupFilterForm(BootstrapMixin, CustomFieldModelFilterForm):
+class ContactGroupFilterForm(CustomFieldModelFilterForm):
     model = ContactGroup
     q = forms.CharField(
         required=False,
@@ -75,7 +75,7 @@ class ContactGroupFilterForm(BootstrapMixin, CustomFieldModelFilterForm):
     tag = TagFilterField(model)
 
 
-class ContactRoleFilterForm(BootstrapMixin, CustomFieldModelFilterForm):
+class ContactRoleFilterForm(CustomFieldModelFilterForm):
     model = ContactRole
     q = forms.CharField(
         required=False,
@@ -85,7 +85,7 @@ class ContactRoleFilterForm(BootstrapMixin, CustomFieldModelFilterForm):
     tag = TagFilterField(model)
 
 
-class ContactFilterForm(BootstrapMixin, CustomFieldModelFilterForm):
+class ContactFilterForm(CustomFieldModelFilterForm):
     model = Contact
     field_groups = (
         ('q', 'tag'),

+ 5 - 5
netbox/tenancy/forms/models.py

@@ -22,7 +22,7 @@ __all__ = (
 # Tenants
 #
 
-class TenantGroupForm(BootstrapMixin, CustomFieldModelForm):
+class TenantGroupForm(CustomFieldModelForm):
     parent = DynamicModelChoiceField(
         queryset=TenantGroup.objects.all(),
         required=False
@@ -40,7 +40,7 @@ class TenantGroupForm(BootstrapMixin, CustomFieldModelForm):
         ]
 
 
-class TenantForm(BootstrapMixin, CustomFieldModelForm):
+class TenantForm(CustomFieldModelForm):
     slug = SlugField()
     group = DynamicModelChoiceField(
         queryset=TenantGroup.objects.all(),
@@ -66,7 +66,7 @@ class TenantForm(BootstrapMixin, CustomFieldModelForm):
 # Contacts
 #
 
-class ContactGroupForm(BootstrapMixin, CustomFieldModelForm):
+class ContactGroupForm(CustomFieldModelForm):
     parent = DynamicModelChoiceField(
         queryset=ContactGroup.objects.all(),
         required=False
@@ -82,7 +82,7 @@ class ContactGroupForm(BootstrapMixin, CustomFieldModelForm):
         fields = ('parent', 'name', 'slug', 'description', 'tags')
 
 
-class ContactRoleForm(BootstrapMixin, CustomFieldModelForm):
+class ContactRoleForm(CustomFieldModelForm):
     slug = SlugField()
     tags = DynamicModelMultipleChoiceField(
         queryset=Tag.objects.all(),
@@ -94,7 +94,7 @@ class ContactRoleForm(BootstrapMixin, CustomFieldModelForm):
         fields = ('name', 'slug', 'description', 'tags')
 
 
-class ContactForm(BootstrapMixin, CustomFieldModelForm):
+class ContactForm(CustomFieldModelForm):
     group = DynamicModelChoiceField(
         queryset=ContactGroup.objects.all(),
         required=False

+ 2 - 2
netbox/utilities/forms/forms.py

@@ -19,7 +19,7 @@ __all__ = (
 )
 
 
-class BootstrapMixin(forms.BaseForm):
+class BootstrapMixin:
     """
     Add the base Bootstrap CSS classes to form elements.
     """
@@ -73,7 +73,7 @@ class ConfirmationForm(BootstrapMixin, ReturnURLForm):
     confirm = forms.BooleanField(required=True, widget=forms.HiddenInput(), initial=True)
 
 
-class BulkEditForm(forms.Form):
+class BulkEditForm(BootstrapMixin, forms.Form):
     """
     Base form for editing multiple objects in bulk
     """

+ 6 - 6
netbox/virtualization/forms/bulk_edit.py

@@ -7,7 +7,7 @@ from extras.forms import AddRemoveTagsForm, CustomFieldModelBulkEditForm
 from ipam.models import VLAN
 from tenancy.models import Tenant
 from utilities.forms import (
-    add_blank_choice, BootstrapMixin, BulkEditNullBooleanSelect, BulkRenameForm, CommentField, DynamicModelChoiceField,
+    add_blank_choice, BulkEditNullBooleanSelect, BulkRenameForm, CommentField, DynamicModelChoiceField,
     DynamicModelMultipleChoiceField, SmallTextarea, StaticSelect
 )
 from virtualization.choices import *
@@ -23,7 +23,7 @@ __all__ = (
 )
 
 
-class ClusterTypeBulkEditForm(BootstrapMixin, AddRemoveTagsForm, CustomFieldModelBulkEditForm):
+class ClusterTypeBulkEditForm(AddRemoveTagsForm, CustomFieldModelBulkEditForm):
     pk = forms.ModelMultipleChoiceField(
         queryset=ClusterType.objects.all(),
         widget=forms.MultipleHiddenInput
@@ -37,7 +37,7 @@ class ClusterTypeBulkEditForm(BootstrapMixin, AddRemoveTagsForm, CustomFieldMode
         nullable_fields = ['description']
 
 
-class ClusterGroupBulkEditForm(BootstrapMixin, AddRemoveTagsForm, CustomFieldModelBulkEditForm):
+class ClusterGroupBulkEditForm(AddRemoveTagsForm, CustomFieldModelBulkEditForm):
     pk = forms.ModelMultipleChoiceField(
         queryset=ClusterGroup.objects.all(),
         widget=forms.MultipleHiddenInput
@@ -51,7 +51,7 @@ class ClusterGroupBulkEditForm(BootstrapMixin, AddRemoveTagsForm, CustomFieldMod
         nullable_fields = ['description']
 
 
-class ClusterBulkEditForm(BootstrapMixin, AddRemoveTagsForm, CustomFieldModelBulkEditForm):
+class ClusterBulkEditForm(AddRemoveTagsForm, CustomFieldModelBulkEditForm):
     pk = forms.ModelMultipleChoiceField(
         queryset=Cluster.objects.all(),
         widget=forms.MultipleHiddenInput()
@@ -95,7 +95,7 @@ class ClusterBulkEditForm(BootstrapMixin, AddRemoveTagsForm, CustomFieldModelBul
         ]
 
 
-class VirtualMachineBulkEditForm(BootstrapMixin, AddRemoveTagsForm, CustomFieldModelBulkEditForm):
+class VirtualMachineBulkEditForm(AddRemoveTagsForm, CustomFieldModelBulkEditForm):
     pk = forms.ModelMultipleChoiceField(
         queryset=VirtualMachine.objects.all(),
         widget=forms.MultipleHiddenInput()
@@ -150,7 +150,7 @@ class VirtualMachineBulkEditForm(BootstrapMixin, AddRemoveTagsForm, CustomFieldM
         ]
 
 
-class VMInterfaceBulkEditForm(BootstrapMixin, AddRemoveTagsForm, CustomFieldModelBulkEditForm):
+class VMInterfaceBulkEditForm(AddRemoveTagsForm, CustomFieldModelBulkEditForm):
     pk = forms.ModelMultipleChoiceField(
         queryset=VMInterface.objects.all(),
         widget=forms.MultipleHiddenInput()

+ 4 - 9
netbox/virtualization/forms/filtersets.py

@@ -20,7 +20,7 @@ __all__ = (
 )
 
 
-class ClusterTypeFilterForm(BootstrapMixin, CustomFieldModelFilterForm):
+class ClusterTypeFilterForm(CustomFieldModelFilterForm):
     model = ClusterType
     q = forms.CharField(
         required=False,
@@ -30,7 +30,7 @@ class ClusterTypeFilterForm(BootstrapMixin, CustomFieldModelFilterForm):
     tag = TagFilterField(model)
 
 
-class ClusterGroupFilterForm(BootstrapMixin, CustomFieldModelFilterForm):
+class ClusterGroupFilterForm(CustomFieldModelFilterForm):
     model = ClusterGroup
     q = forms.CharField(
         required=False,
@@ -40,7 +40,7 @@ class ClusterGroupFilterForm(BootstrapMixin, CustomFieldModelFilterForm):
     tag = TagFilterField(model)
 
 
-class ClusterFilterForm(BootstrapMixin, TenancyFilterForm, CustomFieldModelFilterForm):
+class ClusterFilterForm(TenancyFilterForm, CustomFieldModelFilterForm):
     model = Cluster
     field_order = [
         'q', 'type_id', 'region_id', 'site_id', 'group_id', 'tenant_group_id', 'tenant_id',
@@ -95,12 +95,7 @@ class ClusterFilterForm(BootstrapMixin, TenancyFilterForm, CustomFieldModelFilte
     tag = TagFilterField(model)
 
 
-class VirtualMachineFilterForm(
-    BootstrapMixin,
-    LocalConfigContextFilterForm,
-    TenancyFilterForm,
-    CustomFieldModelFilterForm
-):
+class VirtualMachineFilterForm(LocalConfigContextFilterForm, TenancyFilterForm, CustomFieldModelFilterForm):
     model = VirtualMachine
     field_groups = [
         ['q', 'tag'],

+ 5 - 5
netbox/virtualization/forms/models.py

@@ -26,7 +26,7 @@ __all__ = (
 )
 
 
-class ClusterTypeForm(BootstrapMixin, CustomFieldModelForm):
+class ClusterTypeForm(CustomFieldModelForm):
     slug = SlugField()
     tags = DynamicModelMultipleChoiceField(
         queryset=Tag.objects.all(),
@@ -40,7 +40,7 @@ class ClusterTypeForm(BootstrapMixin, CustomFieldModelForm):
         )
 
 
-class ClusterGroupForm(BootstrapMixin, CustomFieldModelForm):
+class ClusterGroupForm(CustomFieldModelForm):
     slug = SlugField()
     tags = DynamicModelMultipleChoiceField(
         queryset=Tag.objects.all(),
@@ -54,7 +54,7 @@ class ClusterGroupForm(BootstrapMixin, CustomFieldModelForm):
         )
 
 
-class ClusterForm(BootstrapMixin, TenancyForm, CustomFieldModelForm):
+class ClusterForm(TenancyForm, CustomFieldModelForm):
     type = DynamicModelChoiceField(
         queryset=ClusterType.objects.all()
     )
@@ -171,7 +171,7 @@ class ClusterRemoveDevicesForm(ConfirmationForm):
     )
 
 
-class VirtualMachineForm(BootstrapMixin, TenancyForm, CustomFieldModelForm):
+class VirtualMachineForm(TenancyForm, CustomFieldModelForm):
     cluster_group = DynamicModelChoiceField(
         queryset=ClusterGroup.objects.all(),
         required=False,
@@ -271,7 +271,7 @@ class VirtualMachineForm(BootstrapMixin, TenancyForm, CustomFieldModelForm):
             self.fields['primary_ip6'].widget.attrs['readonly'] = True
 
 
-class VMInterfaceForm(BootstrapMixin, InterfaceCommonForm, CustomFieldModelForm):
+class VMInterfaceForm(InterfaceCommonForm, CustomFieldModelForm):
     parent = DynamicModelChoiceField(
         queryset=VMInterface.objects.all(),
         required=False,

+ 4 - 4
netbox/wireless/forms/bulk_edit.py

@@ -3,7 +3,7 @@ from django import forms
 from dcim.choices import LinkStatusChoices
 from extras.forms import AddRemoveTagsForm, CustomFieldModelBulkEditForm
 from ipam.models import VLAN
-from utilities.forms import BootstrapMixin, DynamicModelChoiceField
+from utilities.forms import DynamicModelChoiceField
 from wireless.choices import *
 from wireless.constants import SSID_MAX_LENGTH
 from wireless.models import *
@@ -15,7 +15,7 @@ __all__ = (
 )
 
 
-class WirelessLANGroupBulkEditForm(BootstrapMixin, AddRemoveTagsForm, CustomFieldModelBulkEditForm):
+class WirelessLANGroupBulkEditForm(AddRemoveTagsForm, CustomFieldModelBulkEditForm):
     pk = forms.ModelMultipleChoiceField(
         queryset=WirelessLANGroup.objects.all(),
         widget=forms.MultipleHiddenInput
@@ -33,7 +33,7 @@ class WirelessLANGroupBulkEditForm(BootstrapMixin, AddRemoveTagsForm, CustomFiel
         nullable_fields = ['parent', 'description']
 
 
-class WirelessLANBulkEditForm(BootstrapMixin, AddRemoveTagsForm, CustomFieldModelBulkEditForm):
+class WirelessLANBulkEditForm(AddRemoveTagsForm, CustomFieldModelBulkEditForm):
     pk = forms.ModelMultipleChoiceField(
         queryset=WirelessLAN.objects.all(),
         widget=forms.MultipleHiddenInput
@@ -69,7 +69,7 @@ class WirelessLANBulkEditForm(BootstrapMixin, AddRemoveTagsForm, CustomFieldMode
         nullable_fields = ['ssid', 'group', 'vlan', 'description', 'auth_type', 'auth_cipher', 'auth_psk']
 
 
-class WirelessLinkBulkEditForm(BootstrapMixin, AddRemoveTagsForm, CustomFieldModelBulkEditForm):
+class WirelessLinkBulkEditForm(AddRemoveTagsForm, CustomFieldModelBulkEditForm):
     pk = forms.ModelMultipleChoiceField(
         queryset=WirelessLink.objects.all(),
         widget=forms.MultipleHiddenInput

+ 4 - 6
netbox/wireless/forms/filtersets.py

@@ -3,9 +3,7 @@ from django.utils.translation import gettext as _
 
 from dcim.choices import LinkStatusChoices
 from extras.forms import CustomFieldModelFilterForm
-from utilities.forms import (
-    add_blank_choice, BootstrapMixin, DynamicModelMultipleChoiceField, StaticSelect, TagFilterField,
-)
+from utilities.forms import add_blank_choice, DynamicModelMultipleChoiceField, StaticSelect, TagFilterField
 from wireless.choices import *
 from wireless.models import *
 
@@ -16,7 +14,7 @@ __all__ = (
 )
 
 
-class WirelessLANGroupFilterForm(BootstrapMixin, CustomFieldModelFilterForm):
+class WirelessLANGroupFilterForm(CustomFieldModelFilterForm):
     model = WirelessLANGroup
     q = forms.CharField(
         required=False,
@@ -32,7 +30,7 @@ class WirelessLANGroupFilterForm(BootstrapMixin, CustomFieldModelFilterForm):
     tag = TagFilterField(model)
 
 
-class WirelessLANFilterForm(BootstrapMixin, CustomFieldModelFilterForm):
+class WirelessLANFilterForm(CustomFieldModelFilterForm):
     model = WirelessLAN
     field_groups = [
         ('q', 'tag'),
@@ -70,7 +68,7 @@ class WirelessLANFilterForm(BootstrapMixin, CustomFieldModelFilterForm):
     tag = TagFilterField(model)
 
 
-class WirelessLinkFilterForm(BootstrapMixin, CustomFieldModelFilterForm):
+class WirelessLinkFilterForm(CustomFieldModelFilterForm):
     model = WirelessLink
     q = forms.CharField(
         required=False,

+ 4 - 6
netbox/wireless/forms/models.py

@@ -2,9 +2,7 @@ from dcim.models import Device, Interface, Location, Site
 from extras.forms import CustomFieldModelForm
 from extras.models import Tag
 from ipam.models import VLAN
-from utilities.forms import (
-    BootstrapMixin, DynamicModelChoiceField, DynamicModelMultipleChoiceField, SlugField, StaticSelect,
-)
+from utilities.forms import DynamicModelChoiceField, DynamicModelMultipleChoiceField, SlugField, StaticSelect
 from wireless.models import *
 
 __all__ = (
@@ -14,7 +12,7 @@ __all__ = (
 )
 
 
-class WirelessLANGroupForm(BootstrapMixin, CustomFieldModelForm):
+class WirelessLANGroupForm(CustomFieldModelForm):
     parent = DynamicModelChoiceField(
         queryset=WirelessLANGroup.objects.all(),
         required=False
@@ -32,7 +30,7 @@ class WirelessLANGroupForm(BootstrapMixin, CustomFieldModelForm):
         ]
 
 
-class WirelessLANForm(BootstrapMixin, CustomFieldModelForm):
+class WirelessLANForm(CustomFieldModelForm):
     group = DynamicModelChoiceField(
         queryset=WirelessLANGroup.objects.all(),
         required=False
@@ -63,7 +61,7 @@ class WirelessLANForm(BootstrapMixin, CustomFieldModelForm):
         }
 
 
-class WirelessLinkForm(BootstrapMixin, CustomFieldModelForm):
+class WirelessLinkForm(CustomFieldModelForm):
     site_a = DynamicModelChoiceField(
         queryset=Site.objects.all(),
         required=False,