Skip to content

Commit b04a5e3

Browse files
committed
allow to remove aid param and redirect
1 parent 80c2019 commit b04a5e3

5 files changed

Lines changed: 38 additions & 4 deletions

File tree

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -134,3 +134,4 @@ Define in settings.py
134134
- AFFILIATE_SAVE_IN_SESSION - save affiliate id in session or not. Default `True`.
135135
- AFFILIATE_SESSION_AGE - how long keep affiliate id in session, in seconds. Default `5 * 24 * 60 * 60` seconds (5 days).
136136
- AFFILIATE_DEFAULT_LINK - default link, that will be used by `Affiliate.build_absolute_affiliate_uri` and `.build_affiliate_url`. Default `'/'`.
137+
- AFFILIATE_REMOVE_PARAM_AND_REDIRECT - if True, remove affiliate param from url and redirect to same url (affiliate data will be saved in session). Default `False`.

affiliate/app_settings.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
SAVE_IN_SESSION = getattr(settings, 'AFFILIATE_SAVE_IN_SESSION', True)
1111
SESSION_AGE = getattr(settings, 'AFFILIATE_SESSION_AGE', 5 * 24 * 60 * 60)
1212
DEFAULT_LINK = getattr(settings, 'AFFILIATE_DEFAULT_LINK', '/')
13+
REMOVE_PARAM_AND_REDIRECT = getattr(settings, 'AFFILIATE_REMOVE_PARAM_AND_REDIRECT', False)
1314
# deprecated
1415
BANNER_FOLDER = getattr(settings, 'AFFILIATE_BANNER_PATH', 'affiliate')
1516
START_AID = getattr(settings, 'AFFILIATE_START_AID', "1000")

affiliate/middleware.py

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,14 +5,15 @@
55
from django.utils.functional import SimpleLazyObject
66
from django.utils import timezone
77
from django.utils.dateparse import parse_datetime
8+
from django.http import HttpResponseRedirect
89

910
from .models import NoAffiliate
10-
from .utils import get_model
11+
from . import utils
1112

1213
l = logging.getLogger(__name__)
1314

1415

15-
AffiliateModel = get_model(app_settings.AFFILIATE_MODEL)
16+
AffiliateModel = utils.get_affiliate_model()
1617

1718
def get_affiliate(request, new_aid, prev_aid, prev_aid_dt):
1819
if not hasattr(request, '_cached_affiliate'):
@@ -53,6 +54,9 @@ def process_request(self, request):
5354
if app_settings.SAVE_IN_SESSION:
5455
session['_aid'] = new_aid
5556
session['_aid_dt'] = now.isoformat()
57+
if app_settings.REMOVE_PARAM_AND_REDIRECT:
58+
url = utils.remove_affiliate_code(request.get_full_path())
59+
return HttpResponseRedirect(url)
5660
if prev_aid and app_settings.SAVE_IN_SESSION:
5761
if prev_aid_dt is None:
5862
l.error('_aid_dt not found in session')

affiliate/models.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -45,8 +45,7 @@ def exists(self):
4545
return True
4646

4747
def build_absolute_affiliate_uri(self, request, location=None):
48-
location = location or app_settings.DEFAULT_LINK
49-
uri = request.build_absolute_uri(location)
48+
uri = request.build_absolute_uri(self.build_affiliate_url(location))
5049
return add_affiliate_code(uri, self.pk)
5150

5251
def build_affiliate_url(self, location=None):

tests/test_affiliate_middleware.py

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@
66
from django.core.urlresolvers import reverse
77
from django.core.exceptions import ImproperlyConfigured
88
from django.conf import settings
9+
from django.test.utils import override_settings
10+
from django.utils import six
911
from model_mommy import mommy
1012
from freezegun import freeze_time
1113

@@ -88,6 +90,29 @@ def test_affiliate_code_in_post_request(self):
8890
self.assertEqual(resp.context['request'].affiliate.pk, affiliate.pk)
8991

9092

93+
@override_settings(AFFILIATE_REMOVE_PARAM_AND_REDIRECT=True)
94+
class TestAffiliateMiddlewareRemoveAndRedirect(TestCase):
95+
def setUp(self):
96+
super(TestAffiliateMiddlewareRemoveAndRedirect, self).setUp()
97+
six.moves.reload_module(app_settings)
98+
99+
def test_affiliate_code_remove_from_url(self):
100+
affiliate = mommy.make(settings.AFFILIATE_AFFILIATE_MODEL)
101+
resp = self.client.get(get_aid_url('/', affiliate.aid))
102+
self.assertRedirects(resp, '/')
103+
resp = self.client.get('/')
104+
self.assertTrue(resp.context['request'].affiliate.exists())
105+
self.assertEqual(resp.context['request'].affiliate.pk, affiliate.pk)
106+
107+
def test_affiliate_code_remove_from_url_other_params_kept(self):
108+
affiliate = mommy.make(settings.AFFILIATE_AFFILIATE_MODEL)
109+
resp = self.client.get(get_aid_url('/', affiliate.aid) + '&other=param')
110+
self.assertRedirects(resp, '/?other=param')
111+
resp = self.client.get('/')
112+
self.assertTrue(resp.context['request'].affiliate.exists())
113+
self.assertEqual(resp.context['request'].affiliate.pk, affiliate.pk)
114+
115+
91116
@modify_settings(MIDDLEWARE_CLASSES={
92117
'remove': [
93118
'django.contrib.sessions.middleware.SessionMiddleware',
@@ -100,6 +125,10 @@ def test_affiliate_code_in_post_request(self):
100125
]
101126
})
102127
class TestAffiliateMiddlewareNoSession(TestCase):
128+
def setUp(self):
129+
super(TestAffiliateMiddlewareNoSession, self).setUp()
130+
six.moves.reload_module(app_settings)
131+
103132
def test_no_session_affiliate_in_url(self):
104133
app_settings.SAVE_IN_SESSION = False
105134

0 commit comments

Comments
 (0)