Jeremy Stretch 5 лет назад
Родитель
Сommit
7dc4f8d5cc

+ 5 - 3
netbox/circuits/forms.py

@@ -3,8 +3,8 @@ from django import forms
 from dcim.models import Region, Site
 from dcim.models import Region, Site
 from extras.forms import (
 from extras.forms import (
     AddRemoveTagsForm, CustomFieldBulkEditForm, CustomFieldFilterForm, CustomFieldModelForm, CustomFieldModelCSVForm,
     AddRemoveTagsForm, CustomFieldBulkEditForm, CustomFieldFilterForm, CustomFieldModelForm, CustomFieldModelCSVForm,
-    TagField,
 )
 )
+from extras.models import Tag
 from tenancy.forms import TenancyFilterForm, TenancyForm
 from tenancy.forms import TenancyFilterForm, TenancyForm
 from tenancy.models import Tenant
 from tenancy.models import Tenant
 from utilities.forms import (
 from utilities.forms import (
@@ -23,7 +23,8 @@ from .models import Circuit, CircuitTermination, CircuitType, Provider
 class ProviderForm(BootstrapMixin, CustomFieldModelForm):
 class ProviderForm(BootstrapMixin, CustomFieldModelForm):
     slug = SlugField()
     slug = SlugField()
     comments = CommentField()
     comments = CommentField()
-    tags = TagField(
+    tags = DynamicModelMultipleChoiceField(
+        queryset=Tag.objects.all(),
         required=False
         required=False
     )
     )
 
 
@@ -165,7 +166,8 @@ class CircuitForm(BootstrapMixin, TenancyForm, CustomFieldModelForm):
         queryset=CircuitType.objects.all()
         queryset=CircuitType.objects.all()
     )
     )
     comments = CommentField()
     comments = CommentField()
-    tags = TagField(
+    tags = DynamicModelMultipleChoiceField(
+        queryset=Tag.objects.all(),
         required=False
         required=False
     )
     )
 
 

+ 54 - 26
netbox/dcim/forms.py

@@ -14,8 +14,9 @@ from timezone_field import TimeZoneFormField
 from circuits.models import Circuit, Provider
 from circuits.models import Circuit, Provider
 from extras.forms import (
 from extras.forms import (
     AddRemoveTagsForm, CustomFieldBulkEditForm, CustomFieldModelCSVForm, CustomFieldFilterForm, CustomFieldModelForm,
     AddRemoveTagsForm, CustomFieldBulkEditForm, CustomFieldModelCSVForm, CustomFieldFilterForm, CustomFieldModelForm,
-    LocalConfigContextFilterForm, TagField,
+    LocalConfigContextFilterForm,
 )
 )
+from extras.models import Tag
 from ipam.constants import BGP_ASN_MAX, BGP_ASN_MIN
 from ipam.constants import BGP_ASN_MAX, BGP_ASN_MIN
 from ipam.models import IPAddress, VLAN
 from ipam.models import IPAddress, VLAN
 from tenancy.forms import TenancyFilterForm, TenancyForm
 from tenancy.forms import TenancyFilterForm, TenancyForm
@@ -225,7 +226,8 @@ class SiteForm(BootstrapMixin, TenancyForm, CustomFieldModelForm):
     )
     )
     slug = SlugField()
     slug = SlugField()
     comments = CommentField()
     comments = CommentField()
-    tags = TagField(
+    tags = DynamicModelMultipleChoiceField(
+        queryset=Tag.objects.all(),
         required=False
         required=False
     )
     )
 
 
@@ -481,7 +483,8 @@ class RackForm(BootstrapMixin, TenancyForm, CustomFieldModelForm):
         required=False
         required=False
     )
     )
     comments = CommentField()
     comments = CommentField()
-    tags = TagField(
+    tags = DynamicModelMultipleChoiceField(
+        queryset=Tag.objects.all(),
         required=False
         required=False
     )
     )
 
 
@@ -750,7 +753,8 @@ class RackReservationForm(BootstrapMixin, TenancyForm, forms.ModelForm):
         ),
         ),
         widget=StaticSelect2()
         widget=StaticSelect2()
     )
     )
-    tags = TagField(
+    tags = DynamicModelMultipleChoiceField(
+        queryset=Tag.objects.all(),
         required=False
         required=False
     )
     )
 
 
