Per page visit counting!
This commit is contained in:
@ -16,9 +16,11 @@ class SegmentMiddleware(object):
|
|||||||
if request.path.startswith('/admin/') or request.path.startswith('/django-admin/'):
|
if request.path.startswith('/admin/') or request.path.startswith('/django-admin/'):
|
||||||
return self.get_response(request)
|
return self.get_response(request)
|
||||||
|
|
||||||
|
if 'visit_count' not in request.session:
|
||||||
|
request.session['visit_count'] = []
|
||||||
|
|
||||||
if 'segments' not in request.session:
|
if 'segments' not in request.session:
|
||||||
request.session['segments'] = []
|
request.session['segments'] = []
|
||||||
request.session['visit_count'] = 1
|
|
||||||
|
|
||||||
segments = Segment.objects.all().filter(status='enabled')
|
segments = Segment.objects.all().filter(status='enabled')
|
||||||
|
|
||||||
@ -30,6 +32,7 @@ class SegmentMiddleware(object):
|
|||||||
self.add_segment_to_user(segment, request)
|
self.add_segment_to_user(segment, request)
|
||||||
|
|
||||||
response = self.get_response(request)
|
response = self.get_response(request)
|
||||||
|
|
||||||
logger.info("User has been added to the following segments: {}".format(request.session['segments']))
|
logger.info("User has been added to the following segments: {}".format(request.session['segments']))
|
||||||
return response
|
return response
|
||||||
|
|
||||||
@ -39,6 +42,19 @@ class SegmentMiddleware(object):
|
|||||||
for rule in rules:
|
for rule in rules:
|
||||||
result = rule.test_user(request)
|
result = rule.test_user(request)
|
||||||
|
|
||||||
|
# Debug
|
||||||
|
if result and rule.__class__.__name__ == "TimeRule":
|
||||||
|
print("User segmented. Time between {} and {}.".format(
|
||||||
|
rule.start_time,
|
||||||
|
rule.end_time))
|
||||||
|
if result and rule.__class__.__name__ == "ReferralRule":
|
||||||
|
print("User segmented. Referral matches {}.".format(rule.regex_string))
|
||||||
|
if result and rule.__class__.__name__ == "VisitCountRule":
|
||||||
|
print("User segmented. Visited {} {} {} times.".format(
|
||||||
|
rule.counted_page,
|
||||||
|
rule.operator,
|
||||||
|
rule.count))
|
||||||
|
|
||||||
if result is False:
|
if result is False:
|
||||||
return False
|
return False
|
||||||
|
|
||||||
@ -55,7 +71,6 @@ class SegmentMiddleware(object):
|
|||||||
return False
|
return False
|
||||||
|
|
||||||
if not check_if_segmented(segment):
|
if not check_if_segmented(segment):
|
||||||
# Clear segments session on browser close.
|
|
||||||
segdict = {
|
segdict = {
|
||||||
"encoded_name": segment.encoded_name(),
|
"encoded_name": segment.encoded_name(),
|
||||||
"id": segment.pk,
|
"id": segment.pk,
|
||||||
|
@ -0,0 +1,22 @@
|
|||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
# Generated by Django 1.10.3 on 2016-11-10 12:39
|
||||||
|
from __future__ import unicode_literals
|
||||||
|
|
||||||
|
from django.db import migrations, models
|
||||||
|
import django.db.models.deletion
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('wagtailcore', '0030_index_on_pagerevision_created_at'),
|
||||||
|
('personalisation', '0021_auto_20161110_1325'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.AddField(
|
||||||
|
model_name='visitcountrule',
|
||||||
|
name='counted_page',
|
||||||
|
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to='wagtailcore.Page'),
|
||||||
|
),
|
||||||
|
]
|
21
src/personalisation/migrations/0023_auto_20161110_1454.py
Normal file
21
src/personalisation/migrations/0023_auto_20161110_1454.py
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
# Generated by Django 1.10.3 on 2016-11-10 13:54
|
||||||
|
from __future__ import unicode_literals
|
||||||
|
|
||||||
|
from django.db import migrations, models
|
||||||
|
import django.db.models.deletion
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('personalisation', '0022_visitcountrule_counted_page'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.AlterField(
|
||||||
|
model_name='visitcountrule',
|
||||||
|
name='counted_page',
|
||||||
|
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='+', to='wagtailcore.Page'),
|
||||||
|
),
|
||||||
|
]
|
@ -11,7 +11,7 @@ from django.utils.encoding import python_2_unicode_compatible
|
|||||||
from django.utils.translation import ugettext_lazy as _
|
from django.utils.translation import ugettext_lazy as _
|
||||||
from modelcluster.models import ClusterableModel
|
from modelcluster.models import ClusterableModel
|
||||||
from modelcluster.fields import ParentalKey
|
from modelcluster.fields import ParentalKey
|
||||||
from wagtail.wagtailadmin.edit_handlers import FieldPanel, MultiFieldPanel
|
from wagtail.wagtailadmin.edit_handlers import FieldPanel, MultiFieldPanel, PageChooserPanel
|
||||||
|
|
||||||
from polymorphic.models import PolymorphicModel
|
from polymorphic.models import PolymorphicModel
|
||||||
|
|
||||||
@ -140,10 +140,18 @@ class VisitCountRule(AbstractBaseRule):
|
|||||||
)
|
)
|
||||||
operator = models.CharField(max_length=20, choices=OPERATOR_CHOICES, default="ht")
|
operator = models.CharField(max_length=20, choices=OPERATOR_CHOICES, default="ht")
|
||||||
count = models.PositiveSmallIntegerField(default=0, null=True)
|
count = models.PositiveSmallIntegerField(default=0, null=True)
|
||||||
|
counted_page = models.ForeignKey(
|
||||||
|
'wagtailcore.Page',
|
||||||
|
null=False,
|
||||||
|
blank=False,
|
||||||
|
on_delete=models.CASCADE,
|
||||||
|
related_name='+',
|
||||||
|
)
|
||||||
|
|
||||||
panels = [
|
panels = [
|
||||||
FieldPanel('operator'),
|
FieldPanel('operator'),
|
||||||
FieldPanel('count'),
|
FieldPanel('count'),
|
||||||
|
PageChooserPanel('counted_page'),
|
||||||
]
|
]
|
||||||
|
|
||||||
def __init__(self, *args, **kwargs):
|
def __init__(self, *args, **kwargs):
|
||||||
@ -152,15 +160,26 @@ class VisitCountRule(AbstractBaseRule):
|
|||||||
def test_user(self, request):
|
def test_user(self, request):
|
||||||
operator = self.operator
|
operator = self.operator
|
||||||
segment_count = self.count
|
segment_count = self.count
|
||||||
visit_count = request.session.get('visit_count')
|
|
||||||
|
|
||||||
if operator == "more_than":
|
# TODO: Figure out a way to have a correct count before the middleware
|
||||||
|
# initiates the test function
|
||||||
|
|
||||||
|
def get_visit_count(request):
|
||||||
|
"""Search through the sessions to get the page visit count
|
||||||
|
corresponding to the request."""
|
||||||
|
for page in request.session['visit_count']:
|
||||||
|
if page['path'] == request.path:
|
||||||
|
return page['count']
|
||||||
|
|
||||||
|
visit_count = get_visit_count(request)
|
||||||
|
|
||||||
|
if visit_count and operator == "more_than":
|
||||||
if visit_count > segment_count:
|
if visit_count > segment_count:
|
||||||
return True
|
return True
|
||||||
elif operator == "less_than":
|
elif visit_count and operator == "less_than":
|
||||||
if visit_count < segment_count:
|
if visit_count < segment_count:
|
||||||
return True
|
return True
|
||||||
elif operator == "equal_to":
|
elif visit_count and operator == "equal_to":
|
||||||
if visit_count == segment_count:
|
if visit_count == segment_count:
|
||||||
return True
|
return True
|
||||||
return False
|
return False
|
||||||
|
@ -1,3 +1,5 @@
|
|||||||
|
import time
|
||||||
|
|
||||||
from django.conf.urls import include, url
|
from django.conf.urls import include, url
|
||||||
from wagtail.contrib.modeladmin.options import ModelAdmin, modeladmin_register
|
from wagtail.contrib.modeladmin.options import ModelAdmin, modeladmin_register
|
||||||
from wagtail.contrib.modeladmin.views import IndexView
|
from wagtail.contrib.modeladmin.views import IndexView
|
||||||
@ -34,12 +36,33 @@ modeladmin_register(SegmentModelAdmin)
|
|||||||
@hooks.register('before_serve_page')
|
@hooks.register('before_serve_page')
|
||||||
def set_visit_count(page, request, serve_args, serve_kwargs):
|
def set_visit_count(page, request, serve_args, serve_kwargs):
|
||||||
"""Update the users visit count before each page visit."""
|
"""Update the users visit count before each page visit."""
|
||||||
|
# Update the segment visit count
|
||||||
for seg in request.session['segments']:
|
for seg in request.session['segments']:
|
||||||
segment = Segment.objects.get(pk=seg['id'])
|
segment = Segment.objects.get(pk=seg['id'])
|
||||||
segment.visit_count = segment.visit_count + 1
|
segment.visit_count = segment.visit_count + 1
|
||||||
segment.save()
|
segment.save()
|
||||||
|
|
||||||
if 'visit_count' not in request.session:
|
# Update the page visit count
|
||||||
request.session['visit_count'] = 1
|
def create_new_counter(page):
|
||||||
|
"""Create a new counter dict and place it in session storage."""
|
||||||
|
countdict = {
|
||||||
|
"slug": page.slug,
|
||||||
|
"id": page.pk,
|
||||||
|
"path": page.url,
|
||||||
|
"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 exisits. Increase the count value by 1.
|
||||||
|
newcount = counter['count'] + 1
|
||||||
|
request.session['visit_count'][index]['count'] = newcount
|
||||||
|
request.session.modified = True
|
||||||
else:
|
else:
|
||||||
request.session['visit_count'] = request.session.get('visit_count') + 1
|
# Counter doesn't exist. Create a new counter with count value 1.
|
||||||
|
create_new_counter(page)
|
||||||
|
else:
|
||||||
|
# No counters exist. Create a new counter with count value 1.
|
||||||
|
create_new_counter(page)
|
||||||
|
Reference in New Issue
Block a user