成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Django-simpleui的菜單權限配置,實現(xiàn)無權限不顯示菜單

開發(fā)
當我們使用Django+simpleui這個框架的時候,如果想實現(xiàn)當某個用戶沒有某個菜單的權限時,他無法在界面上看到這個菜單,在不改變源碼的情況下是無法實現(xiàn)的。

聊聊需求

當我們使用Django+simpleui這個框架的時候,如果想實現(xiàn)當某個用戶沒有某個菜單的權限時,他無法在界面上看到這個菜單,在不改變源碼的情況下是無法實現(xiàn)的,換句話說就是無法直接實現(xiàn)根據(jù)權限顯示或隱藏菜單。

解決辦法-修改simpleui的源代碼

需求:Django-simpleui實現(xiàn)根據(jù)用戶權限顯示或者隱藏菜單

  • 修改模塊:simpletags.py
  • 路徑:...XXX\venv\Lib\site-packages\simpleui\templatetags\simpletags.py(根據(jù)你的項目確定路徑,一般為虛擬環(huán)境)

第一步:注釋原有的菜單模塊:

# app_list = context.get('app_list')
# for app in app_list:
#     _models = [
#         {
#             'name': m.get('name'),
#             'icon': get_icon(m.get('object_name'), unicode_to_str(m.get('name'))),
#             'url': m.get('admin_url'),
#             'addUrl': m.get('add_url'),
#             'breadcrumbs': [{
#                 'name': app.get('name'),
#                 'icon': get_icon(app.get('app_label'), app.get('name'))
#             }, {
#                 'name': m.get('name'),
#                 'icon': get_icon(m.get('object_name'), unicode_to_str(m.get('name')))
#             }]
#         }
#
#         for m in app.get('models')
#     ] if app.get('models') else []
#
#     module = {
#         'name': app.get('name'),
#         'icon': get_icon(app.get('app_label'), app.get('name')),
#         'models': _models
#     }
#     data.append(module)

第二步:讀取SIMPLEUI_CONFIG設置合并菜單處理:

...
 # 如果有menu 就讀取,沒有就調(diào)用系統(tǒng)的
    key = 'system_keep'
    # if config and 'menus' in config:
    #     if config.get(key, None):
    #         temp = config.get('menus')
    #         for i in temp:
    #             # 處理面包屑
    #             if 'models' in i:
    #                 for k in i.get('models'):
    #                     k['breadcrumbs'] = [{
    #                         'name': i.get('name'),
    #                         'icon': i.get('icon')
    #                     }, {
    #                         'name': k.get('name'),
    #                         'icon': k.get('icon')
    #                     }]
    #             else:
    #                 i['breadcrumbs'] = [{
    #                     'name': i.get('name'),
    #                     'icon': i.get('icon')
    #                 }]
    #             data.append(i)
    #     else:
    #         data = config.get('menus')

# 修改為
    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')
...
  # 獲取側邊欄排序, 如果設置了就按照設置的內(nèi)容排序, 留空則表示默認排序以及全部顯示
    # 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
    #         _app['_weight'] = config.get('menu_display').index(_app['name'])
    #         display_data.append(_app)
    #     display_data.sort(key=lambda x: x['_weight'])
    #     data = display_data
# 修改
    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
...

第三步:修改setting.py中的菜單配置。

注意:

  • 配置中一級菜單中的codename一般為app名字,二級菜單的codename一般為模型中的類名;
  • 只填寫一級菜單的codename或不填一級菜單和二級菜單的codename,表示該只允許superuser查看。
...
SIMPLEUI_CONFIG = {
    'system_keep': False,  # 關閉系統(tǒng)菜單
    'dynamic': True,  # 設置是否開啟動態(tài)菜單, 默認為False. 如果開啟, 則會在每次用戶登陸時動態(tài)展示菜單內(nèi)容
    'menus': [
        # 菜單1
        {
            'app': 'app_article_ad',
            'codename' : 'app_article_ad',
            'name': '公眾號文章',
            'icon': 'fas fa-user-shield',
            'models': [
                {
                    'name': '文章管理',
                    'codename':'job_article',
                    'icon': 'fa fa-user',
                    'url': 'app_article_ad/job_article/'
                },


            ]
        },

        # 菜單2
        {
            'app': 'app_files',
            'codename': 'app_files',
            'name': '資源管理',
            'icon': 'fas fa-user-shield',
            'models': [
                {
                    'name': '文件管理',
                    'codename': 'file',
                    'icon': 'fa fa-user',
                    'url': '/app_files/file_list'
                },
            ]
        },
...

修改

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

效果

管理員界面

普通用戶界面

責任編輯:趙寧寧 來源: IT仔的筆記本
相關推薦

2023-03-02 21:06:53

數(shù)據(jù)庫MySQL

2009-06-22 17:25:03

J2EE+Flex

2009-07-06 13:57:35

設計方案

2011-08-29 10:38:42

用LINQ去除重復菜單

2009-08-27 09:38:02

Windows 7開始菜單

2020-07-01 07:41:50

權限設計

2015-02-26 18:18:15

動畫菜單Animation c

2011-09-06 14:36:34

觸摸菜單ipad應用電子點菜

2009-07-15 13:31:51

Swing菜單和菜單項

2010-01-22 18:14:49

VB.NET菜單組件

2011-04-21 15:22:27

ArcGIS Engi

2021-07-21 05:31:39

Windows 11操作系統(tǒng)微軟

2022-05-18 07:44:13

自定義菜單前端

2009-12-24 10:04:31

WPF右鍵菜單

2023-05-09 07:38:57

jQueryAjax代碼

2009-09-24 08:31:22

Windows 7菜單欄管理

2014-12-31 13:24:19

drawer抽屜效果

2017-09-18 16:33:18

Windows 10Windows菜單

2015-07-20 15:14:19

側滑菜單功能多樣

2011-02-23 09:29:29

Konqueror
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 日本亚洲欧美 | 国产精品视频导航 | 精品国产一区二区三区免费 | 免费黄色av网站 | 国产一区二区在线免费视频 | 成人性生交大片免费看中文带字幕 | 精品国产一区二区三区av片 | 999国产精品视频 | 在线观看亚洲精品 | 综合九九 | 91视频免费黄 | 久久这里只有 | 精品欧美乱码久久久久久 | 久久精品国产v日韩v亚洲 | 免费99精品国产自在在线 | 中文字幕在线网 | 国产精品资源在线观看 | 色网在线观看 | 久久99久久99精品免视看婷婷 | 成人免费视频 | 国产99免费视频 | 亚洲av毛片成人精品 | 精品一二区| 中文字幕视频在线看 | 免费激情 | 午夜不卡福利视频 | 亚洲久视频 | 国产精品二区三区 | a级黄色毛片免费播放视频 国产精品视频在线观看 | 色综合国产 | 亚洲成人久久久 | 日韩欧美在线视频观看 | 特黄特黄a级毛片免费专区 av网站免费在线观看 | 免费黄网站在线观看 | 亚洲成人在线视频播放 | 国产午夜精品久久久久 | 国产精品久久av | 亚洲国产黄 | 国产九一精品 | 亚洲三区在线观看 | 久久久久久99 |