You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

89 lines
2.5 KiB
Python

from datetime import datetime, timedelta
import re
from django.utils.deprecation import MiddlewareMixin
from django.conf import settings
from .models import User
class ReferrerMiddleware(MiddlewareMixin):
def process_request(self, request):
if "ref" in request.GET:
id = request.GET["ref"]
elif "referrer" in request.COOKIES:
id = request.COOKIES["referrer"]
else:
return
try:
id = int(id.strip())
except (ValueError, TypeError):
return
try:
u = User.objects.get(id=id)
except User.DoesNotExist:
return
request.session["referrer"] = u.id
def process_response(self, request, response):
id = request.session.get("referrer")
if not id:
return response
max_age = 365 * 24 * 60 * 60
expires = datetime.utcnow() + timedelta(seconds=max_age)
expires = expires.strftime("%a, %d-%b-%Y %H:%M:%S GMT")
response.set_cookie(
"referrer",
id,
max_age=max_age,
expires=expires,
domain=settings.SESSION_COOKIE_DOMAIN,
secure=settings.SESSION_COOKIE_SECURE or None,
)
return response
class CampaignMiddleware(MiddlewareMixin):
GET_FIELDS = ["pk_campaign", "utm_campaign", "utm_medium", "utm_source"]
def _get_name(self, request):
for f in self.GET_FIELDS:
if f in request.GET and request.GET[f]:
return request.GET[f]
if "campaign" in request.COOKIES:
return request.COOKIES["campaign"]
return None
def process_request(self, request):
name = self._get_name(request)
if not name:
return
name = name.strip()
if len(name) >= 64 or not re.match("^[a-zA-Z0-9_.:-]+$", name):
return
request.session["campaign"] = name
def process_response(self, request, response):
name = request.session.get("campaign")
if not name:
return response
max_age = 365 * 24 * 60 * 60
expires = datetime.utcnow() + timedelta(seconds=max_age)
expires = expires.strftime("%a, %d-%b-%Y %H:%M:%S GMT")
response.set_cookie(
"campaign",
name,
max_age=max_age,
expires=expires,
domain=settings.SESSION_COOKIE_DOMAIN,
secure=settings.SESSION_COOKIE_SECURE or None,
)
return response