Parcourir la source

Updated RackViewSet() to be compatible with paginated API

Jeremy Stretch il y a 8 ans
Parent
commit
1f78462f58
2 fichiers modifiés avec 26 ajouts et 17 suppressions
  1. 22 8
      netbox/dcim/api/serializers.py
  2. 4 9
      netbox/dcim/api/views.py

+ 22 - 8
netbox/dcim/api/serializers.py

@@ -176,6 +176,28 @@ class WritableRackSerializer(serializers.ModelSerializer):
 
 
 #
+# Rack units
+#
+
+class NestedDeviceSerializer(serializers.ModelSerializer):
+    url = serializers.HyperlinkedIdentityField(view_name='dcim-api:device-detail')
+
+    class Meta:
+        model = Device
+        fields = ['id', 'url', 'name', 'display_name']
+
+
+class RackUnitSerializer(serializers.Serializer):
+    """
+    A rack unit is an abstraction formed by the set (rack, position, face); it does not exist as a row in the database.
+    """
+    id = serializers.IntegerField(read_only=True)
+    name = serializers.CharField(read_only=True)
+    face = serializers.IntegerField(read_only=True)
+    device = NestedDeviceSerializer(read_only=True)
+
+
+#
 # Rack reservations
 #
 
@@ -454,14 +476,6 @@ class DeviceSerializer(CustomFieldModelSerializer):
         }
 
 
-class NestedDeviceSerializer(serializers.ModelSerializer):
-    url = serializers.HyperlinkedIdentityField(view_name='dcim-api:device-detail')
-
-    class Meta:
-        model = Device
-        fields = ['id', 'url', 'name', 'display_name']
-
-
 class WritableDeviceSerializer(serializers.ModelSerializer):
 
     class Meta:

+ 4 - 9
netbox/dcim/api/views.py

@@ -96,15 +96,10 @@ class RackViewSet(WritableSerializerMixin, CustomFieldModelViewSet):
                 exclude_pk = None
         elevation = rack.get_rack_units(face, exclude_pk)
 
-        # Serialize Devices within the rack elevation
-        for u in elevation:
-            if u['device']:
-                u['device'] = serializers.NestedDeviceSerializer(
-                    instance=u['device'],
-                    context={'request': request},
-                ).data
-
-        return Response(elevation)
+        page = self.paginate_queryset(elevation)
+        if page is not None:
+            rack_units = serializers.RackUnitSerializer(page, many=True, context={'request': request})
+            return self.get_paginated_response(rack_units.data)
 
 
 #