From d470211d95a40152bdbdf9a694e0c2989126a1ef Mon Sep 17 00:00:00 2001 From: "Wraithan (Chris McDonald)" Date: Thu, 18 Jul 2013 12:20:03 -0700 Subject: [PATCH] fall back to language portion of locale if available (bug 895195) --- webpay/pay/tasks.py | 39 ++++++++++++++++++----- webpay/pay/tests/test_tasks.py | 57 +++++++++++++++++++++++++++++++++- 2 files changed, 88 insertions(+), 8 deletions(-) diff --git a/webpay/pay/tasks.py b/webpay/pay/tasks.py index 1bb0cdb7a..cde51ddaa 100644 --- a/webpay/pay/tasks.py +++ b/webpay/pay/tasks.py @@ -66,13 +66,7 @@ def configure_transaction(request): pass # Localize the product before sending it off to solitude/bango. - if hasattr(request, 'locale'): - req = (request.session['notes'].get('pay_request', {}) - .get('request', {})) - locale = req.get('locales', {}).get(request.locale) - if locale: - req['name'] = locale['name'] - req['description'] = locale['description'] + _localize_pay_request(request) log.info('configuring payment in background for trans {0}' .format(request.session['trans_id'])) @@ -81,6 +75,37 @@ def configure_transaction(request): request.session['uuid']) +def _localize_pay_request(request): + if hasattr(request, 'locale'): + try: + pay_req = request.session['notes']['pay_request'] + req = pay_req['request'] + except KeyError: + return + + trans_id = request.session.get('trans_id') + + locales = req.get('locales') + if locales: + fallback = request.locale.split('-')[0] + if request.locale in locales: + loc = locales[request.locale] + elif fallback in locales: + log.info('Fell back from {0} to {1} (iss: {2}, trans_id: {3})' + .format(request.locale, fallback, pay_req.get('iss'), + trans_id)) + loc = locales[fallback] + else: + log.info(('No localization found for {0} (iss: {2}, ' + 'trans_id: {3})').format(request.locale, + pay_req.get('iss'), + trans_id)) + return + + req['name'] = loc.get('name', req['name']) + req['description'] = loc.get('description', req['description']) + + def get_secret(issuer_key): """Resolve the secret for this JWT.""" if is_marketplace(issuer_key): diff --git a/webpay/pay/tests/test_tasks.py b/webpay/pay/tests/test_tasks.py index 3c7284af5..757e82f6b 100644 --- a/webpay/pay/tests/test_tasks.py +++ b/webpay/pay/tests/test_tasks.py @@ -393,7 +393,8 @@ def setUp(self): 'request': {'pricePoint': 1, 'id': 'generated-product-uuid', 'icons': {'64': 'http://app/i.png'}, - 'name': 'Virtual Sword'}}} + 'name': 'Virtual Sword', + 'description': 'A fancy sword'}}} self.prices = {'prices': [{'amount': 1, 'currency': 'EUR'}]} @@ -606,6 +607,60 @@ def test_use_locale_name(self, start_pay, marketplace, solitude): eq_(start_pay.call_args[0][1]['pay_request']['request']['description'], description) +class TestLocalizePayRequest(test_utils.TestCase): + + def setUp(self): + self.request = RequestFactory().get('/') + self.request.session = { + 'notes': { + 'pay_request': { + 'request': { + 'name': 'Virtual Sword', + 'description': 'A fancy sword', + 'locales': { + 'en': { + 'name': 'English Virtual Sword', + 'description': 'A fancy English sword' + }, + 'en-GB': { + 'name': 'British Virtual Sword' + } + } + } + } + } + } + + def _get_pay_request_details(self): + return self.request.session['notes']['pay_request']['request'] + + def test_no_locale(self): + tasks._localize_pay_request(self.request) + req = self._get_pay_request_details() + eq_(req['name'], 'Virtual Sword') + eq_(req['description'], 'A fancy sword') + + def test_only_lang(self): + self.request.locale = 'en' + tasks._localize_pay_request(self.request) + req = self._get_pay_request_details() + eq_(req['name'], 'English Virtual Sword') + eq_(req['description'], 'A fancy English sword') + + def test_lang_and_region(self): + self.request.locale = 'en-GB' + tasks._localize_pay_request(self.request) + req = self._get_pay_request_details() + eq_(req['name'], 'British Virtual Sword') + eq_(req['description'], 'A fancy sword') + + def test_lang_and_unlocalized_region(self): + self.request.locale = 'en-US' + tasks._localize_pay_request(self.request) + req = self._get_pay_request_details() + eq_(req['name'], 'English Virtual Sword') + eq_(req['description'], 'A fancy English sword') + class TestGetIconURL(test_utils.TestCase):