Приложение Django для настроек пользователя/учетной записи

Я готовлюсь к разработке одного проекта и нахожусь в процессе планирования того, что я могу использовать для него. Для этого проекта потребуются различные разрешения и настройки модели и объекта на основе группы/пользователя.

Я знаю, что могу использовать разрешения django-objectpermissions (https://github.com/washingtontimes/django-objectpermissions) и собственные разрешения модели django. Но есть некоторые случаи, когда вам действительно не нужно устанавливать права доступа к объекту/модели, а скорее настройку - может ли эта учетная запись/пользователь делать что-то, что не связано с определенным объектом или моделью. Кто-то разработал приложение для этого? Или какой подход используют люди, когда у них есть такая потребность? Возможно, создайте фиктивную модель django и разрешите разрешениям модели djangos обрабатывать все остальное?

Я также знаю, что это делает что-то подобное - https://github.com/danielroseman/django-dbsettings. Но когда я просмотрел код, у меня сложилось впечатление, что все эти настройки основаны на пользователе - мне также нужны настройки на основе группы.

Изменить: люди продолжают предлагать мне приложения с разрешениями. Я ищу не приложение разрешений, а приложение настроек. Эти настройки/разрешения не связаны ни с какими объектами.

В основном. В моем проекте мне нужно ответить на вопросы - Может ли этот пользователь видеть/делать это? Эта «вещь», скорее всего, является видом. Так что один из ответов почти работает. Но проверка, которую я делаю при просмотре, заключается в том, что у пользователя нет разрешения на какую-либо модель/объект. Скорее, если у пользователя включен этот параметр, или если у группы пользователей этот параметр включен.

Алан


person Odif Yltsaeb    schedule 19.02.2011    source источник
comment
docs.djangoproject.com/en/dev/topics/auth/#permissions Вы можете делать групповые разрешения   -  person MattoTodd    schedule 20.02.2011


Ответы (3)


Для этого вам, вероятно, потребуется создать собственную систему. Это не должно быть очень сложно.

class Setting(models.Model):
    name = models.CharField(..)
    value = models.CharField(..)
    users = models.ManyToManyField(User)
    groups = models.ManyToManyField(Group)

    @classmethod
    def has_setting(cls, name, user):
        user_settings = cls.objects.filter(name=name, users__in=[user]).count()
        group_settings = cls.objects.filter(name=name, groups__in=user.groups.all()).count()
        return user_settings or group_settings

    @classmethod
    def get_settings(cls, name, user, priority=User):
        user_settings = list(cls.objects.filter(name=name, users__in=[user]))
        group_settings = list(cls.objects.filter(name=name, groups__in=user.groups.all()))
        if user_settings and not group_settings: 
            return user_settings
        elif group_settings and not user_settings:
            return group_settings
        else:
            return (group_settings, user_settings)[priority==User]

Затем вы можете сделать что-то подобное в своих представлениях:

def display_frob(request):
    if Setting.has_setting('display_frob', request.user):
         settings = Setting.get_setting('display_from', request.user, priority=Group)
         values = [setting.value for setting in settings]
         # if the User was in many groups, we now have a list of values, for the setting
         # `display_frob`, that aligns with each of those groups

Вы можете легко создать декоратор, который выполнит проверку и предоставит список (или один элемент) значений для представления.

person Josh Smeaton    schedule 20.02.2011

Для разрешений для «действий» (где действие обычно реализуется представлением) я обычно использую декораторы.

Декоратор user_passes_test отлично подходит для такого рода цели.

Вы можете создавать пользовательские разрешения, не связанные с моделями.

person Carles Barrobés    schedule 19.02.2011
comment
Спасибо. Это хороший совет. Но мне не нужны только разрешения - мне нужны какие-то настройки, и они не могут быть полностью основаны на пользователе, но должны быть основаны на группе / учетной записи. Нравится - включает ли этот аккаунт или группу то или иное. Должен ли я создать фиктивную модель для того или иного, а затем обрабатывать ее с разрешениями? Или есть приложение для этого? - person Odif Yltsaeb; 20.02.2011
comment
Я бы сказал, сделай это сам, как предлагает Джош. - person Carles Barrobés; 21.02.2011

Возможно, это то, что вы ищете: django-guardian

person Aldarund    schedule 20.02.2011
comment
Спасибо, что обратили на это мое внимание. Я вижу, что это заполняет место для тех же вещей, что и это - github.com/washingtontimes/django-objectpermissions - делает. Как я уже сказал, мне нужны вещи, то есть больше приложение настроек, чем разрешения. Часть разрешений уже покрыта :). - person Odif Yltsaeb; 20.02.2011