Commit 954e3b4a authored by Jannis Leidel's avatar Jannis Leidel
Browse files

Fixed #13914 -- Added natural keys to User and Group models in auth contrib...

Fixed #13914 -- Added natural keys to User and Group models in auth contrib app. Thanks, jbochi and closedbracket.

git-svn-id: http://code.djangoproject.com/svn/django/trunk@17429 bcc190cf-cafb-0310-a4f2-bffc1f526a37
parent 6ecadcbd
Loading
Loading
Loading
Loading
+32 −0
Original line number Diff line number Diff line
[
    {
        "pk": 1, 
        "model": "auth.group", 
        "fields": {
            "name": "my_group", 
            "permissions": []
        }
    }, 
    {
        "pk": 1, 
        "model": "auth.user", 
        "fields": {
            "username": "my_username", 
            "first_name": "", 
            "last_name": "", 
            "is_active": true, 
            "is_superuser": true, 
            "is_staff": true, 
            "last_login": "2012-01-13 00:14:00", 
            "groups": [
                [
                    "my_group"
                ]
            ], 
            "user_permissions": [], 
            "password": "pbkdf2_sha256$10000$LUyhxJjuLwXF$f6Zbpnx1L5dPze8m0itBaHMDyZ/n6JyhuavQy2RrBIM=", 
            "email": "email@example.com", 
            "date_joined": "2012-01-13 00:14:00"
        }
    }
]
+30 −0
Original line number Diff line number Diff line
[
    {
        "pk": 1, 
        "model": "auth.group", 
        "fields": {
            "name": "my_group", 
            "permissions": []
        }
    }, 
    {
        "pk": 1, 
        "model": "auth.user", 
        "fields": {
            "username": "my_username", 
            "first_name": "", 
            "last_name": "", 
            "is_active": true, 
            "is_superuser": true, 
            "is_staff": true, 
            "last_login": "2012-01-13 00:14:00", 
            "groups": [
                1
            ], 
            "user_permissions": [], 
            "password": "pbkdf2_sha256$10000$LUyhxJjuLwXF$f6Zbpnx1L5dPze8m0itBaHMDyZ/n6JyhuavQy2RrBIM=", 
            "email": "email@example.com", 
            "date_joined": "2012-01-13 00:14:00"
        }
    }
]
+18 −0
Original line number Diff line number Diff line
@@ -86,6 +86,13 @@ class Permission(models.Model):
    natural_key.dependencies = ['contenttypes.contenttype']


class GroupManager(models.Manager):
    """
    The manager for the auth's Group model.
    """
    def get_by_natural_key(self, name):
        return self.get(name=name)

class Group(models.Model):
    """
    Groups are a generic way of categorizing users to apply permissions, or
@@ -107,6 +114,8 @@ class Group(models.Model):
    permissions = models.ManyToManyField(Permission,
        verbose_name=_('permissions'), blank=True)

    objects = GroupManager()

    class Meta:
        verbose_name = _('group')
        verbose_name_plural = _('groups')
@@ -114,6 +123,9 @@ class Group(models.Model):
    def __unicode__(self):
        return self.name

    def natural_key(self):
        return (self.name,)


class UserManager(models.Manager):
    def create_user(self, username, email=None, password=None):
@@ -160,6 +172,9 @@ class UserManager(models.Manager):
        """
        return get_random_string(length, allowed_chars)

    def get_by_natural_key(self, username):
        return self.get(username=username)


# A few helper functions for common logic between User and AnonymousUser.
def _user_get_all_permissions(user, obj):
@@ -240,6 +255,9 @@ class User(models.Model):
    def __unicode__(self):
        return self.username

    def natural_key(self):
        return (self.username,)

    def get_absolute_url(self):
        return "/users/%s/" % urllib.quote(smart_str(self.username))

+4 −3
Original line number Diff line number Diff line
@@ -10,7 +10,8 @@ from django.contrib.auth.tests.forms import (UserCreationFormTest,
from django.contrib.auth.tests.remote_user import (RemoteUserTest,
    RemoteUserNoCreateTest, RemoteUserCustomTest)
from django.contrib.auth.tests.management import GetDefaultUsernameTestCase
from django.contrib.auth.tests.models import ProfileTestCase
from django.contrib.auth.tests.models import (ProfileTestCase, NaturalKeysTestCase,
    LoadDataWithoutNaturalKeysTestCase, LoadDataWithNaturalKeysTestCase)
from django.contrib.auth.tests.hashers import TestUtilsHashPass
from django.contrib.auth.tests.signals import SignalTestCase
from django.contrib.auth.tests.tokens import TokenGeneratorTest
+33 −2
Original line number Diff line number Diff line
from django.conf import settings
from django.test import TestCase
from django.contrib.auth.models import User, SiteProfileNotAvailable
from django.contrib.auth.models import Group, User, SiteProfileNotAvailable

class ProfileTestCase(TestCase):
    fixtures = ['authtestdata.json']
@@ -33,3 +33,34 @@ class ProfileTestCase(TestCase):
        # module that doesn't exist
        settings.AUTH_PROFILE_MODULE = 'foo.bar'
        self.assertRaises(SiteProfileNotAvailable, user.get_profile)


class NaturalKeysTestCase(TestCase):
    fixtures = ['authtestdata.json']

    def test_user_natural_key(self):
        staff_user = User.objects.get(username='staff')
        self.assertEquals(User.objects.get_by_natural_key('staff'), staff_user)
        self.assertEquals(staff_user.natural_key(), ('staff',))

    def test_group_natural_key(self):
        users_group = Group.objects.create(name='users')
        self.assertEquals(Group.objects.get_by_natural_key('users'), users_group)


class LoadDataWithoutNaturalKeysTestCase(TestCase):
    fixtures = ['regular.json']

    def test_user_is_created_and_added_to_group(self):
        user = User.objects.get(username='my_username')
        group = Group.objects.get(name='my_group')
        self.assertEquals(group, user.groups.get())


class LoadDataWithNaturalKeysTestCase(TestCase):
    fixtures = ['natural.json']
    def test_user_is_created_and_added_to_group(self):
        user = User.objects.get(username='my_username')
        group = Group.objects.get(name='my_group')
        self.assertEquals(group, user.groups.get())
Loading