From 73dd826d2fed9fb09dc4cda761a775646d4afa0d Mon Sep 17 00:00:00 2001 From: Valeryi Savich Date: Tue, 1 Nov 2016 23:10:13 +0300 Subject: [PATCH] Fixed issue with reverting objects from urls --- aiorest_ws/db/orm/django/relations.py | 27 +++++++++++++++++++------ aiorest_ws/db/orm/django/serializers.py | 5 +++++ 2 files changed, 26 insertions(+), 6 deletions(-) diff --git a/aiorest_ws/db/orm/django/relations.py b/aiorest_ws/db/orm/django/relations.py index c023fb5..a55e73f 100644 --- a/aiorest_ws/db/orm/django/relations.py +++ b/aiorest_ws/db/orm/django/relations.py @@ -5,6 +5,7 @@ from collections import OrderedDict from aiorest_ws.db.orm import relations +from aiorest_ws.exceptions import ImproperlyConfigured from aiorest_ws.utils.fields import get_attribute, is_simple_callable from django.core.exceptions import ObjectDoesNotExist @@ -138,10 +139,24 @@ def get_object(self, view_name, view_args, view_kwargs): Takes the matched URL conf arguments, and should return an object instance, or raise an `ObjectDoesNotExist` exception. """ - # TODO: Check on getting this values correctly - lookup_value = view_kwargs[self.lookup_url_kwarg] - lookup_kwargs = {self.lookup_field: lookup_value} - return self.get_queryset().get(**lookup_kwargs) + try: + lookup_value = view_kwargs[self.lookup_url_kwarg] + lookup_kwargs = {self.lookup_field: lookup_value} + return self.get_queryset().get(**lookup_kwargs) + except ObjectDoesNotExist: + self.raise_error('does_not_exist') + except KeyError: + raise ImproperlyConfigured( + "Missing primary key in the endpoint path. For fixing it just " + "specify for a requested endpoint URL with included " + "`{field_name}` parameter in the path or override" + "`lookup_url_kwarg` in the constructor for the concrete field." + .format(field_name=self.lookup_url_kwarg) + ) + except (TypeError, ValueError): + self.raise_error( + 'incorrect_type', data_type=type(view_kwargs).__name__ + ) def is_saved_in_database(self, obj): if not obj or not obj.pk: @@ -149,8 +164,8 @@ def is_saved_in_database(self, obj): return True def get_lookup_value(self, obj): - # TODO: extract pk fields and return pk values as tuple - pass + pk = getattr(obj, self.lookup_field) + return pk if isinstance(pk, (tuple, list)) else (pk, ) class HyperlinkedIdentityField(relations.HyperlinkedIdentityField, diff --git a/aiorest_ws/db/orm/django/serializers.py b/aiorest_ws/db/orm/django/serializers.py index 62d088d..684d1ca 100644 --- a/aiorest_ws/db/orm/django/serializers.py +++ b/aiorest_ws/db/orm/django/serializers.py @@ -229,6 +229,11 @@ def run_validation(self, data=empty): if is_empty_value: return data + for field in self.fields.values(): + for validator in field.validators: + if hasattr(validator, 'set_context'): + validator.set_context(field) + value = self.to_internal_value(data) try: self.run_validators(value)