diff --git a/rest_framework/generics.py b/rest_framework/generics.py index dc45bda01..88438e8c4 100644 --- a/rest_framework/generics.py +++ b/rest_framework/generics.py @@ -229,9 +229,8 @@ class UpdateAPIView(mixins.UpdateModelMixin, def put(self, request, *args, **kwargs): return self.update(request, *args, **kwargs) - if api_settings.SUPPORT_PATCH: - def patch(self, request, *args, **kwargs): - return self.partial_update(request, *args, **kwargs) + def patch(self, request, *args, **kwargs): + return self.partial_update(request, *args, **kwargs) class ListCreateAPIView(mixins.ListModelMixin, @@ -259,9 +258,8 @@ class RetrieveUpdateAPIView(mixins.RetrieveModelMixin, def put(self, request, *args, **kwargs): return self.update(request, *args, **kwargs) - if api_settings.SUPPORT_PATCH: - def patch(self, request, *args, **kwargs): - return self.partial_update(request, *args, **kwargs) + def patch(self, request, *args, **kwargs): + return self.partial_update(request, *args, **kwargs) class RetrieveDestroyAPIView(mixins.RetrieveModelMixin, @@ -290,9 +288,8 @@ class RetrieveUpdateDestroyAPIView(mixins.RetrieveModelMixin, def put(self, request, *args, **kwargs): return self.update(request, *args, **kwargs) - if api_settings.SUPPORT_PATCH: - def patch(self, request, *args, **kwargs): - return self.partial_update(request, *args, **kwargs) + def patch(self, request, *args, **kwargs): + return self.partial_update(request, *args, **kwargs) def delete(self, request, *args, **kwargs): return self.destroy(request, *args, **kwargs) diff --git a/rest_framework/mixins.py b/rest_framework/mixins.py index 1104aa29c..c338efa4f 100644 --- a/rest_framework/mixins.py +++ b/rest_framework/mixins.py @@ -6,7 +6,7 @@ which allows mixin classes to be composed in interesting ways. """ from __future__ import unicode_literals -from rest_framework import status +from rest_framework import exceptions, status from rest_framework.response import Response from rest_framework.settings import api_settings @@ -74,6 +74,9 @@ class UpdateModelMixin(object): serializer.save() def partial_update(self, request, *args, **kwargs): + if not api_settings.SUPPORT_PATCH: + raise exceptions.MethodNotAllowed(request.method) + kwargs['partial'] = True return self.update(request, *args, **kwargs) diff --git a/tests/test_generics.py b/tests/test_generics.py index 083f95f60..80a4ed66d 100644 --- a/tests/test_generics.py +++ b/tests/test_generics.py @@ -4,11 +4,10 @@ import django from django.db import models from django.shortcuts import get_object_or_404 from django.test import TestCase -from django.test.utils import override_settings from django.utils import six -from django.utils.six.moves import reload_module from rest_framework import generics, renderers, serializers, status +from rest_framework.settings import api_settings from rest_framework.test import APIRequestFactory from tests.models import ( BasicModel, ForeignKeySource, ForeignKeyTarget, RESTFrameworkModel @@ -516,15 +515,19 @@ class TestSupportPatchSetting(TestCase): """ PATCH requests should fail when SUPPORT_PATCH is set to False. """ - with override_settings(REST_FRAMEWORK={'SUPPORT_PATCH': False}): - reload_module(generics) - data = {'text': 'foobar'} - request = factory.patch('/1', data, format='json') + obj = BasicModel.objects.create(text='abc') - class InstanceView(generics.UpdateAPIView): - queryset = BasicModel.objects.all() - serializer_class = BasicSerializer + class InstanceView(generics.UpdateAPIView): + queryset = BasicModel.objects.all() + serializer_class = BasicSerializer - view = InstanceView.as_view() - response = view(request, pk=1).render() - self.assertEqual(response.status_code, status.HTTP_405_METHOD_NOT_ALLOWED) + api_settings.SUPPORT_PATCH = False + + data = {'text': 'foobar'} + request = factory.patch('/1', data, format='json') + view = InstanceView.as_view() + response = view(request, pk=obj.pk).render() + + api_settings.SUPPORT_PATCH = True + + self.assertEqual(response.status_code, status.HTTP_405_METHOD_NOT_ALLOWED)