我准备开发一个项目,并正在制定我可以使用的东西。该项目将需要不同的基于组/用户的模型和对象权限和设置。
我知道我可以使用django-objectpermissions(https://github.com/washingtontimes/django-objectpermissions)和djangos自己的模型权限。但是在某些情况下,当你真的不需要设置对象/模型权限时,而是设置 - 这个帐户/用户可以做某事,这与某个对象或模型无关。有人为此开发了应用程序吗?或者当人们有这种需求时,他们采取什么样的方法?也许创建虚拟django模型,让djangos模型权限处理其余的?
我也知道,这有点类似 - https://github.com/danielroseman/django-dbsettings。但是,当我浏览代码时,我得到了印象,那些设置都是基于用户的 - 我还需要基于组的设置。
修改:人们不断向我提供权限应用。我正在寻找的不是权限应用程序,而是设置应用程序。这些设置/权限与任何对象无关。
基本上。在我的项目中,我需要回答问题 - 这个用户能看到/做这件事吗?那个“事物”很可能是一种观点。所以其中一个答案几乎可行。但是我在视图中进行的检查不是用户是否拥有某个模型/对象的权限。相反,如果用户启用了此设置,则用户组是否已打开此设置。
艾伦
答案 0 :(得分:3)
您可能需要为此创建自己的系统。这应该不是很困难。
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
您可以轻松构建一个将进行检查的装饰器,并为视图提供一个列表(或单个项目)。
答案 1 :(得分:0)
答案 2 :(得分:0)
也许这就是你要找的东西:django-guardian