@@ -912,7 +916,8 @@ class DeviceTypeForm(BootstrapMixin, CustomFieldModelForm):
         slug_source='model'
         slug_source='model'
     )
     )
     comments = CommentField()
     comments = CommentField()
-    tags = TagField(
+    tags = DynamicModelMultipleChoiceField(
+        queryset=Tag.objects.all(),
         required=False
         required=False
     )
     )
 
 
@@ -1716,11 +1721,14 @@ class DeviceForm(BootstrapMixin, TenancyForm, CustomFieldModelForm):
         required=False
         required=False
     )
     )
     comments = CommentField()
     comments = CommentField()
-    tags = TagField(required=False)
     local_context_data = JSONField(
     local_context_data = JSONField(
         required=False,
         required=False,
         label=''
         label=''
     )
     )
+    tags = DynamicModelMultipleChoiceField(
+        queryset=Tag.objects.all(),
+        required=False
+    )
 
 
     class Meta:
     class Meta:
         model = Device
         model = Device
@@ -2209,7 +2217,8 @@ class ConsolePortFilterForm(DeviceComponentFilterForm):
 
 
 
 
 class ConsolePortForm(BootstrapMixin, forms.ModelForm):
 class ConsolePortForm(BootstrapMixin, forms.ModelForm):
-    tags = TagField(
+    tags = DynamicModelMultipleChoiceField(
+        queryset=Tag.objects.all(),
         required=False
         required=False
     )
     )
 
 
@@ -2236,7 +2245,8 @@ class ConsolePortCreateForm(LabeledComponentForm):
         max_length=100,
         max_length=100,
         required=False
         required=False
     )
     )
-    tags = TagField(
+    tags = DynamicModelMultipleChoiceField(
+        queryset=Tag.objects.all(),
         required=False
         required=False
     )
     )
 
 
@@ -2292,7 +2302,8 @@ class ConsoleServerPortFilterForm(DeviceComponentFilterForm):
 
 
 
 
 class ConsoleServerPortForm(BootstrapMixin, forms.ModelForm):
 class ConsoleServerPortForm(BootstrapMixin, forms.ModelForm):
-    tags = TagField(
+    tags = DynamicModelMultipleChoiceField(
+        queryset=Tag.objects.all(),
         required=False
         required=False
     )
     )
 
 
@@ -2319,7 +2330,8 @@ class ConsoleServerPortCreateForm(LabeledComponentForm):
         max_length=100,
         max_length=100,
         required=False
         required=False
     )
     )
-    tags = TagField(
+    tags = DynamicModelMultipleChoiceField(
+        queryset=Tag.objects.all(),
         required=False
         required=False
     )
     )
 
 
@@ -2389,7 +2401,8 @@ class PowerPortFilterForm(DeviceComponentFilterForm):
 
 
 
 
 class PowerPortForm(BootstrapMixin, forms.ModelForm):
 class PowerPortForm(BootstrapMixin, forms.ModelForm):
-    tags = TagField(
+    tags = DynamicModelMultipleChoiceField(
+        queryset=Tag.objects.all(),
         required=False
         required=False
     )
     )
 
 
@@ -2426,7 +2439,8 @@ class PowerPortCreateForm(LabeledComponentForm):
         max_length=100,
         max_length=100,
         required=False
         required=False
     )
     )
-    tags = TagField(
+    tags = DynamicModelMultipleChoiceField(
+        queryset=Tag.objects.all(),
         required=False
         required=False
     )
     )
 
 
@@ -2486,7 +2500,8 @@ class PowerOutletForm(BootstrapMixin, forms.ModelForm):
         queryset=PowerPort.objects.all(),
         queryset=PowerPort.objects.all(),
         required=False
         required=False
     )
     )
-    tags = TagField(
+    tags = DynamicModelMultipleChoiceField(
+        queryset=Tag.objects.all(),
         required=False
         required=False
     )
     )
 
 
@@ -2530,7 +2545,8 @@ class PowerOutletCreateForm(LabeledComponentForm):
         max_length=100,
         max_length=100,
         required=False
         required=False
     )
     )
-    tags = TagField(
+    tags = DynamicModelMultipleChoiceField(
+        queryset=Tag.objects.all(),
         required=False
         required=False
     )
     )
 
 
