5

我有两个模型:

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'))        

例如,当我在执行 `get_objects_for_user(User, 'appname.view_contact) 但仍保留更改单个联系人权限的选项时,如何让 django 监护人考虑 ContactGroup 权限?(不排除,仅授予查看单个联系人的权限当用户没有整个组的权限时)

4

2 回答 2

1

非常丑陋的解决方法,它不考虑单个对象的帐户更改(ContactGroup如果 remove= False,它会将所有权限重置为权限)。但如果需要,它可以被重写以保留更改。我计划将它附加到“与组同步权限”按钮,这样它只会在用户请求时触发。主要优点是它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)
于 2014-05-20T12:05:30.060 回答
1

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

但是,您可以get_objects_for_user先执行 for ContactGroup,然后执行 forContact并使用第一个查询集的结果扩展最后一个查询集。就像是:

contact_groups = get_objects_for_user(user, 'appname.view_group_contacts', ContactGroup)
contacts = get_objects_for_user(user, 'appname.view_contact', Contact)

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

于 2014-05-19T13:53:47.427 回答