Reputation: 71
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
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
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