Skip to content

Commit 7f158bb

Browse files
committed
🐛 [#576] fix invalid data field type in api spec
1 parent 659df56 commit 7f158bb

File tree

4 files changed

+39
-4
lines changed

4 files changed

+39
-4
lines changed

src/objects/api/serializers.py

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,14 +6,19 @@
66

77
from objects.core.models import Object, ObjectRecord, ObjectType
88
from objects.token.models import Permission
9-
from objects.utils.serializers import DynamicFieldsMixin
9+
from objects.utils.serializers import (
10+
DynamicFieldsMixin,
11+
JsonObjectFieldModelSerializerMixin,
12+
)
1013

1114
from .fields import ObjectSlugRelatedField, ObjectTypeField, ObjectUrlField
1215
from .utils import merge_patch
1316
from .validators import GeometryValidator, IsImmutableValidator, JsonSchemaValidator
1417

1518

16-
class ObjectRecordSerializer(serializers.ModelSerializer):
19+
class ObjectRecordSerializer(
20+
JsonObjectFieldModelSerializerMixin, serializers.ModelSerializer
21+
):
1722
correctionFor = ObjectSlugRelatedField(
1823
source="correct",
1924
slug_field="index",
@@ -50,7 +55,9 @@ class Meta:
5055
}
5156

5257

53-
class HistoryRecordSerializer(serializers.ModelSerializer):
58+
class HistoryRecordSerializer(
59+
JsonObjectFieldModelSerializerMixin, serializers.ModelSerializer
60+
):
5461
correctionFor = serializers.SlugRelatedField(
5562
source="correct",
5663
slug_field="index",
@@ -151,7 +158,9 @@ class ObjectSearchSerializer(serializers.Serializer):
151158
geometry = GeoWithinSerializer(required=False)
152159

153160

154-
class PermissionSerializer(serializers.ModelSerializer):
161+
class PermissionSerializer(
162+
JsonObjectFieldModelSerializerMixin, serializers.ModelSerializer
163+
):
155164
type = ObjectTypeField(
156165
min_length=1,
157166
max_length=1000,

src/objects/api/v2/openapi.yaml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -858,6 +858,8 @@ components:
858858
minimum: 0
859859
description: Version of the OBJECTTYPE for data in the object record
860860
data:
861+
type: object
862+
additionalProperties: true
861863
description: Object data, based on OBJECTTYPE
862864
geometry:
863865
allOf:
@@ -1016,6 +1018,8 @@ components:
10161018
minimum: 0
10171019
description: Version of the OBJECTTYPE for data in the object record
10181020
data:
1021+
type: object
1022+
additionalProperties: true
10191023
description: Object data, based on OBJECTTYPE
10201024
geometry:
10211025
allOf:
@@ -1178,6 +1182,8 @@ components:
11781182
type: boolean
11791183
description: Use field-based authorization
11801184
fields:
1185+
type: object
1186+
additionalProperties: true
11811187
nullable: true
11821188
title: Mode
11831189
description: Fields allowed for this token in relation to objecttype versions.

src/objects/utils/fields.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
from drf_spectacular.utils import extend_schema_field
2+
from rest_framework import serializers
3+
4+
5+
@extend_schema_field({"type": "object", "additionalProperties": True})
6+
class JSONObjectField(serializers.JSONField):
7+
"""
8+
serializers.JSONField does not have a type by default and will show `any` in api spec.
9+
"""

src/objects/utils/serializers.py

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,15 @@
11
import logging
22
from collections import defaultdict
33

4+
from django.db import models
5+
46
from glom import SKIP, GlomError, glom
57
from rest_framework import fields, serializers
68

79
from objects.token.constants import PermissionModes
810

11+
from .fields import JSONObjectField
12+
913
logger = logging.getLogger(__name__)
1014

1115

@@ -162,3 +166,10 @@ def get_allowed_fields(self, instance) -> list:
162166
return permission.fields.get(str(instance.version), [])
163167

164168
return ALL_FIELDS
169+
170+
171+
class JsonObjectFieldModelSerializerMixin:
172+
serializer_field_mapping = (
173+
serializers.ModelSerializer.serializer_field_mapping.copy()
174+
)
175+
serializer_field_mapping[models.JSONField] = JSONObjectField

0 commit comments

Comments
 (0)