7

adds middleware functionality with tests

This commit is contained in:
Boris Besemer
2016-12-07 11:40:50 +01:00
parent 56529c0732
commit ce619b4117
2 changed files with 48 additions and 4 deletions

View File

@ -77,7 +77,16 @@ def set_visit_count(page, request, serve_args, serve_kwargs):
@hooks.register('before_serve_page')
def segment_user(page, request, serve_args, serve_kwargs):
if 'segments' not in request.session:
request.session['segments'] = []
current_segments = request.session['segments']
persistent_segments = Segment.objects.filter(persistent=True)
current_segments = [item for item in current_segments if any(seg.pk for seg in persistent_segments) == item['id']]
request.session['segments'] = current_segments
segments = Segment.objects.all().filter(status='enabled')
for segment in segments:
@ -103,12 +112,12 @@ def segment_user(page, request, serve_args, serve_kwargs):
def _test_rules(rules, request):
"""Test wether the user matches a segment's rules'"""
"""Test whether the user matches a segment's rules'"""
if len(rules) > 0:
for rule in rules:
result = rule.test_user(request)
# Debug
""" Debug
if result and rule.__class__.__name__ == "TimeRule":
print("User segmented. Time between {} and {}.".format(
rule.start_time,
@ -120,7 +129,7 @@ def _test_rules(rules, request):
print("User segmented. Visited {} {} {} times.".format(
rule.counted_page,
rule.operator,
rule.count))
rule.count))"""
if result is False:
return False
@ -144,6 +153,7 @@ def _add_segment_to_user(segment, request):
"encoded_name": segment.encoded_name(),
"id": segment.pk,
"timestamp": int(time.time()),
"persistent": segment.persistent,
}
request.session['segments'].append(segdict)

View File

@ -178,6 +178,40 @@ class TestUserSegmenting(object):
assert any(item['encoded_name'] == 'multiple-queries' for item in client.session['segments'])
def test_persistent_segmenting(self, client):
segment = SegmentFactory(name='Persistent', persistent=True)
query_rule = QueryRuleFactory(
parameter="test",
value="test",
segment=segment
)
client.get('/?test=test')
assert any(item['encoded_name'] == 'persistent' for item in client.session['segments'])
client.get('/')
assert any(item['encoded_name'] == 'persistent' for item in client.session['segments'])
def test_non_persistent_segmenting(self, client):
segment = SegmentFactory(name='Non Persistent')
query_rule = QueryRuleFactory(
parameter="test",
value="test",
segment=segment
)
client.get('/?test=test')
assert any(item['encoded_name'] == 'non-persistent' for item in client.session['segments'])
client.get('/')
assert not any(item['encoded_name'] == 'non-persistent' for item in client.session['segments'])
@pytest.mark.django_db
class TestUserVisitCount(object):