@@ -2689,7 +2705,8 @@ class InterfaceForm(InterfaceCommonForm, BootstrapMixin, forms.ModelForm):
             },
             },
         )
         )
     )
     )
-    tags = TagField(
+    tags = DynamicModelMultipleChoiceField(
+        queryset=Tag.objects.all(),
         required=False
         required=False
     )
     )
 
 
@@ -2773,7 +2790,8 @@ class InterfaceCreateForm(InterfaceCommonForm, LabeledComponentForm):
         required=False,
         required=False,
         widget=StaticSelect2(),
         widget=StaticSelect2(),
     )
     )
-    tags = TagField(
+    tags = DynamicModelMultipleChoiceField(
+        queryset=Tag.objects.all(),
         required=False
         required=False
     )
     )
     untagged_vlan = DynamicModelChoiceField(
     untagged_vlan = DynamicModelChoiceField(
@@ -2985,7 +3003,8 @@ class FrontPortFilterForm(DeviceComponentFilterForm):
 
 
 
 
 class FrontPortForm(BootstrapMixin, forms.ModelForm):
 class FrontPortForm(BootstrapMixin, forms.ModelForm):
-    tags = TagField(
+    tags = DynamicModelMultipleChoiceField(
+        queryset=Tag.objects.all(),
         required=False
         required=False
     )
     )
 
 
@@ -3176,7 +3195,8 @@ class RearPortFilterForm(DeviceComponentFilterForm):
 
 
 
 
 class RearPortForm(BootstrapMixin, forms.ModelForm):
 class RearPortForm(BootstrapMixin, forms.ModelForm):
-    tags = TagField(
+    tags = DynamicModelMultipleChoiceField(
+        queryset=Tag.objects.all(),
         required=False
         required=False
     )
     )
 
 
@@ -3279,7 +3299,8 @@ class DeviceBayFilterForm(DeviceComponentFilterForm):
 
 
 
 
 class DeviceBayForm(BootstrapMixin, forms.ModelForm):
 class DeviceBayForm(BootstrapMixin, forms.ModelForm):
-    tags = TagField(
+    tags = DynamicModelMultipleChoiceField(
+        queryset=Tag.objects.all(),
         required=False
         required=False
     )
     )
 
 
@@ -3300,7 +3321,8 @@ class DeviceBayCreateForm(BootstrapMixin, forms.Form):
     name_pattern = ExpandableNameField(
     name_pattern = ExpandableNameField(
         label='Name'
         label='Name'
     )
     )
-    tags = TagField(
+    tags = DynamicModelMultipleChoiceField(
+        queryset=Tag.objects.all(),
         required=False
         required=False
     )
     )
 
 
@@ -3330,7 +3352,8 @@ class DeviceBayBulkCreateForm(
     form_from_model(DeviceBay, ['description', 'tags']),
     form_from_model(DeviceBay, ['description', 'tags']),
     DeviceBulkAddComponentForm
     DeviceBulkAddComponentForm
 ):
 ):
-    tags = TagField(
+    tags = DynamicModelMultipleChoiceField(
+        queryset=Tag.objects.all(),
         required=False
         required=False
     )
     )
 
 
@@ -3634,7 +3657,8 @@ class ConnectCableToPowerFeedForm(BootstrapMixin, forms.ModelForm):
 
 
 
 
 class CableForm(BootstrapMixin, forms.ModelForm):
 class CableForm(BootstrapMixin, forms.ModelForm):
-    tags = TagField(
+    tags = DynamicModelMultipleChoiceField(
+        queryset=Tag.objects.all(),
         required=False
         required=False
     )
     )
 
 
@@ -3963,7 +3987,8 @@ class InventoryItemForm(BootstrapMixin, forms.ModelForm):
         queryset=Manufacturer.objects.all(),
         queryset=Manufacturer.objects.all(),
         required=False
         required=False
     )
     )
-    tags = TagField(
+    tags = DynamicModelMultipleChoiceField(
+        queryset=Tag.objects.all(),
         required=False
         required=False
     )
     )
 
 
@@ -4111,7 +4136,8 @@ class DeviceSelectionForm(forms.Form):
 
 
 
 
 class VirtualChassisForm(BootstrapMixin, forms.ModelForm):
 class VirtualChassisForm(BootstrapMixin, forms.ModelForm):
