7

Refactor of original branch

This commit is contained in:
Jasper Berghoef
2017-08-24 17:32:58 +02:00
parent 83c2a4289e
commit c3e237b970
10 changed files with 256 additions and 65 deletions

View File

@ -1,7 +1,6 @@
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
@ -36,7 +35,7 @@ class BaseSegmentsAdapter(object):
def refresh(self):
"""Refresh the segments stored in the adapter storage."""
def _test_rules(self, rules, request, match_any=False):
def _test_rules(self, rules, match_any=False):
"""Tests the provided rules to see if the request still belongs
to a segment.
:param rules: The rules to test for
@ -50,9 +49,20 @@ class BaseSegmentsAdapter(object):
"""
if not rules:
return False
if not hasattr(self.request, 'matched_rules'):
self.request.matched_rules = []
results = []
for rule in rules:
validation = rule.test_user(self.request)
if validation:
self.request.matched_rules.append(rule.pk)
results.append(validation)
if match_any:
return any(rule.test_user(request) for rule in rules)
return all(rule.test_user(request) for rule in rules)
return any(results)
return all(results)
class Meta:
abstract = True
@ -150,17 +160,6 @@ class SessionSegmentsAdapter(BaseSegmentsAdapter):
return visit['count']
return 0
def update_visit_count(self):
"""Update the visit count for all segments in the request session."""
segments = self.request.session['segments']
segment_pks = [s['id'] for s in segments]
# Update counts
(Segment.objects
.enabled()
.filter(pk__in=segment_pks)
.update(visit_count=F('visit_count') + 1))
def refresh(self):
"""Retrieve the request session segments and verify whether or not they
still apply to the requesting visitor.
@ -178,14 +177,13 @@ class SessionSegmentsAdapter(BaseSegmentsAdapter):
for rule_model in rule_models:
segment_rules.extend(rule_model.objects.filter(segment=segment))
result = self._test_rules(segment_rules, self.request,
match_any=segment.match_any)
result = self._test_rules(
segment_rules, match_any=segment.match_any)
if result:
additional_segments.append(segment)
self.set_segments(current_segments + additional_segments)
self.update_visit_count()
SEGMENT_ADAPTER_CLASS = import_string(getattr(