from pathlib import Path import yaml from advcommon.security.aam_security import security from os import sep from collections import Mapping from copy import deepcopy from itertools import cycle from pprint import pprint __author__ = 'jknoll' def data_merge(a, b, name): key = None try: if (a is None or isinstance(a, str) or isinstance(a, unicode) or isinstance(a, int) or isinstance(a, long) or isinstance(a, float)): a = b elif isinstance(a, list): if isinstance(b, list): a.extend(b) else: a.append(b) elif isinstance(a, dict): if isinstance(b, dict): for key in b: if key in a: a[key] = data_merge(a[key], b[key], name) else: a[key] = b[key] else: raise TypeError('Cannot merge non-dict "%s" into dict "%s"' % (b, a)) else: raise TypeError('NOT IMPLEMENTED "%s" into "%s"' % (b, a)) except TypeError, e: raise TypeError('TypeError "%s" in key "%s" when merging "%s" into "%s"' % (e, key, b, a)) return a def make_lists(menu_dict): list_dict = [] if isinstance(menu_dict, Mapping) and 'text' not in menu_dict: list_tuple = [x[::-1] for x in zip(menu_dict.keys(), cycle(['text', ]))] list_dict = [{x[0]:x[1], 'children': make_lists(menu_dict[x[1]])} for x in list_tuple] elif isinstance(menu_dict, list): for x in menu_dict: list_dict.extend(make_lists(x)) elif isinstance(menu_dict, Mapping) and 'text' in menu_dict: list_dict.append(menu_dict) return list_dict def get_menu(user, initial_menu=None, config_path='./yaml'): main_menu = dict() if initial_menu is None else deepcopy(initial_menu) for file_path in Path(config_path).glob('**/*.yaml'): with open(str(file_path), 'r') as stream: config = yaml.load(stream) groups = security.get_member_of(user) if config['Security'] in groups and config['Security'] + ' deny' not in groups: data_merge(main_menu, config['Menu'], str(file_path).split(sep)[-1]) return make_lists(main_menu)
Run
Reset
Share
Import
Link
Embed
Language▼
English
中文
Python Fiddle
Python Cloud IDE
Follow @python_fiddle
Browser Version Not Supported
Due to Python Fiddle's reliance on advanced JavaScript techniques, older browsers might have problems running it correctly. Please download the latest version of your favourite browser.
Chrome 10+
Firefox 4+
Safari 5+
IE 10+
Let me try anyway!
url:
Go
Python Snippet
Stackoverflow Question