def _what(self, instance, level, depth): if level <= 1: if depth == 1: return Page.objects.toplevel_navigation() else: return Page.objects.in_navigation().filter(level__lt=depth) # mptt starts counting at 0, NavigationNode at 1; if we need the submenu # of the current page, we have to add 2 to the mptt level if instance.level + 2 == level: pass elif instance.level + 2 < level: try: queryset = instance.get_descendants().filter( level=level - 2, in_navigation=True) instance = PageManager.apply_active_filters(queryset)[0] except IndexError: return [] else: instance = instance.get_ancestors()[level - 2] # special case for the navigation extension if getattr(instance, 'navigation_extension', None): return instance.extended_navigation( depth=depth, request=self.render_context.get('request', None)) else: if depth == 1: return instance.children.in_navigation() else: queryset = instance.get_descendants().filter( level__lte=instance.level + depth, in_navigation=True) return PageManager.apply_active_filters(queryset)
def register(cls, admin_cls): cls.add_to_class("site", models.ForeignKey(Site, verbose_name=_("Site"), default=settings.SITE_ID)) PageManager.add_to_active_filters(current_site, key="current_site") admin_cls.list_display.extend(["site"]) admin_cls.list_filter.extend(["site"])
def _what(self, instance, level, depth): if level <= 1: if depth == 1: return Page.objects.toplevel_navigation() else: return Page.objects.in_navigation().filter(level__lt=depth) # mptt starts counting at 0, NavigationNode at 1; if we need the submenu # of the current page, we have to add 2 to the mptt level if instance.level + 2 == level: pass elif instance.level + 2 < level: try: queryset = instance.get_descendants().filter(level=level - 2, in_navigation=True) instance = PageManager.apply_active_filters(queryset)[0] except IndexError: return [] else: instance = instance.get_ancestors()[level - 2] # special case for the navigation extension if getattr(instance, "navigation_extension", None): return instance.extended_navigation(depth=depth, request=self.render_context.get("request", None)) else: if depth == 1: return instance.children.in_navigation() else: queryset = instance.get_descendants().filter(level__lte=instance.level + depth, in_navigation=True) return PageManager.apply_active_filters(queryset)
def handle_model(self): self.model.add_to_class( 'site', models.ForeignKey( Site, verbose_name=_('Site'), default=settings.SITE_ID)) PageManager.add_to_active_filters(current_site, key='current_site')
def handle_model(self): self.model.add_to_class( 'site', models.ForeignKey(Site, verbose_name=_('Site'), default=settings.SITE_ID)) PageManager.add_to_active_filters(current_site, key='current_site')
def register(cls, admin_cls): cls.add_to_class('site', models.ForeignKey(Site, verbose_name=_('Site'), default=settings.SITE_ID, )) PageManager.add_to_active_filters(current_site) admin_cls.list_display.extend(['site'])
def register(cls, admin_cls): cls.add_to_class('site', models.ForeignKey(Site, verbose_name=_('Site'), default=settings.SITE_ID, )) PageManager.add_to_active_filters(current_site, key='current_site') admin_cls.list_display.extend(['site']) admin_cls.list_filter.extend(['site'])
def handle_model(self): self.model.add_to_class( "site", models.ForeignKey( Site, verbose_name=_("Site"), default=settings.SITE_ID, on_delete=models.CASCADE, ), ) PageManager.add_to_active_filters(current_site, key="current_site")
def register(cls, admin_cls): "Add a foreign key on Site to the Page model" cls.add_to_class('site', SiteForeignKey(Site, verbose_name=_('Site'), default=settings.SITE_ID, )) PageManager.add_to_active_filters(current_site, key='current_site') # Show the site on the admin list admin_cls.list_display.extend(['site'])
def entries(self, instance, level=1, depth=1, show_all_subnav=False): if level <= 1: if depth == 1: return Page.objects.toplevel_navigation() elif show_all_subnav: return Page.objects.in_navigation().filter(level__lt=depth) else: queryset = Page.objects.toplevel_navigation() if instance.level > 1: # Get the ancestors (and their direct children) between # this level and top of tree. queryset = queryset | self.ancestor_siblings(instance) queryset = ( queryset | instance.get_siblings(include_self=True).filter(in_navigation=True, level__lt=depth) | instance.children.filter(in_navigation=True, level__lt=depth) ) return PageManager.apply_active_filters(queryset) # mptt starts counting at 0, NavigationNode at 1; if we need the submenu # of the current page, we have to add 2 to the mptt level toplevel = instance if toplevel.level + 2 == level: pass elif instance.level + 2 < level: try: queryset = instance.get_descendants().filter(level=level - 2, in_navigation=True) toplevel = PageManager.apply_active_filters(queryset)[0] except IndexError: return [] else: toplevel = instance.get_ancestors()[level - 2] if depth == 1: return toplevel.children.in_navigation() elif show_all_subnav: queryset = toplevel.get_descendants().filter(level__lte=toplevel.level + depth, in_navigation=True) return PageManager.apply_active_filters(queryset) else: queryset = ( instance.children.in_navigation() | self.ancestor_siblings(instance, level=level) | instance.get_siblings(include_self=True).filter( in_navigation=True, level__gte=level - 1, level__lte=instance.level + depth ) ) if toplevel != instance: queryset = queryset | toplevel.children.in_navigation() return PageManager.apply_active_filters(queryset)
def get_navigation(start_page=None, level=0, depth=1, active_depth=0, language=None, navigation_type=None, extended=False, request=None): if not start_page: root = Page.objects else: if (start_page.level < level - 1): return [] if start_page.is_root_node() or (start_page.level == level - 1): root_page = start_page else: root_page = start_page.get_ancestors().get(level=max(level - 1, 0)) root = Page.objects.filter(lft__gte=root_page.lft, rght__lte=root_page.rght, tree_id=root_page.tree_id) from_level = level to_level = level + depth queryset = root.filter(level__gte=from_level, level__lt=to_level, in_navigation=True) if language: queryset = queryset.filter(language=language) if navigation_type: queryset = queryset.filter(navigation_type=navigation_type) queryset = PageManager.apply_active_filters(queryset) entries = list(queryset) if start_page and active_depth and (start_page.level >= level): if start_page.level == level: active_node = start_page else: try: active_node = start_page.get_ancestors().get( in_navigation=True, level=level) except type(start_page).DoesNotExist: # active_node is not in navigation active_node = None # handle case when start_page is not in navigation if active_node in entries: index = entries.index(active_node) + 1 entries[index:index] = active_node.children.filter( in_navigation=True).filter(level__lte=level + active_depth) if extended: _entries = list(entries) entries = [] # add extended navigation from root_page if getattr(root_page, 'navigation_extension', None): extended_entries = [p for p in root_page.extended_navigation( level=root_page.level + 1, tree_id=root_page.tree_id, lft=0, rght=0, request=request) if p.level <= root_page.level + depth] entries.extend(extended_entries) # and from all entries for entry in _entries: entries.append(entry) if getattr(entry, 'navigation_extension', None): extended_entries = [p for p in entry.extended_navigation( level=entry.level + 1, tree_id=root_page.tree_id, lft=0, rght=0, request=request) if p.level <= root_page.level + depth] entries.extend(extended_entries) return entries
def entries(self, instance, level=1, depth=1, show_all_subnav=False): if level <= 1: if depth == 1: return Page.objects.toplevel_navigation() elif show_all_subnav: return Page.objects.in_navigation().filter(level__lt=depth) else: queryset = Page.objects.toplevel_navigation() if instance.level > 1: # Get the ancestors (and their direct children) between # this level and top of tree. queryset = queryset | self.ancestor_siblings(instance) queryset = queryset | \ instance.get_siblings(include_self=True).filter(in_navigation=True, level__lt=depth) | \ instance.children.filter(in_navigation=True, level__lt=depth) return PageManager.apply_active_filters(queryset) # mptt starts counting at 0, NavigationNode at 1; if we need the submenu # of the current page, we have to add 2 to the mptt level toplevel = instance if toplevel.level + 2 == level: pass elif instance.level + 2 < level: try: queryset = instance.get_descendants().filter( level=level - 2, in_navigation=True) toplevel = PageManager.apply_active_filters(queryset)[0] except IndexError: return [] else: toplevel = instance.get_ancestors()[level - 2] if depth == 1: return toplevel.children.in_navigation() elif show_all_subnav: queryset = toplevel.get_descendants().filter( level__lte=toplevel.level + depth, in_navigation=True) return PageManager.apply_active_filters(queryset) else: queryset = instance.children.in_navigation() | \ self.ancestor_siblings(instance, level=level) | \ instance.get_siblings(include_self=True).filter(in_navigation=True, level__gte=level - 1, level__lte=instance.level + depth) if toplevel != instance: queryset = queryset | toplevel.children.in_navigation() return PageManager.apply_active_filters(queryset)
def what(self, instance, args): level = int(args.get('level', 1)) depth = int(args.get('depth', 1)) if isinstance(instance, HttpRequest): instance = Page.objects.from_request(instance) if level <= 1: if depth == 1: return Page.objects.toplevel_navigation() else: return Page.objects.in_navigation().filter(level__lt=depth) # mptt starts counting at 0, NavigationNode at 1; if we need the submenu # of the current page, we have to add 2 to the mptt level if instance.level + 2 == level: pass elif instance.level + 2 < level: try: queryset = instance.get_descendants().filter(level=level - 2, in_navigation=True) instance = PageManager.apply_active_filters(queryset)[0] except IndexError: return [] else: instance = instance.get_ancestors()[level - 2] # special case for the navigation extension if getattr(instance, 'navigation_extension', None): # XXX what should be done with the depth parameter here? return instance.extended_navigation() else: if depth == 1: return instance.children.in_navigation() else: queryset = instance.get_descendants().filter(level__lte=instance.level + depth, in_navigation=True) return PageManager.apply_active_filters(queryset)
def get_navigation(start_page=None, level=0, depth=1, active_depth=0, language=None, navigation_type=None, extended=False): if not start_page: root = Page.objects else: if (start_page.level < level - 1): return [] if start_page.is_root_node() or (start_page.level == level - 1): root_page = start_page else: root_page = start_page.get_ancestors().get(level=max(level - 1, 0)) root = Page.objects.filter(lft__gte=root_page.lft, rght__lte=root_page.rght, tree_id=root_page.tree_id) from_level = level to_level = level + depth queryset = root.filter(level__gte=from_level, level__lt=to_level, in_navigation=True) if language: queryset = queryset.filter(language=language) if navigation_type: queryset = queryset.filter(navigation_type=navigation_type) queryset = PageManager.apply_active_filters(queryset) entries = list(queryset) if start_page and active_depth and (start_page.level >= level): active_node = start_page if ( start_page.level == level) else start_page.get_ancestors().filter( in_navigation=True).get(level=level) # handle case when start_page is not in navigation if active_node in entries: index = entries.index(active_node) + 1 entries[index:index] = active_node.children.filter( in_navigation=True).filter(level__lte=level + active_depth) if extended: _entries = list(entries) entries = [] # add extended navigation from root_page if getattr(root_page, 'navigation_extension', None): extended_entries = [ p for p in root_page.extended_navigation( level=root_page.level + 1, tree_id=root_page.tree_id, lft=0, rght=0) if p.level <= root_page.level + depth ] entries.extend(extended_entries) # and from all entries for entry in _entries: entries.append(entry) if getattr(entry, 'navigation_extension', None): extended_entries = [ p for p in entry.extended_navigation( level=entry.level + 1, tree_id=root_page.tree_id, lft=0, rght=0) if p.level <= root_page.level + depth ] entries.extend(extended_entries) return entries