8

fixes a few issues

This commit is contained in:
Boris Besemer
2016-12-22 12:35:03 +01:00
parent 8d257867b8
commit 6b779f29b0
4 changed files with 18 additions and 24 deletions

View File

@@ -1,9 +1,14 @@
import time
from django.db.models import F
from personalisation.models import AbstractBaseRule, Segment
class BaseSegmentsAdapter(object):
def setup(self):
return None
def _test_rules(self, rules, request):
if len(rules) > 0:
for rule in rules:
@@ -23,20 +28,18 @@ class SessionSegmentsAdapter(BaseSegmentsAdapter):
def setup(self, request):
self.request = request
# Set up segments dictionary object in the session
if 'segments' not in self.request.session:
self.request.session['segments'] = []
self.request.session.setdefault('segments', [])
def get(self):
def get_all_segments(self):
return self.request.session['segments']
def get_segment(self, segment_id):
return next(item for item in self.request.session['segments'] if item.id == segment_id)
def add(self, segment):
def check_if_segmented(item):
"""Check if the user has been segmented"""
for seg in self.request.session['segments']:
if seg['encoded_name'] == item.encoded_name():
return True
return False
return any(seg['encoded_name'] == item.encoded_name for seg in self.request.session['segments'])
if not check_if_segmented(segment):
segdict = {
@@ -56,15 +59,13 @@ class SessionSegmentsAdapter(BaseSegmentsAdapter):
self.request.session['segments'] = current_segments
segments = Segment.objects.all().filter(status='enabled')
segments = Segment.objects.filter(status='enabled').prefetch_related('rules')
for segment in segments:
rules = AbstractBaseRule.__subclasses__()
segment_rules = []
for rule in rules:
queried_rules = rule.objects.filter(segment=segment)
for result in queried_rules:
segment_rules.append(result)
segment_rules += rule.objects.filter(segment=segment)
result = self._test_rules(segment_rules, self.request)
if result:
@@ -73,11 +74,11 @@ class SessionSegmentsAdapter(BaseSegmentsAdapter):
for seg in self.request.session['segments']:
segment = Segment.objects.get(pk=seg['id'])
segment.visit_count = segment.visit_count + 1
segment.visit_count = F('visit_count') + 1
segment.save()
def check_segment_exists(self, segment):
segments = self.request.session['segments']
return any(item for item in self.request.session['segments'] if segment.pk == item.id)
return any(item for item in segments if segment.pk == item.id)

View File

@@ -1,7 +1,6 @@
from django.conf import settings
from personalisation.utils import import_class
from django.utils.module_loading import import_string
segments_adapter = import_class(getattr(settings, 'PERSONALISATION_SEGMENTS_ADAPTER', 'personalisation.adapters.SessionSegmentsAdapter'))()
segments_adapter = import_string(getattr(settings, 'PERSONALISATION_SEGMENTS_ADAPTER', 'personalisation.adapters.SessionSegmentsAdapter'))()

View File

@@ -1,11 +1,5 @@
import importlib
def impersonate_other_page(page, other_page):
page.path = other_page.path
page.depth = other_page.depth
page.url_path = other_page.url_path
page.title = other_page.title
def import_class(name):
module_name, class_name = name.rsplit('.', 1)
return getattr(importlib.import_module(module_name), class_name)

View File

@@ -88,7 +88,7 @@ def segment_user(page, request, serve_args, serve_kwargs):
def serve_variation(page, request, serve_args, serve_kwargs):
user_segments = []
for segment in segments_adapter.get():
for segment in segments_adapter.get_all_segments():
try:
user_segment = Segment.objects.get(pk=segment['id'],
status='enabled')