Question

Je vous prépare pour le développement d'un projet et je suis en train de mapper des choses que je peux utiliser pour cela. Ce projet aura besoin de différentes autorisations et paramètres de modèle et d'objets basés sur l'utilisateur.

Je sais que je peux utiliser django-objectpermissions (https://github.com/washingtontimes/django-ObjectPersmissions) et des autorisations de modèle de Djangos. Mais il y a des cas, lorsque vous n'avez pas vraiment besoin de définir des autorisations d'objet / modèle, mais plutôt un paramètre - peut-il faire quelque chose, ce qui n'est pas lié à certains objets ou modèles. Quelqu'un a-t-il développé une application pour cela? Ou quel type d'approche prend-ils les gens quand ils ont un tel besoin? Peut-être créer un modèle django factice et laisser les autorisations de modèle Djangos gérer le reste?

Je sais aussi que cela fait quelque chose de similaire - https://github.com/danielroseman/django- Dbsettings . Mais lorsque j'ai écrémé à travers le code, j'ai eu l'impression que ces paramètres sont tous basés sur l'utilisateur - j'ai besoin également de paramètres de groupe.

edit: Les gens continuent à m'en proposer des applications d'autorisations. Ce que je cherche, ce n'est pas une application des autorisations, mais l'application Paramètres. Ces paramètres / autorisations ne sont liés à aucun objet.

essentiellement. Dans mon projet, j'ai besoin de répondre aux questions - peut-on voir / faire cette chose? Cette "chose" est probablement une vue. Donc, une des réponses fonctionne presque. Mais le chèque que je fais en vue n'est pas si l'utilisateur a la permission d'un modèle / objet. C'est plutôt si l'utilisateur dispose de ce paramètre, de si le groupe d'utilisateurs dispose de ce paramètre.

alan

Était-ce utile?

La solution

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.

Autres conseils

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top