django-guardian如何使对象继承相关对象的权限?

时间:2014-05-19 09:40:38

标签: python django permissions django-guardian

我有两个型号:

class ContactGroup(models.Model):
    name = models.CharField(max_length=40)
    class Meta:
        permissions=(('view_group_contacts', 'View contacts from group'))


class Contact(models.Model):
    name = models.CharField(max_length=40)
    group = models.ForeignKey(ContactGroup)
    class Meta:
        permissions=(('view_contact', 'View contact'))        

我怎样才能让django监护人在我做“get_objects_for_user(用户,' appname.view_contact)”时考虑ContactGroup权限,但仍然保留更改个人联系人权限的选项?(不排除,只有在用户不具有整个群组的权限时才允许查看单个联系人

2 个答案:

答案 0 :(得分:1)

抱歉,django-guardian不支持此类行为。至于has_perm - 将它用于查询集是非常低效的,因为我们需要对表中的每一行执行> = 1查询。

然而,您可以先为get_objects_for_user执行ContactGroup,然后为Contact执行contact_groups = get_objects_for_user(user, 'appname.view_group_contacts', ContactGroup) contacts = get_objects_for_user(user, 'appname.view_contact', Contact) ,并使用第一个查询集的结果扩展最后一个查询集。类似的东西:

{{1}}

合并这些问题仍然存在问题,但这是可能的。

答案 1 :(得分:0)

非常难看的解决方法,它不需要对单个对象进行帐户更改(如果remove = False,它会重置ContactGroup权限的所有权限。但是如果需要,可以重写它以保留更改。我打算将它附加到“与组同步权限”按钮,因此只有在用户请求时才会触发它。主要职业是按照预期使用get_objects_for_user

def syncPerms(source, remove=False):
if not isinstance(source, ContactGroup):
    return False

contacts= source.client_set.all()
user_perms=get_users_with_perms(source, attach_perms=True)
for contact in contacts:
    for user, perm in user_perms.iteritems():
        if u'view_group_contacts' in perm:
            assign_perm('view_contact', user,client)
        else:
            if remove:
                remove_perm('view_contact', user, client)