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

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