Pregunta

Estoy preparando para desarrollar un proyecto y estoy en proceso de mapeo de cosas que puedo usar para ello. Este proyecto va a necesitar diferentes permisos y configuraciones de objetos y modelo de grupo / usuario.

Sé que puedo usar Django-Objectpermissions (https://github.com/washingtontimes/django-objectpermissions) y Djangos PROGROS MODELOS PERMISOS. Pero hay algunos casos, cuando realmente no necesita establecer permisos de objeto / modelo, sino más bien una configuración, puede esta cuenta / usuario hacer algo, que no está relacionado con ciertos objetos o modelo. ¿Alguien ha desarrollado la aplicación para esto? ¿O qué tipo de enfoque toman las personas cuando tienen tanta necesidad? Tal vez cree un modelo DUMMY DJANGO y deje que los permisos del modelo de Djangos manejen el resto?

También sé, que esto hace algo similar: https://github.com/danielroseman/django- dbsettings . Pero cuando escape por el código, obtuve impresión, que esas configuraciones son todas basadas en el usuario, también necesito la configuración basada en el grupo.

Editar: La gente sigue ofreciéndome las aplicaciones de permisos. Lo que estoy buscando no es la aplicación de permisos, sino la aplicación de configuración. Esos ajustes / permisos no están relacionados con ningún objeto.

básicamente. En mi proyecto necesito responder preguntas, ¿puede este usuario ver / hacer esto? Esa "cosa" es muy probablemente una vista. Así que una de las respuestas casi funciona. Pero el cheque que hago a la vista, no es si el usuario tiene permiso para algún modelo / objeto. Es más bien, si el usuario tiene esta configuración encendida, de si el grupo de usuarios tiene esta configuración encendida.

alan

¿Fue útil?

Solución

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.

Otros consejos

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top