diff --git a/src/personalisation/admin.py b/src/personalisation/admin.py new file mode 100644 index 0000000..c111dea --- /dev/null +++ b/src/personalisation/admin.py @@ -0,0 +1,17 @@ +from django.contrib import admin + +from personalisation import models + +class TimeRuleAdmin(admin.ModelAdmin): + list_display = ('name', 'start_time', 'end_time') + +class TimeRuleAdminInline(admin.TabularInline): + model = models.TimeRule + +class SegmentAdmin(admin.ModelAdmin): + list_display = ['name'] + inlines = (TimeRuleAdminInline,) + + +admin.site.register(models.TimeRule, TimeRuleAdmin) +admin.site.register(models.Segment, SegmentAdmin) diff --git a/src/personalisation/middleware.py b/src/personalisation/middleware.py index 0178f91..be2fb1b 100644 --- a/src/personalisation/middleware.py +++ b/src/personalisation/middleware.py @@ -1,3 +1,5 @@ +from personalisation.models import TimeRule + class SegmentMiddleware(object): """Middleware for testing and putting a user in a segment""" @@ -5,7 +7,14 @@ class SegmentMiddleware(object): self.get_response = get_response def __call__(self, request): - request.session['segmented'] = True + time_rules = TimeRule.objects.all() + + result = False + + for rule in time_rules: + result = rule.test_user() + + request.session['segmented'] = result response = self.get_response(request) print(request.session['segmented']) diff --git a/src/personalisation/migrations/0002_abstractrulebase_timerule.py b/src/personalisation/migrations/0002_abstractrulebase_timerule.py new file mode 100644 index 0000000..93f34f5 --- /dev/null +++ b/src/personalisation/migrations/0002_abstractrulebase_timerule.py @@ -0,0 +1,32 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.10.3 on 2016-11-07 13:53 +from __future__ import unicode_literals + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('personalisation', '0001_initial'), + ] + + operations = [ + migrations.CreateModel( + name='AbstractRuleBase', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('name', models.CharField(max_length=255)), + ], + ), + 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')), + ('start_time', models.TimeField(verbose_name='Starting time')), + ('end_time', models.TimeField(verbose_name='Ending time')), + ], + bases=('personalisation.abstractrulebase',), + ), + ] diff --git a/src/personalisation/migrations/0003_abstractrulebase_segment.py b/src/personalisation/migrations/0003_abstractrulebase_segment.py new file mode 100644 index 0000000..c31b332 --- /dev/null +++ b/src/personalisation/migrations/0003_abstractrulebase_segment.py @@ -0,0 +1,22 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.10.3 on 2016-11-07 14:12 +from __future__ import unicode_literals + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('personalisation', '0002_abstractrulebase_timerule'), + ] + + operations = [ + migrations.AddField( + model_name='abstractrulebase', + 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/models.py b/src/personalisation/models.py index 14399df..a575188 100644 --- a/src/personalisation/models.py +++ b/src/personalisation/models.py @@ -1,8 +1,11 @@ from __future__ import absolute_import, unicode_literals +from datetime import datetime, time + from django.conf import settings from django.db import models from django.utils.encoding import python_2_unicode_compatible +from django.utils.translation import ugettext_lazy as _ from modelcluster.models import ClusterableModel from wagtail.wagtailadmin.edit_handlers import FieldPanel @@ -20,4 +23,47 @@ class Segment(ClusterableModel): ] def __str__(self): - return self.name \ No newline at end of file + return self.name + + +""" +Base for creating rules to segment users with +""" +@python_2_unicode_compatible +class AbstractRuleBase(models.Model): + name = models.CharField(max_length=255) + segment = models.ForeignKey(to=Segment, related_name="segment") + + def test_user(self, request=None): + return True + + def return_segment_id(self): + return "".join(self.name.lower().split()) + + def __str__(self): + return self.name + + +""" +Time rule to segment users with +""" +@python_2_unicode_compatible +class TimeRule(AbstractRuleBase): + start_time = models.TimeField(_("Starting time")) + end_time = models.TimeField(_("Ending time")) + + def __init__(self, *args, **kwargs): + super(TimeRule, self).__init__(*args, **kwargs) + + def test_user(self, request=None): + current_time = datetime.now().time() + starting_time = self.start_time + ending_time = self.end_time + + if starting_time <= current_time <= ending_time: + return True + else: + return False + + +