adds automatic rule subclass checks in the middleware
This commit is contained in:
1
setup.py
1
setup.py
@ -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',
|
||||||
]
|
]
|
||||||
)
|
)
|
@ -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:
|
||||||
|
@ -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',),
|
||||||
),
|
),
|
||||||
]
|
]
|
@ -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,
|
@ -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 = [
|
||||||
|
@ -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
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user