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',
],
install_requires=[
'django-model-utils==2.6',
'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):
"""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:

View File

@ -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',),
),
]

View File

@ -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,

View File

@ -8,7 +8,7 @@ from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('personalisation', '0003_abstractrulebase_segment'),
('personalisation', '0003_abstractbaserule_segment'),
]
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 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