Fix function returns

This commit is contained in:
Christian Clauss 2024-03-15 13:17:18 +01:00
parent a677b09729
commit bef4fd51e2
12 changed files with 28 additions and 27 deletions

View File

@ -230,3 +230,4 @@ class RemoteUserAuthentication(BaseAuthentication):
user = authenticate(request=request, remote_user=request.META.get(self.header)) user = authenticate(request=request, remote_user=request.META.get(self.header))
if user and user.is_active: if user and user.is_active:
return (user, None) return (user, None)
return None

View File

@ -708,6 +708,7 @@ class BooleanField(Field):
elif self._lower_if_str(data) in self.NULL_VALUES and self.allow_null: elif self._lower_if_str(data) in self.NULL_VALUES and self.allow_null:
return None return None
self.fail("invalid", input=data) self.fail("invalid", input=data)
return None
def to_representation(self, value): def to_representation(self, value):
if self._lower_if_str(value) in self.TRUE_VALUES: if self._lower_if_str(value) in self.TRUE_VALUES:
@ -1196,6 +1197,7 @@ class DateTimeField(Field):
humanized_format = humanize_datetime.datetime_formats(input_formats) humanized_format = humanize_datetime.datetime_formats(input_formats)
self.fail('invalid', format=humanized_format) self.fail('invalid', format=humanized_format)
return None
def to_representation(self, value): def to_representation(self, value):
if not value: if not value:
@ -1258,6 +1260,7 @@ class DateField(Field):
humanized_format = humanize_datetime.date_formats(input_formats) humanized_format = humanize_datetime.date_formats(input_formats)
self.fail('invalid', format=humanized_format) self.fail('invalid', format=humanized_format)
return None
def to_representation(self, value): def to_representation(self, value):
if not value: if not value:
@ -1321,6 +1324,7 @@ class TimeField(Field):
humanized_format = humanize_datetime.time_formats(input_formats) humanized_format = humanize_datetime.time_formats(input_formats)
self.fail('invalid', format=humanized_format) self.fail('invalid', format=humanized_format)
return None
def to_representation(self, value): def to_representation(self, value):
if value in (None, ''): if value in (None, ''):
@ -1376,6 +1380,7 @@ class DurationField(Field):
if parsed is not None: if parsed is not None:
return parsed return parsed
self.fail('invalid', format='[DD] [HH:[MM:]]ss[.uuuuuu]') self.fail('invalid', format='[DD] [HH:[MM:]]ss[.uuuuuu]')
return None
def to_representation(self, value): def to_representation(self, value):
return duration_string(value) return duration_string(value)

View File

@ -558,7 +558,7 @@ class LimitOffsetPagination(BasePagination):
] ]
def get_schema_operation_parameters(self, view): def get_schema_operation_parameters(self, view):
parameters = [ return [
{ {
'name': self.limit_query_param, 'name': self.limit_query_param,
'required': False, 'required': False,
@ -578,7 +578,6 @@ class LimitOffsetPagination(BasePagination):
}, },
}, },
] ]
return parameters
class CursorPagination(BasePagination): class CursorPagination(BasePagination):

View File

