Есть ли способ применить разрешение Meta к каждой модели в приложении Django? - PullRequest
1 голос
/ 30 марта 2012

Я хотел бы добавить разрешение can_view Meta для каждой модели в моем приложении Django.

В значительной степени я хочу добавить это к каждому классу в models.py

class Meta:
    permissions = [ ( "can_view", "Can view {something}".format( something = self.verbose_name ) ]

Я даже не уверен, что self.verbose_name будет работать так же в этом случае ....

Возможно ли это?

Бонусный вопрос: Как только я добавлю разрешение в Meta модели, я смогу вызвать его с помощью has_perm верно? Как

if request.user.has_perm( 'polls.can_view' ) :
    # Show a list of polls.
else :
    # Say "Insufficient permissions" or something.    

Ответы [ 2 ]

5 голосов
/ 30 марта 2012

Разрешение также является обычным экземпляром модели Django.Вы можете создать его как любую другую модель.

Так что вам нужно что-то вроде

from django.contrib.auth.models import Permission
from django.contrib.contenttypes.models import ContentType

for content_type in ContentType.objects.all():
     Permission.objects.create(content_type=content_type, codename='view_%s' % content_type.model, name='Can view %s' % content_type.name)

Вам нужно сделать это один раз, чтобы сигнал post_syncdb выглядел как хорошее местодля этого.

1 голос
/ 30 марта 2012

Самый простой и очевидный подход - это пользовательская базовая модель, которая является родителем всех ваших моделей.Таким образом, вам (или другому программисту) будет интересно, откуда взялись эти черты can_view.

class CustomBaseModel(models.Model):
    class Meta:
        abstract = True
        permissions = [ ( "can_view", "Can view {something}".format( something = self.verbose_name ) ]

class SomeModel(CustomBaseModel):
    # ...

Однако для этого нужно поменять все свои модели (это легко сделать с помощью небольшого поиска изаменить), и это не изменит встроенные модели Djangos (например, User).

...