权限个人逐级关系解析

2018-03-20  本文已影响4人  两点半的杂货铺

一、思路

通过上一篇文章,我们知道了如何获取个人url和url对应的增删改查,

(一)、获取个人的url和对应的url所在的目录

 menu_leaf_list = list(
                models.Url2Action.objects.filter(url2action2role__r__in=role_list) \
                    .exclude(url__menu__isnull=True).
                    values('url__menu', 'url__caption', 'url_id','url__url').distinct()
            )

上面返回的样式是[{'url__menu':'对应菜单id','url__caption':'对应url的标题','url_id':'对应url的id','url__url':'对应url的地址'}]

(二)、重新编辑获取的目录格式

{'当前url标签id':[{.....},{.......}]}

 open_leaf_parent_id = None
        menu_leaf_dict = {}
        for item in self.menu_leaf_list:
            item = {
                'id': item['url_id'],
                'url': item['url__url'],
                'caption': item['url__caption'],
                'parent_id': item['url__menu'],
                'status': True,
                'child': [],
                # 判断菜单是否打开
                'opend': False
            }
            if item['parent_id'] in self.menu_leaf_list:
                menu_leaf_dict[item['parent_id']].append(item)
            else:
                menu_leaf_dict[item['parent_id']] = [item,]

            # 在数据库的url用正则表示,和用户的url做对比
            if re.match(item['url'],self.current_url):
                item['opend'] = True
                open_leaf_parent_id = item['parent_id']
        # {1: {'id': 1, 'caption': '菜单1', 'child': [], 'parent_id': None},}

(三)、获取数据库目录表

获取整个目录结构,通过查目录表
 menu_list = list(models.Menu.objects.values('id', 'caption', 'parent_id'))

(四)、把目录和个人权限统一格式

把目标也转换成个人权限的字典模式,所以要创建一个child,status,opend的k
# {1: {'id': 1, 'caption': '菜单1', 'child': [], 'parent_id': None},}
        # 创建一个字典在里面加一个child key
        menu_dict = {}
        for item in self.menu_list:
            item['child'] = []
            item['status'] = False
            item['opend'] = False
            menu_dict[item['id']] = item

(五)、整合我们把个人目录和整体目录做合并

        for k, v in menu_leaf_dict.items():
            menu_dict[k]['child'] = v

            # 循环每一层的parent_id
            parent_id = k
            while parent_id:
                menu_dict[parent_id]['status'] = True
                parent_id = menu_dict[parent_id]['parent_id']

        # 循环标记打开菜单
        while open_leaf_parent_id:
            menu_dict[open_leaf_parent_id]['opend'] = True
            open_leaf_parent_id = menu_dict[open_leaf_parent_id]['parent_id']

(六)、把所有的根菜单放到主菜单下

result = []
        for row in menu_dict.values():
            # 找到主菜单,主菜单自关联是None
            if not row['parent_id']:
                result.append(row)
            else:
                menu_dict[row['parent_id']]['child'].append(row)

        return result
上一篇 下一篇

猜你喜欢

热点阅读