1
+ import sys
2
+
3
+ from core .models import ObjectType
1
4
from django .contrib .contenttypes .models import ContentType
2
5
from extras .choices import CustomFieldTypeChoices
3
6
from netbox .api .serializers import NetBoxModelSerializer
6
9
from rest_framework .reverse import reverse
7
10
8
11
from netbox_custom_objects import field_types
9
- from netbox_custom_objects .models import CustomObject , CustomObjectType , CustomObjectTypeField
12
+ from netbox_custom_objects .models import (CustomObject , CustomObjectType ,
13
+ CustomObjectTypeField )
10
14
11
15
__all__ = (
12
16
"CustomObjectTypeSerializer" ,
@@ -59,10 +63,10 @@ def validate(self, attrs):
59
63
CustomFieldTypeChoices .TYPE_MULTIOBJECT ,
60
64
]:
61
65
try :
62
- attrs ["related_object_type" ] = ContentType .objects .get (
66
+ attrs ["related_object_type" ] = ObjectType .objects .get (
63
67
app_label = app_label , model = model
64
68
)
65
- except ContentType .DoesNotExist :
69
+ except ObjectType .DoesNotExist :
66
70
raise ValidationError (
67
71
"Must provide valid app_label and model for object field type."
68
72
)
@@ -197,17 +201,24 @@ def get_field_data(self, obj):
197
201
198
202
def get_serializer_class (model ):
199
203
model_fields = model .custom_object_type .fields .all ()
204
+
205
+ # Create field list including all necessary fields
206
+ base_fields = ["id" , "url" , "display" , "created" , "last_updated" , "tags" ]
207
+ custom_field_names = [field .name for field in model_fields ]
208
+ all_fields = base_fields + custom_field_names
209
+
200
210
meta = type (
201
211
"Meta" ,
202
212
(),
203
213
{
204
214
"model" : model ,
205
- "fields" : "__all__" ,
215
+ "fields" : all_fields ,
216
+ "brief_fields" : ("id" , "url" , "display" ),
206
217
},
207
218
)
208
219
209
220
def get_url (self , obj ):
210
- # Unsaved objects will not yet have a valid URL.
221
+ """Generate the API URL for this object"""
211
222
if hasattr (obj , "pk" ) and obj .pk in (None , "" ):
212
223
return None
213
224
@@ -221,24 +232,38 @@ def get_url(self, obj):
221
232
format = self .context .get ("format" )
222
233
return reverse (view_name , kwargs = kwargs , request = request , format = format )
223
234
235
+ def get_display (self , obj ):
236
+ """Get display representation of the object"""
237
+ return str (obj )
238
+
239
+ # Create basic attributes for the serializer
224
240
attrs = {
225
241
"Meta" : meta ,
226
- "__module__" : "database .serializers" ,
242
+ "__module__" : "netbox_custom_objects.api .serializers" ,
227
243
"url" : serializers .SerializerMethodField (),
228
244
"get_url" : get_url ,
245
+ "display" : serializers .SerializerMethodField (),
246
+ "get_display" : get_display ,
229
247
}
230
248
231
249
for field in model_fields :
232
250
field_type = field_types .FIELD_TYPE_CLASS [field .type ]()
233
251
try :
234
252
attrs [field .name ] = field_type .get_serializer_field (field )
235
253
except NotImplementedError :
236
- print (f"serializer: { field .name } field is not implemented; using a default serializer field" )
254
+ print (
255
+ f"serializer: { field .name } field is not implemented; using a default serializer field"
256
+ )
237
257
258
+ serializer_name = f"{ model ._meta .object_name } Serializer"
238
259
serializer = type (
239
- f" { model . _meta . object_name } Serializer" ,
240
- (serializers . ModelSerializer ,),
260
+ serializer_name ,
261
+ (NetBoxModelSerializer ,),
241
262
attrs ,
242
263
)
243
264
265
+ # Register the serializer in the current module so NetBox can find it
266
+ current_module = sys .modules [__name__ ]
267
+ setattr (current_module , serializer_name , serializer )
268
+
244
269
return serializer
0 commit comments