Return 404 if variant page is accessed directly (#188)
This commit is contained in:
@ -4,6 +4,7 @@ import logging
|
|||||||
|
|
||||||
from django.conf.urls import include, url
|
from django.conf.urls import include, url
|
||||||
from django.db import transaction
|
from django.db import transaction
|
||||||
|
from django.http import Http404
|
||||||
from django.shortcuts import redirect, render
|
from django.shortcuts import redirect, render
|
||||||
from django.template.defaultfilters import pluralize
|
from django.template.defaultfilters import pluralize
|
||||||
from django.urls import reverse
|
from django.urls import reverse
|
||||||
@ -104,9 +105,13 @@ def serve_variant(page, request, serve_args, serve_kwargs):
|
|||||||
adapter = get_segment_adapter(request)
|
adapter = get_segment_adapter(request)
|
||||||
user_segments = adapter.get_segments()
|
user_segments = adapter.get_segments()
|
||||||
|
|
||||||
if user_segments:
|
|
||||||
metadata = page.personalisation_metadata
|
metadata = page.personalisation_metadata
|
||||||
|
|
||||||
|
# If page is not canonical, don't serve it.
|
||||||
|
if not metadata.is_canonical:
|
||||||
|
raise Http404
|
||||||
|
|
||||||
|
if user_segments:
|
||||||
# TODO: This is never more then one page? (fix query count)
|
# TODO: This is never more then one page? (fix query count)
|
||||||
metadata = metadata.metadata_for_segments(user_segments)
|
metadata = metadata.metadata_for_segments(user_segments)
|
||||||
if metadata:
|
if metadata:
|
||||||
|
@ -1,4 +1,7 @@
|
|||||||
import pytest
|
import pytest
|
||||||
|
|
||||||
|
from django.http import Http404
|
||||||
|
|
||||||
from wagtail.core.models import Page
|
from wagtail.core.models import Page
|
||||||
|
|
||||||
from tests.factories.segment import SegmentFactory
|
from tests.factories.segment import SegmentFactory
|
||||||
@ -16,6 +19,15 @@ def test_serve_variant_no_variant(site, rf):
|
|||||||
assert result is None
|
assert result is None
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.mark.django_db
|
||||||
|
def test_variant_accessed_directly_returns_404(segmented_page, rf):
|
||||||
|
request = rf.get('/')
|
||||||
|
args = tuple()
|
||||||
|
kwargs = {}
|
||||||
|
with pytest.raises(Http404):
|
||||||
|
wagtail_hooks.serve_variant(segmented_page, request, args, kwargs)
|
||||||
|
|
||||||
|
|
||||||
@pytest.mark.django_db
|
@pytest.mark.django_db
|
||||||
def test_serve_variant_with_variant_no_segment(site, rf, segmented_page):
|
def test_serve_variant_with_variant_no_segment(site, rf, segmented_page):
|
||||||
request = rf.get('/')
|
request = rf.get('/')
|
||||||
|
Reference in New Issue
Block a user