|
1 |
| -from rest_framework.serializers import ModelSerializer |
| 1 | +from rest_framework.serializers import Serializer, HyperlinkedIdentityField |
2 | 2 |
|
3 |
| -from netbox.api import ChoiceField |
| 3 | +from netbox.api import ChoiceField, WritableNestedSerializer |
4 | 4 | from dcim.api.nested_serializers import NestedSiteSerializer
|
5 | 5 | from tenancy.api.nested_serializers import NestedTenantSerializer
|
6 |
| -from extras.api.serializers import TaggedObjectSerializer |
7 |
| -from extras.api.customfields import CustomFieldModelSerializer |
| 6 | + |
| 7 | +try: |
| 8 | + from extras.api.customfields import CustomFieldModelSerializer |
| 9 | +except ImportError: |
| 10 | + from netbox.api.serializers import CustomFieldModelSerializer |
| 11 | + |
| 12 | +from extras.models import Tag |
8 | 13 | from netbox_bgp.models import ASN, ASNStatusChoices, BGPSession, SessionStatusChoices
|
9 | 14 |
|
10 | 15 |
|
| 16 | +class NestedTagSerializer(WritableNestedSerializer): |
| 17 | + url = HyperlinkedIdentityField(view_name='extras-api:tag-detail') |
| 18 | + |
| 19 | + class Meta: |
| 20 | + model = Tag |
| 21 | + fields = ['id', 'url', 'name', 'slug', 'color'] |
| 22 | + |
| 23 | + |
| 24 | +class TaggedObjectSerializer(Serializer): |
| 25 | + tags = NestedTagSerializer(many=True, required=False) |
| 26 | + |
| 27 | + def create(self, validated_data): |
| 28 | + tags = validated_data.pop('tags', None) |
| 29 | + instance = super().create(validated_data) |
| 30 | + |
| 31 | + if tags is not None: |
| 32 | + return self._save_tags(instance, tags) |
| 33 | + return instance |
| 34 | + |
| 35 | + def update(self, instance, validated_data): |
| 36 | + tags = validated_data.pop('tags', None) |
| 37 | + # Cache tags on instance for change logging |
| 38 | + instance._tags = tags or [] |
| 39 | + |
| 40 | + instance = super().update(instance, validated_data) |
| 41 | + if tags is not None: |
| 42 | + return self._save_tags(instance, tags) |
| 43 | + return instance |
| 44 | + |
| 45 | + def _save_tags(self, instance, tags): |
| 46 | + if tags: |
| 47 | + instance.tags.set(*[t.name for t in tags]) |
| 48 | + else: |
| 49 | + instance.tags.clear() |
| 50 | + return instance |
| 51 | + |
| 52 | + |
11 | 53 | class ASNSerializer(TaggedObjectSerializer, CustomFieldModelSerializer):
|
12 | 54 | status = ChoiceField(choices=ASNStatusChoices, required=False)
|
13 | 55 | site = NestedSiteSerializer(required=False, allow_null=True)
|
|
0 commit comments