mirror of
https://github.com/netbox-community/netbox.git
synced 2025-07-16 04:02:52 -06:00
Merge pull request #6 from digitalocean/flat-renderer
dcim: added json flat renderer.
This commit is contained in:
commit
10d28f2fe2
@ -16,7 +16,7 @@ from .serializers import SiteSerializer, RackGroupSerializer, RackSerializer, Ra
|
|||||||
ManufacturerSerializer, DeviceTypeSerializer, DeviceRoleSerializer, PlatformSerializer, DeviceSerializer, \
|
ManufacturerSerializer, DeviceTypeSerializer, DeviceRoleSerializer, PlatformSerializer, DeviceSerializer, \
|
||||||
DeviceNestedSerializer, ConsolePortSerializer, ConsoleServerPortSerializer, PowerPortSerializer, \
|
DeviceNestedSerializer, ConsolePortSerializer, ConsoleServerPortSerializer, PowerPortSerializer, \
|
||||||
PowerOutletSerializer, InterfaceSerializer, InterfaceDetailSerializer, InterfaceConnectionSerializer
|
PowerOutletSerializer, InterfaceSerializer, InterfaceDetailSerializer, InterfaceConnectionSerializer
|
||||||
from extras.api.renderers import BINDZoneRenderer
|
from extras.api.renderers import BINDZoneRenderer, FlatJSONRenderer
|
||||||
from utilities.api import ServiceUnavailable
|
from utilities.api import ServiceUnavailable
|
||||||
|
|
||||||
|
|
||||||
@ -198,7 +198,7 @@ class DeviceListView(generics.ListAPIView):
|
|||||||
.prefetch_related('primary_ip__nat_outside')
|
.prefetch_related('primary_ip__nat_outside')
|
||||||
serializer_class = DeviceSerializer
|
serializer_class = DeviceSerializer
|
||||||
filter_class = DeviceFilter
|
filter_class = DeviceFilter
|
||||||
renderer_classes = api_settings.DEFAULT_RENDERER_CLASSES + [BINDZoneRenderer]
|
renderer_classes = api_settings.DEFAULT_RENDERER_CLASSES + [BINDZoneRenderer, FlatJSONRenderer]
|
||||||
|
|
||||||
|
|
||||||
class DeviceDetailView(generics.RetrieveAPIView):
|
class DeviceDetailView(generics.RetrieveAPIView):
|
||||||
|
@ -349,6 +349,48 @@ class DeviceTest(APITestCase):
|
|||||||
sorted(RackTest.nested_fields),
|
sorted(RackTest.nested_fields),
|
||||||
)
|
)
|
||||||
|
|
||||||
|
def test_get_list_flat(self, endpoint='/api/dcim/devices/?format=json_flat'):
|
||||||
|
|
||||||
|
flat_fields = [
|
||||||
|
'comments',
|
||||||
|
'device_role_id',
|
||||||
|
'device_role_name',
|
||||||
|
'device_role_slug',
|
||||||
|
'device_type_id',
|
||||||
|
'device_type_manufacturer_id',
|
||||||
|
'device_type_manufacturer_name',
|
||||||
|
'device_type_manufacturer_slug',
|
||||||
|
'device_type_model',
|
||||||
|
'device_type_slug',
|
||||||
|
'display_name',
|
||||||
|
'face',
|
||||||
|
'id',
|
||||||
|
'name',
|
||||||
|
'platform_id',
|
||||||
|
'platform_name',
|
||||||
|
'platform_slug',
|
||||||
|
'position',
|
||||||
|
'primary_ip_address',
|
||||||
|
'primary_ip_family',
|
||||||
|
'primary_ip_id',
|
||||||
|
'rack_display_name',
|
||||||
|
'rack_facility_id',
|
||||||
|
'rack_id',
|
||||||
|
'rack_name',
|
||||||
|
'ro_snmp',
|
||||||
|
'serial',
|
||||||
|
'status',
|
||||||
|
]
|
||||||
|
|
||||||
|
response = self.client.get(endpoint)
|
||||||
|
content = json.loads(response.content)
|
||||||
|
self.assertEqual(response.status_code, status.HTTP_200_OK)
|
||||||
|
device = content[0]
|
||||||
|
self.assertEqual(
|
||||||
|
sorted(device.keys()),
|
||||||
|
sorted(flat_fields),
|
||||||
|
)
|
||||||
|
|
||||||
def test_get_detail(self, endpoint='/api/dcim/devices/1/'):
|
def test_get_detail(self, endpoint='/api/dcim/devices/1/'):
|
||||||
response = self.client.get(endpoint)
|
response = self.client.get(endpoint)
|
||||||
content = json.loads(response.content)
|
content = json.loads(response.content)
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
|
import json
|
||||||
from rest_framework import renderers
|
from rest_framework import renderers
|
||||||
|
|
||||||
|
|
||||||
# IP address family designations
|
# IP address family designations
|
||||||
AF = {
|
AF = {
|
||||||
4: 'A',
|
4: 'A',
|
||||||
@ -29,3 +29,23 @@ class BINDZoneRenderer(renderers.BaseRenderer):
|
|||||||
except KeyError:
|
except KeyError:
|
||||||
pass
|
pass
|
||||||
return '\n'.join(records)
|
return '\n'.join(records)
|
||||||
|
|
||||||
|
|
||||||
|
class FlatJSONRenderer(renderers.BaseRenderer):
|
||||||
|
"""
|
||||||
|
Flattens a nested JSON reponse.
|
||||||
|
"""
|
||||||
|
format = 'json_flat'
|
||||||
|
media_type = 'application/json'
|
||||||
|
|
||||||
|
def render(self, data, media_type=None, renderer_context=None):
|
||||||
|
|
||||||
|
def flatten(entry):
|
||||||
|
for key, val in entry.iteritems():
|
||||||
|
if isinstance(val, dict):
|
||||||
|
for child_key, child_val in flatten(val):
|
||||||
|
yield "{}_{}".format(key, child_key), child_val
|
||||||
|
else:
|
||||||
|
yield key, val
|
||||||
|
|
||||||
|
return json.dumps([dict(flatten(i)) for i in data])
|
||||||
|
Loading…
Reference in New Issue
Block a user