allow URL(...,language=...) with parametric router, thanks Jonathan
This commit is contained in:
1 parent
391bdf5cd4
commit
34bbb376be
5 files changed
+52
-14
No files matched your search
@@ -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
@@ -160,7 +160,8 @@ def URL(
|
|||||||
host=None,
|
host=None,
|
||||||
port=None,
|
port=None,
|
||||||
encode_embedded_slash=False,
|
encode_embedded_slash=False,
|
||||||
url_encode=True
|
url_encode=True,
|
||||||
|
language=None,
|
||||||
):
|
):
|
||||||
"""
|
"""
|
||||||
generate a URL
|
generate a URL
|
||||||
@@ -369,7 +370,7 @@ def URL(
|
|||||||
raise SyntaxError('CRLF Injection Detected')
|
raise SyntaxError('CRLF Injection Detected')
|
||||||
|
|
||||||
url = url_out(r, env, application, controller, function,
|
url = url_out(r, env, application, controller, function,
|
||||||
args, other, scheme, host, port)
|
args, other, scheme, host, port, language=language)
|
||||||
return url
|
return url
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
+9
-8
@@ -188,11 +188,11 @@ def url_in(request, environ):
|
|||||||
|
|
||||||
|
|
||||||
def url_out(request, environ, application, controller, function,
|
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"
|
"assemble and rewrite outgoing URL"
|
||||||
if routers:
|
if routers:
|
||||||
acf = map_url_out(request, environ, application, controller,
|
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)
|
url = '%s%s' % (acf, other)
|
||||||
else:
|
else:
|
||||||
url = '/%s/%s/%s%s' % (application, controller, function, other)
|
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',
|
def filter_url(url, method='get', remote='0.0.0.0',
|
||||||
out=False, app=False, lang=None,
|
out=False, app=False, lang=None,
|
||||||
domain=(None, None), env=False, scheme=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()
|
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:
|
if not routers:
|
||||||
return regex_filter_out(uri, e)
|
return regex_filter_out(uri, e)
|
||||||
acf = map_url_out(
|
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:
|
if items:
|
||||||
url = '%s/%s' % (acf, '/'.join(items))
|
url = '%s/%s' % (acf, '/'.join(items))
|
||||||
if items[-1] == '':
|
if items[-1] == '':
|
||||||
@@ -1125,7 +1125,7 @@ class MapUrlOut(object):
|
|||||||
"logic for mapping outgoing URLs"
|
"logic for mapping outgoing URLs"
|
||||||
|
|
||||||
def __init__(self, request, env, application, controller,
|
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"
|
"initialize a map-out object"
|
||||||
self.default_application = routers.BASE.default_application
|
self.default_application = routers.BASE.default_application
|
||||||
if application in routers:
|
if application in routers:
|
||||||
@@ -1144,6 +1144,7 @@ class MapUrlOut(object):
|
|||||||
self.scheme = scheme
|
self.scheme = scheme
|
||||||
self.host = host
|
self.host = host
|
||||||
self.port = port
|
self.port = port
|
||||||
|
self.language = language
|
||||||
|
|
||||||
self.applications = routers.BASE.applications
|
self.applications = routers.BASE.applications
|
||||||
self.controllers = self.router.controllers
|
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):
|
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')
|
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:
|
if lang and self.languages and lang in self.languages:
|
||||||
self.language = lang
|
self.language = lang
|
||||||
else:
|
else:
|
||||||
@@ -1331,7 +1332,7 @@ def map_url_in(request, env, app=False):
|
|||||||
|
|
||||||
|
|
||||||
def map_url_out(request, env, application, controller,
|
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
|
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.
|
We assume that language names do not collide with a/c/f names.
|
||||||
'''
|
'''
|
||||||
map = MapUrlOut(request, env, application, controller,
|
map = MapUrlOut(request, env, application, controller,
|
||||||
function, args, other, scheme, host, port)
|
function, args, other, scheme, host, port, language)
|
||||||
return map.acf()
|
return map.acf()
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -12,7 +12,7 @@ import logging
|
|||||||
if os.path.isdir('gluon'):
|
if os.path.isdir('gluon'):
|
||||||
sys.path.insert(0,os.path.realpath('gluon')) # running from web2py base
|
sys.path.insert(0,os.path.realpath('gluon')) # running from web2py base
|
||||||
else:
|
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
|
os.environ['web2py_path'] = os.path.realpath('../../') # for settings
|
||||||
|
|
||||||
from gluon.rewrite import load, filter_url, filter_err, get_effective_router, map_url_out
|
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'):
|
if not os.path.isdir('gluon'):
|
||||||
os.chdir(os.path.realpath(
|
os.chdir(os.path.realpath(
|
||||||
'../../')) # run from web2py base directory
|
'../../')) # run from web2py base directory
|
||||||
import main # for initialization after chdir
|
import gluon.main # for initialization after chdir
|
||||||
global logger
|
global logger
|
||||||
logger = logging.getLogger('web2py.rewrite')
|
logger = logging.getLogger('web2py.rewrite')
|
||||||
global_settings.applications_parent = tempfile.mkdtemp()
|
global_settings.applications_parent = tempfile.mkdtemp()
|
||||||
@@ -1105,6 +1105,40 @@ class TestRouter(unittest.TestCase):
|
|||||||
self.assertEqual(filter_url('https://domain.com/welcome/ctr/fcn',
|
self.assertEqual(filter_url('https://domain.com/welcome/ctr/fcn',
|
||||||
lang='es', out=True), "/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
|
router_lang['admin']['map_static'] = True
|
||||||
load(rdict=router_lang)
|
load(rdict=router_lang)
|
||||||
self.assertEqual(filter_url('https://domain.com/admin/ctr/fcn',
|
self.assertEqual(filter_url('https://domain.com/admin/ctr/fcn',
|
||||||
|
|||||||
+3
-1
@@ -2258,9 +2258,11 @@ class IS_DATE(Validator):
|
|||||||
format = format.replace('%Y', y)
|
format = format.replace('%Y', y)
|
||||||
if year < 1900:
|
if year < 1900:
|
||||||
year = 2000
|
year = 2000
|
||||||
d = datetime.date(year, value.month, value.day)
|
|
||||||
if self.timezone is not None:
|
if self.timezone is not None:
|
||||||
|
d = datetime.datetime(year, value.month, value.day)
|
||||||
d = d.replace(tzinfo=utc).astimezone(self.timezone)
|
d = d.replace(tzinfo=utc).astimezone(self.timezone)
|
||||||
|
else:
|
||||||
|
d = datetime.date(year, value.month, value.day)
|
||||||
return d.strftime(format)
|
return d.strftime(format)
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Reference in new issue
Block a user