同一模型的分层权限

时间:2014-03-21 10:59:52

标签: python django permissions

抱歉,我找不到合适的标题,如果你理解了问题,请编辑标题。

我想达到4级层次结构(django Group):Country-Manager,State-Manager,City-Manager和Field-staff。

一个用户一次只能属于一个组,任何用户都可以添加潜在客户。

我有一个名为Lead的模型,我想实现以下层次结构:

" User of higher level (say State-Manager) can view leads added by him and and all entries added by users of lower level (say City-Manager and Field Staff) but can not view entries added by other users of same level or higher lever (say Country-Manager)"

要跟踪谁添加了条目,我将用户和组对象保存为Lead模型中的外键。

请建议任何策略或代码段。

-

p.s:我在Django 1.5上

1 个答案:

答案 0 :(得分:0)

我在mixins的帮助下解决了这个问题。 (http://eflorenzano.com/blog/2008/05/17/exploring-mixins-django-model-inheritance/

我创建了一个Hierarchy类:

class Hierarchy(models.Model):
    parent = models.ForeignKey('self',null=True,blank=True)

    def get_children(self):
        return self._default_manager.filter(parent=self)

    def get_descendants(self):
        descs = set(self.get_children())
        for node in list(descs):
            descs.update(node.get_descendants())
        return descs

    class Meta:
        abstract = True

并在名为GroupHirerarchy的类中继承它:

class GroupHierarchy(Hierarchy):
    group = models.ForeignKey(Group)

    def __unicode__(self):
        return self.group.name

现在我可以让一群人的孩子使用 group_object.get_children() 和所有后代: group_object.get_descendants()

现在使用这个我获得了对模型的分级许可:

glist = []
groups = request.user.groups.all() 
for group in groups:
        try:
            group_hierarchy = GroupHierarchy.objects.get(group = group)
            group_descendants = group_hierarchy.get_descendants()
            for group_descendant in group_descendants:
                glist.append(Group.objects.get(name=group_descendant.group))
        except:
            pass
    obj =  Model.objects.filter(user_group__in = glist)