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