Skip to content
This repository was archived by the owner on Jan 13, 2022. It is now read-only.

Commit 09469ef

Browse files
committed
Bug 863066: Fix subscription data returned
There was a bug in how we translated from what Exact Target gives us to our preferred internal representation of what newsletters the user is subscribed to. The symptom was that when a user confirmed, we thought they hadn't subscribed to anything and so didn't send any welcome messages.
1 parent c400a0f commit 09469ef

4 files changed

Lines changed: 59 additions & 10 deletions

File tree

apps/news/newsletters.py

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -70,11 +70,19 @@ def newsletter_name(field):
7070
return None
7171

7272

73-
def newsletter_names():
74-
"""Get a list of all the available newsletters"""
73+
def newsletter_slugs():
74+
"""
75+
Get a list of all the available newsletters.
76+
Returns a list of their slugs.
77+
"""
7578
return _newsletters()['by_name'].keys()
7679

7780

81+
def slug_to_vendor_id(slug):
82+
"""Given a newsletter's slug, return its vendor_id"""
83+
return _newsletters()['by_name'][slug].vendor_id
84+
85+
7886
def newsletter_fields():
7987
"""Get a list of all the newsletter backend-specific fields"""
8088
return _newsletters()['by_vendor_id'].keys()

apps/news/tasks.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313

1414
from .backends.exacttarget import (ExactTarget, ExactTargetDataExt)
1515
from .models import Newsletter
16-
from .newsletters import newsletter_field, newsletter_names
16+
from .newsletters import newsletter_field, newsletter_slugs
1717

1818

1919
log = logging.getLogger(__name__)
@@ -176,7 +176,7 @@ def parse_newsletters(record, type, newsletters, cur_newsletters):
176176
unsubs = cur_newsletters - set(newsletters)
177177
else:
178178
subs = set(newsletters)
179-
all = set(newsletter_names())
179+
all = set(newsletter_slugs())
180180
unsubs = all - subs
181181
else: # type == UNSUBSCRIBE
182182
# unsubscribe from the specified newsletters

apps/news/tests.py

Lines changed: 37 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212

1313
from news import models, tasks, views
1414
from news.backends.exacttarget import NewsletterException
15+
from news.models import Newsletter
1516
from news.newsletters import newsletter_fields, newsletter_languages
1617
from news.tasks import (FFAY_VENDOR_ID, FFOS_VENDOR_ID,
1718
SET, SUBSCRIBE, UNSUBSCRIBE,
@@ -20,7 +21,7 @@
2021
UU_MUST_CONFIRM_NEW, UU_MUST_CONFIRM_PENDING,
2122
RetryTask,
2223
confirm_user, update_user)
23-
from news.views import get_user_data, language_code_is_valid
24+
from news.views import get_user_data, language_code_is_valid, look_for_user
2425

2526

2627
class SubscriberTest(TestCase):
@@ -1278,6 +1279,41 @@ def test_cache_clear_on_delete(self):
12781279
self.assertEqual([], vendor_ids)
12791280

12801281

1282+
class TestLookForUser(TestCase):
1283+
def test_subscriptions(self):
1284+
"""
1285+
look_for_user returns the right list of subscribed newsletters
1286+
"""
1287+
Newsletter.objects.create(slug='n1', vendor_id='NEWSLETTER1')
1288+
Newsletter.objects.create(slug='n2', vendor_id='NEWSLETTER2')
1289+
fields = ['NEWSLETTER1_FLG', 'NEWSLETTER2_FLG']
1290+
with patch('news.views.ExactTargetDataExt') as et_ext:
1291+
data_ext = et_ext()
1292+
data_ext.get_record.return_value = {
1293+
'EMAIL_ADDRESS_': 'dude@example.com',
1294+
'EMAIL_FORMAT_': 'HTML',
1295+
'COUNTRY_': 'us',
1296+
'LANGUAGE_ISO2': 'en',
1297+
'TOKEN': 'asdf',
1298+
'CREATED_DATE_': 'Yesterday',
1299+
'NEWSLETTER1_FLG': 'Y',
1300+
'NEWSLETTER2_FLG': 'Y',
1301+
}
1302+
result = look_for_user(database='DUMMY', email='EMAIL',
1303+
token='TOKEN', fields=fields)
1304+
expected_result = {
1305+
'newsletters': [u'n1', u'n2'],
1306+
'status': 'ok',
1307+
'country': 'us',
1308+
'lang': 'en',
1309+
'token': 'asdf',
1310+
'created-date': 'Yesterday',
1311+
'email': 'dude@example.com',
1312+
'format': 'HTML',
1313+
}
1314+
self.assertEqual(expected_result, result)
1315+
1316+
12811317
class TestGetUserData(TestCase):
12821318

12831319
def generic_test(self,

apps/news/views.py

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@
2222
update_user,
2323
)
2424
from .newsletters import (newsletter_fields, newsletter_languages,
25-
newsletter_names)
25+
newsletter_slugs, slug_to_vendor_id)
2626

2727

2828
## Utility functions
@@ -146,7 +146,7 @@ def update_user_task(request, type, data=None, optin=True):
146146

147147
newsletters = data.get('newsletters', None)
148148
if newsletters:
149-
all_newsletters = newsletter_names()
149+
all_newsletters = newsletter_slugs()
150150
for nl in [x.strip() for x in newsletters.split(',')]:
151151
if nl not in all_newsletters:
152152
return HttpResponseJSON({
@@ -202,6 +202,12 @@ def look_for_user(database, email, token, fields):
202202
return None
203203
if database == settings.EXACTTARGET_CONFIRMATION:
204204
return True
205+
newsletters = []
206+
for slug in newsletter_slugs():
207+
vendor_id = slug_to_vendor_id(slug)
208+
flag = "%s_FLG" % vendor_id
209+
if user.get(flag, 'N') == 'Y':
210+
newsletters.append(slug)
205211
user_data = {
206212
'status': 'ok',
207213
'email': user['EMAIL_ADDRESS_'],
@@ -210,8 +216,7 @@ def look_for_user(database, email, token, fields):
210216
'lang': user['LANGUAGE_ISO2'],
211217
'token': user['TOKEN'],
212218
'created-date': user['CREATED_DATE_'],
213-
'newsletters': [nl for nl in newsletter_names()
214-
if user.get('%s_FLG' % nl, False) == 'Y'],
219+
'newsletters': newsletters,
215220
}
216221
return user_data
217222

@@ -398,7 +403,7 @@ def unsubscribe(request, token):
398403
data = request.POST.copy()
399404

400405
if data.get('optout', 'N') == 'Y':
401-
data['newsletters'] = ','.join(newsletter_names())
406+
data['newsletters'] = ','.join(newsletter_slugs())
402407

403408
return update_user_task(request, UNSUBSCRIBE, data)
404409

0 commit comments

Comments
 (0)