I want to add per object permissions to my django app, but I can't seem to get the basics working. I am using python-social-auth also but I didn't think that would be an issue as auth.User still works normally.
I seem to be doing everything correctly, but when I try to add permissions to a group it fails with a DoesNotExist error.
To try to explain my design a bit, each project has a leader and a group of members. The member group defines permissions that each member of the project will have. The lead is in the member group but will also have special permissions added eventually to allow them to do things that standard members cannot do.
My models.py
class Project(models.Model):
# Leader of the project
project_name = models.CharField(max_length=200, unique=True)
# The url for the stash repository
#project_repo = models.
# Date the project was created
date_created = models.DateTimeField(auto_now=True)
# Person in charge of the project
project_lead = models.ForeignKey(User, related_name='%(class)s_lead_set')
# Group of members to use for permission checking
members = models.ForeignKey(Group, null=True, default=None)
class Meta:
permissions = (
('edit_project', 'Edit Project'),
)
My views.py
@login_required
def create(request):
if request.method== "POST":
form = NewProjectForm(request.POST)
if form.is_valid():
# Create the new project
project = Project(**form.cleaned_data)
project.project_lead = request.user
# Create a user group
members = Group.objects.create(name = project.project_name)
members.save()
# Add the members group to the project
project.members = members
project.save()
#ERROR OCCURS HERE
assign_perm('edit', members, project)
members.save()
From my projects settings.py
INSTALLED_APPS = (
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'thelibrary',
'home',
'projects',
'social.apps.django_app.default',
'guardian',
)
TEMPLATE_CONTEXT_PROCESSORS = (
'django.contrib.auth.context_processors.auth',
'django.core.context_processors.debug',
'django.core.context_processors.i18n',
'django.core.context_processors.media',
'django.core.context_processors.static',
'django.core.context_processors.tz',
'django.contrib.messages.context_processors.messages',
'social.apps.django_app.context_processors.backends',
'social.apps.django_app.context_processors.login_redirect',
)
AUTHENTICATION_BACKENDS = (
'social.backends.google.GoogleOAuth2',
'guardian.backends.ObjectPermissionBackend',
'django.contrib.auth.backends.ModelBackend',
)
Full stack trace
Traceback (most recent call last):
File "<console>", line 1, in <module>
File "/usr/lib/python2.7/site-packages/guardian/shortcuts.py", line 91, in assign_perm
return model.objects.assign_perm(perm, user, obj)
File "/usr/lib/python2.7/site-packages/guardian/managers.py", line 33, in assign_perm
permission = Permission.objects.get(content_type=ctype, codename=perm)
File "/usr/lib64/python2.7/site-packages/django/db/models/manager.py", line 92, in manager_method
return getattr(self.get_queryset(), name)(*args, **kwargs)
File "/usr/lib64/python2.7/site-packages/django/db/models/query.py", line 357, in get
self.model._meta.object_name)
DoesNotExist: Permission matching query does not exist.
You should change
assign_perm('edit', members, project)
to
assign_perm('edit_project', members, project)