Skip to content

Commit 4f9176d

Browse files
committed
Move visit count logic to the segment adapter
This makes the code also a bit simpler and updates the tests
1 parent b8908e2 commit 4f9176d

4 files changed

Lines changed: 45 additions & 51 deletions

File tree

src/wagtail_personalisation/adapters.py

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -168,3 +168,19 @@ def refresh(self):
168168
self.request.session['segments'] = new_segments
169169

170170
self.update_visit_count()
171+
172+
def add_page_visit(self, page):
173+
visit_count = self.request.session.setdefault('visit_count', [])
174+
page_visits = [visit for visit in visit_count if visit['id'] == page.pk]
175+
176+
if page_visits:
177+
for page_visit in page_visits:
178+
page_visit['count'] += 1
179+
self.request.session.modified = True
180+
else:
181+
visit_count.append({
182+
'slug': page.slug,
183+
'id': page.pk,
184+
'path': self.request.path,
185+
'count': 1,
186+
})

src/wagtail_personalisation/wagtail_hooks.py

Lines changed: 1 addition & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -39,41 +39,7 @@ def set_visit_count(page, request, serve_args, serve_kwargs):
3939
:type request: django.http.HttpRequest
4040
4141
"""
42-
# Create a new dict in the session if it's empty.
43-
if 'visit_count' not in request.session:
44-
request.session['visit_count'] = []
45-
46-
def create_new_counter(page, request):
47-
"""Create a new counter dict and place it in session storage.
48-
49-
:param page: The page being served
50-
:type page: wagtail.wagtailcore.models.Page
51-
:param request: The http request
52-
:type request: django.http.HttpRequest
53-
54-
"""
55-
countdict = {
56-
"slug": page.slug,
57-
"id": page.pk,
58-
"path": request.path,
59-
"count": 1,
60-
}
61-
request.session['visit_count'].append(countdict)
62-
63-
if len(request.session['visit_count']) > 0:
64-
for index, counter in enumerate(request.session['visit_count']):
65-
if counter['id'] == page.pk:
66-
# Counter already exists. Increase the count value by 1.
67-
newcount = counter['count'] + 1
68-
request.session['visit_count'][index]['count'] = newcount
69-
request.session.modified = True
70-
else:
71-
# Counter doesn't exist.
72-
# Create a new counter with count value 1.
73-
create_new_counter(page, request)
74-
else:
75-
# No counters exist. Create a new counter with count value 1.
76-
create_new_counter(page, request)
42+
request.segment_adapter.add_page_visit(page)
7743

7844

7945
@hooks.register('before_serve_page')

tests/conftest.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22

33
import pytest
44
from wagtail.wagtailcore.models import Page, Site
5+
from wagtail_factories import SiteFactory
6+
from tests.factories.page import PageFactory
57

68

79
@pytest.fixture(scope='session')
@@ -10,3 +12,10 @@ def django_db_setup(django_db_setup, django_db_blocker):
1012
# Remove some initial data that is brought by the sandbox module
1113
Site.objects.all().delete()
1214
Page.objects.all().exclude(depth=1).delete()
15+
16+
17+
@pytest.fixture(scope='function')
18+
def site():
19+
site = SiteFactory(is_default_site=True)
20+
PageFactory(parent=site.root_page, slug='page-1')
21+
PageFactory(parent=site.root_page, slug='page-2')

tests/unit/test_middleware.py

Lines changed: 19 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
from freezegun import freeze_time
77
from wagtail_factories import SiteFactory
88

9+
from tests.factories.page import PageFactory
910
from tests.factories.rule import (
1011
DayRuleFactory, DeviceRuleFactory, QueryRuleFactory, ReferralRuleFactory,
1112
TimeRuleFactory, VisitCountRuleFactory)
@@ -257,19 +258,21 @@ def test_match_any_segmenting(self, client):
257258

258259

259260
@pytest.mark.django_db
260-
class TestUserVisitCount(object):
261-
262-
def setup(self):
263-
self.site = SiteFactory(is_default_site=True)
264-
265-
# TODO: Set up a bunch of pages for testing the visit count
266-
267-
def test_visit_count(self, client):
268-
client.get('/')
269-
270-
assert any(item['path'] == '/' for item in client.session['visit_count'])
271-
272-
def test_no_visit_count(self, client):
273-
client.get('/')
274-
275-
assert not any(item['path'] == '/doesntexist' for item in client.session['visit_count'])
261+
def test_visit_count(site, client):
262+
response = client.get('/')
263+
assert response.status_code == 200
264+
visit_count = client.session['visit_count']
265+
assert visit_count[0]['path'] == '/'
266+
assert visit_count[0]['count'] == 1
267+
268+
response = client.get('/')
269+
assert response.status_code == 200
270+
visit_count = client.session['visit_count']
271+
assert visit_count[0]['path'] == '/'
272+
assert visit_count[0]['count'] == 2
273+
274+
response = client.get('/page-1/')
275+
assert response.status_code == 200
276+
visit_count = client.session['visit_count']
277+
assert visit_count[0]['count'] == 2
278+
assert visit_count[1]['count'] == 1

0 commit comments

Comments
 (0)