2013-12-11 4 views
2

내 허가를 관리하려면 django-guardian을 사용하고 있습니다. 각 모델의 기본값은 add, change, delete의 세 가지 perm입니다. 예를 들어 나 자신의 허락을 추가하면 view, User 관리 탭에 모두 4 개, 모델 - 개체 관리 탭에 모두 4 개가 있습니다.장고 보호자. 어떻게 사용 권한 목록을 필터링 할 수 있습니까?

는 그 필터 권한에 가능하다 알고 Django admin - change permissions list

하지만 모델 객체 Managment를 탭에 권한을 필터링하는 방법을 모르겠어요. 심지어 가능할까요?

답변

2

나는 약간의 연구를했다. 어쩌면 그것은하지 최상의 솔루션,하지만 작동합니다

admin_utils.py :

from __future__ import unicode_literals 
from django import forms 
from django.conf import settings 
from guardian.compat import url, patterns 
from django.contrib import admin 
from django.contrib import messages 
from django.contrib.admin.widgets import FilteredSelectMultiple 
from django.core.urlresolvers import reverse 
from django.shortcuts import render_to_response, get_object_or_404, redirect 
from django.template import RequestContext 
from django.utils.datastructures import SortedDict 
from django.utils.translation import ugettext, ugettext_lazy as _ 
from django.db.models import Q 
from django.contrib.auth.models import Group, Permission 

from guardian.compat import get_user_model 
from guardian.forms import UserObjectPermissionsForm 
from guardian.forms import GroupObjectPermissionsForm 
from guardian.shortcuts import get_perms 
from guardian.shortcuts import get_users_with_perms 
from guardian.shortcuts import get_groups_with_perms 
from guardian.models import Group 
from django.contrib.contenttypes.models import ContentType 
from guardian.admin import AdminUserObjectPermissionsForm, AdminGroupObjectPermissionsForm 
from guardian.admin import GuardedModelAdmin 


class MyGuardedModelAdmin(GuardedModelAdmin): 

    allowed_perms = [] 

    def get_perms_for_model(self, cls): 
     if isinstance(cls, basestring): 
      app_label, model_name = cls.split('.') 
      model = models.get_model(app_label, model_name) 
     else: 
      model = cls 
     ctype = ContentType.objects.get_for_model(model) 
     return Permission.objects.filter(Q(content_type=ctype), Q(codename__in=self.allowed_perms)) 

    def get_obj_perms_base_context(self, request, obj): 
     context = { 
      'adminform': {'model_admin': self}, 
      'media': self.media, 
      'object': obj, 
      'app_label': self.model._meta.app_label, 
      'opts': self.model._meta, 
      'original': hasattr(obj, '__unicode__') and obj.__unicode__() or\ 
       str(obj), 
      'has_change_permission': self.has_change_permission(request, obj), 
      'model_perms': self.get_perms_for_model(obj), 
      'title': _("Object permissions"), 
     } 
     return context 


    class MyAdminUserObjectPermissionsForm(AdminUserObjectPermissionsForm): 

     def get_perms_for_model(self, cls): 
      if isinstance(cls, basestring): 
       app_label, model_name = cls.split('.') 
       model = models.get_model(app_label, model_name) 
      else: 
       model = cls 
      ctype = ContentType.objects.get_for_model(model) 
      return Permission.objects.filter(Q(content_type=ctype), Q(codename__in=self.allowed_perms)) 

     def get_obj_perms_field_choices(self): 
      choices = [(p.codename, p.name) for p in self.get_perms_for_model(self.obj)] 
      return choices 

    def get_obj_perms_manage_user_form(self): 
     setattr(self.MyAdminUserObjectPermissionsForm, 'allowed_perms', self.allowed_perms) 
     return self.MyAdminUserObjectPermissionsForm 


    class MyAdminGroupObjectPermissionsForm(GroupObjectPermissionsForm): 
     def get_perms_for_model(self, cls): 
      if isinstance(cls, basestring): 
       app_label, model_name = cls.split('.') 
       model = models.get_model(app_label, model_name) 
      else: 
       model = cls 
      ctype = ContentType.objects.get_for_model(model) 
      return Permission.objects.filter(Q(content_type=ctype), Q(codename__in=self.allowed_perms)) 

     def get_obj_perms_field_choices(self): 
      choices = [(p.codename, p.name) for p in self.get_perms_for_model(self.obj)] 
      return choices 

    def get_obj_perms_manage_group_form(self): 
     setattr(self.MyAdminGroupObjectPermissionsForm, 'allowed_perms', self.allowed_perms) 
     return self.MyAdminGroupObjectPermissionsForm 

그리고 지금 당신은 allowed_perms

admin.py으로 필터링 할 수 있습니다

class PollAdmin(MyGuardedModelAdmin): 
    allowed_perms = ['view_poll'] 

admin.site.register(Poll, PollAdmin)