Przeglądaj źródła

refactor(api): simplify Domain.write_rrsets() interface

Peter Thomassen 7 lat temu
rodzic
commit
d3c92f4b3c
2 zmienionych plików z 14 dodań i 7 usunięć
  1. 11 1
      api/desecapi/models.py
  2. 3 6
      api/desecapi/views.py

+ 11 - 1
api/desecapi/models.py

@@ -181,8 +181,17 @@ class Domain(models.Model, mixins.SetterMixin):
         RRset.objects.bulk_create(rrsets)
         RR.objects.bulk_create(rrs)
 
+    def write_rrsets(self, datas):
+        rrsets = {}
+        for data in datas:
+            rrset = RRset(domain=self, subname=data['subname'],
+                          type=data['type'], ttl=data['ttl'])
+            rrsets[rrset] = [RR(rrset=rrset, content=content)
+                             for content in data['contents']]
+        self._write_rrsets(rrsets)
+
     @transaction.atomic
-    def write_rrsets(self, rrsets):
+    def _write_rrsets(self, rrsets):
         # Always-false Q object: https://stackoverflow.com/a/35894246/6867099
         rrsets_index = {}
         q_update = models.Q(pk__isnull=True)
@@ -271,6 +280,7 @@ class Domain(models.Model, mixins.SetterMixin):
                 rrsets = parent.rrset_set.filter(subname=subname,
                                                  type__in=['NS', 'DS']).all()
                 # Need to go RRset by RRset to trigger pdns sync
+                # TODO can optimize using write_rrsets()
                 for rrset in rrsets:
                     rrset.delete()
 

+ 3 - 6
api/desecapi/views.py

@@ -364,12 +364,9 @@ class DynDNS12Update(APIView):
             raise Http404
 
         datas = {'A': self.findIPv4(request), 'AAAA': self.findIPv6(request)}
-
-        rrsets = {}
-        for type_, ip in datas.items():
-            rrset = RRset(domain=domain, subname='', type=type_, ttl=60)
-            rrsets[rrset] = [RR(rrset=rrset, content=ip)] if ip is not None else []
-        domain.write_rrsets(rrsets)
+        domain.write_rrsets([{'subname': '', 'type': type_, 'ttl': 60,
+                              'contents': [ip] if ip is not None else []}
+                             for type_, ip in datas.items()])
 
         return Response('good')