Skip to content

Commit

Permalink
fixed nested serializers for data source and data file
Browse files Browse the repository at this point in the history
  • Loading branch information
amyasnikov committed Oct 3, 2024
1 parent 9350a6f commit 10c264c
Show file tree
Hide file tree
Showing 2 changed files with 31 additions and 8 deletions.
16 changes: 15 additions & 1 deletion validity/api/helpers.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
from django.db.models import ManyToManyField
from netbox.api.serializers import WritableNestedSerializer
from rest_framework.relations import PrimaryKeyRelatedField
from rest_framework.serializers import JSONField, ModelSerializer
from rest_framework.serializers import HyperlinkedIdentityField, JSONField, ModelSerializer

from validity import NetboxVersion
from validity.fields.encrypted import EncryptedDict
Expand Down Expand Up @@ -38,6 +38,20 @@ def nested_factory(
return type(name, bases, s_attribs)


def proxy_factory(
serializer_class: type[ModelSerializer], view_name: str, fields: Sequence[str] = ()
) -> type[ModelSerializer]:
"""
Creates Nested Serializer for a proxy model.
Proxy models can't use regular nested serializers, see https://github.com/amyasnikov/validity/issues/121
"""
url = HyperlinkedIdentityField(view_name=view_name)
meta = serializer_class.Meta
if fields:
meta = meta_factory(serializer_class.Meta, fields=fields)
return type(serializer_class.__name__, (serializer_class,), {"url": url, "Meta": meta})


class EncryptedDictField(JSONField):
def to_representation(self, value):
return value.encrypted
Expand Down
23 changes: 16 additions & 7 deletions validity/api/serializers.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,9 @@
from core.api.nested_serializers import NestedDataFileSerializer, NestedDataSourceSerializer
from core.api.nested_serializers import (
NestedDataFileSerializer as _NestedDataFileSerializer,
)
from core.api.nested_serializers import (
NestedDataSourceSerializer as _NestedDataSourceSerializer,
)
from core.api.serializers import JobSerializer
from core.models import DataSource
from dcim.api.nested_serializers import (
Expand Down Expand Up @@ -32,15 +37,19 @@
PrimaryKeyField,
SubformValidationMixin,
nested_factory,
proxy_factory,
)


class NestedDeviceSerializer(_NestedDeviceSerializer):
url = serializers.HyperlinkedIdentityField(view_name="dcim-api:device-detail")

class Meta:
model = Device
fields = ["id", "url", "display", "name"]
NestedDeviceSerializer = proxy_factory(
_NestedDeviceSerializer, view_name="dcim-api:device-detail", fields=["id", "url", "display", "name"]
)
NestedDataSourceSerializer = proxy_factory(
_NestedDataSourceSerializer, view_name="core-api:datasource-detail", fields=["id", "url", "display", "name"]
)
NestedDataFileSerializer = proxy_factory(
_NestedDataFileSerializer, view_name="core-api:datafile-detail", fields=["id", "url", "display", "path"]
)


class ComplianceSelectorSerializer(NetBoxModelSerializer):
Expand Down

0 comments on commit 10c264c

Please sign in to comment.