7
This repository has been archived on 2023-05-07. You can view files and clone it, but cannot push or open issues or pull requests.
Files
cavemanon-wagtail-personali…/src/personalisation/models.py
2016-11-08 11:18:41 +01:00

97 lines
2.5 KiB
Python

from __future__ import absolute_import, unicode_literals
import re
from datetime import datetime
from django.db import models
from django.utils.encoding import python_2_unicode_compatible
from django.utils.translation import ugettext_lazy as _
from model_utils.managers import InheritanceManager
from modelcluster.models import ClusterableModel
from wagtail.wagtailadmin.edit_handlers import FieldPanel
"""
Model for a new segment
"""
@python_2_unicode_compatible
class Segment(ClusterableModel):
name = models.CharField(max_length=255)
STATUS_CHOICES = (
('disabled', 'Disabled'),
('live', 'Live'),
('completed', 'Completed'),
)
status = models.CharField(max_length=20, choices=STATUS_CHOICES, default="disabled")
panels = [
FieldPanel('name'),
]
def __str__(self):
return self.name
def encoded_name(self):
return "".join(self.name.lower().split())
"""
Base for creating rules to segment users with
"""
@python_2_unicode_compatible
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
def return_segment_id(self):
return "".join(self.name.lower().split())
def __str__(self):
return self.name
"""
Time rule to segment users based on a start and end time
"""
@python_2_unicode_compatible
class TimeRule(AbstractBaseRule):
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):
current_time = self.get_current_time()
starting_time = self.start_time
ending_time = self.end_time
return starting_time <= current_time <= ending_time
def get_current_time(self):
"""Mockable function for testing purposes"""
return datetime.now().time()
"""
Referral rule to segment users based on a regex test
"""
class ReferralRule(AbstractBaseRule):
regex_string = models.TextField()
def __init__(self, *args, **kwargs):
super(ReferralRule, self).__init__(*args, **kwargs)
def test_user(self, request):
pattern = re.compile(self.regex_string)
if 'HTTP_REFERER' in request.META:
referer = request.META['HTTP_REFERER']
if pattern.search(referer):
return True
return False