Django 应用程序用于用户/账户设置。

3
我正在准备开发一个项目,并正在制定可以用于该项目的内容。这个项目将需要不同的基于组/用户的模型和对象权限以及设置。
我知道我可以使用django-objectpermissions (https://github.com/washingtontimes/django-objectpermissions) 和django自己的模型权限。但是有些情况下,您不需要设置对象/模型权限,而是需要设置 - 此帐户/用户是否可以执行某些与特定对象或模型无关的操作。有人为此开发了应用程序吗?或者当他们有这种需求时人们采取什么样的方法?也许创建虚拟django模型并让django的模型权限处理其余部分?
我还知道,这做了类似的事情- https://github.com/danielroseman/django-dbsettings 。但是当我浏览代码时,我得到的印象是,这些设置都是基于用户的 - 我还需要基于组的设置。
编辑:人们一直向我提供权限应用程序。我要找的不是权限应用程序,而是设置应用程序。这些设置/权限与任何对象无关。
基本上,在我的项目中,我需要回答问题 - 这个用户能否看到/执行这件事?那个“事情”很可能是一个视图。因此,其中一个答案几乎有效。但是我在视图中进行的检查并不是用户是否具有对某个模型/对象的权限。相反,它是如果用户打开了此设置,或者如果用户组打开了此设置,则检查该用户是否具有此设置。
艾伦

http://docs.djangoproject.com/en/dev/topics/auth/#permissions你可以基于用户组进行权限控制。 - MattoTodd
3个回答

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

您可以轻松地构建一个装饰器来进行检查,并向视图提供值列表(或单个项目)。

0

对于“操作”(通常由视图实现)的权限,我通常使用装饰器。

user_passes_test 装饰器非常适合这种目的。

您可以创建与模型无关的用户权限。


谢谢。这是个好建议。但我不仅需要权限,我还需要一些设置,它们不能完全基于用户,而必须基于组/账户。比如,这个账户或组是否开启了某个功能。我应该为此创建虚拟模型,然后使用权限进行处理吗?还是有相应的应用程序可以实现这个功能? - Odif Yltsaeb
我会建议你像Josh建议的那样自己去做。 - Carles Barrobés

0

感谢您提醒我。我可以看出这个东西填补了与 https://github.com/washingtontimes/django-objectpermissions- 相同的位置。就像我说的那样 - 我需要更多的设置应用程序,而不是权限。权限部分已经涵盖了 :)。 - Odif Yltsaeb

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接