Приложение Django для настроек пользователя / аккаунта - PullRequest
3 голосов
/ 19 февраля 2011

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

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

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

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

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

Алан

Ответы [ 3 ]

3 голосов
/ 20 февраля 2011

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

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

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

0 голосов
/ 20 февраля 2011

Может быть, это то, что вы ищете: Джанго-хранитель

0 голосов
/ 20 февраля 2011

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

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

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

...