Move visit count logic to the segment adapter
This makes the code also a bit simpler and updates the tests
This commit is contained in:
committed by
Michael van Tellingen
parent
7034c09d4a
commit
7436384471
@ -124,6 +124,23 @@ class SessionSegmentsAdapter(BaseSegmentsAdapter):
|
|||||||
segdict = create_segment_dictionary(segment)
|
segdict = create_segment_dictionary(segment)
|
||||||
self.request.session['segments'].append(segdict)
|
self.request.session['segments'].append(segdict)
|
||||||
|
|
||||||
|
def add_page_visit(self, page):
|
||||||
|
"""Mar kthe page as visited by the user"""
|
||||||
|
visit_count = self.request.session.setdefault('visit_count', [])
|
||||||
|
page_visits = [visit for visit in visit_count if visit['id'] == page.pk]
|
||||||
|
|
||||||
|
if page_visits:
|
||||||
|
for page_visit in page_visits:
|
||||||
|
page_visit['count'] += 1
|
||||||
|
self.request.session.modified = True
|
||||||
|
else:
|
||||||
|
visit_count.append({
|
||||||
|
'slug': page.slug,
|
||||||
|
'id': page.pk,
|
||||||
|
'path': self.request.path,
|
||||||
|
'count': 1,
|
||||||
|
})
|
||||||
|
|
||||||
def update_visit_count(self):
|
def update_visit_count(self):
|
||||||
"""Update the visit count for all segments in the request session."""
|
"""Update the visit count for all segments in the request session."""
|
||||||
segments = self.request.session['segments']
|
segments = self.request.session['segments']
|
||||||
|
@ -40,41 +40,8 @@ def set_visit_count(page, request, serve_args, serve_kwargs):
|
|||||||
:type request: django.http.HttpRequest
|
:type request: django.http.HttpRequest
|
||||||
|
|
||||||
"""
|
"""
|
||||||
# Create a new dict in the session if it's empty.
|
adapter = get_segment_adapter(request)
|
||||||
if 'visit_count' not in request.session:
|
adapter.add_page_visit(page)
|
||||||
request.session['visit_count'] = []
|
|
||||||
|
|
||||||
def create_new_counter(page, request):
|
|
||||||
"""Create a new counter dict and place it in session storage.
|
|
||||||
|
|
||||||
:param page: The page being served
|
|
||||||
:type page: wagtail.wagtailcore.models.Page
|
|
||||||
:param request: The http request
|
|
||||||
:type request: django.http.HttpRequest
|
|
||||||
|
|
||||||
"""
|
|
||||||
countdict = {
|
|
||||||
"slug": page.slug,
|
|
||||||
"id": page.pk,
|
|
||||||
"path": request.path,
|
|
||||||
"count": 1,
|
|
||||||
}
|
|
||||||
request.session['visit_count'].append(countdict)
|
|
||||||
|
|
||||||
if len(request.session['visit_count']) > 0:
|
|
||||||
for index, counter in enumerate(request.session['visit_count']):
|
|
||||||
if counter['id'] == page.pk:
|
|
||||||
# Counter already exists. Increase the count value by 1.
|
|
||||||
newcount = counter['count'] + 1
|
|
||||||
request.session['visit_count'][index]['count'] = newcount
|
|
||||||
request.session.modified = True
|
|
||||||
else:
|
|
||||||
# Counter doesn't exist.
|
|
||||||
# Create a new counter with count value 1.
|
|
||||||
create_new_counter(page, request)
|
|
||||||
else:
|
|
||||||
# No counters exist. Create a new counter with count value 1.
|
|
||||||
create_new_counter(page, request)
|
|
||||||
|
|
||||||
|
|
||||||
@hooks.register('before_serve_page')
|
@hooks.register('before_serve_page')
|
||||||
|
@ -2,6 +2,8 @@ from __future__ import absolute_import, unicode_literals
|
|||||||
|
|
||||||
import pytest
|
import pytest
|
||||||
from wagtail.wagtailcore.models import Page, Site
|
from wagtail.wagtailcore.models import Page, Site
|
||||||
|
from wagtail_factories import SiteFactory
|
||||||
|
from tests.factories.page import PageFactory
|
||||||
|
|
||||||
|
|
||||||
@pytest.fixture(scope='session')
|
@pytest.fixture(scope='session')
|
||||||
@ -10,3 +12,10 @@ def django_db_setup(django_db_setup, django_db_blocker):
|
|||||||
# Remove some initial data that is brought by the sandbox module
|
# Remove some initial data that is brought by the sandbox module
|
||||||
Site.objects.all().delete()
|
Site.objects.all().delete()
|
||||||
Page.objects.all().exclude(depth=1).delete()
|
Page.objects.all().exclude(depth=1).delete()
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.fixture(scope='function')
|
||||||
|
def site():
|
||||||
|
site = SiteFactory(is_default_site=True)
|
||||||
|
PageFactory(parent=site.root_page, slug='page-1')
|
||||||
|
PageFactory(parent=site.root_page, slug='page-2')
|
||||||
|
@ -6,6 +6,7 @@ import pytest
|
|||||||
from freezegun import freeze_time
|
from freezegun import freeze_time
|
||||||
from wagtail_factories import SiteFactory
|
from wagtail_factories import SiteFactory
|
||||||
|
|
||||||
|
from tests.factories.page import PageFactory
|
||||||
from tests.factories.rule import (
|
from tests.factories.rule import (
|
||||||
DayRuleFactory, DeviceRuleFactory, QueryRuleFactory, ReferralRuleFactory,
|
DayRuleFactory, DeviceRuleFactory, QueryRuleFactory, ReferralRuleFactory,
|
||||||
TimeRuleFactory, VisitCountRuleFactory)
|
TimeRuleFactory, VisitCountRuleFactory)
|
||||||
@ -257,19 +258,21 @@ class TestUserSegmenting(object):
|
|||||||
|
|
||||||
|
|
||||||
@pytest.mark.django_db
|
@pytest.mark.django_db
|
||||||
class TestUserVisitCount(object):
|
def test_visit_count(site, client):
|
||||||
|
response = client.get('/')
|
||||||
|
assert response.status_code == 200
|
||||||
|
visit_count = client.session['visit_count']
|
||||||
|
assert visit_count[0]['path'] == '/'
|
||||||
|
assert visit_count[0]['count'] == 1
|
||||||
|
|
||||||
def setup(self):
|
response = client.get('/')
|
||||||
self.site = SiteFactory(is_default_site=True)
|
assert response.status_code == 200
|
||||||
|
visit_count = client.session['visit_count']
|
||||||
|
assert visit_count[0]['path'] == '/'
|
||||||
|
assert visit_count[0]['count'] == 2
|
||||||
|
|
||||||
# TODO: Set up a bunch of pages for testing the visit count
|
response = client.get('/page-1/')
|
||||||
|
assert response.status_code == 200
|
||||||
def test_visit_count(self, client):
|
visit_count = client.session['visit_count']
|
||||||
client.get('/')
|
assert visit_count[0]['count'] == 2
|
||||||
|
assert visit_count[1]['count'] == 1
|
||||||
assert any(item['path'] == '/' for item in client.session['visit_count'])
|
|
||||||
|
|
||||||
def test_no_visit_count(self, client):
|
|
||||||
client.get('/')
|
|
||||||
|
|
||||||
assert not any(item['path'] == '/doesntexist' for item in client.session['visit_count'])
|
|
||||||
|
Reference in New Issue
Block a user