Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Unique Together support in DRF3 #31

Open
wants to merge 1 commit into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 8 additions & 0 deletions rest_framework_bulk/tests/simple_app/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,3 +5,11 @@
class SimpleModel(models.Model):
number = models.IntegerField()
contents = models.CharField(max_length=16)


class UniqueTogetherModel(models.Model):
foo = models.IntegerField()
bar = models.IntegerField()

class Meta(object):
unique_together = ('foo', 'bar')
10 changes: 9 additions & 1 deletion rest_framework_bulk/tests/simple_app/serializers.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
from rest_framework.serializers import ModelSerializer
from rest_framework_bulk.serializers import BulkListSerializer, BulkSerializerMixin

from .models import SimpleModel
from .models import SimpleModel, UniqueTogetherModel


class SimpleSerializer(BulkSerializerMixin, # only required in DRF3
Expand All @@ -11,3 +11,11 @@ class Meta(object):
model = SimpleModel
# only required in DRF3
list_serializer_class = BulkListSerializer


class UniqueTogetherSerializer(BulkSerializerMixin, # only required in DRF3
ModelSerializer):
class Meta(object):
model = UniqueTogetherModel
# only required in DRF3
list_serializer_class = BulkListSerializer
3 changes: 2 additions & 1 deletion rest_framework_bulk/tests/simple_app/urls.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,12 @@
from django.conf.urls import patterns, url, include
from rest_framework_bulk.routes import BulkRouter

from .views import SimpleViewSet
from .views import SimpleViewSet, UniqueTogetherViewSet


router = BulkRouter()
router.register('simple', SimpleViewSet, 'simple')
router.register('unique-together', UniqueTogetherViewSet, 'unique-together')

urlpatterns = patterns(
'',
Expand Down
10 changes: 8 additions & 2 deletions rest_framework_bulk/tests/simple_app/views.py
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
from __future__ import unicode_literals, print_function
from rest_framework_bulk import generics

from .models import SimpleModel
from .serializers import SimpleSerializer
from .models import SimpleModel, UniqueTogetherModel
from .serializers import SimpleSerializer, UniqueTogetherSerializer


class SimpleMixin(object):
Expand All @@ -23,3 +23,9 @@ def filter_queryset(self, queryset):
class SimpleViewSet(SimpleMixin, generics.BulkModelViewSet):
def filter_queryset(self, queryset):
return queryset.filter(number__gt=5)


class UniqueTogetherViewSet(generics.BulkModelViewSet):
model = UniqueTogetherModel
queryset = UniqueTogetherModel.objects.all()
serializer_class = UniqueTogetherSerializer
21 changes: 20 additions & 1 deletion rest_framework_bulk/tests/test_generics.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
from django.test.client import RequestFactory
from rest_framework import status

from .simple_app.models import SimpleModel
from .simple_app.models import SimpleModel, UniqueTogetherModel
from .simple_app.views import FilteredBulkAPIView, SimpleBulkAPIView


Expand Down Expand Up @@ -256,6 +256,25 @@ def test_patch(self):

self.assertEqual(response.status_code, status.HTTP_200_OK)

def test_patch_unique_together(self):
"""
Test that PATCH with multiple partial resources returns 200
even on model with unique together columns
"""
obj1 = UniqueTogetherModel.objects.create(foo=1, bar=2)
obj2 = UniqueTogetherModel.objects.create(foo=3, bar=4)

response = self.client.patch(
reverse('api:unique-together-list'),
data=json.dumps([
{'foo': 5, 'id': obj1.pk},
{'foo': 6, 'id': obj2.pk},
]),
content_type='application/json',
)

self.assertEqual(response.status_code, status.HTTP_200_OK)

def test_delete(self):
"""
Test that PATCH with multiple partial resources returns 200
Expand Down
2 changes: 2 additions & 0 deletions tests/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
# -*- coding: utf-8 -*-
from __future__ import print_function, unicode_literals