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

10 years ago
from datetime import datetime, timedelta
import re
10 years ago
from django.utils.deprecation import MiddlewareMixin
10 years ago
from django.conf import settings
from .models import User
class ReferrerMiddleware(MiddlewareMixin):
10 years ago
def process_request(self, request):
if "ref" in request.GET:
id = request.GET["ref"]
elif "referrer" in request.COOKIES:
id = request.COOKIES["referrer"]
10 years ago
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
10 years ago
def process_response(self, request, response):
id = request.session.get("referrer")
10 years ago
if not id:
return response
max_age = 365 * 24 * 60 * 60
expires = datetime.utcnow() + timedelta(seconds=max_age)
10 years ago
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,
)
10 years ago
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