data: get descendants of a page (#39091)

This commit is contained in:
Nicolas Roche 2020-01-23 15:30:57 +01:00
parent 3e5e80f6e6
commit bd558163a8
2 changed files with 34 additions and 0 deletions

View File

@ -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']

View File

@ -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]