@ -197,8 +197,7 @@ class TemplateHTMLRenderer(BaseRenderer):
except Exception: except Exception:
# Fall back to using eg '404 Not Found' # Fall back to using eg '404 Not Found'
body = '%d %s' % (response.status_code, response.status_text.title()) body = '%d %s' % (response.status_code, response.status_text.title())
template = engines['django'].from_string(body) return engines['django'].from_string(body)
return template
# Note, subclass TemplateHTMLRenderer simply for the exception behavior # Note, subclass TemplateHTMLRenderer simply for the exception behavior
@ -424,7 +423,7 @@ class BrowsableAPIRenderer(BaseRenderer):
Returns True if a form should be shown for this method. Returns True if a form should be shown for this method.
""" """
if method not in view.allowed_methods: if method not in view.allowed_methods:
return # Not a valid method return None # Not a valid method
try: try:
view.check_permissions(request) view.check_permissions(request)
@ -473,7 +472,7 @@ class BrowsableAPIRenderer(BaseRenderer):
with override_method(view, request, method) as request: with override_method(view, request, method) as request:
if not self.show_form_for_method(view, method, request, instance): if not self.show_form_for_method(view, method, request, instance):
return return None
if method in ('DELETE', 'OPTIONS'): if method in ('DELETE', 'OPTIONS'):
return True # Don't actually need to return a form return True # Don't actually need to return a form
@ -485,7 +484,7 @@ class BrowsableAPIRenderer(BaseRenderer):
(not has_serializer and not has_serializer_class) or (not has_serializer and not has_serializer_class) or
not any(is_form_media_type(parser.media_type) for parser in view.parser_classes) not any(is_form_media_type(parser.media_type) for parser in view.parser_classes)
): ):
return return None
if existing_serializer is not None: if existing_serializer is not None:
with contextlib.suppress(TypeError): with contextlib.suppress(TypeError):
@ -538,7 +537,7 @@ class BrowsableAPIRenderer(BaseRenderer):
with override_method(view, request, method) as request: with override_method(view, request, method) as request:
# Check permissions # Check permissions
if not self.show_form_for_method(view, method, request, instance): if not self.show_form_for_method(view, method, request, instance):
return return None
# If possible, serialize the initial content for the generic form # If possible, serialize the initial content for the generic form
default_parser = view.parser_classes[0] default_parser = view.parser_classes[0]
@ -615,7 +614,7 @@ class BrowsableAPIRenderer(BaseRenderer):
def get_filter_form(self, data, view, request): def get_filter_form(self, data, view, request):
if not hasattr(view, 'get_queryset') or not hasattr(view, 'filter_backends'): if not hasattr(view, 'get_queryset') or not hasattr(view, 'filter_backends'):
return return None
# Infer if this is a list view or not. # Infer if this is a list view or not.
paginator = getattr(view, 'paginator', None) paginator = getattr(view, 'paginator', None)
@ -625,9 +624,9 @@ class BrowsableAPIRenderer(BaseRenderer):
try: try:
paginator.get_results(data) paginator.get_results(data)
except (TypeError, KeyError): except (TypeError, KeyError):
return return None
elif not isinstance(data, list): elif not isinstance(data, list):
return return None
queryset = view.get_queryset() queryset = view.get_queryset()
elements = [] elements = []
@ -638,7 +637,7 @@ class BrowsableAPIRenderer(BaseRenderer):
elements.append(html) elements.append(html)
if not elements: if not elements:
return return None
template = loader.get_template(self.filter_template) template = loader.get_template(self.filter_template)
context = {'elements': elements} context = {'elements': elements}
@ -833,7 +832,7 @@ class AdminRenderer(BrowsableAPIRenderer):
""" """
if not hasattr(view, 'reverse_action') or \ if not hasattr(view, 'reverse_action') or \
not hasattr(view, 'lookup_field'): not hasattr(view, 'lookup_field'):
return return None
lookup_field = view.lookup_field lookup_field = view.lookup_field
lookup_url_kwarg = getattr(view, 'lookup_url_kwarg', None) or lookup_field lookup_url_kwarg = getattr(view, 'lookup_url_kwarg', None) or lookup_field
@ -842,7 +841,7 @@ class AdminRenderer(BrowsableAPIRenderer):
kwargs = {lookup_url_kwarg: result[lookup_field]} kwargs = {lookup_url_kwarg: result[lookup_field]}
return view.reverse_action('detail', kwargs=kwargs) return view.reverse_action('detail', kwargs=kwargs)
except (KeyError, NoReverseMatch): except (KeyError, NoReverseMatch):
return return None
class DocumentationRenderer(BaseRenderer): class DocumentationRenderer(BaseRenderer):

View File

@ -557,8 +557,7 @@ class AutoSchema(ViewInspector):
by_name = {f.name: f for f in fields} by_name = {f.name: f for f in fields}
for f in update_with: for f in update_with:
by_name[f.name] = f by_name[f.name] = f
fields = list(by_name.values()) return list(by_name.values())
return fields
def get_encoding(self, path, method): def get_encoding(self, path, method):
""" """

