From 35a8bd5c8e68d45fc4dc4362a464f6fd03038d5c Mon Sep 17 00:00:00 2001 From: Boris Besemer Date: Mon, 7 Nov 2016 17:11:15 +0100 Subject: [PATCH] adds automatic rule subclass checks in the middleware --- setup.py | 3 ++- src/personalisation/middleware.py | 4 ++-- ...merule.py => 0002_abstractbaserule_timerule.py} | 6 +++--- ...segment.py => 0003_abstractbaserule_segment.py} | 4 ++-- .../migrations/0004_segment_status.py | 2 +- src/personalisation/models.py | 14 +++++--------- 6 files changed, 15 insertions(+), 18 deletions(-) rename src/personalisation/migrations/{0002_abstractrulebase_timerule.py => 0002_abstractbaserule_timerule.py} (83%) rename src/personalisation/migrations/{0003_abstractrulebase_segment.py => 0003_abstractbaserule_segment.py} (83%) diff --git a/setup.py b/setup.py index d6144f3..5df0615 100644 --- a/setup.py +++ b/setup.py @@ -28,6 +28,7 @@ setup( 'Topic :: Internet :: WWW/HTTP :: Site Management', ], install_requires=[ + 'django-model-utils==2.6', 'wagtail>=1.7', ] -) \ No newline at end of file +) diff --git a/src/personalisation/middleware.py b/src/personalisation/middleware.py index 5709923..beb0290 100644 --- a/src/personalisation/middleware.py +++ b/src/personalisation/middleware.py @@ -1,4 +1,4 @@ -from personalisation.models import Segment, TimeRule +from personalisation.models import Segment, AbstractBaseRule, TimeRule class SegmentMiddleware(object): """Middleware for testing and putting a user in a segment""" @@ -13,7 +13,7 @@ class SegmentMiddleware(object): for segment in segments: result = False - rules = TimeRule.objects.all().filter(segment=segment) + rules = AbstractBaseRule.objects.filter(segment=segment).select_subclasses() for rule in rules: result = rule.test_user() if result: diff --git a/src/personalisation/migrations/0002_abstractrulebase_timerule.py b/src/personalisation/migrations/0002_abstractbaserule_timerule.py similarity index 83% rename from src/personalisation/migrations/0002_abstractrulebase_timerule.py rename to src/personalisation/migrations/0002_abstractbaserule_timerule.py index 93f34f5..2cae5d2 100644 --- a/src/personalisation/migrations/0002_abstractrulebase_timerule.py +++ b/src/personalisation/migrations/0002_abstractbaserule_timerule.py @@ -14,7 +14,7 @@ class Migration(migrations.Migration): operations = [ migrations.CreateModel( - name='AbstractRuleBase', + name='AbstractBaseRule', fields=[ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('name', models.CharField(max_length=255)), @@ -23,10 +23,10 @@ class Migration(migrations.Migration): migrations.CreateModel( name='TimeRule', fields=[ - ('abstractrulebase_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='personalisation.AbstractRuleBase')), + ('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')), ('start_time', models.TimeField(verbose_name='Starting time')), ('end_time', models.TimeField(verbose_name='Ending time')), ], - bases=('personalisation.abstractrulebase',), + bases=('personalisation.abstractbaserule',), ), ] diff --git a/src/personalisation/migrations/0003_abstractrulebase_segment.py b/src/personalisation/migrations/0003_abstractbaserule_segment.py similarity index 83% rename from src/personalisation/migrations/0003_abstractrulebase_segment.py rename to src/personalisation/migrations/0003_abstractbaserule_segment.py index c31b332..d2ac8b4 100644 --- a/src/personalisation/migrations/0003_abstractrulebase_segment.py +++ b/src/personalisation/migrations/0003_abstractbaserule_segment.py @@ -9,12 +9,12 @@ import django.db.models.deletion class Migration(migrations.Migration): dependencies = [ - ('personalisation', '0002_abstractrulebase_timerule'), + ('personalisation', '0002_abstractbaserule_timerule'), ] operations = [ migrations.AddField( - model_name='abstractrulebase', + model_name='abstractbaserule', name='segment', field=models.ForeignKey(default='', on_delete=django.db.models.deletion.CASCADE, related_name='segment', to='personalisation.Segment'), preserve_default=False, diff --git a/src/personalisation/migrations/0004_segment_status.py b/src/personalisation/migrations/0004_segment_status.py index 4f18027..76ad33b 100644 --- a/src/personalisation/migrations/0004_segment_status.py +++ b/src/personalisation/migrations/0004_segment_status.py @@ -8,7 +8,7 @@ from django.db import migrations, models class Migration(migrations.Migration): dependencies = [ - ('personalisation', '0003_abstractrulebase_segment'), + ('personalisation', '0003_abstractbaserule_segment'), ] operations = [ diff --git a/src/personalisation/models.py b/src/personalisation/models.py index e71f34a..2ac3b00 100644 --- a/src/personalisation/models.py +++ b/src/personalisation/models.py @@ -8,6 +8,7 @@ from django.utils.encoding import python_2_unicode_compatible from django.utils.translation import ugettext_lazy as _ from modelcluster.models import ClusterableModel +from model_utils.managers import InheritanceManager from wagtail.wagtailadmin.edit_handlers import FieldPanel @@ -40,9 +41,10 @@ class Segment(ClusterableModel): Base for creating rules to segment users with """ @python_2_unicode_compatible -class AbstractRuleBase(models.Model): +class AbstractBaseRule(models.Model): name = models.CharField(max_length=255) segment = models.ForeignKey(to=Segment, related_name="segment") + objects = InheritanceManager() def test_user(self, request=None): return True @@ -58,7 +60,7 @@ class AbstractRuleBase(models.Model): Time rule to segment users with """ @python_2_unicode_compatible -class TimeRule(AbstractRuleBase): +class TimeRule(AbstractBaseRule): start_time = models.TimeField(_("Starting time")) end_time = models.TimeField(_("Ending time")) @@ -70,10 +72,4 @@ class TimeRule(AbstractRuleBase): starting_time = self.start_time ending_time = self.end_time - if starting_time <= current_time <= ending_time: - return True - else: - return False - - - + return starting_time <= current_time <= ending_time