mirror of
https://github.com/encode/django-rest-framework.git
synced 2025-07-17 19:52:25 +03:00
Fix function returns
This commit is contained in:
parent
a677b09729
commit
bef4fd51e2
|
@ -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
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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):
|
||||||
|
|
|
@ -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):
|
||||||
|
|
|
@ -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):
|
||||||
"""
|
"""
|
||||||
|
|
|
@ -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):
|
||||||
|
|
|
@ -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):
|
||||||
|
|
|
@ -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):
|
||||||
"""
|
"""
|
||||||
|
|
|
@ -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
|
|
||||||
|
|
|
@ -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.
|
||||||
|
|
|
@ -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):
|
||||||
|
|
|
@ -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):
|
||||||
|
|
Loading…
Reference in New Issue
Block a user