diff --git a/src/wagtail_personalisation/models.py b/src/wagtail_personalisation/models.py index 3df7731..f1e1a1a 100644 --- a/src/wagtail_personalisation/models.py +++ b/src/wagtail_personalisation/models.py @@ -169,6 +169,10 @@ class Segment(ClusterableModel): if self.is_static: request = RequestFactory().get('/') + + rules = self.get_rules() + all_static = all(rule.static for rule in rules) + for session in Session.objects.filter( expire_date__gt=timezone.now(), ).iterator(): @@ -176,7 +180,8 @@ class Segment(ClusterableModel): user = user_from_data(session_data.get('_auth_id')) request.user = user request.session = SessionStore(session_key=session.session_key) - if all(rule.test_user(request) for rule in self.get_rules() if rule.static): + all_pass = all(rule.test_user(request) for rule in rules if rule.static) + if rules and all_static and all_pass: self.sessions.add(session) diff --git a/tests/unit/test_static_dynamic_segments.py b/tests/unit/test_static_dynamic_segments.py index 7815d8e..b70b806 100644 --- a/tests/unit/test_static_dynamic_segments.py +++ b/tests/unit/test_static_dynamic_segments.py @@ -17,14 +17,34 @@ def test_session_added_to_static_segment_at_creation(rf, site, client): segment = SegmentFactory(type=Segment.TYPE_STATIC) VisitCountRule.objects.create(counted_page=site.root_page, segment=segment) + segment.save() assert session.session_key in segment.sessions.values_list('session_key', flat=True) +@pytest.mark.django_db +def test_mixed_static_dynamic_session_doesnt_generate_at_creation(rf, site, client): + session = client.session + session.save() + client.get(site.root_page.url) + + segment = SegmentFactory(type=Segment.TYPE_STATIC) + VisitCountRule.objects.create(counted_page=site.root_page, segment=segment) + TimeRule.objects.create( + start_time=datetime.time(0, 0, 0), + end_time=datetime.time(23, 59, 59), + segment=segment, + ) + segment.save() + + assert not segment.sessions.all() + + @pytest.mark.django_db def test_session_not_added_to_static_segment_after_creation(rf, site, client): segment = SegmentFactory(type=Segment.TYPE_STATIC) VisitCountRule.objects.create(counted_page=site.root_page, segment=segment) + segment.save() session = client.session session.save() @@ -37,6 +57,7 @@ def test_session_not_added_to_static_segment_after_creation(rf, site, client): def test_session_added_to_static_segment_after_creation(rf, site, client): segment = SegmentFactory(type=Segment.TYPE_STATIC, count=1) VisitCountRule.objects.create(counted_page=site.root_page, segment=segment) + segment.save() session = client.session session.save() @@ -49,6 +70,7 @@ def test_session_added_to_static_segment_after_creation(rf, site, client): def test_session_not_added_to_static_segment_after_full(rf, site, client): segment = SegmentFactory(type=Segment.TYPE_STATIC, count=1) VisitCountRule.objects.create(counted_page=site.root_page, segment=segment) + segment.save() session = client.session session.save() @@ -65,12 +87,18 @@ def test_session_not_added_to_static_segment_after_full(rf, site, client): @pytest.mark.django_db -def test_sessions_not_added_to_static_segment_if_rule_not_static(): +def test_sessions_not_added_to_static_segment_if_rule_not_static(client, site): + session = client.session + session.save() + client.get(site.root_page.url) + segment = SegmentFactory(type=Segment.TYPE_STATIC) TimeRule.objects.create( - start_time=datetime.time(8, 0, 0), - end_time=datetime.time(23, 0, 0), - segment=segment) + start_time=datetime.time(0, 0, 0), + end_time=datetime.time(23, 59, 59), + segment=segment, + ) + segment.save() assert not segment.sessions.all() @@ -83,6 +111,7 @@ def test_does_not_calculate_the_segment_again(rf, site, client, mocker): segment = SegmentFactory(type=Segment.TYPE_STATIC, count=2) VisitCountRule.objects.create(counted_page=site.root_page, segment=segment) + segment.save() mock_test_rule = mocker.patch('wagtail_personalisation.adapters.SessionSegmentsAdapter._test_rules') client.get(site.root_page.url)