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
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
|