-    tags = TagField(
+    tags = DynamicModelMultipleChoiceField(
+        queryset=Tag.objects.all(),
         required=False
         required=False
     )
     )
 
 
@@ -4301,7 +4327,8 @@ class PowerPanelForm(BootstrapMixin, forms.ModelForm):
         queryset=RackGroup.objects.all(),
         queryset=RackGroup.objects.all(),
         required=False
         required=False
     )
     )
-    tags = TagField(
+    tags = DynamicModelMultipleChoiceField(
+        queryset=Tag.objects.all(),
         required=False
         required=False
     )
     )
 
 
@@ -4425,7 +4452,8 @@ class PowerFeedForm(BootstrapMixin, CustomFieldModelForm):
         required=False
         required=False
     )
     )
     comments = CommentField()
     comments = CommentField()
-    tags = TagField(
+    tags = DynamicModelMultipleChoiceField(
+        queryset=Tag.objects.all(),
         required=False
         required=False
     )
     )
 
 

+ 8 - 12
netbox/extras/forms.py

@@ -3,7 +3,6 @@ from django.contrib.auth.models import User
 from django.contrib.contenttypes.models import ContentType
 from django.contrib.contenttypes.models import ContentType
 from django.utils.safestring import mark_safe
 from django.utils.safestring import mark_safe
 from mptt.forms import TreeNodeMultipleChoiceField
 from mptt.forms import TreeNodeMultipleChoiceField
-from taggit.forms import TagField as TagField_
 
 
 from dcim.models import DeviceRole, Platform, Region, Site
 from dcim.models import DeviceRole, Platform, Region, Site
 from tenancy.models import Tenant, TenantGroup
 from tenancy.models import Tenant, TenantGroup
@@ -143,15 +142,6 @@ class CustomFieldFilterForm(forms.Form):
 # Tags
 # Tags
 #
 #
 
 
-class TagField(TagField_):
-
-    def widget_attrs(self, widget):
-        # Apply the "tagfield" CSS class to trigger the special API-based selection widget for tags
-        return {
-            'class': 'tagfield'
-        }
-
-
 class TagForm(BootstrapMixin, forms.ModelForm):
 class TagForm(BootstrapMixin, forms.ModelForm):
     slug = SlugField()
     slug = SlugField()
 
 
@@ -179,8 +169,14 @@ class AddRemoveTagsForm(forms.Form):
         super().__init__(*args, **kwargs)
         super().__init__(*args, **kwargs)
 
 
         # Add add/remove tags fields
         # Add add/remove tags fields
-        self.fields['add_tags'] = TagField(required=False)
-        self.fields['remove_tags'] = TagField(required=False)
+        self.fields['add_tags'] = DynamicModelMultipleChoiceField(
+            queryset=Tag.objects.all(),
+            required=False
+        )
+        self.fields['remove_tags'] = DynamicModelMultipleChoiceField(
+            queryset=Tag.objects.all(),
+            required=False
+        )
 
 
 
 
 class TagFilterForm(BootstrapMixin, forms.Form):
 class TagFilterForm(BootstrapMixin, forms.Form):

+ 17 - 7
netbox/ipam/forms.py

@@ -4,8 +4,8 @@ from django.core.validators import MaxValueValidator, MinValueValidator
 from dcim.models import Device, Interface, Rack, Region, Site
 from dcim.models import Device, Interface, Rack, Region, Site
 from extras.forms import (
 from extras.forms import (
     AddRemoveTagsForm, CustomFieldBulkEditForm, CustomFieldModelCSVForm, CustomFieldModelForm, CustomFieldFilterForm,
     AddRemoveTagsForm, CustomFieldBulkEditForm, CustomFieldModelCSVForm, CustomFieldModelForm, CustomFieldFilterForm,
-    TagField,
 )
 )
