diff --git a/syncano/models/manager.py b/syncano/models/manager.py index c6ab313..a2abda8 100644 --- a/syncano/models/manager.py +++ b/syncano/models/manager.py @@ -18,7 +18,7 @@ class ManagerDescriptor(object): def __init__(self, manager): self.manager = manager - def __get__(self, instance, owner=None): + def __get__(self, instance, owner=None, instance_name=None): if instance is not None: raise AttributeError("Manager isn't accessible via {0} instances.".format(owner.__name__)) return self.manager.all() @@ -777,10 +777,23 @@ def request(self, method=None, path=None, **request): raise if 'next' not in response and not self._template: + self._populate_instance_name(response) return self.serialize(response) + if isinstance(response, dict) and 'objects' in response: + for obj in response['objects']: + self._populate_instance_name(obj) return response + def _populate_instance_name(self, object): + instance_name = self.properties.get('instance_name') + if instance_name is None or not isinstance(object, dict): + return + for field in self.model._meta.fields: + if field.__class__.__name__ == 'ModelField': + if not isinstance(field.rel, six.string_types): + object[field.name]['instance_name'] = instance_name + def get_allowed_method(self, *methods): meta = self.model._meta allowed_methods = meta.get_endpoint_methods(self.endpoint) diff --git a/tests/integration_test_user.py b/tests/integration_test_user.py index e314e28..bfeb6c4 100644 --- a/tests/integration_test_user.py +++ b/tests/integration_test_user.py @@ -1,6 +1,9 @@ # -*- coding: utf-8 -*- +from datetime import datetime + from syncano.exceptions import UserNotFound from syncano.models import Group, User +from syncano.models.registry import registry from tests.integration_test import InstanceMixin, IntegrationTest @@ -59,6 +62,17 @@ def setUpClass(cls): label='testgroup' ) + cls.additional_instance = cls.connection.Instance.please.create( + name='testpythonlib%s' % cls.generate_hash()[:10], + description='IntegrationTest %s' % datetime.now(), + ) + registry.set_used_instance(cls.instance.name) + + @classmethod + def tearDownClass(cls): + super(UserTest, cls).tearDownClass() + cls.additional_instance.delete() + def test_if_custom_error_is_raised_on_user_group(self): with self.assertRaises(UserNotFound): self.group.user_details(user_id=221) @@ -114,3 +128,16 @@ def test_group_user_membership(self): response = group.delete_user(user_id=user_test.id) self.assertIsNone(response) + + def test_user_retrieval_with_specified_instance_name(self): + user = self.additional_instance.users.create( + username='custom_instance_user_123', + password='password', + ) + instance_user = User.please.get(id=user.id, instance_name=self.additional_instance.name) + self.assertEqual(instance_user.id, user.id) + self.assertEqual(instance_user.username, user.username) + users = User.please.list(instance_name=self.additional_instance.name) + self.assertEqual(len(list(users)), 1) + self.assertEqual(instance_user.id, users[0].id) + self.assertEqual(instance_user.username, users[0].username)