瀏覽代碼

refactor(api): streamline RRsetSerializer context handling

Peter Thomassen 4 年之前
父節點
當前提交
9463d59eba
共有 4 個文件被更改,包括 14 次插入23 次删除
  1. 2 1
      api/desecapi/management/commands/chores.py
  2. 0 3
      api/desecapi/metrics.py
  3. 6 14
      api/desecapi/serializers.py
  4. 6 5
      api/desecapi/views.py

+ 2 - 1
api/desecapi/management/commands/chores.py

@@ -43,7 +43,8 @@ class Command(BaseCommand):
             'ttl': '3600',
             'records': [content]
         }]
-        serializer = serializers.RRsetSerializer(instances, domain=domain, data=data, many=True, partial=True)
+        context = {'domain': domain}
+        serializer = serializers.RRsetSerializer(instances, data=data, many=True, partial=True, context=context)
         serializer.is_valid(raise_exception=True)
         with PDNSChangeTracker():
             serializer.save()

+ 0 - 3
api/desecapi/metrics.py

@@ -45,6 +45,3 @@ set_counter('desecapi_pdns_catalog_updated', 'number of times pdns catalog was u
 
 # throttling.py metrics
 set_counter('desecapi_throttle_failure', 'number of requests throttled', ['method', 'scope', 'user'])
-
-# serializers.py metrics
-set_counter('desecapi_rrset_list_serializer', 'number of times RRsetListSerializer was initialized')

+ 6 - 14
api/desecapi/serializers.py

@@ -418,22 +418,14 @@ class RRsetSerializer(ConditionalExistenceModelSerializer):
         extra_kwargs = {
             'subname': {'required': False, 'default': NonBulkOnlyDefault('')}
         }
+        list_serializer_class = RRsetListSerializer
 
-    def __init__(self, instance=None, data=serializers.empty, domain=None, **kwargs):
-        if domain is None:
+    def __init__(self, *args, **kwargs):
+        super().__init__(*args, **kwargs)
+        try:
+            self.domain = self.context['domain']
+        except KeyError:
             raise ValueError('RRsetSerializer() must be given a domain object (to validate uniqueness constraints).')
-        self.domain = domain
-        super().__init__(instance, data, **kwargs)
-
-    @classmethod
-    def many_init(cls, *args, **kwargs):
-        domain = kwargs.pop('domain')
-        # Note: We are not yet deciding the value of the child's "partial" attribute, as its value depends on whether
-        # the RRSet is created (never partial) or not (partial if PATCH), for each given item (RRset) individually.
-        kwargs['child'] = cls(domain=domain)
-        serializer = RRsetListSerializer(*args, **kwargs)
-        metrics.get('desecapi_rrset_list_serializer').inc()
-        return serializer
 
     def get_fields(self):
         fields = super().get_fields()

+ 6 - 5
api/desecapi/views.py

@@ -66,6 +66,9 @@ class IdempotentDestroyMixin:
 
 class DomainViewMixin:
 
+    def get_serializer_context(self):
+        return {**super().get_serializer_context(), 'domain': self.domain}
+
     def initial(self, request, *args, **kwargs):
         # noinspection PyUnresolvedReferences
         super().initial(request, *args, **kwargs)
@@ -173,9 +176,6 @@ class RRsetDetail(IdempotentDestroyMixin, DomainViewMixin, generics.RetrieveUpda
 
         return obj
 
-    def get_serializer(self, *args, **kwargs):
-        return super().get_serializer(domain=self.domain, *args, **kwargs)
-
     def update(self, request, *args, **kwargs):
         response = super().update(request, *args, **kwargs)
 
@@ -231,7 +231,7 @@ class RRsetList(EmptyPayloadMixin, DomainViewMixin, generics.ListCreateAPIView,
             elif self.request.method in ['PATCH', 'PUT']:
                 kwargs['many'] = True
 
-        return super().get_serializer(domain=self.domain, *args, **kwargs)
+        return super().get_serializer(*args, **kwargs)
 
     def perform_create(self, serializer):
         with PDNSChangeTracker():
@@ -364,7 +364,8 @@ class DynDNS12Update(APIView):
         ]
 
         instances = domain.rrset_set.filter(subname='', type__in=['A', 'AAAA']).all()
-        serializer = serializers.RRsetSerializer(instances, domain=domain, data=data, many=True, partial=True)
+        context = {'domain': domain}
+        serializer = serializers.RRsetSerializer(instances, data=data, many=True, partial=True, context=context)
         try:
             serializer.is_valid(raise_exception=True)
         except ValidationError as e: