From 6d9abb9d29e8a99a358979ea13a068eebd34bfab Mon Sep 17 00:00:00 2001 From: Fabian Geisberger Date: Wed, 9 Sep 2020 11:56:32 -0400 Subject: [PATCH] Add custom fields to tags. --- netbox/extras/api/serializers.py | 8 ++++++-- netbox/extras/api/views.py | 2 +- netbox/extras/forms.py | 2 +- netbox/extras/models/tags.py | 12 ++++++++++-- netbox/templates/extras/tag_edit.html | 8 ++++++++ 5 files changed, 26 insertions(+), 6 deletions(-) diff --git a/netbox/extras/api/serializers.py b/netbox/extras/api/serializers.py index aa8f6ba69..819608e6a 100644 --- a/netbox/extras/api/serializers.py +++ b/netbox/extras/api/serializers.py @@ -8,6 +8,7 @@ from dcim.api.nested_serializers import ( NestedRegionSerializer, NestedSiteSerializer, ) from dcim.models import Device, DeviceRole, Platform, Rack, Region, Site +from extras.api.customfields import CustomFieldModelSerializer from extras.choices import * from extras.models import ( ConfigContext, ExportTemplate, Graph, ImageAttachment, ObjectChange, JobResult, Tag, @@ -88,13 +89,16 @@ class ExportTemplateSerializer(ValidatedModelSerializer): # Tags # -class TagSerializer(ValidatedModelSerializer): +class TagSerializer(CustomFieldModelSerializer): url = serializers.HyperlinkedIdentityField(view_name='extras-api:tag-detail') tagged_items = serializers.IntegerField(read_only=True) class Meta: model = Tag - fields = ['id', 'url', 'name', 'slug', 'color', 'description', 'tagged_items'] + fields = [ + 'id', 'url', 'name', 'slug', 'color', 'description', 'custom_fields', + 'tagged_items', + ] class TaggedObjectSerializer(serializers.Serializer): diff --git a/netbox/extras/api/views.py b/netbox/extras/api/views.py index a63dbe44d..81fb204e9 100644 --- a/netbox/extras/api/views.py +++ b/netbox/extras/api/views.py @@ -124,7 +124,7 @@ class ExportTemplateViewSet(ModelViewSet): # Tags # -class TagViewSet(ModelViewSet): +class TagViewSet(CustomFieldModelViewSet): queryset = Tag.objects.annotate( tagged_items=Count('extras_taggeditem_items') ).order_by(*Tag._meta.ordering) diff --git a/netbox/extras/forms.py b/netbox/extras/forms.py index 90ec828c7..bb55e9464 100644 --- a/netbox/extras/forms.py +++ b/netbox/extras/forms.py @@ -152,7 +152,7 @@ class CustomFieldFilterForm(forms.Form): # Tags # -class TagForm(BootstrapMixin, forms.ModelForm): +class TagForm(BootstrapMixin, CustomFieldModelForm): slug = SlugField() class Meta: diff --git a/netbox/extras/models/tags.py b/netbox/extras/models/tags.py index 4b5acdc76..92e04140d 100644 --- a/netbox/extras/models/tags.py +++ b/netbox/extras/models/tags.py @@ -1,8 +1,10 @@ +from django.contrib.contenttypes.fields import GenericRelation from django.db import models from django.utils.text import slugify from taggit.models import TagBase, GenericTaggedItemBase -from extras.models import ChangeLoggedModel +from extras.models import ChangeLoggedModel, CustomFieldModel +from extras.utils import extras_features from utilities.choices import ColorChoices from utilities.fields import ColorField from utilities.querysets import RestrictedQuerySet @@ -12,7 +14,8 @@ from utilities.querysets import RestrictedQuerySet # Tags # -class Tag(TagBase, ChangeLoggedModel): +@extras_features('custom_fields') +class Tag(TagBase, ChangeLoggedModel, CustomFieldModel): color = ColorField( default=ColorChoices.COLOR_GREY ) @@ -20,6 +23,11 @@ class Tag(TagBase, ChangeLoggedModel): max_length=200, blank=True, ) + custom_field_values = GenericRelation( + to='extras.CustomFieldValue', + content_type_field='obj_type', + object_id_field='obj_id' + ) objects = RestrictedQuerySet.as_manager() diff --git a/netbox/templates/extras/tag_edit.html b/netbox/templates/extras/tag_edit.html index 87b9a2e53..43ed48598 100644 --- a/netbox/templates/extras/tag_edit.html +++ b/netbox/templates/extras/tag_edit.html @@ -11,4 +11,12 @@ {% render_field form.description %} + {% if form.custom_fields %} +
+
Custom Fields
+
+ {% render_custom_fields form %} +
+
+ {% endif %} {% endblock %}