+from extras.models import Tag
 from tenancy.forms import TenancyFilterForm, TenancyForm
 from tenancy.forms import TenancyFilterForm, TenancyForm
 from tenancy.models import Tenant
 from tenancy.models import Tenant
 from utilities.forms import (
 from utilities.forms import (
@@ -33,7 +33,8 @@ IPADDRESS_MASK_LENGTH_CHOICES = add_blank_choice([
 #
 #
 
 
 class VRFForm(BootstrapMixin, TenancyForm, CustomFieldModelForm):
 class VRFForm(BootstrapMixin, TenancyForm, CustomFieldModelForm):
-    tags = TagField(
+    tags = DynamicModelMultipleChoiceField(
+        queryset=Tag.objects.all(),
         required=False
         required=False
     )
     )
 
 
@@ -141,7 +142,8 @@ class AggregateForm(BootstrapMixin, CustomFieldModelForm):
     rir = DynamicModelChoiceField(
     rir = DynamicModelChoiceField(
         queryset=RIR.objects.all()
         queryset=RIR.objects.all()
     )
     )
-    tags = TagField(
+    tags = DynamicModelMultipleChoiceField(
+        queryset=Tag.objects.all(),
         required=False
         required=False
     )
     )
 
 
@@ -292,7 +294,10 @@ class PrefixForm(BootstrapMixin, TenancyForm, CustomFieldModelForm):
         queryset=Role.objects.all(),
         queryset=Role.objects.all(),
         required=False
         required=False
     )
     )
-    tags = TagField(required=False)
+    tags = DynamicModelMultipleChoiceField(
+        queryset=Tag.objects.all(),
+        required=False
+    )
 
 
     class Meta:
     class Meta:
         model = Prefix
         model = Prefix
@@ -584,7 +589,8 @@ class IPAddressForm(BootstrapMixin, TenancyForm, ReturnURLForm, CustomFieldModel
         required=False,
         required=False,
         label='Make this the primary IP for the device/VM'
         label='Make this the primary IP for the device/VM'
     )
     )
-    tags = TagField(
+    tags = DynamicModelMultipleChoiceField(
+        queryset=Tag.objects.all(),
         required=False
         required=False
     )
     )
 
 
@@ -990,7 +996,10 @@ class VLANForm(BootstrapMixin, TenancyForm, CustomFieldModelForm):
         queryset=Role.objects.all(),
         queryset=Role.objects.all(),
         required=False
         required=False
     )
     )
-    tags = TagField(required=False)
+    tags = DynamicModelMultipleChoiceField(
+        queryset=Tag.objects.all(),
+        required=False
+    )
 
 
     class Meta:
     class Meta:
         model = VLAN
         model = VLAN
@@ -1157,7 +1166,8 @@ class ServiceForm(BootstrapMixin, CustomFieldModelForm):
         min_value=SERVICE_PORT_MIN,
         min_value=SERVICE_PORT_MIN,
         max_value=SERVICE_PORT_MAX
         max_value=SERVICE_PORT_MAX
     )
     )
-    tags = TagField(
+    tags = DynamicModelMultipleChoiceField(
+        queryset=Tag.objects.all(),
         required=False
         required=False
     )
     )
 
 

+ 3 - 2
netbox/secrets/forms.py

@@ -5,8 +5,8 @@ from django import forms
 from dcim.models import Device
 from dcim.models import Device
 from extras.forms import (
 from extras.forms import (
     AddRemoveTagsForm, CustomFieldBulkEditForm, CustomFieldFilterForm, CustomFieldModelForm, CustomFieldModelCSVForm,
     AddRemoveTagsForm, CustomFieldBulkEditForm, CustomFieldFilterForm, CustomFieldModelForm, CustomFieldModelCSVForm,
-    TagField,
 )
 )
