diff --git a/setup.py b/setup.py index 5df0615..b6d620f 100644 --- a/setup.py +++ b/setup.py @@ -28,7 +28,7 @@ setup( 'Topic :: Internet :: WWW/HTTP :: Site Management', ], install_requires=[ - 'django-model-utils==2.6', + 'django-polymorphic==1.0.2', 'wagtail>=1.7', ] ) diff --git a/src/personalisation/middleware.py b/src/personalisation/middleware.py index b9a68d4..9021ca0 100644 --- a/src/personalisation/middleware.py +++ b/src/personalisation/middleware.py @@ -8,14 +8,17 @@ class SegmentMiddleware(object): self.get_response = get_response def __call__(self, request): - segments = Segment.objects.all().filter(status="enabled") + if 'segments' not in request.session: + request.session['segments'] = [] chosen_segments = [] for segment in segments: - rules = AbstractBaseRule.objects.filter(segment=segment).select_subclasses() + rules = AbstractBaseRule.objects.filter(segment=segment) result = self.test_rules(rules, request) + print(result) + if result: self.add_segment_to_user(segment, request) @@ -25,22 +28,20 @@ class SegmentMiddleware(object): request.session['segments'] = [] print(request.session['segments']) - return response def test_rules(self, rules, request): - for rule in rules: - result = rule.test_user(request) + if len(rules) > 0: + for rule in rules: + result = rule.test_user(request) - if result is False: - return False + if result is False: + return False - return True + return True + return False def add_segment_to_user(self, segment, request): - if 'segments' not in request.session: - request.session['segments'] = [] - if segment not in request.session['segments']: request.session['segments'].append(segment.encoded_name()) diff --git a/src/personalisation/migrations/0006_abstractbaserule_polymorphic_ctype.py b/src/personalisation/migrations/0006_abstractbaserule_polymorphic_ctype.py new file mode 100644 index 0000000..3ed5f01 --- /dev/null +++ b/src/personalisation/migrations/0006_abstractbaserule_polymorphic_ctype.py @@ -0,0 +1,22 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.10.3 on 2016-11-08 13:00 +from __future__ import unicode_literals + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('contenttypes', '0002_remove_content_type_name'), + ('personalisation', '0005_referralrule'), + ] + + operations = [ + migrations.AddField( + model_name='abstractbaserule', + name='polymorphic_ctype', + field=models.ForeignKey(editable=False, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='polymorphic_personalisation.abstractbaserule_set+', to='contenttypes.ContentType'), + ), + ] diff --git a/src/personalisation/models.py b/src/personalisation/models.py index f54c71d..1c64c67 100644 --- a/src/personalisation/models.py +++ b/src/personalisation/models.py @@ -2,11 +2,11 @@ from __future__ import absolute_import, unicode_literals import re from datetime import datetime - +from polymorphic.models import PolymorphicModel from django.db import models from django.utils.encoding import python_2_unicode_compatible from django.utils.translation import ugettext_lazy as _ -from model_utils.managers import InheritanceManager + from modelcluster.models import ClusterableModel from wagtail.wagtailadmin.edit_handlers import FieldPanel @@ -35,13 +35,12 @@ class Segment(ClusterableModel): return "".join(self.name.lower().split()) -""" -Base for creating rules to segment users with -""" + @python_2_unicode_compatible -class AbstractBaseRule(models.Model): +class AbstractBaseRule(PolymorphicModel): + """Base for creating rules to segment users with""" + name = models.CharField(max_length=255) segment = models.ForeignKey(to=Segment, related_name="segment") - objects = InheritanceManager() def test_user(self, request=None): return True @@ -50,11 +49,10 @@ class AbstractBaseRule(models.Model): return "Segmentation rule" -""" -Time rule to segment users based on a start and end time -""" + @python_2_unicode_compatible class TimeRule(AbstractBaseRule): + """Time rule to segment users based on a start and end time""" start_time = models.TimeField(_("Starting time")) end_time = models.TimeField(_("Ending time")) @@ -76,10 +74,9 @@ class TimeRule(AbstractBaseRule): return '{} - {}'.format(self.start_time, self.end_time) -""" -Referral rule to segment users based on a regex test -""" + class ReferralRule(AbstractBaseRule): + """Referral rule to segment users based on a regex test""" regex_string = models.TextField() def __init__(self, *args, **kwargs): @@ -131,4 +128,4 @@ class VisitCountRule(AbstractBaseRule): def __str__(self): operator_display = self.get_operator_display() - return '{} {}'.format(operator_display, self.count) \ No newline at end of file + return '{} {}'.format(operator_display, self.count) diff --git a/src/personalisation/templates/wagtailadmin/segment.html b/src/personalisation/templates/wagtailadmin/segment.html new file mode 100644 index 0000000..d1082b2 --- /dev/null +++ b/src/personalisation/templates/wagtailadmin/segment.html @@ -0,0 +1,10 @@ +{% extends "wagtailadmin/base.html" %} +{% load i18n staticfiles %} +{% block titletag %}{% trans "Segments" %}{% endblock %} + + +{% block content %} +

Our segment page

+ +{% endblock %} +