Search code examples
pythondjangopython-social-authdjango-guardian

django-guardian DoesNotExist error when adding group permission


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.

Solution

  • You should change

    assign_perm('edit', members, project)
    

    to

    assign_perm('edit_project', members, project)