diff --git a/combo/public/views.py b/combo/public/views.py index aeca4439..da387d81 100644 --- a/combo/public/views.py +++ b/combo/public/views.py @@ -436,18 +436,31 @@ def page(request): request.session['visited'] = True return HttpResponseRedirect(settings.COMBO_WELCOME_PAGE_PATH) - pages = {x.slug: x for x in Page.objects.filter(slug__in=parts)} + pages = {} + for page in Page.objects.filter(slug__in=parts): + if not page.slug in pages: + pages[page.slug] = [] + pages[page.slug].append(page) + if pages == {} and parts == ['index'] and Page.objects.count() == 0: return empty_site(request) i = 0 hierarchy_ids = [None] while i < len(parts): - try: - page = pages[parts[i]] - except KeyError: + slug_pages = pages.get(parts[i]) + if slug_pages is None or len(slug_pages) == 0: page = None break + elif len(slug_pages) == 1: + page = slug_pages[0] + else: + # multiple pages with same slugs + try: + page = [x for x in slug_pages if x.parent_id == hierarchy_ids[-1]][0] + except IndexError: + page = None + break if page.parent_id != hierarchy_ids[-1]: if i == 0: # root page should be at root but maybe the page is a child of diff --git a/tests/test_public.py b/tests/test_public.py index 25bbee32..86eb892e 100644 --- a/tests/test_public.py +++ b/tests/test_public.py @@ -404,6 +404,48 @@ def test_subpage_location(app): assert 'Grand child of second' in resp.text +def test_repeated_slug(app): + Page.objects.all().delete() + + page1 = Page(title='Home Page', slug='index', template_name='standard') + page1.save() + + page2 = Page(title='Second top level page', slug='second', template_name='standard') + page2.save() + + page3 = Page(title='Child of second', slug='child-second', + template_name='standard', parent=page2) + page3.save() + + page4 = Page(title='Grand child of second (named third)', slug='third', + template_name='standard', parent=page3) + page4.save() + + page5 = Page(title='Third top level page', slug='third', template_name='standard') + page5.save() + + for i, page in enumerate((page1, page2, page3, page4, page5)): + page.order = i + page.save() + + resp = app.get('/third/', status=200) + assert 'Third top level page' in resp.text + + resp = app.get('/second/child-second/third/', status=200) + assert 'Grand child of second (named third)' in resp.text + + # reverse page order, and expect same behaviour + for i, page in enumerate(reversed((page1, page2, page3, page4, page5))): + page.order = i + page.save() + + resp = app.get('/third/', status=200) + assert 'Third top level page' in resp.text + + resp = app.get('/second/child-second/third/', status=200) + assert 'Grand child of second (named third)' in resp.text + + def test_menu(app): Page.objects.all().delete() Page.objects.create(title='Page1', slug='index', template_name='standard', exclude_from_navigation=False)