Ver Fonte

HUE-8530 [organization] Avoid infinite recursion when overriding User queryset

Romain há 5 anos atrás
pai
commit
65c4850746

+ 6 - 3
apps/useradmin/src/useradmin/models.py

@@ -221,10 +221,13 @@ def get_default_user_group(**kwargs):
   if default_user_group is None:
     return None
 
+  attributes = {
+    'name': default_user_group
+  }
   if ENABLE_ORGANIZATIONS.get():
-    group, created = Group.objects.get_or_create(name=default_user_group, organization=default_organization())
-  else:
-    group, created = Group.objects.get_or_create(name=default_user_group)
+    attributes['organization'] = organization = kwargs['user'].organization if kwargs.get('user') else default_organization()
+
+  group, created = Group.objects.get_or_create(**attributes)
 
   if created:
     group.save()

+ 3 - 2
apps/useradmin/src/useradmin/models2.py

@@ -20,6 +20,7 @@ import uuid
 
 from crequest.middleware import CrequestMiddleware
 from django.contrib.auth.models import models, AbstractUser, BaseUserManager
+from django.utils.functional import SimpleLazyObject
 from django.utils.translation import ugettext_lazy as _t
 
 
@@ -110,7 +111,7 @@ class UserManager(BaseUserManager):
     queryset = super(UserManager, self).get_queryset()
     request = CrequestMiddleware.get_request()
 
-    if request:
+    if request and hasattr(request, 'user') and type(request.user) is not SimpleLazyObject:
       queryset = queryset.filter(
         organization=request.user.organization
       )
@@ -176,7 +177,7 @@ class OrganizationUser(AbstractUser):
   objects = UserManager()
 
   def __str__(self):
-    return '%s @ %s' % (self.name, self.organization)
+    return '%s @ %s' % (self.email, self.organization)
 
   @property
   def username(self):

+ 9 - 4
apps/useradmin/src/useradmin/models2_tests.py

@@ -59,16 +59,21 @@ class TestOrganizationSingleUser(unittest.TestCase):
 
 
   def test_user_group(self):
+    user1_organization = Organization.objects.get(name='user1@testorg.gethue.com')
+
     assert_equal('user1@testorg.gethue.com', self.user1.email)
     assert_true(self.user1.is_admin)
-    assert_equal([Group.objects.filter(name='user1@testorg.gethue.com')], self.user1.groups.all())
-    assert_equal(Organization.objects.filter(name='user1@testorg.gethue.com'), self.user1.organization)
+    assert_equal(user1_organization, self.user1.organization)
+    assert_equal(
+      list(Group.objects.filter(name='default', organization=user1_organization)),
+      list(self.user1.groups.all())
+    )
 
 
   def test_users_groups(self):
     assert_equal(4, User.objects.filter(email__contains='testorg.gethue.com').count(), User.objects.all())
     assert_equal(4, Organization.objects.filter(name__contains='testorg.gethue.com').count(), Organization.objects.all())
-    assert_equal(4, Group.objects.filter(name__contains='testorg.gethue.com').count(), Group.objects.all())
+    assert_equal(4, Group.objects.filter(organization__name__contains='testorg.gethue.com').count(), Group.objects.all())
 
 
   def test_get_users(self):
@@ -76,4 +81,4 @@ class TestOrganizationSingleUser(unittest.TestCase):
     data = json.loads(response.content)
 
     assert_equal(0, data['status'])
-    assert_equal([self.user1.email], [user['username'] for user in data['users']])
+    assert_equal([self.user1.email], [user['email'] for user in data['users']])

+ 1 - 1
desktop/core/src/desktop/auth/backend.py

@@ -186,7 +186,7 @@ def find_or_create_user(username, password=None, is_superuser=True):
   return user
 
 def ensure_has_a_group(user):
-  default_group = get_default_user_group()
+  default_group = get_default_user_group(user=user)
 
   if not user.groups.exists() and default_group is not None:
     user.groups.add(default_group)