Peter Thomassen 2 лет назад
Родитель
Сommit
ae73500dca

+ 1 - 11
api/desecapi/management/commands/outreach-email.py

@@ -1,23 +1,13 @@
 import argparse
 import sys
 
-from django.core.exceptions import ImproperlyConfigured
 from django.core.management import BaseCommand
 from django.template import engines
-from django.template.backends.django import DjangoTemplates
 from django.urls import resolve, reverse
 
 from desecapi.models import User
 
 
-def _get_default_template_backend():
-    # Ad-hoc implementation of https://github.com/django/django/pull/15944
-    for backend in engines.all():
-        if isinstance(backend, DjangoTemplates):
-            return backend
-    raise ImproperlyConfigured("No DjangoTemplates backend is configured.")
-
-
 class Command(BaseCommand):
     help = "Reach out to users with an email. Takes email template on stdin."
 
@@ -67,7 +57,7 @@ class Command(BaseCommand):
         template_code = '{%% extends "%s" %%}' % base_file
         if content:
             template_code += "{% block content %}" + content + "{% endblock %}"
-        template = _get_default_template_backend().from_string(template_code)
+        template = engines["django"].from_string(template_code)
 
         if options["email"]:
             users = User.objects.filter(email__in=options["email"])

+ 2 - 2
api/desecapi/models/domains.py

@@ -285,8 +285,8 @@ class Domain(ExportModelOperationsMixin("Domain"), models.Model):
             # Domain not real: that's it
             metrics.get("desecapi_autodelegation_deleted").inc()
 
-    def delete(self):
-        ret = super().delete()
+    def delete(self, *args, **kwargs):
+        ret = super().delete(*args, **kwargs)
         logger.warning(f"Domain {self.name} deleted (owner: {self.owner.pk})")
         return ret
 

+ 1 - 1
api/desecapi/models/records.py

@@ -279,7 +279,7 @@ class RR(ExportModelOperationsMixin("RR"), models.Model):
                 )
 
             # Convert to canonical presentation format, disable chunking of records.
-            # Exempt types which have chunksize hardcoded (prevents "got multiple values for keyword argument 'chunksize'").
+            # Exempt types with hardcoded chunksize (prevents "got multiple values for keyword argument 'chunksize'").
             chunksize_exception_types = (
                 dns.rdatatype.OPENPGPKEY,
                 dns.rdatatype.EUI48,

+ 2 - 2
api/desecapi/models/tokens.py

@@ -174,7 +174,7 @@ class TokenDomainPolicy(ExportModelOperationsMixin("TokenDomainPolicy"), models.
                     }
                 )
 
-    def delete(self):
+    def delete(self, *args, **kwargs):
         # Can't delete default policy when others exist
         if (self.domain is None) and self.token.tokendomainpolicy_set.exclude(
             domain__isnull=True
@@ -184,7 +184,7 @@ class TokenDomainPolicy(ExportModelOperationsMixin("TokenDomainPolicy"), models.
                     "domain": "Policy precedence: Can't delete default policy when there exist others."
                 }
             )
-        return super().delete()
+        return super().delete(*args, **kwargs)
 
     def save(self, *args, **kwargs):
         self.clean()

+ 2 - 2
api/desecapi/models/users.py

@@ -102,9 +102,9 @@ class User(ExportModelOperationsMixin("User"), AbstractBaseUser):
         self.save()
         self.send_email("password-change-confirmation")
 
-    def delete(self):
+    def delete(self, *args, **kwargs):
         pk = self.pk
-        ret = super().delete()
+        ret = super().delete(*args, **kwargs)
         logger.warning(f"User {pk} deleted")
         return ret
 

+ 2 - 2
api/desecapi/permissions.py

