Aplicativo Django para configurações de usuário / conta
-
15-11-2019 - |
Pergunta
Estou preparando para o desenvolvimento de um projeto e estou em processo de mapeamento de coisas que eu posso usar para isso. Este projeto vai precisar de diferentes permissões e configurações de modelos e objetos baseados em grupo / usuário.
Eu sei que posso usar Django-ObjectPermissions (https://github.com/washingtontimes/django-objectpermissions) e Permissões de Modelo Djangos. Mas existem alguns casos, quando você realmente não precisa definir permissões de objeto / modelo, mas sim uma configuração - pode esta conta / usuário fazer alguma coisa, que não está relacionada a determinado objeto ou modelo. Alguém desenvolvido aplicativo para isso? Ou que tipo de abordagem as pessoas tomam quando têm essa necessidade? Talvez crie modelo Dummy Django e deixe as permissões do modelo Djangos lidar com o resto?
Eu também sei, que isso faz algo semelhante - https://github.com/danielroseman/django- dbsettings . Mas quando eu deslizei pelo código, tenho impressão, que essas configurações são todos com base do usuário - eu também preciso de configurações baseadas em grupo.
Edit: As pessoas continuam me oferecendo aos aplicativos de permissões. O que eu estou procurando não é permissões app, mas configurações app. Essas configurações / permissões não estão relacionadas a nenhum objeto.
Basicamente. No meu projeto, preciso de responder a perguntas - pode este usuário ver / fazer essa coisa? Que "coisa" é provavelmente uma visão. Então uma das respostas quase funciona. Mas a verificação que faço à exibição, não é se o usuário tiver permissão para algum modelo / objeto. É em vez disso, se o usuário tiver essa configuração ligada, se o grupo de usuários tiver essa configuração ligada.
alan
Solução
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.
Outras dicas
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