Browse Source

fix(api): fix serializer logic for [] PATCH/PUT payload to rrsets/

Peter Thomassen 5 years ago
parent
commit
69f83053b1
2 changed files with 7 additions and 2 deletions
  1. 2 2
      api/desecapi/serializers.py
  2. 5 0
      api/desecapi/tests/test_rrsets_bulk.py

+ 2 - 2
api/desecapi/serializers.py

@@ -447,7 +447,7 @@ class RRsetListSerializer(serializers.ListSerializer):
         def is_empty(data_item):
         def is_empty(data_item):
             return data_item.get('records', None) == []
             return data_item.get('records', None) == []
 
 
-        query = Q()
+        query = Q(pk__in=[])  # start out with an always empty query, see https://stackoverflow.com/q/35893867/6867099
         for item in validated_data:
         for item in validated_data:
             query |= Q(type=item['type'], subname=item['subname'])  # validation has ensured these fields exist
             query |= Q(type=item['type'], subname=item['subname'])  # validation has ensured these fields exist
         instance = instance.filter(query)
         instance = instance.filter(query)
@@ -457,7 +457,7 @@ class RRsetListSerializer(serializers.ListSerializer):
 
 
         if data_index.keys() | instance_index.keys() != data_index.keys():
         if data_index.keys() | instance_index.keys() != data_index.keys():
             raise ValueError('Given set of known RRsets (`instance`) is not a subset of RRsets referred to in'
             raise ValueError('Given set of known RRsets (`instance`) is not a subset of RRsets referred to in'
-                             '`validated_data`. While this would produce a correct result, this is illegal due to its'
+                             ' `validated_data`. While this would produce a correct result, this is illegal due to its'
                              ' inefficiency.')
                              ' inefficiency.')
 
 
         everything = instance_index.keys() | data_index.keys()
         everything = instance_index.keys() | data_index.keys()

+ 5 - 0
api/desecapi/tests/test_rrsets_bulk.py

@@ -179,6 +179,9 @@ class AuthenticatedRRSetBulkTestCase(AuthenticatedRRSetBaseTestCase):
         response = self.client.bulk_patch_rr_sets(domain_name=self.my_empty_domain.name, payload=[])
         response = self.client.bulk_patch_rr_sets(domain_name=self.my_empty_domain.name, payload=[])
         self.assertStatus(response, status.HTTP_200_OK)
         self.assertStatus(response, status.HTTP_200_OK)
 
 
+        response = self.client.bulk_patch_rr_sets(domain_name=self.my_rr_set_domain.name, payload=[])
+        self.assertStatus(response, status.HTTP_200_OK)
+
     def test_bulk_patch_does_not_accept_empty_payload(self):
     def test_bulk_patch_does_not_accept_empty_payload(self):
         response = self.client.bulk_patch_rr_sets(domain_name=self.my_empty_domain.name, payload=None)
         response = self.client.bulk_patch_rr_sets(domain_name=self.my_empty_domain.name, payload=None)
         self.assertContains(response, 'No data provided', status_code=status.HTTP_400_BAD_REQUEST)
         self.assertContains(response, 'No data provided', status_code=status.HTTP_400_BAD_REQUEST)
@@ -328,6 +331,8 @@ class AuthenticatedRRSetBulkTestCase(AuthenticatedRRSetBaseTestCase):
     def test_bulk_put_does_accept_empty_list(self):
     def test_bulk_put_does_accept_empty_list(self):
         response = self.client.bulk_put_rr_sets(domain_name=self.my_empty_domain.name, payload=[])
         response = self.client.bulk_put_rr_sets(domain_name=self.my_empty_domain.name, payload=[])
         self.assertStatus(response, status.HTTP_200_OK)
         self.assertStatus(response, status.HTTP_200_OK)
+        response = self.client.bulk_put_rr_sets(domain_name=self.my_rr_set_domain.name, payload=[])
+        self.assertStatus(response, status.HTTP_200_OK)
 
 
     def test_bulk_put_does_not_accept_empty_payload(self):
     def test_bulk_put_does_not_accept_empty_payload(self):
         response = self.client.bulk_put_rr_sets(domain_name=self.my_empty_domain.name, payload=None)
         response = self.client.bulk_put_rr_sets(domain_name=self.my_empty_domain.name, payload=None)