allow URL(...,language=...) with parametric router, thanks Jonathan
This commit is contained in:
@@ -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,
|
||||
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
@@ -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()
|
||||
|
||||
|
||||
|
||||
@@ -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
@@ -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)
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user