Skip to content

Commit

Permalink
Merge pull request miki725#35 from miki725/update_no_id
Browse files Browse the repository at this point in the history
Update fails when no ID is provided
  • Loading branch information
miki725 committed Apr 26, 2015
2 parents eeead95 + a8265b1 commit 2a59d14
Show file tree
Hide file tree
Showing 10 changed files with 70 additions and 21 deletions.
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

0 comments on commit 2a59d14

Please sign in to comment.