diff --git a/src/personalisation/migrations/0006_visitcountrule.py b/src/personalisation/migrations/0006_visitcountrule.py new file mode 100644 index 0000000..fa8e6a3 --- /dev/null +++ b/src/personalisation/migrations/0006_visitcountrule.py @@ -0,0 +1,23 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.10.3 on 2016-11-08 14:47 +from __future__ import unicode_literals + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('personalisation', '0005_referralrule'), + ] + + operations = [ + migrations.CreateModel( + name='VisitCountRule', + fields=[ + ('abstractbaserule_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='personalisation.AbstractBaseRule')), + ], + bases=('personalisation.abstractbaserule',), + ), + ] diff --git a/src/personalisation/migrations/0007_auto_20161108_1610.py b/src/personalisation/migrations/0007_auto_20161108_1610.py new file mode 100644 index 0000000..98ef35e --- /dev/null +++ b/src/personalisation/migrations/0007_auto_20161108_1610.py @@ -0,0 +1,25 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.10.3 on 2016-11-08 15:10 +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('personalisation', '0006_visitcountrule'), + ] + + operations = [ + migrations.AddField( + model_name='visitcountrule', + name='count', + field=models.PositiveSmallIntegerField(default=0), + ), + migrations.AddField( + model_name='visitcountrule', + name='operator', + field=models.CharField(choices=[('more_than', 'More than'), ('less_than', 'Less than'), ('equal_to', 'Equal to')], default='ht', max_length=20), + ), + ] diff --git a/src/personalisation/models.py b/src/personalisation/models.py index 316b7f2..a5e82e0 100644 --- a/src/personalisation/models.py +++ b/src/personalisation/models.py @@ -94,3 +94,34 @@ class ReferralRule(AbstractBaseRule): if pattern.search(referer): return True return False + +""" +Visit count rule to segment users based on amount of visits +""" +class VisitCountRule(AbstractBaseRule): + OPERATOR_CHOICES = ( + ('more_than', 'More than'), + ('less_than', 'Less than'), + ('equal_to', 'Equal to'), + ) + operator = models.CharField(max_length=20, choices=OPERATOR_CHOICES, default="ht") + count = models.PositiveSmallIntegerField(default=0) + + def __init__(self, *args, **kwargs): + super(VisitCountRule, self).__init__(*args, **kwargs) + + def test_user(self, request): + operator = self.operator + segment_count = self.count + visit_count = request.session.get('visit_count') + + if operator is "more_than": + if visit_count > segment_count: + return True + elif operator is "less_than": + if visit_count < segment_count: + return True + elif operator is "equal_to": + if visit_count is segment_count: + return True + return False \ No newline at end of file diff --git a/src/personalisation/wagtail_hooks.py b/src/personalisation/wagtail_hooks.py index 7c84d87..ceb064d 100644 --- a/src/personalisation/wagtail_hooks.py +++ b/src/personalisation/wagtail_hooks.py @@ -16,6 +16,9 @@ def register_admin_urls(): ] +""" +The base model for the Segments administration interface +""" class SegmentModelAdmin(ModelAdmin): model = Segment menu_icon = 'group' @@ -25,3 +28,14 @@ class SegmentModelAdmin(ModelAdmin): form_view_extra_css = ['personalisation/segment/form.css'] modeladmin_register(SegmentModelAdmin) + + +""" +Update the users visit count before each page visit +""" +@hooks.register('before_serve_page') +def set_visit_count(page, request, serve_args, serve_kwargs): + if request.session.get('visit_count'): + request.session['visit_count'] = request.session.get('visit_count') + 1 + else: + request.session['visit_count'] = 1 \ No newline at end of file