Ejemplo n.º 1
0
    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)
Ejemplo n.º 2
0
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"])
Ejemplo n.º 3
0
    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)
Ejemplo n.º 4
0
    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')
Ejemplo n.º 5
0
    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')
Ejemplo n.º 6
0
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'])
Ejemplo n.º 7
0
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'])
Ejemplo n.º 8
0
    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")
Ejemplo n.º 9
0
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'])
Ejemplo n.º 10
0
    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
Ejemplo n.º 12
0
    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)
Ejemplo n.º 13
0
    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)
Ejemplo n.º 14
0
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