View File

@ -44,7 +44,7 @@ class BaseThrottle:
Optionally, return a recommended number of seconds to wait before Optionally, return a recommended number of seconds to wait before
the next request. the next request.
""" """
return None return
class SimpleRateThrottle(BaseThrottle): class SimpleRateThrottle(BaseThrottle):

View File

@ -36,8 +36,7 @@ class JSONEncoder(json.JSONEncoder):
elif isinstance(obj, datetime.time): elif isinstance(obj, datetime.time):
if timezone and timezone.is_aware(obj): if timezone and timezone.is_aware(obj):
raise ValueError("JSON can't represent timezone-aware times.") raise ValueError("JSON can't represent timezone-aware times.")
representation = obj.isoformat() return obj.isoformat()
return representation
elif isinstance(obj, datetime.timedelta): elif isinstance(obj, datetime.timedelta):
return str(obj.total_seconds()) return str(obj.total_seconds())
elif isinstance(obj, decimal.Decimal): elif isinstance(obj, decimal.Decimal):

View File

@ -188,6 +188,7 @@ class APIView(View):
authenticators = self.get_authenticators() authenticators = self.get_authenticators()
if authenticators: if authenticators:
return authenticators[0].authenticate_header(request) return authenticators[0].authenticate_header(request)
return None
def get_parser_context(self, http_request): def get_parser_context(self, http_request):
""" """
@ -252,6 +253,7 @@ class APIView(View):
""" """
if self.settings.FORMAT_SUFFIX_KWARG: if self.settings.FORMAT_SUFFIX_KWARG:
return kwargs.get(self.settings.FORMAT_SUFFIX_KWARG) return kwargs.get(self.settings.FORMAT_SUFFIX_KWARG)
return None
def get_renderers(self): def get_renderers(self):
""" """

View File

@ -29,5 +29,4 @@ class BasicModelWithUsersViewSet(ModelViewSet):
renderer_classes = (renderers.BrowsableAPIRenderer, renderers.JSONRenderer) renderer_classes = (renderers.BrowsableAPIRenderer, renderers.JSONRenderer)
def get_queryset(self): def get_queryset(self):
qs = super().get_queryset().filter(users=self.request.user) return super().get_queryset().filter(users=self.request.user)
return qs

View File

@ -131,10 +131,9 @@ class OneToOnePKSource(RESTFrameworkModel):
class CustomManagerModel(RESTFrameworkModel): class CustomManagerModel(RESTFrameworkModel):
class CustomManager: class CustomManager:
def __new__(cls, *args, **kwargs): def __new__(cls, *args, **kwargs):
cls = BaseManager.from_queryset( return BaseManager.from_queryset(
QuerySet QuerySet
) )
return cls
objects = CustomManager()() objects = CustomManager()()
# `CustomManager()` will return a `BaseManager` class. # `CustomManager()` will return a `BaseManager` class.

View File

@ -25,14 +25,12 @@ from . import views
def create_request(path): def create_request(path):
factory = RequestFactory() factory = RequestFactory()
request = Request(factory.get(path)) return Request(factory.get(path))
return request
def create_view(view_cls, method, request): def create_view(view_cls, method, request):
generator = SchemaGenerator() generator = SchemaGenerator()
view = generator.create_view(view_cls.as_view(), method, request) return generator.create_view(view_cls.as_view(), method, request)
return view
class TestBasics(TestCase): class TestBasics(TestCase):

View File

@ -32,6 +32,7 @@ def basic_view(request):
return {'method': 'PUT', 'data': request.data} return {'method': 'PUT', 'data': request.data}
elif request.method == 'PATCH': elif request.method == 'PATCH':
return {'method': 'PATCH', 'data': request.data} return {'method': 'PATCH', 'data': request.data}
return None
class ErrorView(APIView): class ErrorView(APIView):