@@ -9,8 +9,8 @@ class IsActiveUser(permissions.BasePermission):
     """
 
     def has_permission(self, request, view):
-        # Authenticated users can have is_active = None (pending activation). Strictly require True here.
-        return request.user and request.user.is_active == True
+        # Authenticated users can have is_active = None (pending activation). Those are not considered active.
+        return request.user and request.user.is_active
 
 
 class IsOwner(permissions.BasePermission):

+ 2 - 2
api/desecapi/serializers/donation.py

@@ -27,11 +27,11 @@ class DonationSerializer(serializers.ModelSerializer):
 
     @staticmethod
     def validate_bic(value):
-        return re.sub(r"[\s]", "", value)
+        return re.sub(r"\s", "", value)
 
     @staticmethod
     def validate_iban(value):
-        return re.sub(r"[\s]", "", value)
+        return re.sub(r"\s", "", value)
 
     def create(self, validated_data):
         return self.Meta.model(**validated_data)

+ 3 - 5
api/desecapi/serializers/tokens.py

@@ -1,14 +1,12 @@
 import django.core.exceptions
-from netfields import rest_framework as netfields_rf
+from netfields.rest_framework import CidrAddressField
 from rest_framework import serializers
 
 from desecapi.models import Token, TokenDomainPolicy
 
 
 class TokenSerializer(serializers.ModelSerializer):
-    allowed_subnets = serializers.ListField(
-        child=netfields_rf.CidrAddressField(), required=False
-    )
+    allowed_subnets = serializers.ListField(child=CidrAddressField(), required=False)
     token = serializers.ReadOnlyField(source="plain")
     is_valid = serializers.ReadOnlyField()
 
@@ -30,7 +28,7 @@ class TokenSerializer(serializers.ModelSerializer):
 
     def __init__(self, *args, include_plain=False, **kwargs):
         self.include_plain = include_plain
-        return super().__init__(*args, **kwargs)
+        super().__init__(*args, **kwargs)
 
     def get_fields(self):
         fields = super().get_fields()

+ 2 - 3
api/desecapi/views/authenticated_actions.py

@@ -6,8 +6,8 @@ from rest_framework.permissions import SAFE_METHODS
 from rest_framework.renderers import JSONRenderer, StaticHTMLRenderer
 from rest_framework.response import Response
 
-import desecapi.authentication as auth
 from desecapi import permissions, serializers
+from desecapi.authentication import AuthenticatedBasicUserActionAuthentication
 from desecapi.models import Token
 from desecapi.pdns_change_tracker import PDNSChangeTracker
 
@@ -27,7 +27,6 @@ class AuthenticatedActionView(generics.GenericAPIView):
     else                HTTP 406 Not Acceptable             perform action      405 Method Not Allowed
     """
 
-    authenticated_action = None
     html_url = None  # Redirect GET requests to this webapp GUI URL
     http_method_names = ["get", "post"]  # GET is for redirect only
     renderer_classes = [JSONRenderer, StaticHTMLRenderer]
@@ -57,7 +56,7 @@ class AuthenticatedActionView(generics.GenericAPIView):
         return (
             ()
             if self.request.method in SAFE_METHODS
-            else (auth.AuthenticatedBasicUserActionAuthentication,)
+            else (AuthenticatedBasicUserActionAuthentication,)
         )
 
     @property

+ 5 - 6
api/desecapi/views/records.py

@@ -15,12 +15,7 @@ class EmptyPayloadMixin:
         # noinspection PyUnresolvedReferences
         request = super().initialize_request(request, *args, **kwargs)
 
-        try:
-            no_data = request.stream is None
-        except:
-            no_data = True
-
-        if no_data:
+        if request.stream is None:
             # In this case, data and files are both empty, so we can set request.data=None (instead of the default {}).
             # This allows distinguishing missing payload from empty dict payload.
             # See https://github.com/encode/django-rest-framework/pull/7195
@@ -40,12 +35,14 @@ class RRsetView:
     @property
     def domain(self):
         try:
+            # noinspection PyUnresolvedReferences
             return self.request.user.domains.get(name=self.kwargs["name"])
         except models.Domain.DoesNotExist:
             raise Http404
 
     @property
     def throttle_scope(self):
+        # noinspection PyUnresolvedReferences
         return (
             "dns_api_read"
             if self.request.method in SAFE_METHODS
@@ -55,6 +52,7 @@ class RRsetView:
     @property
     def throttle_scope_bucket(self):
         # Note: bucket should remain constant even when domain is recreated
+        # noinspection PyUnresolvedReferences
         return None if self.request.method in SAFE_METHODS else self.kwargs["name"]
 
     def get_queryset(self):
@@ -66,6 +64,7 @@ class RRsetView:
 
     def perform_update(self, serializer):
         with PDNSChangeTracker():
+            # noinspection PyUnresolvedReferences
             super().perform_update(serializer)