simpleui权限交互二次开发

介绍

simpleui库是想做django开发但是前端不熟练同学的福音。
它是Django Admin的一个主题,基于element-ui+vue开发,重写和优化90%以上的页面。
Django Admin默认界面设计语言存在着的一些不足,比如色彩单一,大量线条的使用,分割化明显。将这些不足归类一下就是界面单调、雷同性明显、缺少惊喜。

安装

pip install django-simpleui

用pip或者源码方式安装simpleui后,在自己项目的settings.py文件中INSTALLED_APPS的第一行加入simpleui。

举个例子:

INSTALLED_APPS = [
      'simpleui',
      'django.contrib.admin',
      'django.contrib.auth',
      'django.contrib.contenttypes',
      'django.contrib.sessions',
      'django.contrib.messages',
      'django.contrib.staticfiles',
      ...
  ]

更多simpleui的settings配置请看https://simpleui.72wo.com/docs/simpleui/

常见问题

如果关闭debug模式后,请执行以下命令将simpleui静态文件静态文件克隆到根目录

python3 manage.py collectstatic

克隆静态文件出错 请在settings.py文件中加入

STATIC_ROOT = os.path.join(BASE_DIR, "static")

二次开发

1.二次开发的原因

settings.py的SIMPLEUI_CONFIG,虽然可以做到配置admin页面左边的模块展示和模块下拉项,但是无法和用户权限产生交互。用户无权限访问的模块,依旧会显示在页面左边,点击会返回403,十分的不美观。如图所示

image

2.如何对simpleui进行二次开发

删除已经pip成功的simple库

pip uninstall django-simpleui

克隆simpleui源码到项目下,和其它app同级别。
修改simpleui/templatetags/simpletags.py文件的menus方法调整models的显示权限控制

源代码逻辑:
1.app_list = context.get('app_list')取出系统允许显示的菜单进行处理
2.读取SIMPLEUI_CONFIG设置合并菜单处理
3.menu_display一级菜单的排序和过滤处理

修改步骤:

1. 干掉系统菜单显示权限逻辑
image
2. 读取SIMPLEUI_CONFIG设置合并菜单处理

对普通用户未拥有权限的展示模块进行去除 , 超级用户不检测权限直接不参与去除。

key = 'system_keep'
if config and 'menus' in config:
    total = config.get('menus')
    user_permissions = 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')
3. menu_display一级菜单的排序和过滤处理

获取侧边栏排序, 如果设置了就按照设置的内容排序, 留空则表示默认排序以及全部显示

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下simpleui_config写法

只填写一级菜单的codename或不填一级菜单和二级菜单的codename,表示该只允许superuser查看。
一级菜单的codename必须为app名,二级菜单的codename可通过get_user_permissions方法查看具体的权限名。

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/'}, ]
        },
    ]
} 
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,332评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,508评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,812评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,607评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,728评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,919评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,071评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,802评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,256评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,576评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,712评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,389评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,032评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,798评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,026评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,473评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,606评论 2 350

推荐阅读更多精彩内容