Skip to content

Commit

Permalink
Merge pull request #98 from django-oscar/fixes/useraddress-integrity-…
Browse files Browse the repository at this point in the history
…error

Fix Useraddress integrity error
  • Loading branch information
Martijn Jacobs committed May 9, 2017
2 parents bbb9ffd + 36bf027 commit 76c504a
Show file tree
Hide file tree
Showing 2 changed files with 37 additions and 5 deletions.
19 changes: 14 additions & 5 deletions oscarapi/serializers/checkout.py
Original file line number Diff line number Diff line change
@@ -1,11 +1,14 @@
import warnings

from django.db import IntegrityError
from rest_framework.response import Response

from django.conf import settings
from django.core.urlresolvers import reverse, NoReverseMatch
from django.utils.translation import gettext as _
from oscar.core import prices
from oscar.core.loading import get_class, get_model
from rest_framework import serializers, exceptions
from rest_framework import exceptions, serializers

from oscarapi.basket.operations import (
assign_basket_strategy,
Expand Down Expand Up @@ -291,7 +294,7 @@ def create(self, validated_data):
guest_email=validated_data.get('guest_email') or ''
)
except ValueError as e:
raise exceptions.NotAcceptable(e.message)
raise exceptions.NotAcceptable(str(e))

def _shipping_method(self, request, basket,
shipping_method_code, shipping_address):
Expand Down Expand Up @@ -328,15 +331,21 @@ class UserAddressSerializer(OscarModelSerializer):
def create(self, validated_data):
request = self.context['request']
validated_data['user'] = request.user
return super(UserAddressSerializer, self).create(validated_data)
try:
return super(UserAddressSerializer, self).create(validated_data)
except IntegrityError as e:
raise exceptions.NotAcceptable(str(e))

def update(self, instance, validated_data):
# to be sure that we cannot change the owner of an address. If you
# want this, please override the serializer
request = self.context['request']
validated_data['user'] = request.user
return super(
UserAddressSerializer, self).update(instance, validated_data)
try:
return super(
UserAddressSerializer, self).update(instance, validated_data)
except IntegrityError as e:
raise exceptions.NotAcceptable(str(e))

class Meta:
model = UserAddress
Expand Down
23 changes: 23 additions & 0 deletions oscarapi/tests/testuseraddress.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

from django.contrib.auth import get_user_model
from django.core.urlresolvers import reverse
from django.db.transaction import atomic

from oscarapi.tests.utils import APITest

Expand Down Expand Up @@ -63,6 +64,28 @@ def test_useraddress_list_and_add(self):
self.response = self.client.get(url, content_type='application/json')
self.assertEqual(self.response.status_code, 403)

# atomic is needed because of the teardown of this testcase
@atomic
def test_useraddress_duplicate(self):
"Duplicate addresses raise an integrityerror, let's catch this"
self.login('nobody', 'nobody')

url = reverse('useraddress-list')
self.response = self.client.get(url, content_type='application/json')

# let's create one
self.response = self.post(url, **ADDRESS)
self.assertEqual(self.response.status_code, 201)

# And now there should be one
self.response = self.client.get(url, content_type='application/json')
self.assertEqual(self.response.status_code, 200)
self.assertEqual(len(self.response.data), 1)

# now we create the same address and this is not possible
self.response = self.post(url, **ADDRESS)
self.assertEqual(self.response.status_code, 406)

def test_useraddress_update_and_delete(self):
"Regular users can update and delete their own addresses"
self.login('nobody', 'nobody')
Expand Down

0 comments on commit 76c504a

Please sign in to comment.