From bd558163a85526f34f2a79ecd4d35b2669869ad6 Mon Sep 17 00:00:00 2001 From: Nicolas ROCHE Date: Thu, 23 Jan 2020 15:30:57 +0100 Subject: [PATCH] data: get descendants of a page (#39091) --- combo/data/models.py | 8 ++++++++ tests/test_pages.py | 26 ++++++++++++++++++++++++++ 2 files changed, 34 insertions(+) diff --git a/combo/data/models.py b/combo/data/models.py index cae39ae7..429b1cd9 100644 --- a/combo/data/models.py +++ b/combo/data/models.py @@ -237,6 +237,14 @@ class Page(models.Model): return bool(self._children) return Page.objects.filter(parent_id=self.id).exists() + def get_descendants_and_me(self): + def get_descendant_pages(page): + descendants = [page] + for item in page.get_children(): + descendants.extend(get_descendant_pages(item)) + return descendants + return Page.objects.filter(id__in=[x.id for x in get_descendant_pages(self)]) + def get_template_display_name(self): try: return settings.COMBO_PUBLIC_TEMPLATES[self.template_name]['name'] diff --git a/tests/test_pages.py b/tests/test_pages.py index 6c609f0c..7d57b562 100644 --- a/tests/test_pages.py +++ b/tests/test_pages.py @@ -415,3 +415,29 @@ def test_page_is_new(freezer): freezer.move_to('2020-01-08') page = Page.objects.get(slug='page-1') assert not page.is_new() + +def test_get_descendants_and_me(): + ''' 1 + | + 2 6 + / \ + 3 4 5 7 8 9 + ''' + def add_pages(depth=1, parent_id=None): + if depth > 3: + return + page = Page(title='%s' % add_pages.num, slug='page-%s' % add_pages.num) + page.parent_id = parent_id + page.save() + add_pages.num += 1 + for m in range(0, depth + 1): + add_pages(depth + 1, page.id) + add_pages.num = 1 + add_pages() + + page = Page.objects.get(slug='page-1') + assert len(page.get_descendants_and_me()) == 9 + page = Page.objects.get(slug='page-2') + assert [int(x.title) for x in page.get_descendants_and_me()] == [2, 3, 4, 5] + page = Page.objects.get(slug='page-3') + assert [int(x.title) for x in page.get_descendants_and_me()] == [3]