2015-10-19 17 views
3

У меня есть активный проект Django, где панель администратора используется командой поддержки клиентов. Django не имеет разрешения view, из-за которого я должен назначить разрешение на изменение для группы поддержки клиентов, которая немного опасна. У меня есть некоторые модели, для которых команде поддержки клиентов нужен только доступ к виду, а не доступ к изменениям из-за проблем с безопасностью. Почему в Django отсутствует разрешение view? Любой обходной путь к этому?Почему у Django нет разрешения на просмотр?

+0

Вы хотите, чтобы информация в admin была доступна только для чтения? –

+0

@marksweb: Да, но только для определенной группы пользователей. Я не хочу, чтобы он читался только глобально по всем группам. – anon

+1

Никто не отвечал на вопрос, почему отсутствует разрешение 'view'. – mehmet

ответ

1

Я думаю, что это должно работать:

1.Add "вид" разрешение см https://stackoverflow.com/a/23411901/1266258

2.Customize "изменение" разрешение:

class FooAdmin(ModelAdmin): 
    def has_change_permission(self, request, obj=None): 
     # user can view the change list 
     if not obj and request.user.has_perm('myapp.view_foo'): 
      return True 
     # user can view the change form and change the obj 
     return request.user.has_perm('myapp.change_foo') 
+0

Я хочу, чтобы разрешения были назначены по-разному в разных группах, как в моем комментарии к вопросу. – anon

+0

'user.has_perm()' будет проверять права пользователей и групповые разрешения. – JimmyYe

+0

pista329 отправил правильный ответ – okolimar

4

Вот обходной путь.

Модели

Просто создавать модели с разрешением зрения, унаследовав их от Mixin:

class ViewPermissionsMixin(models.Model): 
    """ 
     Mixin adds view permission to model. 
    """ 
    class Meta: 
     abstract=True 
     default_permissions = ('add', 'change', 'delete', 'view') 

Пример модели:

class ExampleModel(ViewPermissionsMixin): 
    name = models.CharField(max_length=255) 

    class Meta(ViewPermissionsMixin.Meta): 
     abstract = False 

Это добавит разрешение представления, которое может быть назначено определенный пользователь/группа. Но такое разрешение бесполезно без правильной модификации администратора.

Админы

Вот подмешать для админ:

class AdminViewMixin(admin.ModelAdmin): 

    def has_perm(self,user,permission): 
     """ 
      Usefull shortcut for `user.has_perm()` 
     """ 
     if user.has_perm("%s.%s_%s" % (self.model._meta.app_label,permission,self.model.__name__.lower(),)): 
      return True 
     return False 

    def has_module_permission(self, request): # Django 1.8 
     pass 

    def has_change_permission(self, request, obj=None): 
     """ 
      Necessary permission check to let Django show change_form for `view` permissions 
     """ 
     if request.user.is_superuser: 
      return True 
     elif self.has_perm(request.user,'change'): 
      return True 
     elif self.has_perm(request.user,'view'): 
      return True 
     return super(AdminMixin, self).has_change_permission(request, obj) 

    def get_readonly_fields(self, request, obj=None): 
     """ 
      Turn each model field into read-only for `viewers` 
     """ 
     all_model_fields = [] 
     for field in self.model._meta.fields: 
      # TODO in Django 1.8 use ModelAdmin.get_fields() 
      if not field.auto_created \ 
       and (not hasattr(field,'auto_now_add') or not field.auto_now_add) \ 
       and (not hasattr(field,'auto_now') or not field.auto_now) \ 
       : 
       all_model_fields.append(field.name) 
     if request.user.is_superuser: 
      return self.readonly_fields 
     elif self.has_perm(request.user,'change'): 
      return self.readonly_fields 
     elif self.has_perm(request.user,'view'): 
      return all_model_fields 
     return self.readonly_fields 

    def change_view(self, request, object_id, extra_context=None): 
     """ 
      Disable buttons for `viewers` in `change_view` 
     """ 
     if request.user.is_superuser: 
      pass 
     elif self.has_perm(request.user,'change'): 
      pass 
     elif self.has_perm(request.user,'view'): 
      extra_context = extra_context or {} 
      extra_context['hide_save_buttons'] = True 
     return super(AdminViewMixin, self).change_view(request, object_id, extra_context=extra_context) 

Пример администратор:

@admin.register(models.ExampleModel) 
class ExampleAdmin(AdminViewMixin): 
    list_display = ('name',) 
    pass 

Наконец просто назначить view разрешения для конкретных моделей для любого пользователя или группы в вашем Администратор Django.

+0

спасибо, работает как шарм :), вы сохранили мой день – okolimar

+0

Как это сравнить с разрешением django-admin-view [https://github.com/ctxis/django-admin-view -передача]? – Don

Смежные вопросы