97 lines
2.5 KiB
Python
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
|