From 48911c381e66abe47ddde6f3fec7078d99bee696 Mon Sep 17 00:00:00 2001 From: Sharoon Thomas Date: Sun, 10 Nov 2013 13:39:36 +0100 Subject: [PATCH] Update nereid to use the locale instead of lang #65 This patch makes a significant shift in the way nereid handles multi language sites. Previously, the language code was used in the URL, but now a locale code which can be defined by the user is used --- __init__.py | 9 +-- configuration.xml | 35 ++++++++-- currency.py | 12 +--- routing.py | 50 ++++++++++++-- tests/test_address.py | 10 ++- tests/test_auth.py | 10 ++- tests/test_currency.py | 68 +++++++++++++------ tests/test_i18n.py | 10 ++- tests/test_static_file.py | 10 ++- urls.xml | 36 +++++----- view/website_form.xml | 7 +- view/website_locale_form.xml | 11 +++ ...{lang_form.xml => website_locale_tree.xml} | 10 +-- 13 files changed, 201 insertions(+), 77 deletions(-) create mode 100644 view/website_locale_form.xml rename view/{lang_form.xml => website_locale_tree.xml} (56%) diff --git a/__init__.py b/__init__.py index 96d23e4..5db7bbe 100644 --- a/__init__.py +++ b/__init__.py @@ -4,10 +4,10 @@ from trytond.pool import Pool from .party import Address, Party, ContactMechanism, NereidUser, Permission, \ UserPermission -from .routing import URLMap, WebSite, URLRule, URLRuleDefaults, \ - WebsiteCountry, WebsiteCurrency +from .routing import URLMap, WebSite, WebSiteLocale, URLRule, URLRuleDefaults, \ + WebsiteCountry, WebsiteCurrency, WebsiteWebsiteLocale from .static_file import NereidStaticFolder, NereidStaticFile -from .currency import Currency, Language +from .currency import Currency from .template import ContextProcessors @@ -21,13 +21,14 @@ def register(): UserPermission, URLMap, WebSite, + WebSiteLocale, URLRule, URLRuleDefaults, WebsiteCountry, WebsiteCurrency, + WebsiteWebsiteLocale, NereidStaticFolder, NereidStaticFile, - Language, Currency, ContextProcessors, module='nereid', type_='model' diff --git a/configuration.xml b/configuration.xml index ec7b712..8115480 100644 --- a/configuration.xml +++ b/configuration.xml @@ -23,13 +23,6 @@ - - ir.lang - tree - - lang_form - - @@ -60,6 +53,34 @@ + + + nereid.website.locale + form + website_locale_form + + + nereid.website.locale + tree + website_locale_tree + + + Web Sites Locale + nereid.website.locale + + + + + + + + + + + + + nereid.url_map diff --git a/currency.py b/currency.py index 4ce9721..64d25dc 100644 --- a/currency.py +++ b/currency.py @@ -1,9 +1,9 @@ # This file is part of Tryton. The COPYRIGHT file at the top level of # this repository contains the full copyright notices and license terms. -from trytond.model import ModelView, ModelSQL, fields +from trytond.model import ModelView, ModelSQL from nereid import request -__all__ = ['Currency', 'Language'] +__all__ = ['Currency'] class Currency(ModelSQL, ModelView): @@ -34,11 +34,3 @@ class Currency(ModelSQL, ModelView): 'compute': cls.compute, 'convert': cls.convert } - - -class Language(ModelSQL, ModelView): - __name__ = "ir.lang" - - default_currency = fields.Many2One( - 'currency.currency', 'Default Currency' - ) diff --git a/routing.py b/routing.py index f1c07e7..d25b77f 100644 --- a/routing.py +++ b/routing.py @@ -15,8 +15,8 @@ from trytond.pool import Pool from .i18n import _ -__all__ = ['URLMap', 'WebSite', 'URLRule', 'URLRuleDefaults', - 'WebsiteCountry', 'WebsiteCurrency'] +__all__ = ['URLMap', 'WebSite', 'WebSiteLocale', 'URLRule', 'URLRuleDefaults', + 'WebsiteCountry', 'WebsiteCurrency', 'WebsiteWebsiteLocale'] class URLMap(ModelSQL, ModelView): @@ -132,12 +132,17 @@ class WebSite(ModelSQL, ModelView): 'nereid.website-currency.currency', 'website', 'currency', 'Currencies Available') - #: Default language - default_language = fields.Many2One( - 'ir.lang', 'Default Language', + #: Default locale + default_locale = fields.Many2One( + 'nereid.website.locale', 'Default Locale', required=True ) + #: Allowed locales in the website + locales = fields.Many2Many( + 'nereid.website-nereid.website.locale', + 'website', 'locale', 'Languages Available') + #: The res.user with which the nereid application will be loaded #: .. versionadded: 0.3 application_user = fields.Many2One( @@ -347,6 +352,28 @@ class WebSite(ModelSQL, ModelView): return jsonify(status=cls._user_status()) +class WebSiteLocale(ModelSQL, ModelView): + 'Web Site Locale' + __name__ = "nereid.website.locale" + _rec_name = 'code' + + code = fields.Char('Code', required=True) + language = fields.Many2One( + 'ir.lang', 'Default Language', required=True + ) + currency = fields.Many2One( + 'currency.currency', 'Currency', ondelete='CASCADE', required=True + ) + + @classmethod + def __setup__(cls): + super(WebSiteLocale, cls).__setup__() + cls._sql_constraints += [ + ('unique_code', 'UNIQUE(code)', + 'Code must be unique'), + ] + + class URLRule(ModelSQL, ModelView): """ URL Rule @@ -497,3 +524,16 @@ class WebsiteCurrency(ModelSQL): currency = fields.Many2One( 'currency.currency', 'Currency', ondelete='CASCADE', select=1, required=True) + + +class WebsiteWebsiteLocale(ModelSQL): + "Languages to be made available on website" + __name__ = 'nereid.website-nereid.website.locale' + _table = 'website_locale_rel' + + website = fields.Many2One( + 'nereid.website', 'Website', + ondelete='CASCADE', select=1, required=True) + locale = fields.Many2One( + 'nereid.website.locale', 'Locale', + ondelete='CASCADE', select=1, required=True) diff --git a/tests/test_address.py b/tests/test_address.py index 0bf4df6..f6a4e3b 100755 --- a/tests/test_address.py +++ b/tests/test_address.py @@ -26,6 +26,7 @@ class TestAddress(NereidTestCase): trytond.tests.test_tryton.install_module('nereid') self.nereid_website_obj = POOL.get('nereid.website') + self.nereid_website_locale_obj = POOL.get('nereid.website.locale') self.nereid_user_obj = POOL.get('nereid.user') self.url_map_obj = POOL.get('nereid.url_map') self.company_obj = POOL.get('company.company') @@ -130,12 +131,19 @@ class TestAddress(NereidTestCase): url_map_id, = self.url_map_obj.search([], limit=1) en_us, = self.language_obj.search([('code', '=', 'en_US')]) + currency, = self.currency_obj.search([('code', '=', 'USD')]) + locale, = self.nereid_website_locale_obj.create([{ + 'code': 'en_US', + 'language': en_us, + 'currency': currency, + }]) self.nereid_website_obj.create([{ 'name': 'localhost', 'url_map': url_map_id, 'company': self.company, 'application_user': USER, - 'default_language': en_us, + 'default_locale': locale, + 'locales': [('add', [locale.id])], 'guest_user': self.guest_user, 'countries': [('set', self.available_countries)], }]) diff --git a/tests/test_auth.py b/tests/test_auth.py index 81a47d8..1b585bf 100644 --- a/tests/test_auth.py +++ b/tests/test_auth.py @@ -25,6 +25,7 @@ class TestAuth(NereidTestCase): trytond.tests.test_tryton.install_module('nereid') self.nereid_website_obj = POOL.get('nereid.website') + self.nereid_website_locale_obj = POOL.get('nereid.website.locale') self.nereid_permission_obj = POOL.get('nereid.permission') self.nereid_user_obj = POOL.get('nereid.user') self.url_map_obj = POOL.get('nereid.url_map') @@ -71,12 +72,19 @@ class TestAuth(NereidTestCase): url_map, = self.url_map_obj.search([], limit=1) en_us, = self.language_obj.search([('code', '=', 'en_US')]) + currency, = self.currency_obj.search([('code', '=', 'USD')]) + locale, = self.nereid_website_locale_obj.create([{ + 'code': 'en_US', + 'language': en_us, + 'currency': currency, + }]) self.nereid_website_obj.create([{ 'name': 'localhost', 'url_map': url_map, 'company': self.company, 'application_user': USER, - 'default_language': en_us, + 'default_locale': locale, + 'locales': [('add', [locale.id])], 'guest_user': self.guest_user, }]) self.templates = { diff --git a/tests/test_currency.py b/tests/test_currency.py index b901cd8..cf35991 100644 --- a/tests/test_currency.py +++ b/tests/test_currency.py @@ -19,6 +19,7 @@ class TestCurrency(NereidTestCase): trytond.tests.test_tryton.install_module('nereid') self.nereid_website_obj = POOL.get('nereid.website') + self.nereid_website_locale_obj = POOL.get('nereid.website.locale') self.nereid_permission_obj = POOL.get('nereid.permission') self.nereid_user_obj = POOL.get('nereid.user') self.url_map_obj = POOL.get('nereid.url_map') @@ -37,6 +38,12 @@ class TestCurrency(NereidTestCase): 'symbol': '$', 'rates': [('create', [{'rate': Decimal('1')}])], }]) + eur, = self.currency_obj.create([{ + 'name': 'Euro', + 'code': 'EUR', + 'symbol': 'E', + 'rates': [('create', [{'rate': Decimal('2')}])], + }]) self.party, = self.party_obj.create([{ 'name': 'Openlabs', }]) @@ -82,12 +89,25 @@ class TestCurrency(NereidTestCase): self.website_currencies = [c1, c2] url_map, = self.url_map_obj.search([], limit=1) self.en_us, = self.language_obj.search([('code', '=', 'en_US')]) + self.es_es, = self.language_obj.search([('code', '=', 'es_ES')]) + self.usd, = self.currency_obj.search([('code', '=', 'USD')]) + self.eur, = self.currency_obj.search([('code', '=', 'EUR')]) + locale_en_us, locale_es_es = self.nereid_website_locale_obj.create([{ + 'code': 'en_US', + 'language': self.en_us, + 'currency': self.usd, + }, { + 'code': 'es_ES', + 'language': self.es_es, + 'currency': self.eur, + }]) self.nereid_website_obj.create([{ 'name': 'localhost', 'url_map': url_map, 'company': self.company, 'application_user': USER, - 'default_language': self.en_us, + 'default_locale': locale_en_us.id, + 'locales': [('add', [locale_en_us.id, locale_es_es.id])], 'guest_user': self.guest_user.id, 'currencies': [('set', self.website_currencies)], }]) @@ -111,37 +131,41 @@ class TestCurrency(NereidTestCase): app = self.get_app() with app.test_client() as c: - rv = c.get('/en_US/') + rv = c.get('/en_us/') self.assertEqual(rv.status_code, 200) self.assertEqual(int(rv.data), self.company.currency.id) + with app.test_request_context('/en_us/'): + self.assertEqual( + self.currency_obj.convert(Decimal('100')), Decimal('100') + ) + + def test_0020_currency_from_locale(self): + """ + Test and ensure that the currency is based on the locale + """ + with Transaction().start(DB_NAME, USER, CONTEXT): + self.setup_defaults() + app = self.get_app() + + with app.test_client() as c: + rv = c.get('/en_US/') + self.assertEqual(rv.status_code, 200) + self.assertEqual(int(rv.data), int(self.usd.id)) + + rv = c.get('/es_ES/') + self.assertEqual(rv.status_code, 200) + self.assertEqual(int(rv.data), int(self.eur.id)) + with app.test_request_context('/en_US/'): self.assertEqual( self.currency_obj.convert(Decimal('100')), Decimal('100') ) - def test_0020_currency_from_language(self): - """ - Set the currency for the language and check if the currency - in the request is correct - """ - with Transaction().start(DB_NAME, USER, CONTEXT): - self.setup_defaults() - app = self.get_app() - - self.language_obj.write( - [self.en_us], {'default_currency': self.lang_currency} - ) - with app.test_client() as c: - rv = c.get('/en_US/') - self.assertEqual(rv.status_code, 200) - - self.assertEqual(int(rv.data), int(self.lang_currency)) - - with app.test_request_context('/en_US/'): + with app.test_request_context('/es_ES/'): self.assertEqual( - self.currency_obj.convert(Decimal('100')), Decimal('3000') + self.currency_obj.convert(Decimal('100')), Decimal('200') ) diff --git a/tests/test_i18n.py b/tests/test_i18n.py index e15fc45..3c50836 100644 --- a/tests/test_i18n.py +++ b/tests/test_i18n.py @@ -25,6 +25,7 @@ class TestI18N(NereidTestCase): trytond.tests.test_tryton.install_module('nereid') self.nereid_website_obj = POOL.get('nereid.website') + self.nereid_website_locale_obj = POOL.get('nereid.website.locale') self.nereid_permission_obj = POOL.get('nereid.permission') self.nereid_user_obj = POOL.get('nereid.user') self.url_map_obj = POOL.get('nereid.url_map') @@ -55,12 +56,19 @@ class TestI18N(NereidTestCase): }) url_map_id, = self.url_map_obj.search([], limit=1) en_us, = self.language_obj.search([('code', '=', 'en_US')]) + currency, = self.currency_obj.search([('code', '=', 'USD')]) + locale, = self.nereid_website_locale_obj.create([{ + 'code': 'en_US', + 'language': en_us, + 'currency': currency, + }]) self.nereid_website_obj.create({ 'name': 'localhost', 'url_map': url_map_id, 'company': self.company_id, 'application_user': USER, - 'default_language': en_us, + 'default_locale': locale, + 'locales': [('add', [locale.id])], 'guest_user': self.guest_user_id, }) diff --git a/tests/test_static_file.py b/tests/test_static_file.py index ab0408a..777b1d6 100644 --- a/tests/test_static_file.py +++ b/tests/test_static_file.py @@ -34,6 +34,7 @@ class TestStaticFile(NereidTestCase): trytond.tests.test_tryton.install_module('nereid') self.nereid_website_obj = POOL.get('nereid.website') + self.nereid_website_locale_obj = POOL.get('nereid.website.locale') self.nereid_user_obj = POOL.get('nereid.user') self.url_map_obj = POOL.get('nereid.url_map') self.company_obj = POOL.get('company.company') @@ -84,12 +85,19 @@ class TestStaticFile(NereidTestCase): url_map_id, = self.url_map_obj.search([], limit=1) en_us, = self.language_obj.search([('code', '=', 'en_US')]) + currency, = self.currency_obj.search([('code', '=', 'USD')]) + locale, = self.nereid_website_locale_obj.create([{ + 'code': 'en_US', + 'language': en_us, + 'currency': currency, + }]) self.nereid_website_obj.create([{ 'name': 'localhost', 'url_map': url_map_id, 'company': self.company, 'application_user': USER, - 'default_language': en_us, + 'default_locale': locale, + 'locales': [('add', [locale.id])], 'guest_user': self.guest_user, }]) diff --git a/urls.xml b/urls.xml index 7847e38..adb70ed 100644 --- a/urls.xml +++ b/urls.xml @@ -28,7 +28,7 @@ - /<language>/login + /login nereid.website.login @@ -37,7 +37,7 @@ - /<language>/logout + /logout nereid.website.logout @@ -45,7 +45,7 @@ - /<language>/registration + /registration nereid.user.registration @@ -54,7 +54,7 @@ - /<language>/account + /account nereid.website.account @@ -62,7 +62,7 @@ - /<language>/change-password + /change-password nereid.user.change_password @@ -71,7 +71,7 @@ - /<language>/new-password + /new-password nereid.user.new_password @@ -80,7 +80,7 @@ - /<language>/activate-account/<int:active_id>/<activation_code> + /activate-account/<int:active_id>/<activation_code> nereid.user.activate @@ -89,7 +89,7 @@ - /<language>/reset-account + /reset-account nereid.user.reset_account @@ -98,7 +98,7 @@ - /<language>/save-new-address + /save-new-address party.address.edit_address @@ -108,7 +108,7 @@ - /<language>/edit-address/<int:address> + /edit-address/<int:address> party.address.edit_address @@ -117,7 +117,7 @@ - /<language>/view-address + /view-address party.address.view_address @@ -125,7 +125,7 @@ - /<language>/countries + /countries nereid.website.country_list @@ -133,7 +133,7 @@ - /<language>/subdivisions + /subdivisions nereid.website.subdivision_list @@ -141,7 +141,7 @@ - /<language>/static-file/<folder>/<name> + /static-file/<folder>/<name> nereid.static.file.send_static_file @@ -149,14 +149,14 @@ - /<language>/user_status + /user_status nereid.website.user_status - /<language>/contact-mechanisms/add + /contact-mechanisms/add party.contact_mechanism.add @@ -164,7 +164,7 @@ - /<language>/contact-mechanisms/remove + /contact-mechanisms/remove party.contact_mechanism.remove @@ -172,7 +172,7 @@ - /<language>/me + /me nereid.user.profile diff --git a/view/website_form.xml b/view/website_form.xml index 223f34b..ed25c55 100644 --- a/view/website_form.xml +++ b/view/website_form.xml @@ -10,8 +10,8 @@ this repository contains the full copyright notices and license terms. -->