+from extras.models import Tag
 from utilities.forms import (
 from utilities.forms import (
     APISelectMultiple, BootstrapMixin, CSVModelChoiceField, CSVModelForm, DynamicModelChoiceField,
     APISelectMultiple, BootstrapMixin, CSVModelChoiceField, CSVModelForm, DynamicModelChoiceField,
     DynamicModelMultipleChoiceField, SlugField, StaticSelect2Multiple, TagFilterField,
     DynamicModelMultipleChoiceField, SlugField, StaticSelect2Multiple, TagFilterField,
@@ -90,7 +90,8 @@ class SecretForm(BootstrapMixin, CustomFieldModelForm):
     role = DynamicModelChoiceField(
     role = DynamicModelChoiceField(
         queryset=SecretRole.objects.all()
         queryset=SecretRole.objects.all()
     )
     )
-    tags = TagField(
+    tags = DynamicModelMultipleChoiceField(
+        queryset=Tag.objects.all(),
         required=False
         required=False
     )
     )
 
 

+ 3 - 2
netbox/tenancy/forms.py

@@ -2,8 +2,8 @@ from django import forms
 
 
 from extras.forms import (
 from extras.forms import (
     AddRemoveTagsForm, CustomFieldModelForm, CustomFieldBulkEditForm, CustomFieldFilterForm, CustomFieldModelCSVForm,
     AddRemoveTagsForm, CustomFieldModelForm, CustomFieldBulkEditForm, CustomFieldFilterForm, CustomFieldModelCSVForm,
-    TagField,
 )
 )
+from extras.models import Tag
 from utilities.forms import (
 from utilities.forms import (
     APISelect, APISelectMultiple, BootstrapMixin, CommentField, CSVModelChoiceField, CSVModelForm,
     APISelect, APISelectMultiple, BootstrapMixin, CommentField, CSVModelChoiceField, CSVModelForm,
     DynamicModelChoiceField, DynamicModelMultipleChoiceField, SlugField, TagFilterField,
     DynamicModelChoiceField, DynamicModelMultipleChoiceField, SlugField, TagFilterField,
@@ -57,7 +57,8 @@ class TenantForm(BootstrapMixin, CustomFieldModelForm):
         required=False
         required=False
     )
     )
     comments = CommentField()
     comments = CommentField()
-    tags = TagField(
+    tags = DynamicModelMultipleChoiceField(
+        queryset=Tag.objects.all(),
         required=False
         required=False
     )
     )
 
 

+ 11 - 7
netbox/virtualization/forms.py

@@ -7,8 +7,8 @@ from dcim.forms import INTERFACE_MODE_HELP_TEXT
 from dcim.models import Device, DeviceRole, Interface, Platform, Rack, Region, Site
 from dcim.models import Device, DeviceRole, Interface, Platform, Rack, Region, Site
 from extras.forms import (
 from extras.forms import (
     AddRemoveTagsForm, CustomFieldBulkEditForm, CustomFieldModelCSVForm, CustomFieldModelForm, CustomFieldFilterForm,
     AddRemoveTagsForm, CustomFieldBulkEditForm, CustomFieldModelCSVForm, CustomFieldModelForm, CustomFieldFilterForm,
-    TagField,
 )
 )
+from extras.models import Tag
 from ipam.models import IPAddress, VLAN
 from ipam.models import IPAddress, VLAN
 from tenancy.forms import TenancyFilterForm, TenancyForm
 from tenancy.forms import TenancyFilterForm, TenancyForm
 from tenancy.models import Tenant
 from tenancy.models import Tenant
@@ -83,7 +83,8 @@ class ClusterForm(BootstrapMixin, TenancyForm, CustomFieldModelForm):
         required=False
         required=False
     )
     )
     comments = CommentField()
     comments = CommentField()
-    tags = TagField(
+    tags = DynamicModelMultipleChoiceField(
+        queryset=Tag.objects.all(),
         required=False
         required=False
     )
     )
 
 
@@ -312,13 +313,14 @@ class VirtualMachineForm(BootstrapMixin, TenancyForm, CustomFieldModelForm):
         queryset=Platform.objects.all(),
         queryset=Platform.objects.all(),
         required=False
         required=False
     )
     )
-    tags = TagField(
-        required=False
-    )
     local_context_data = JSONField(
     local_context_data = JSONField(
         required=False,
         required=False,
         label=''
         label=''
     )
     )
+    tags = DynamicModelMultipleChoiceField(
+        queryset=Tag.objects.all(),
+        required=False
+    )
 
 
     class Meta:
     class Meta:
         model = VirtualMachine
         model = VirtualMachine
@@ -590,7 +592,8 @@ class InterfaceForm(BootstrapMixin, forms.ModelForm):
             },
             },
         )
         )
     )
     )
-    tags = TagField(
+    tags = DynamicModelMultipleChoiceField(
+        queryset=Tag.objects.all(),
         required=False
         required=False
     )
     )
 
 
@@ -697,7 +700,8 @@ class InterfaceCreateForm(BootstrapMixin, forms.Form):
             },
             },
         )
         )
     )
     )
-    tags = TagField(
+    tags = DynamicModelMultipleChoiceField(
+        queryset=Tag.objects.all(),
         required=False
         required=False
     )
     )