7

adds automatic rule subclass checks in the middleware

This commit is contained in:
Boris Besemer
2016-11-07 17:11:15 +01:00
parent 59aec0871e
commit 35a8bd5c8e
6 changed files with 15 additions and 18 deletions

View File

@ -28,6 +28,7 @@ setup(
'Topic :: Internet :: WWW/HTTP :: Site Management', 'Topic :: Internet :: WWW/HTTP :: Site Management',
], ],
install_requires=[ install_requires=[
'django-model-utils==2.6',
'wagtail>=1.7', 'wagtail>=1.7',
] ]
) )

View File

@ -1,4 +1,4 @@
from personalisation.models import Segment, TimeRule from personalisation.models import Segment, AbstractBaseRule, TimeRule
class SegmentMiddleware(object): class SegmentMiddleware(object):
"""Middleware for testing and putting a user in a segment""" """Middleware for testing and putting a user in a segment"""
@ -13,7 +13,7 @@ class SegmentMiddleware(object):
for segment in segments: for segment in segments:
result = False result = False
rules = TimeRule.objects.all().filter(segment=segment) rules = AbstractBaseRule.objects.filter(segment=segment).select_subclasses()
for rule in rules: for rule in rules:
result = rule.test_user() result = rule.test_user()
if result: if result:

View File

@ -14,7 +14,7 @@ class Migration(migrations.Migration):
operations = [ operations = [
migrations.CreateModel( migrations.CreateModel(
name='AbstractRuleBase', name='AbstractBaseRule',
fields=[ fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('name', models.CharField(max_length=255)), ('name', models.CharField(max_length=255)),
@ -23,10 +23,10 @@ class Migration(migrations.Migration):
migrations.CreateModel( migrations.CreateModel(
name='TimeRule', name='TimeRule',
fields=[ 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')), ('start_time', models.TimeField(verbose_name='Starting time')),
('end_time', models.TimeField(verbose_name='Ending time')), ('end_time', models.TimeField(verbose_name='Ending time')),
], ],
bases=('personalisation.abstractrulebase',), bases=('personalisation.abstractbaserule',),
), ),
] ]

View File

@ -9,12 +9,12 @@ import django.db.models.deletion
class Migration(migrations.Migration): class Migration(migrations.Migration):
dependencies = [ dependencies = [
('personalisation', '0002_abstractrulebase_timerule'), ('personalisation', '0002_abstractbaserule_timerule'),
] ]
operations = [ operations = [
migrations.AddField( migrations.AddField(
model_name='abstractrulebase', model_name='abstractbaserule',
name='segment', name='segment',
field=models.ForeignKey(default='', on_delete=django.db.models.deletion.CASCADE, related_name='segment', to='personalisation.Segment'), field=models.ForeignKey(default='', on_delete=django.db.models.deletion.CASCADE, related_name='segment', to='personalisation.Segment'),
preserve_default=False, preserve_default=False,

View File

@ -8,7 +8,7 @@ from django.db import migrations, models
class Migration(migrations.Migration): class Migration(migrations.Migration):
dependencies = [ dependencies = [
('personalisation', '0003_abstractrulebase_segment'), ('personalisation', '0003_abstractbaserule_segment'),
] ]
operations = [ operations = [

View File

@ -8,6 +8,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 model_utils.managers import InheritanceManager
from wagtail.wagtailadmin.edit_handlers import FieldPanel from wagtail.wagtailadmin.edit_handlers import FieldPanel
@ -40,9 +41,10 @@ class Segment(ClusterableModel):
Base for creating rules to segment users with Base for creating rules to segment users with
""" """
@python_2_unicode_compatible @python_2_unicode_compatible
class AbstractRuleBase(models.Model): class AbstractBaseRule(models.Model):
name = models.CharField(max_length=255) name = models.CharField(max_length=255)
segment = models.ForeignKey(to=Segment, related_name="segment") segment = models.ForeignKey(to=Segment, related_name="segment")
objects = InheritanceManager()
def test_user(self, request=None): def test_user(self, request=None):
return True return True
@ -58,7 +60,7 @@ class AbstractRuleBase(models.Model):
Time rule to segment users with Time rule to segment users with
""" """
@python_2_unicode_compatible @python_2_unicode_compatible
class TimeRule(AbstractRuleBase): class TimeRule(AbstractBaseRule):
start_time = models.TimeField(_("Starting time")) start_time = models.TimeField(_("Starting time"))
end_time = models.TimeField(_("Ending time")) end_time = models.TimeField(_("Ending time"))
@ -70,10 +72,4 @@ class TimeRule(AbstractRuleBase):
starting_time = self.start_time starting_time = self.start_time
ending_time = self.end_time ending_time = self.end_time
if starting_time <= current_time <= ending_time: return starting_time <= current_time <= ending_time
return True
else:
return False