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

StackOverflow https://stackoverflow.com/questions/5053421

Вопрос

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

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

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

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

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

Алан

Это было полезно?

Решение

You're probably going to need to create your own system for this. It shouldn't be very difficult.

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]

Then you can do something like this in your views:

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

You can easy build a decorator which will do the check, and provide a list (or a single item) of values to the view.

Другие советы

For permissions for "actions" (where an action is typically implemented by a view) I commonly use decorators.

The user_passes_test decorator is great for this kind of purpose.

You could create user permissions not linked to models.

Maybe this is what you looking for : django-guardian

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top