fixes a few issues
This commit is contained in:
@@ -1,9 +1,14 @@
|
|||||||
import time
|
import time
|
||||||
|
|
||||||
|
from django.db.models import F
|
||||||
|
|
||||||
from personalisation.models import AbstractBaseRule, Segment
|
from personalisation.models import AbstractBaseRule, Segment
|
||||||
|
|
||||||
|
|
||||||
class BaseSegmentsAdapter(object):
|
class BaseSegmentsAdapter(object):
|
||||||
|
def setup(self):
|
||||||
|
return None
|
||||||
|
|
||||||
def _test_rules(self, rules, request):
|
def _test_rules(self, rules, request):
|
||||||
if len(rules) > 0:
|
if len(rules) > 0:
|
||||||
for rule in rules:
|
for rule in rules:
|
||||||
@@ -23,20 +28,18 @@ class SessionSegmentsAdapter(BaseSegmentsAdapter):
|
|||||||
def setup(self, request):
|
def setup(self, request):
|
||||||
self.request = request
|
self.request = request
|
||||||
|
|
||||||
# Set up segments dictionary object in the session
|
self.request.session.setdefault('segments', [])
|
||||||
if 'segments' not in self.request.session:
|
|
||||||
self.request.session['segments'] = []
|
|
||||||
|
|
||||||
def get(self):
|
def get_all_segments(self):
|
||||||
return self.request.session['segments']
|
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 add(self, segment):
|
||||||
def check_if_segmented(item):
|
def check_if_segmented(item):
|
||||||
"""Check if the user has been segmented"""
|
"""Check if the user has been segmented"""
|
||||||
for seg in self.request.session['segments']:
|
return any(seg['encoded_name'] == item.encoded_name for seg in self.request.session['segments'])
|
||||||
if seg['encoded_name'] == item.encoded_name():
|
|
||||||
return True
|
|
||||||
return False
|
|
||||||
|
|
||||||
if not check_if_segmented(segment):
|
if not check_if_segmented(segment):
|
||||||
segdict = {
|
segdict = {
|
||||||
@@ -56,15 +59,13 @@ class SessionSegmentsAdapter(BaseSegmentsAdapter):
|
|||||||
|
|
||||||
self.request.session['segments'] = current_segments
|
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:
|
for segment in segments:
|
||||||
rules = AbstractBaseRule.__subclasses__()
|
rules = AbstractBaseRule.__subclasses__()
|
||||||
segment_rules = []
|
segment_rules = []
|
||||||
for rule in rules:
|
for rule in rules:
|
||||||
queried_rules = rule.objects.filter(segment=segment)
|
segment_rules += rule.objects.filter(segment=segment)
|
||||||
for result in queried_rules:
|
|
||||||
segment_rules.append(result)
|
|
||||||
result = self._test_rules(segment_rules, self.request)
|
result = self._test_rules(segment_rules, self.request)
|
||||||
|
|
||||||
if result:
|
if result:
|
||||||
@@ -73,11 +74,11 @@ class SessionSegmentsAdapter(BaseSegmentsAdapter):
|
|||||||
|
|
||||||
for seg in self.request.session['segments']:
|
for seg in self.request.session['segments']:
|
||||||
segment = Segment.objects.get(pk=seg['id'])
|
segment = Segment.objects.get(pk=seg['id'])
|
||||||
segment.visit_count = segment.visit_count + 1
|
segment.visit_count = F('visit_count') + 1
|
||||||
segment.save()
|
segment.save()
|
||||||
|
|
||||||
def check_segment_exists(self, segment):
|
def check_segment_exists(self, segment):
|
||||||
segments = self.request.session['segments']
|
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)
|
||||||
|
|
||||||
|
@@ -1,7 +1,6 @@
|
|||||||
from django.conf import settings
|
from django.conf import settings
|
||||||
|
from django.utils.module_loading import import_string
|
||||||
from personalisation.utils import import_class
|
|
||||||
|
|
||||||
|
|
||||||
segments_adapter = import_class(getattr(settings, 'PERSONALISATION_SEGMENTS_ADAPTER', 'personalisation.adapters.SessionSegmentsAdapter'))()
|
segments_adapter = import_string(getattr(settings, 'PERSONALISATION_SEGMENTS_ADAPTER', 'personalisation.adapters.SessionSegmentsAdapter'))()
|
||||||
|
|
||||||
|
@@ -1,11 +1,5 @@
|
|||||||
import importlib
|
|
||||||
|
|
||||||
def impersonate_other_page(page, other_page):
|
def impersonate_other_page(page, other_page):
|
||||||
page.path = other_page.path
|
page.path = other_page.path
|
||||||
page.depth = other_page.depth
|
page.depth = other_page.depth
|
||||||
page.url_path = other_page.url_path
|
page.url_path = other_page.url_path
|
||||||
page.title = other_page.title
|
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)
|
|
||||||
|
@@ -88,7 +88,7 @@ def segment_user(page, request, serve_args, serve_kwargs):
|
|||||||
def serve_variation(page, request, serve_args, serve_kwargs):
|
def serve_variation(page, request, serve_args, serve_kwargs):
|
||||||
user_segments = []
|
user_segments = []
|
||||||
|
|
||||||
for segment in segments_adapter.get():
|
for segment in segments_adapter.get_all_segments():
|
||||||
try:
|
try:
|
||||||
user_segment = Segment.objects.get(pk=segment['id'],
|
user_segment = Segment.objects.get(pk=segment['id'],
|
||||||
status='enabled')
|
status='enabled')
|
||||||
|
Reference in New Issue
Block a user