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

Update fails when no ID is provided #35

Merged
merged 7 commits into from
Apr 26, 2015
Merged
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
7 changes: 4 additions & 3 deletions .travis.yml
Original file line number Diff line number Diff line change
Expand Up @@ -6,13 +6,14 @@ python:
- "pypy"

env:
- "DRF='djangorestframework<3'"
- "DRF='djangorestframework>=3'"
- "$DJANGO_DRF='django<1.8' 'djangorestframework<3'"
- "$DJANGO_DRF='djangorestframework>=3'"

# command to install dependencies, e.g. pip install -r requirements.txt --use-mirrors
install:
- pip install $DRF
- pip install $DJANGO_DRF
- pip install -r requirements-dev.txt
- pip freeze

# command to run tests, e.g. python setup.py test
script: make check
8 changes: 8 additions & 0 deletions HISTORY.rst
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,14 @@
History
-------

0.2.1 (2015-04-26)
~~~~~~~~~~~~~~~~~~

* Fixed a bug which allowed to submit data for update to serializer
without update field.
See `#34 <https://github.com/miki725/django-rest-framework-bulk/issues/34>`_.
* Removed support for Django1.8 with DRF2.x

0.2 (2015-02-09)
~~~~~~~~~~~~~~~~

Expand Down
18 changes: 10 additions & 8 deletions Makefile
Original file line number Diff line number Diff line change
@@ -1,9 +1,7 @@
.PHONY: clean-pyc clean-build docs clean

NOSE_FLAGS=-s --verbosity=2
COVER_CONFIG_FLAGS=--with-coverage --cover-package=rest_framework_bulk --cover-erase
COVER_REPORT_FLAGS=--cover-html --cover-html-dir=htmlcov
COVER_FLAGS=${COVER_CONFIG_FLAGS} ${COVER_REPORT_FLAGS}
TEST_FLAGS=--verbosity=2
COVER_FLAGS=--source=rest_framework_bulk

help:
@echo "install - install all requirements including for testing"
Expand Down Expand Up @@ -51,10 +49,14 @@ lint:
flake8 rest_framework_bulk

test:
python tests/manage.py test ${NOSE_FLAGS}

test-coverage:
python tests/manage.py test ${NOSE_FLAGS} ${COVER_FLAGS}
python tests/manage.py test ${TEST_FLAGS}

test-coverage: clean-test
-coverage run ${COVER_FLAGS} tests/manage.py test ${TEST_FLAGS}
@exit_code=$?
@-coverage report
@-coverage html
@exit ${exit_code}

test-all:
tox
Expand Down
9 changes: 5 additions & 4 deletions README.rst
Original file line number Diff line number Diff line change
Expand Up @@ -21,10 +21,11 @@ within the framework. That is the purpose of this project.
Requirements
------------

* Python 2.7+
* Django 1.3+
* Django REST Framework >= 2.2.5 (when bulk features were added to serializers)
* Django REST Framework >= 3.0.0 (DRF-bulk supports both DRF2 and DRF3!)
* Python>=2.7
* Django>=1.3
* Django REST Framework >= 3.0.0
* REST Framework >= 2.2.5
(**only with** Django<1.8 since DRF<3 does not support Django1.8)

Installing
----------
Expand Down
1 change: 0 additions & 1 deletion requirements-dev.txt
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
-r requirements.txt
coverage
django-nose
flake8
tox
2 changes: 1 addition & 1 deletion rest_framework_bulk/__init__.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
__version__ = '0.2'
__version__ = '0.2.1'
__author__ = 'Miroslav Shubernetskiy'

try:
Expand Down
6 changes: 6 additions & 0 deletions rest_framework_bulk/drf3/serializers.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
from __future__ import print_function, unicode_literals
import inspect

from rest_framework.exceptions import ValidationError
from rest_framework.serializers import ListSerializer

Expand Down Expand Up @@ -41,6 +43,10 @@ def update(self, queryset, all_validated_data):
for i in all_validated_data
}

if not all((bool(i) and not inspect.isclass(i)
for i in all_validated_data_by_id.keys())):
raise ValidationError('')

# since this method is given a queryset which can have many
# model instances, first find all objects to update
# and only then update the models
Expand Down
17 changes: 17 additions & 0 deletions rest_framework_bulk/tests/test_generics.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
from __future__ import unicode_literals, print_function
import json

from django.core.urlresolvers import reverse
from django.test import TestCase
from django.test.client import RequestFactory
Expand Down Expand Up @@ -83,6 +84,22 @@ def test_put(self):
]
)

def test_put_without_update_key(self):
"""
Test that PUT request updates all submitted resources.
"""
response = self.view(self.request.put(
'',
json.dumps([
{'contents': 'foo', 'number': 3},
{'contents': 'rainbows', 'number': 4}, # multiple objects without id
{'contents': 'bar', 'number': 4, 'id': 555}, # non-existing id
]),
content_type='application/json',
))

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

def test_patch(self):
"""
Test that PATCH request partially updates all submitted resources.
Expand Down
5 changes: 2 additions & 3 deletions tests/settings.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,15 +12,14 @@
MIDDLEWARE_CLASSES = ()

INSTALLED_APPS = (
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.staticfiles',
'django_nose',
'rest_framework',
'rest_framework_bulk',
'rest_framework_bulk.tests.simple_app',
)

TEST_RUNNER = 'django_nose.NoseTestSuiteRunner'

STATIC_URL = '/static/'
SECRET_KEY = 'foo'

Expand Down
18 changes: 17 additions & 1 deletion tox.ini
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ basepython =
pypy: pypy
pypy3: pypy3
setenv =
PYTHONPATH = {toxinidir}:{toxinidir}/multinosetests
PYTHONPATH = {toxinidir}
commands =
make install-quite
pip freeze
Expand All @@ -20,5 +20,21 @@ deps =
whitelist_externals =
make

[testenv:py27-drf2]
deps =
django<1.8

[testenv:py34-drf2]
deps =
django<1.8

[testenv:pypy-drf2]
deps =
django<1.8

[testenv:pypy3-drf2]
deps =
django<1.8

[flake8]
max-line-length = 100