allow URL(...,language=...) with parametric router, thanks Jonathan

This commit is contained in:
mdipierro
2014-01-14 22:17:28 -06:00
parent 391bdf5cd4
commit 34bbb376be
5 changed files with 52 additions and 14 deletions
+1 -1
View File
@@ -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
+3 -2
View File
@@ -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
+9 -8
View File
@@ -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()
+36 -2
View File
@@ -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',
+3 -1
View File
@@ -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)