diff --git a/VERSION b/VERSION index da496b1c..32e6c53a 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -Version 2.8.2-stable+timestamp.2014.01.11.15.31.09 +Version 2.8.2-stable+timestamp.2014.01.14.22.16.35 diff --git a/gluon/html.py b/gluon/html.py index 8d28b8c3..938824aa 100644 --- a/gluon/html.py +++ b/gluon/html.py @@ -160,7 +160,8 @@ def URL( host=None, port=None, encode_embedded_slash=False, - url_encode=True + url_encode=True, + language=None, ): """ generate a URL @@ -369,7 +370,7 @@ def URL( raise SyntaxError('CRLF Injection Detected') url = url_out(r, env, application, controller, function, - args, other, scheme, host, port) + args, other, scheme, host, port, language=language) return url diff --git a/gluon/rewrite.py b/gluon/rewrite.py index 49fd4605..aefb8df5 100644 --- a/gluon/rewrite.py +++ b/gluon/rewrite.py @@ -188,11 +188,11 @@ def url_in(request, environ): def url_out(request, environ, application, controller, function, - args, other, scheme, host, port): + args, other, scheme, host, port, language=None): "assemble and rewrite outgoing URL" if routers: acf = map_url_out(request, environ, application, controller, - function, args, other, scheme, host, port) + function, args, other, scheme, host, port, language) url = '%s%s' % (acf, other) else: url = '/%s/%s/%s%s' % (application, controller, function, other) @@ -698,7 +698,7 @@ def regex_filter_out(url, e=None): def filter_url(url, method='get', remote='0.0.0.0', out=False, app=False, lang=None, domain=(None, None), env=False, scheme=None, - host=None, port=None): + host=None, port=None, language=None): """ doctest/unittest interface to regex_filter_in() and regex_filter_out() """ @@ -755,7 +755,7 @@ def filter_url(url, method='get', remote='0.0.0.0', if not routers: return regex_filter_out(uri, e) acf = map_url_out( - request, None, a, c, f, items, None, scheme, host, port) + request, None, a, c, f, items, None, scheme, host, port, language=language) if items: url = '%s/%s' % (acf, '/'.join(items)) if items[-1] == '': @@ -1125,7 +1125,7 @@ class MapUrlOut(object): "logic for mapping outgoing URLs" def __init__(self, request, env, application, controller, - function, args, other, scheme, host, port): + function, args, other, scheme, host, port, language): "initialize a map-out object" self.default_application = routers.BASE.default_application if application in routers: @@ -1144,6 +1144,7 @@ class MapUrlOut(object): self.scheme = scheme self.host = host self.port = port + self.language = language self.applications = routers.BASE.applications self.controllers = self.router.controllers @@ -1166,7 +1167,7 @@ class MapUrlOut(object): if (self.router.exclusive_domain and self.domain_application and self.domain_application != self.application and not self.host): raise SyntaxError('cross-domain conflict: must specify host') - lang = request and request.uri_language + lang = self.language if self.language else request and request.uri_language if lang and self.languages and lang in self.languages: self.language = lang else: @@ -1331,7 +1332,7 @@ def map_url_in(request, env, app=False): def map_url_out(request, env, application, controller, - function, args, other, scheme, host, port): + function, args, other, scheme, host, port, language=None): ''' supply /a/c/f (or /a/lang/c/f) portion of outgoing url @@ -1358,7 +1359,7 @@ def map_url_out(request, env, application, controller, We assume that language names do not collide with a/c/f names. ''' map = MapUrlOut(request, env, application, controller, - function, args, other, scheme, host, port) + function, args, other, scheme, host, port, language) return map.acf() diff --git a/gluon/tests/test_router.py b/gluon/tests/test_router.py index 81c8baff..111a930a 100644 --- a/gluon/tests/test_router.py +++ b/gluon/tests/test_router.py @@ -12,7 +12,7 @@ import logging if os.path.isdir('gluon'): sys.path.insert(0,os.path.realpath('gluon')) # running from web2py base else: - sys.path.insert(0,os.path.realpath('../')) # running from gluon/tests/ + sys.path.insert(0,os.path.realpath('../../')) # running from gluon/tests/ os.environ['web2py_path'] = os.path.realpath('../../') # for settings from gluon.rewrite import load, filter_url, filter_err, get_effective_router, map_url_out @@ -71,7 +71,7 @@ def setUpModule(): if not os.path.isdir('gluon'): os.chdir(os.path.realpath( '../../')) # run from web2py base directory - import main # for initialization after chdir + import gluon.main # for initialization after chdir global logger logger = logging.getLogger('web2py.rewrite') global_settings.applications_parent = tempfile.mkdtemp() @@ -1105,6 +1105,40 @@ class TestRouter(unittest.TestCase): self.assertEqual(filter_url('https://domain.com/welcome/ctr/fcn', lang='es', out=True), "/welcome/ctr/fcn") + self.assertEqual(filter_url('https://domain.com/admin/ctr/fcn', + language='en', out=True), "/ctr/fcn") + self.assertEqual(filter_url('https://domain.com/admin/ctr/fcn', + language='it', out=True), "/it/ctr/fcn") + self.assertEqual(filter_url('https://domain.com/admin/ctr/fcn', + language='it-it', out=True), "/it-it/ctr/fcn") + self.assertEqual(filter_url('https://domain.com/admin/static/file', + language='en', out=True), "/admin/en/static/file") + self.assertEqual(filter_url('https://domain.com/admin/static/file', + language='it', out=True), "/admin/it/static/file") + self.assertEqual(filter_url('https://domain.com/admin/static/file', + language='it-it', out=True), "/admin/it-it/static/file") + self.assertEqual(filter_url('https://domain.com/welcome/ctr/fcn', + language='it', out=True), "/welcome/ctr/fcn") + self.assertEqual(filter_url('https://domain.com/welcome/ctr/fcn', + language='es', out=True), "/welcome/ctr/fcn") + + self.assertEqual(filter_url('https://domain.com/admin/ctr/fcn', + lang='it', language='en', out=True), "/ctr/fcn") + self.assertEqual(filter_url('https://domain.com/admin/ctr/fcn', + lang='en', language='it', out=True), "/it/ctr/fcn") + self.assertEqual(filter_url('https://domain.com/admin/ctr/fcn', + lang='it', language='it-it', out=True), "/it-it/ctr/fcn") + self.assertEqual(filter_url('https://domain.com/admin/static/file', + lang='it', language='en', out=True), "/admin/en/static/file") + self.assertEqual(filter_url('https://domain.com/admin/static/file', + lang='it', language='it', out=True), "/admin/it/static/file") + self.assertEqual(filter_url('https://domain.com/admin/static/file', + lang='it', language='it-it', out=True), "/admin/it-it/static/file") + self.assertEqual(filter_url('https://domain.com/welcome/ctr/fcn', + lang='it', language='it', out=True), "/welcome/ctr/fcn") + self.assertEqual(filter_url('https://domain.com/welcome/ctr/fcn', + lang='it', language='es', out=True), "/welcome/ctr/fcn") + router_lang['admin']['map_static'] = True load(rdict=router_lang) self.assertEqual(filter_url('https://domain.com/admin/ctr/fcn', diff --git a/gluon/validators.py b/gluon/validators.py index b8c85fea..a00b8945 100644 --- a/gluon/validators.py +++ b/gluon/validators.py @@ -2258,9 +2258,11 @@ class IS_DATE(Validator): format = format.replace('%Y', y) if year < 1900: year = 2000 - d = datetime.date(year, value.month, value.day) if self.timezone is not None: + d = datetime.datetime(year, value.month, value.day) d = d.replace(tzinfo=utc).astimezone(self.timezone) + else: + d = datetime.date(year, value.month, value.day) return d.strftime(format)