Sparky
Sparky

Reputation: 71

Unable to set custom permissions in Django

I'm trying to setup some custom permissions for a Django application, but can't seem to get it working. The official documentation is a little scant, and doesn't mention (at least that I can find) how to actually set a permission? Based on a few 3rd party tutorials I found, I've extended the User class and it seems to work OK:

from django.db import models
from django.contrib.auth.models import User,UserManager

    class CustomUser(User):
        custom_field = models.CharField(max_length=250)
        objects = UserManager()

        class Meta:
            permissions = (
                ('is_custom','Has a Custom Permission'),
            )

When I try to set a permission however, it doesn't work:

>>> from project.custauth.models import CustomUser
>>> from django.contrib.auth.models import User, Permission
>>> user = CustomUser.objects.get(username='new.user')
>>> user
<CustomUser: new.user>
>>> custom_permission = Permission.objects.get(codename="is_custom")
>>> custom_permission
<Permission: custauth | custom user | Has a Custom Permission>
>>> custom_permission.save()
>>> user.user_permissions.add(custom_permission)
>>> user.save()
>>> user.has_perm(custom_permission)
False
>>> user.get_all_permissions()
set([])

Any ideas on what I'm doing wrong? I'm using Django 1.2.1 with Python 2.4.3. All input appreciated...

Upvotes: 7

Views: 3360

Answers (2)

Sparky
Sparky

Reputation: 71

I did some more testing on a different platform and was able to replicate your results. After more digging I've found it's an issue with the authentication backend, rather than the permissions themselves.

Thanks for your help Manoj.

Upvotes: 0

Manoj Govindan
Manoj Govindan

Reputation: 74705

I tested your code (Python 2.6.2, Django 1.2.1) and everything worked as expected. Can you write a unit test to exercise the same code snippet?

On a side note user.has_perm(custom_permission) will not return True. Try user.has_perm('app.is_custom').

Update

Code snippet follows:

In [1]: from app.models import CustomUser

In [2]: from django.contrib.auth.models import User, Permission

In [3]: user = CustomUser.objects.get(username = 'new.user')

In [4]: custom_permission = Permission.objects.get(codename='is_custom')

In [5]: user.user_permissions.add(custom_permission)

In [6]: user.save()

In [7]: user.has_perm(custom_permission)
Out[7]: False

In [8]: user.has_perm('app.is_custom')
Out[8]: True

In [9]: user.get_all_permissions()
Out[9]: set([u'app.is_custom'])

Upvotes: 1

Related Questions