Check for SUPPORT_PATCH in partial_update

This commit is contained in:
José Padilla 2015-06-26 11:40:55 -04:00
parent 1402f51327
commit d322c3fa4b
3 changed files with 25 additions and 22 deletions

View File

@ -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)

View File

@ -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)

View File

@ -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)