diff --git a/setup.py b/setup.py index 2e4b730..de3bfdc 100644 --- a/setup.py +++ b/setup.py @@ -12,7 +12,7 @@ tests_require = [ 'pytest-django==3.0.0', 'pytest-sugar==0.7.1', 'freezegun==0.3.8', - 'factory_boy==2.7.0', + 'factory_boy==2.8.1', ] setup( diff --git a/src/personalisation/migrations/0007_dayrule.py b/src/personalisation/migrations/0007_dayrule.py new file mode 100644 index 0000000..b020b08 --- /dev/null +++ b/src/personalisation/migrations/0007_dayrule.py @@ -0,0 +1,34 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.10.5 on 2017-01-10 14:35 +from __future__ import unicode_literals + +from django.db import migrations, models +import django.db.models.deletion +import modelcluster.fields + + +class Migration(migrations.Migration): + + dependencies = [ + ('personalisation', '0006_segment_match_any'), + ] + + operations = [ + migrations.CreateModel( + name='DayRule', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('mon', models.BooleanField(default=False, verbose_name='Monday')), + ('tue', models.BooleanField(default=False, verbose_name='Tuesday')), + ('wed', models.BooleanField(default=False, verbose_name='Wednesday')), + ('thu', models.BooleanField(default=False, verbose_name='Thursday')), + ('fri', models.BooleanField(default=False, verbose_name='Friday')), + ('sat', models.BooleanField(default=False, verbose_name='Saturday')), + ('sun', models.BooleanField(default=False, verbose_name='Sunday')), + ('segment', modelcluster.fields.ParentalKey(on_delete=django.db.models.deletion.CASCADE, related_name='personalisation_dayrule_related', related_query_name='personalisation_dayrules', to='personalisation.Segment')), + ], + options={ + 'abstract': False, + }, + ), + ] diff --git a/src/personalisation/models.py b/src/personalisation/models.py index 66a01ed..dc0665a 100644 --- a/src/personalisation/models.py +++ b/src/personalisation/models.py @@ -67,6 +67,54 @@ class TimeRule(AbstractBaseRule): return _('Time Rule') +@python_2_unicode_compatible +class DayRule(AbstractBaseRule): + """Day rule to segment users based on day(s) of visit""" + mon = models.BooleanField(_("Monday"), default=False) + tue = models.BooleanField(_("Tuesday"), default=False) + wed = models.BooleanField(_("Wednesday"), default=False) + thu = models.BooleanField(_("Thursday"), default=False) + fri = models.BooleanField(_("Friday"), default=False) + sat = models.BooleanField(_("Saturday"), default=False) + sun = models.BooleanField(_("Sunday"), default=False) + + panels = [ + FieldPanel('mon'), + FieldPanel('tue'), + FieldPanel('wed'), + FieldPanel('thu'), + FieldPanel('fri'), + FieldPanel('sat'), + FieldPanel('sun'), + ] + + def __init__(self, *args, **kwargs): + super(DayRule, self).__init__(*args, **kwargs) + + def test_user(self, request=None): + current_day = datetime.today().weekday() + + if current_day == 0: + return self.mon + elif current_day == 1: + return self.tue + elif current_day == 2: + return self.wed + elif current_day == 3: + return self.thu + elif current_day == 4: + return self.fri + elif current_day == 5: + return self.sat + elif current_day == 6: + return self.sun + else: + return False + + def __str__(self): + return _('Day Rule') + + @python_2_unicode_compatible class ReferralRule(AbstractBaseRule): """Referral rule to segment users based on a regex test""" diff --git a/tests/factories/segment.py b/tests/factories/segment.py index ec77d45..dddb3d1 100644 --- a/tests/factories/segment.py +++ b/tests/factories/segment.py @@ -16,18 +16,26 @@ class SegmentFactory(factory.DjangoModelFactory): class TimeRuleFactory(factory.DjangoModelFactory): - start_time = datetime.time(8,0,0) - end_time = datetime.time(23,0,0) + start_time = datetime.time(8, 0, 0) + end_time = datetime.time(23, 0, 0) class Meta: model = models.TimeRule + +class DayRuleFactory(factory.DjangoModelFactory): + + class Meta: + model = models.DayRule + + class ReferralRuleFactory(factory.DjangoModelFactory): regex_string = "test.test" class Meta: model = models.ReferralRule + class VisitCountRuleFactory(factory.DjangoModelFactory): operator = "more_than" count = 0 diff --git a/tests/unit/test_factories.py b/tests/unit/test_factories.py index 53af49a..7193461 100644 --- a/tests/unit/test_factories.py +++ b/tests/unit/test_factories.py @@ -6,7 +6,7 @@ import pytest from personalisation.models import Segment, TimeRule from tests.factories.segment import ( - ReferralRuleFactory, SegmentFactory, TimeRuleFactory) + ReferralRuleFactory, SegmentFactory, TimeRuleFactory, DayRuleFactory) """Factory tests""" @pytest.mark.django_db @@ -18,6 +18,7 @@ def test_create_segment_factory(): assert factoried_segment.name == segment.name assert factoried_segment.status == segment.status + """TimeRuleFactory tests""" @pytest.mark.django_db def test_create_segment_with_time_rule(): @@ -26,6 +27,18 @@ def test_create_segment_with_time_rule(): assert time_rule.start_time == datetime.time(8,0,0) + +"""TimeRuleFactory tests""" +@pytest.mark.django_db +def test_create_segment_with_day_rule(): + segment = SegmentFactory(name='DaySegment') + day_rule = DayRuleFactory(mon=True, thu=True, segment=segment) + + assert day_rule.mon is True + assert day_rule.thu is True + assert day_rule.sun is False + + """ReferralRuleFactory tests""" @pytest.mark.django_db def test_create_segment_with_referral_rule(): @@ -34,6 +47,7 @@ def test_create_segment_with_referral_rule(): assert referral_rule.regex_string == 'test.test' + @pytest.mark.django_db def test_create_segment_with_new_referral_rule(): segment = SegmentFactory() diff --git a/tests/unit/test_middleware.py b/tests/unit/test_middleware.py index 515bc66..8ef13e6 100644 --- a/tests/unit/test_middleware.py +++ b/tests/unit/test_middleware.py @@ -9,7 +9,7 @@ from wagtail.wagtailcore.models import Page from tests.factories.segment import ( QueryRuleFactory, ReferralRuleFactory, SegmentFactory, TimeRuleFactory, - VisitCountRuleFactory) + DayRuleFactory, VisitCountRuleFactory) from tests.factories.site import SiteFactory @@ -39,6 +39,19 @@ class TestUserSegmenting(object): assert client.session['segments'][0]['encoded_name'] == 'time-only' + + @freeze_time("2017-01-01") + def test_day_segment(self, client): + day_only_segment = SegmentFactory(name='Day only') + day_rule = DayRuleFactory( + sun=True, + segment=day_only_segment) + + request = client.get('/') + + assert client.session['segments'][0]['encoded_name'] == 'day-only' + + def test_referral_segment(self, client): referral_segment = SegmentFactory(name='Referral') referral_rule = ReferralRuleFactory(