From bbcec4ffff3039b85c4e501142dddcd0732a75d7 Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Fri, 23 Jun 2023 11:23:45 -0400 Subject: [PATCH] Limit tags by object type during assignment --- netbox/extras/filtersets.py | 10 +++++++--- netbox/extras/forms/filtersets.py | 2 +- netbox/netbox/forms/base.py | 7 +++++++ 3 files changed, 15 insertions(+), 4 deletions(-) diff --git a/netbox/extras/filtersets.py b/netbox/extras/filtersets.py index 6370f3f25..acb0aa359 100644 --- a/netbox/extras/filtersets.py +++ b/netbox/extras/filtersets.py @@ -258,10 +258,9 @@ class TagFilterSet(ChangeLoggedModelFilterSet): content_type_id = MultiValueNumberFilter( method='_content_type_id' ) - object_type_id = MultiValueNumberFilter( - field_name='object_types__id' + for_object_type_id = MultiValueNumberFilter( + method='_for_object_type' ) - object_types = ContentTypeFilter() class Meta: model = Tag @@ -302,6 +301,11 @@ class TagFilterSet(ChangeLoggedModelFilterSet): return queryset.filter(extras_taggeditem_items__content_type__in=content_types).distinct() + def _for_object_type(self, queryset, name, values): + return queryset.filter( + Q(object_types__id__in=values) | Q(object_types__isnull=True) + ) + class ConfigContextFilterSet(ChangeLoggedModelFilterSet): q = django_filters.CharFilter( diff --git a/netbox/extras/forms/filtersets.py b/netbox/extras/forms/filtersets.py index ad315a133..56e9c8dfb 100644 --- a/netbox/extras/forms/filtersets.py +++ b/netbox/extras/forms/filtersets.py @@ -245,7 +245,7 @@ class TagFilterForm(SavedFiltersMixin, FilterForm): required=False, label=_('Tagged object type') ) - object_type_id = ContentTypeMultipleChoiceField( + for_object_type_id = ContentTypeChoiceField( queryset=ContentType.objects.filter(FeatureQuery('tags').get_query()), required=False, label=_('Allowed object type') diff --git a/netbox/netbox/forms/base.py b/netbox/netbox/forms/base.py index 83c238e0f..f102f79e4 100644 --- a/netbox/netbox/forms/base.py +++ b/netbox/netbox/forms/base.py @@ -31,6 +31,13 @@ class NetBoxModelForm(BootstrapMixin, CustomFieldsMixin, forms.ModelForm): required=False ) + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + + # Limit tags to those applicable to the object type + if ct := self._get_content_type(): + self.fields['tags'].widget.add_query_param('for_object_type_id', ct.pk) + def _get_content_type(self): return ContentType.objects.get_for_model(self._meta.model)