Skip to content

Instantly share code, notes, and snippets.

@xuhcc
Last active October 16, 2018 08:59
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save xuhcc/67871719116bdc0fee6c to your computer and use it in GitHub Desktop.
Save xuhcc/67871719116bdc0fee6c to your computer and use it in GitHub Desktop.
django 1.7 migrations + django-guardian
"""
You also need to create initial migration for guardian app!
"""
from django.contrib.contenttypes.models import ContentType
from guardian.models import UserObjectPermission, GroupObjectPermission
def is_user(obj):
return obj._meta.model_name == 'user'
def is_group(obj):
return obj._meta.model_name == 'group'
def get_content_type(obj):
return ContentType.objects.get_for_model(obj)
def assign_perm(apps, perm, owner, obj=None):
"""
Accepts:
apps: django apps registry containing historical models
owner: user or group
"""
Permission = apps.get_model('auth', 'Permission')
UserObjectPermission = apps.get_model('guardian', 'UserObjectPermission')
GroupObjectPermission = apps.get_model('guardian', 'GroupObjectPermission')
try:
app_label, codename = perm.split('.', 1)
except ValueError:
raise ValueError("perm must be in format: 'app_label.codename'")
if obj is None:
perm = Permission.objects.get(
content_type__app_label=app_label,
codename=codename)
if is_user(owner):
owner.user_permissions.add(perm)
return perm
elif is_group(owner):
owner.permissions.add(perm)
return perm
else:
perm = Permission.objects.get(
content_type=get_content_type(obj),
codename=codename)
kwargs = {
'permission': perm,
'content_type': perm.content_type,
'object_pk': obj.pk,
}
if is_user(owner):
kwargs['user'] = owner
return UserObjectPermission.objects.get_or_create(**kwargs)
elif is_group(owner):
kwargs['group'] = owner
return GroupObjectPermission.objects.get_or_create(**kwargs)
def remove_perm(apps, perm, owner, obj=None):
"""
Accepts:
apps: django apps registry containing historical models
owner: user or group
"""
Permission = apps.get_model('auth', 'Permission')
UserObjectPermission = apps.get_model('guardian', 'UserObjectPermission')
GroupObjectPermission = apps.get_model('guardian', 'GroupObjectPermission')
try:
app_label, codename = perm.split('.', 1)
except ValueError:
raise ValueError("perm must be in format: 'app_label.codename'")
if obj is None:
perm = Permission.objects.get(
content_type__app_label=app_label,
codename=codename)
if is_user(owner):
owner.user_permissions.remove(perm)
elif is_group(owner):
owner.permissions.remove(perm)
else:
filters = {
'permission__codename': codename,
'permission__content_type': get_content_type(obj),
'object_pk': obj.pk,
}
if is_user(owner):
filters['user'] = owner
UserObjectPermission.objects.filter(**filters).delete()
elif is_group(owner):
filters['group'] = owner
GroupObjectPermission.objects.filter(**filters).delete()
@mrabedini
Copy link

This snippet was great. Just the ContentType model should also be retrieved by apps.get_model().

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment