Experimental book page layout.
[wolnelektury.git] / src / experiments / middleware.py
diff --git a/src/experiments/middleware.py b/src/experiments/middleware.py
new file mode 100644 (file)
index 0000000..080aee2
--- /dev/null
@@ -0,0 +1,41 @@
+import hashlib
+from django.conf import settings
+
+
+def experiments_middleware(get_response):
+    def middleware(request):
+        exps = {}
+
+        overrides = getattr(settings, 'EXPERIMENTS_OVERRIDES', {})
+        for exp in settings.EXPERIMENTS:
+            slug = exp['slug']
+            if slug in overrides:
+                exps[slug] = overrides[slug]
+                continue
+
+            cookie_value = request.COOKIES.get(f'EXPERIMENT_{slug}')
+            if cookie_value is not None:
+                for cohort in exp.get('cohorts', []):
+                    if cohort['value'] == cookie_value:
+                        exps[slug] = cookie_value
+                        break
+
+            if slug not in exps:
+                number = int(
+                    # TODO sth else?
+                    hashlib.md5(
+                        (slug + request.META['REMOTE_ADDR']).encode('utf-8')
+                    ).hexdigest(),
+                    16
+                ) % 10e6 / 10e6
+                for cohort in exp.get('cohorts', []):
+                    number -= cohort.get('size', 1)
+                    if number < 0:
+                        exps[slug] = cohort['value']
+                        break
+
+        request.EXPERIMENTS = exps
+        response = get_response(request)
+        return response
+
+    return middleware