def slugify(value): """ Slugify a string (even if it contains non-ASCII chars) """ # Re-map some strings to avoid important characters being stripped. Eg # remap 'c++' to 'cpp' otherwise it will become 'c'. for k, v in settings.OSCAR_SLUG_MAP.items(): value = value.replace(k, v) # Allow an alternative slugify function to be specified # Recommended way to specify a function is as a string slugifier = getattr(settings, 'OSCAR_SLUG_FUNCTION', default_slugifier) if isinstance(slugifier, six.string_types): slugifier = import_string(slugifier) # Use unidecode to convert non-ASCII strings to ASCII equivalents where # possible. value = slugifier(unidecode(six.text_type(value))) # Remove stopwords for word in settings.OSCAR_SLUG_BLACKLIST: value = value.replace(word + '-', '') value = value.replace('-' + word, '') return value
def create_menu(menu_items, parent=None): """ Create the navigation nodes based on a passed list of dicts """ nodes = [] default_fn = import_string( settings.OSCAR_DASHBOARD_DEFAULT_ACCESS_FUNCTION) for menu_dict in menu_items: try: label = menu_dict['label'] except KeyError: raise ImproperlyConfigured( "No label specified for menu item in dashboard") children = menu_dict.get('children', []) if children: node = Node(label=label, icon=menu_dict.get('icon', None), access_fn=menu_dict.get('access_fn', default_fn)) create_menu(children, parent=node) else: node = Node(label=label, icon=menu_dict.get('icon', None), url_name=menu_dict.get('url_name', None), url_kwargs=menu_dict.get('url_kwargs', None), url_args=menu_dict.get('url_args', None), access_fn=menu_dict.get('access_fn', default_fn)) if parent is None: nodes.append(node) else: parent.add_child(node) return nodes