فهرست منبع

Closes #2288: Fix exception when assigning objects to a ConfigContext via the API

Jeremy Stretch 7 سال پیش
والد
کامیت
45ab08aa76
2فایلهای تغییر یافته به همراه72 افزوده شده و 9 حذف شده
  1. 39 8
      netbox/extras/api/serializers.py
  2. 33 1
      netbox/extras/tests/test_api.py

+ 39 - 8
netbox/extras/api/serializers.py

@@ -8,15 +8,16 @@ from dcim.api.serializers import (
     NestedDeviceSerializer, NestedDeviceRoleSerializer, NestedPlatformSerializer, NestedRackSerializer,
     NestedRegionSerializer, NestedSiteSerializer,
 )
-from dcim.models import Device, Rack, Site
+from dcim.models import Device, DeviceRole, Platform, Rack, Region, Site
 from extras.models import (
     ConfigContext, ExportTemplate, Graph, ImageAttachment, ObjectChange, ReportResult, TopologyMap, UserAction,
 )
 from extras.constants import *
 from tenancy.api.serializers import NestedTenantSerializer, NestedTenantGroupSerializer
+from tenancy.models import Tenant, TenantGroup
 from users.api.serializers import NestedUserSerializer
 from utilities.api import (
-    ChoiceField, ContentTypeField, get_serializer_for_model, ValidatedModelSerializer,
+    ChoiceField, ContentTypeField, get_serializer_for_model, SerializedPKRelatedField, ValidatedModelSerializer,
 )
 
 
@@ -132,12 +133,42 @@ class ImageAttachmentSerializer(ValidatedModelSerializer):
 #
 
 class ConfigContextSerializer(ValidatedModelSerializer):
-    regions = NestedRegionSerializer(required=False, many=True)
-    sites = NestedSiteSerializer(required=False, many=True)
-    roles = NestedDeviceRoleSerializer(required=False, many=True)
-    platforms = NestedPlatformSerializer(required=False, many=True)
-    tenant_groups = NestedTenantGroupSerializer(required=False, many=True)
-    tenants = NestedTenantSerializer(required=False, many=True)
+    regions = SerializedPKRelatedField(
+        queryset=Region.objects.all(),
+        serializer=NestedRegionSerializer,
+        required=False,
+        many=True
+    )
+    sites = SerializedPKRelatedField(
+        queryset=Site.objects.all(),
+        serializer=NestedSiteSerializer,
+        required=False,
+        many=True
+    )
+    roles = SerializedPKRelatedField(
+        queryset=DeviceRole.objects.all(),
+        serializer=NestedDeviceRoleSerializer,
+        required=False,
+        many=True
+    )
+    platforms = SerializedPKRelatedField(
+        queryset=Platform.objects.all(),
+        serializer=NestedPlatformSerializer,
+        required=False,
+        many=True
+    )
+    tenant_groups = SerializedPKRelatedField(
+        queryset=TenantGroup.objects.all(),
+        serializer=NestedTenantGroupSerializer,
+        required=False,
+        many=True
+    )
+    tenants = SerializedPKRelatedField(
+        queryset=Tenant.objects.all(),
+        serializer=NestedTenantSerializer,
+        required=False,
+        many=True
+    )
 
     class Meta:
         model = ConfigContext

+ 33 - 1
netbox/extras/tests/test_api.py

@@ -7,9 +7,10 @@ from rest_framework import status
 from rest_framework.test import APITestCase
 from taggit.models import Tag
 
-from dcim.models import Device, DeviceRole, DeviceType, Manufacturer, Site
+from dcim.models import Device, DeviceRole, DeviceType, Manufacturer, Platform, Region, Site
 from extras.constants import GRAPH_TYPE_SITE
 from extras.models import ConfigContext, Graph, ExportTemplate
+from tenancy.models import Tenant, TenantGroup
 from users.models import Token
 from utilities.testing import HttpStatusMixin
 
@@ -363,9 +364,28 @@ class ConfigContextTest(HttpStatusMixin, APITestCase):
 
     def test_create_configcontext(self):
 
+        region1 = Region.objects.create(name='Test Region 1', slug='test-region-1')
+        region2 = Region.objects.create(name='Test Region 2', slug='test-region-2')
+        site1 = Site.objects.create(name='Test Site 1', slug='test-site-1')
+        site2 = Site.objects.create(name='Test Site 2', slug='test-site-2')
+        role1 = DeviceRole.objects.create(name='Test Role 1', slug='test-role-1')
+        role2 = DeviceRole.objects.create(name='Test Role 2', slug='test-role-2')
+        platform1 = Platform.objects.create(name='Test Platform 1', slug='test-platform-1')
+        platform2 = Platform.objects.create(name='Test Platform 2', slug='test-platform-2')
+        tenantgroup1 = TenantGroup.objects.create(name='Test Tenant Group 1', slug='test-tenant-group-1')
+        tenantgroup2 = TenantGroup.objects.create(name='Test Tenant Group 2', slug='test-tenant-group-2')
+        tenant1 = Tenant.objects.create(name='Test Tenant 1', slug='test-tenant-1')
+        tenant2 = Tenant.objects.create(name='Test Tenant 2', slug='test-tenant-2')
+
         data = {
             'name': 'Test Config Context 4',
             'weight': 1000,
+            'regions': [region1.pk, region2.pk],
+            'sites': [site1.pk, site2.pk],
+            'roles': [role1.pk, role2.pk],
+            'platforms': [platform1.pk, platform2.pk],
+            'tenant_groups': [tenantgroup1.pk, tenantgroup2.pk],
+            'tenants': [tenant1.pk, tenant2.pk],
             'data': {'foo': 'XXX'}
         }
 
@@ -376,6 +396,18 @@ class ConfigContextTest(HttpStatusMixin, APITestCase):
         self.assertEqual(ConfigContext.objects.count(), 4)
         configcontext4 = ConfigContext.objects.get(pk=response.data['id'])
         self.assertEqual(configcontext4.name, data['name'])
+        self.assertEqual(region1.pk, data['regions'][0])
+        self.assertEqual(region2.pk, data['regions'][1])
+        self.assertEqual(site1.pk, data['sites'][0])
+        self.assertEqual(site2.pk, data['sites'][1])
+        self.assertEqual(role1.pk, data['roles'][0])
+        self.assertEqual(role2.pk, data['roles'][1])
+        self.assertEqual(platform1.pk, data['platforms'][0])
+        self.assertEqual(platform2.pk, data['platforms'][1])
+        self.assertEqual(tenantgroup1.pk, data['tenant_groups'][0])
+        self.assertEqual(tenantgroup2.pk, data['tenant_groups'][1])
+        self.assertEqual(tenant1.pk, data['tenants'][0])
+        self.assertEqual(tenant2.pk, data['tenants'][1])
         self.assertEqual(configcontext4.data, data['data'])
 
     def test_create_configcontext_bulk(self):