オブジェクトごとのアクセス許可を django アプリに追加したいのですが、基本が機能していないようです。私は python-social-auth も使用していますが、auth.User は引き続き正常に動作するため、問題になるとは思いませんでした。
すべてを正しく行っているように見えますが、グループに権限を追加しようとすると、DoesNotExist エラーで失敗します。
私の設計を少し説明すると、各プロジェクトにはリーダーとメンバーのグループがいます。メンバー グループは、プロジェクトの各メンバーが持つ権限を定義します。リードはメンバー グループに属していますが、最終的には特別な権限が追加され、標準メンバーが実行できないことを実行できるようになります。
私のモデル.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'),
)
私の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()
私のプロジェクトの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',
)
完全なスタック トレース
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.