7

changed inheritance to polymorphic

This commit is contained in:
Boris Besemer
2016-11-09 11:17:28 +01:00
parent 075ea804fa
commit a4bd0ece20
5 changed files with 56 additions and 26 deletions

View File

@ -28,7 +28,7 @@ setup(
'Topic :: Internet :: WWW/HTTP :: Site Management',
],
install_requires=[
'django-model-utils==2.6',
'django-polymorphic==1.0.2',
'wagtail>=1.7',
]
)

View File

@ -8,14 +8,17 @@ class SegmentMiddleware(object):
self.get_response = get_response
def __call__(self, request):
segments = Segment.objects.all().filter(status="enabled")
if 'segments' not in request.session:
request.session['segments'] = []
chosen_segments = []
for segment in segments:
rules = AbstractBaseRule.objects.filter(segment=segment).select_subclasses()
rules = AbstractBaseRule.objects.filter(segment=segment)
result = self.test_rules(rules, request)
print(result)
if result:
self.add_segment_to_user(segment, request)
@ -25,10 +28,10 @@ class SegmentMiddleware(object):
request.session['segments'] = []
print(request.session['segments'])
return response
def test_rules(self, rules, request):
if len(rules) > 0:
for rule in rules:
result = rule.test_user(request)
@ -36,11 +39,9 @@ class SegmentMiddleware(object):
return False
return True
return False
def add_segment_to_user(self, segment, request):
if 'segments' not in request.session:
request.session['segments'] = []
if segment not in request.session['segments']:
request.session['segments'].append(segment.encoded_name())

View File

@ -0,0 +1,22 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.10.3 on 2016-11-08 13:00
from __future__ import unicode_literals
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('contenttypes', '0002_remove_content_type_name'),
('personalisation', '0005_referralrule'),
]
operations = [
migrations.AddField(
model_name='abstractbaserule',
name='polymorphic_ctype',
field=models.ForeignKey(editable=False, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='polymorphic_personalisation.abstractbaserule_set+', to='contenttypes.ContentType'),
),
]

View File

@ -2,11 +2,11 @@ from __future__ import absolute_import, unicode_literals
import re
from datetime import datetime
from polymorphic.models import PolymorphicModel
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
@ -35,13 +35,12 @@ class Segment(ClusterableModel):
return "".join(self.name.lower().split())
"""
Base for creating rules to segment users with
"""
@python_2_unicode_compatible
class AbstractBaseRule(models.Model):
class AbstractBaseRule(PolymorphicModel):
"""Base for creating rules to segment users with"""
name = models.CharField(max_length=255)
segment = models.ForeignKey(to=Segment, related_name="segment")
objects = InheritanceManager()
def test_user(self, request=None):
return True
@ -50,11 +49,10 @@ class AbstractBaseRule(models.Model):
return "Segmentation rule"
"""
Time rule to segment users based on a start and end time
"""
@python_2_unicode_compatible
class TimeRule(AbstractBaseRule):
"""Time rule to segment users based on a start and end time"""
start_time = models.TimeField(_("Starting time"))
end_time = models.TimeField(_("Ending time"))
@ -76,10 +74,9 @@ class TimeRule(AbstractBaseRule):
return '{} - {}'.format(self.start_time, self.end_time)
"""
Referral rule to segment users based on a regex test
"""
class ReferralRule(AbstractBaseRule):
"""Referral rule to segment users based on a regex test"""
regex_string = models.TextField()
def __init__(self, *args, **kwargs):

View File

@ -0,0 +1,10 @@
{% extends "wagtailadmin/base.html" %}
{% load i18n staticfiles %}
{% block titletag %}{% trans "Segments" %}{% endblock %}
{% block content %}
<h1>Our segment page</h1>
{% endblock %}