Skip to content

Instantly share code, notes, and snippets.

@nitely
Created February 5, 2014 02:30
Show Gist options
  • Save nitely/8816502 to your computer and use it in GitHub Desktop.
Save nitely/8816502 to your computer and use it in GitHub Desktop.
Group permissions selection in admin filtered by your app models
"""
Sometimes you just don't want to display every permission django has,
you just want a short list showing the permissions for some of your apps (or even django core apps).
GROUP_PERMISSIONS_MODELS must be a list of your app models.
Dotted path (in lowercase) required, app name + model class name.
tested on Django 1.6 (should work on +1.3)
"""
#admin.py, you may create a new app, or put it in your "admin" app if you happen to have one.
from django.contrib import admin
from django.contrib.admin import widgets
from django.utils.translation import ugettext_lazy as _
from django import forms
from django.contrib.auth.models import Permission, Group
from django.db.models import Q
from django.conf import settings
def get_permissions():
app_models_dict = {}
for app_model in settings.GROUP_PERMISSIONS_MODELS:
app, model = app_model.split(".")
app_models_dict.setdefault(app, []).append(model)
q = Q()
for app, models in app_models_dict.iteritems():
q |= Q(content_type__app_label=app, content_type__model__in=models)
if q:
return Permission.objects.filter(q)
else:
return Permission.objects.all()
class GroupAdminForm(forms.ModelForm):
permissions = forms.ModelMultipleChoiceField(
queryset=get_permissions(),
widget=widgets.FilteredSelectMultiple(_('permissions'), False))
class Meta:
model = Group
class GroupAdmin(admin.ModelAdmin):
form = GroupAdminForm
search_fields = ('name', )
ordering = ('name', )
admin.site.unregister(Group)
admin.site.register(Group, GroupAdmin)
# settings.py
GROUP_PERMISSIONS_MODELS = ['app1.modelname', 'app2.modelname', ]
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment