django simpleui 的菜单权限设置,实现无权限不显示菜单

simpleUI框架的菜单在不修改源码的情况下是无法做到根据权限隐藏和显示菜单的,如果有根据权限隐藏和显示对应菜单的需求,下面是修改步骤:

1、进入simpleUI源码中的simpletags.py目录为:

D:\XXX\venv\Lib\site-packages\simpleui\templatetags\simpletags.py(XXX为你的项目根目录)

2、去掉系统原有的菜单模块:

 3、读取SIMPLEUI_CONFIG设置合并菜单处理:

 key = 'system_keep'
    if config and 'menus' in config:
        total = config.get('menus')
        group_permissions = len(context.request.user.get_group_permissions())
        user_permissions = len(context.request.user.get_user_permissions())

        if (group_permissions > user_permissions):
            user_permissions = context.request.user.get_group_permissions().union(
                context.request.user.get_user_permissions())
        else:
            user_permissions = context.request.user.get_group_permissions().union(
                context.request.user.get_user_permissions())


        for level_one_menu in total:
            # 与一级菜单codename比对权限
            if 'codename' not in level_one_menu or (
                    True in [(True if level_one_menu['codename'] in u_p else False) for u_p in
                             user_permissions]) == False:
                if context.request.user.is_superuser == False:
                    continue
            # 处理面包屑
            if 'models' in level_one_menu:
                del_models = list()
                for level_two_menu in level_one_menu.get('models'):
                    if context.request.user.is_superuser:
                        pass
                    elif 'codename' not in level_two_menu.keys():
                        del_models.append(level_two_menu)
                        continue
                    elif ('codename' not in level_one_menu or 'codename' not in level_two_menu
                          or (level_one_menu['codename'] + '.' + level_two_menu[
                                'codename'] not in user_permissions)) and \
                            (level_one_menu['codename'] + '.view_' + level_two_menu['codename'] not in user_permissions) \
                            and (
                            level_one_menu['codename'] + '.add_' + level_two_menu['codename'] not in user_permissions) \
                            and (level_one_menu['codename'] + '.change_' + level_two_menu[
                        'codename'] not in user_permissions) \
                            and (level_one_menu['codename'] + '.delete_' + level_two_menu[
                        'codename'] not in user_permissions) \
                            and level_two_menu['codename'] not in user_permissions:
                        del_models.append(level_two_menu)
                        continue
                    level_two_menu['breadcrumbs'] = [{
                        'name': level_one_menu.get('name'),
                        'icon': level_one_menu.get('icon')
                    }, {
                        'name': level_two_menu.get('name'),
                        'icon': level_two_menu.get('icon')
                    }]
                for del_m in del_models:
                    level_one_menu['models'].remove(del_m)
            else:
                level_one_menu['breadcrumbs'] = [{
                    'name': level_one_menu.get('name'),
                    'icon': level_one_menu.get('icon')
                }]
            if len(level_one_menu['models']) > 0:
                data.append(level_one_menu)
    else:
        data = config.get('menus')

    # 获取侧边栏排序, 如果设置了就按照设置的内容排序, 留空则表示默认排序以及全部显示
    if config.get('menu_display') is not None:
        display_data = list()
        for _app in data:
            if _app['name'] not in config.get('menu_display'):
                continue
            # 处理二级菜单显示权限
            if _app.get('menu_display') is not None:
                display_model = list()
                for _app_m in _app['models']:
                    if _app_m['name'] not in _app.get('menu_display'):
                        continue
                # 没有排序逻辑,这里的_weight暂时无效
                _app['_weight'] = config.get('menu_display').index(_app['name'])
                display_data.append(_app)
            else:
                display_model = _app['models']
            _app['models'] = display_model
            _app['_weight'] = config.get('menu_display').index(_app['name'])
            display_data.append(_app)

        display_data.sort(key=lambda x: x['_weight'])
        data = display_data

4、修改settings.py中的menus配置:

SIMPLEUI_CONFIG = {
    'system_keep':False,
    'dynamic':True,  # 重要,动态更新页面,不然给用户增加权限后界面可能不改变
    'menus': [
        {
        'name': '定时任务',
        'codename': 'django_celery_beat',
        'models': [{
            'name': 'periodictask',
            'url': '/admin/django_celery_beat/periodictask/',
        },{
            'name': 'crontabschedule',
            'url': '/admin/django_celery_beat/crontabschedule/',
        },{
            'name': 'intervalschedule',
            'url': '/admin/django_celery_beat/intervalschedule/',
        },
        {
        'name': '爬虫管理',
        'codename':'spiders_process',
        'models': [{
            'codename':'add_demandsubmit',
            'name': '需求提交',
            'url': '/admin/spiders_process/demandsubmit/',
        },{
            'codename':'add_errorfeedback',
            'name': '异常反馈',
            'url': '/admin/spiders_process/errorfeedback/',
        },{
            'codename':'view_users',
            'name': '用户管理',
            'url': '/admin/spiders_process/users/',
        }
           ]
        },
        {
            'codename':'auth',
            'name': '认证和授权',
            'models': [{
                'name': '组',
                'url': '/admin/auth/group/'}, ]
        },
        {
            'name': '数据下载',
            'codename': 'spiders_process',
            'models': [{
                'codename': 'data_download',
                'name': '数据下载',
                'url': '/data_download/'}, ]
        },
        {
            'name': '任务监控',
            'codename': 'spiders_process',
            'models': [{
                'name': '任务监控',
                'url': '/flower/'}, ]
        },
    ]
} 

 作者:修行的修行
链接:https://www.jianshu.com/p/0d1175a43186
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 7
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值