7

Add adapters.get_segment_adapter to set the segment adapter on the request

object.

Previously the segment adapter was set globally with the request as
attribute. This causes thread safety issues. Instead we now initialise
the segment adapter for each request and set it as attribute
This commit is contained in:
Michael van Tellingen
2017-05-31 11:59:25 +02:00
committed by Michael van Tellingen
parent 4158bafe58
commit cc38634519
5 changed files with 59 additions and 31 deletions

View File

@ -1,6 +1,8 @@
from __future__ import absolute_import, unicode_literals
from django.conf import settings
from django.db.models import F
from django.utils.module_loading import import_string
from wagtail_personalisation.models import Segment
from wagtail_personalisation.rules import AbstractBaseRule
@ -10,6 +12,15 @@ from wagtail_personalisation.utils import create_segment_dictionary
class BaseSegmentsAdapter(object):
"""Base segments adapter."""
def __init__(self, request):
"""Prepare the request session for segment storage.
:param request: The http request
:type request: django.http.HttpRequest
"""
self.request = request
def setup(self):
"""Prepare the adapter for segment storage."""
return None
@ -64,15 +75,8 @@ class BaseSegmentsAdapter(object):
class SessionSegmentsAdapter(BaseSegmentsAdapter):
"""Segment adapter that uses Django's session backend."""
def setup(self, request):
"""Prepare the request session for segment storage.
:param request: The http request
:type request: django.http.HttpRequest
"""
self.request = request
def __init__(self, request):
super(SessionSegmentsAdapter, self).__init__(request)
self.request.session.setdefault('segments', [])
def get_all_segments(self):
@ -166,3 +170,18 @@ class SessionSegmentsAdapter(BaseSegmentsAdapter):
self.request.session['segments'] = new_segments
self.update_visit_count()
SEGMENT_ADAPTER_CLASS = import_string(getattr(
settings,
'PERSONALISATION_SEGMENTS_ADAPTER',
'wagtail_personalisation.adapters.SessionSegmentsAdapter'))
def get_segment_adapter(request):
"""Return the Segment Adapter for the given request"""
try:
return request.segment_adapter
except AttributeError:
request.segment_adapter = SEGMENT_ADAPTER_CLASS(request)
return request.segment_adapter