Skip to content

Commit 01362b8

Browse files
committed
Use GFKSerializerField for ObjectChangeSerializer.changed_object and EventRuleSerializer.action_object
1 parent 7b5349e commit 01362b8

File tree

3 files changed

+17
-44
lines changed

3 files changed

+17
-44
lines changed

contrib/openapi.json

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -219028,9 +219028,8 @@
219028219028
"nullable": true
219029219029
},
219030219030
"action_object": {
219031-
"type": "object",
219032-
"additionalProperties": {},
219033-
"readOnly": true
219031+
"readOnly": true,
219032+
"nullable": true
219034219033
},
219035219034
"description": {
219036219035
"type": "string",
@@ -229795,7 +229794,11 @@
229795229794
"format": "int64"
229796229795
},
229797229796
"changed_object": {
229798-
"nullable": true,
229797+
"readOnly": true,
229798+
"nullable": true
229799+
},
229800+
"object_repr": {
229801+
"type": "string",
229799229802
"readOnly": true
229800229803
},
229801229804
"message": {
@@ -229820,6 +229823,7 @@
229820229823
"display_url",
229821229824
"id",
229822229825
"message",
229826+
"object_repr",
229823229827
"postchange_data",
229824229828
"prechange_data",
229825229829
"request_id",
Lines changed: 7 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,11 @@
1-
from drf_spectacular.utils import extend_schema_field
21
from rest_framework import serializers
32

43
from core.choices import *
54
from core.models import ObjectChange
6-
from netbox.api.exceptions import SerializerNotFound
75
from netbox.api.fields import ChoiceField, ContentTypeField
6+
from netbox.api.gfk_fields import GFKSerializerField
87
from netbox.api.serializers import BaseModelSerializer
98
from users.api.serializers_.users import UserSerializer
10-
from utilities.api import get_serializer_for_model
119

1210
__all__ = (
1311
'ObjectChangeSerializer',
@@ -26,7 +24,10 @@ class ObjectChangeSerializer(BaseModelSerializer):
2624
changed_object_type = ContentTypeField(
2725
read_only=True
2826
)
29-
changed_object = serializers.SerializerMethodField(
27+
changed_object = GFKSerializerField(
28+
read_only=True
29+
)
30+
object_repr = serializers.CharField(
3031
read_only=True
3132
)
3233
prechange_data = serializers.JSONField(
@@ -44,22 +45,6 @@ class Meta:
4445
model = ObjectChange
4546
fields = [
4647
'id', 'url', 'display_url', 'display', 'time', 'user', 'user_name', 'request_id', 'action',
47-
'changed_object_type', 'changed_object_id', 'changed_object', 'message', 'prechange_data',
48-
'postchange_data',
48+
'changed_object_type', 'changed_object_id', 'changed_object', 'object_repr', 'message',
49+
'prechange_data', 'postchange_data',
4950
]
50-
51-
@extend_schema_field(serializers.JSONField(allow_null=True))
52-
def get_changed_object(self, obj):
53-
"""
54-
Serialize a nested representation of the changed object.
55-
"""
56-
if obj.changed_object is None:
57-
return None
58-
59-
try:
60-
serializer = get_serializer_for_model(obj.changed_object)
61-
except SerializerNotFound:
62-
return obj.object_repr
63-
data = serializer(obj.changed_object, nested=True, context={'request': self.context['request']}).data
64-
65-
return data

netbox/extras/api/serializers_/events.py

Lines changed: 2 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,10 @@
1-
from drf_spectacular.types import OpenApiTypes
2-
from drf_spectacular.utils import extend_schema_field
3-
from rest_framework import serializers
4-
51
from core.models import ObjectType
62
from extras.choices import *
73
from extras.models import EventRule, Webhook
84
from netbox.api.fields import ChoiceField, ContentTypeField
5+
from netbox.api.gfk_fields import GFKSerializerField
96
from netbox.api.serializers import NetBoxModelSerializer
107
from users.api.serializers_.mixins import OwnerMixin
11-
from utilities.api import get_serializer_for_model
12-
from .scripts import ScriptSerializer
138

149
__all__ = (
1510
'EventRuleSerializer',
@@ -30,7 +25,7 @@ class EventRuleSerializer(OwnerMixin, NetBoxModelSerializer):
3025
action_object_type = ContentTypeField(
3126
queryset=ObjectType.objects.with_feature('event_rules'),
3227
)
33-
action_object = serializers.SerializerMethodField(read_only=True)
28+
action_object = GFKSerializerField(read_only=True)
3429

3530
class Meta:
3631
model = EventRule
@@ -41,17 +36,6 @@ class Meta:
4136
]
4237
brief_fields = ('id', 'url', 'display', 'name', 'description')
4338

44-
@extend_schema_field(OpenApiTypes.OBJECT)
45-
def get_action_object(self, instance):
46-
context = {'request': self.context['request']}
47-
# We need to manually instantiate the serializer for scripts
48-
if instance.action_type == EventRuleActionChoices.SCRIPT:
49-
script = instance.action_object
50-
return ScriptSerializer(script, nested=True, context=context).data
51-
else:
52-
serializer = get_serializer_for_model(instance.action_object_type.model_class())
53-
return serializer(instance.action_object, nested=True, context=context).data
54-
5539

5640
#
5741
# Webhooks

0 commit comments

Comments
 (0)