misc: add tiny /r/{formdef-id}-{formdata-id} URL redirections (#48159)
This commit is contained in:
parent
61fcfee1f5
commit
36cc71044c
|
@ -246,3 +246,18 @@ def test_postgresql_down(pub):
|
||||||
with mock.patch('psycopg2.connect', side_effect=psycopg2.OperationalError()):
|
with mock.patch('psycopg2.connect', side_effect=psycopg2.OperationalError()):
|
||||||
resp = get_app(pub).get('/', status=503)
|
resp = get_app(pub).get('/', status=503)
|
||||||
assert 'Error connecting to database' in resp.text
|
assert 'Error connecting to database' in resp.text
|
||||||
|
|
||||||
|
|
||||||
|
def test_short_url_redirect(pub, formdef1):
|
||||||
|
formdata = formdef1.data_class()()
|
||||||
|
formdata.just_created()
|
||||||
|
formdata.store()
|
||||||
|
|
||||||
|
app = get_app(pub)
|
||||||
|
app.get('/r/xxx', status=404)
|
||||||
|
app.get('/r/300', status=404)
|
||||||
|
app.get('/r/300-100', status=404)
|
||||||
|
resp = app.get(f'/r/{formdef1.id}', status=302)
|
||||||
|
assert resp.location == formdef1.get_url()
|
||||||
|
resp = app.get(f'/r/{formdef1.id}-{formdata.id}', status=302)
|
||||||
|
assert resp.location == formdata.get_url()
|
||||||
|
|
22
wcs/root.py
22
wcs/root.py
|
@ -171,6 +171,26 @@ class StaticsDirectory(Directory):
|
||||||
raise errors.TraversalError()
|
raise errors.TraversalError()
|
||||||
|
|
||||||
|
|
||||||
|
class TinyRedirectDirectory(Directory):
|
||||||
|
def _q_lookup(self, component):
|
||||||
|
formdata_match = re.match('^([1-9][0-9]*)-([1-9][0-9]*)$', component)
|
||||||
|
formdef_match = re.match('^([1-9][0-9]*)$', component)
|
||||||
|
if formdata_match:
|
||||||
|
formdef_id, formdata_id = formdata_match.groups()
|
||||||
|
elif formdef_match:
|
||||||
|
formdef_id, formdata_id = formdef_match.groups()[0], None
|
||||||
|
else:
|
||||||
|
raise errors.TraversalError()
|
||||||
|
try:
|
||||||
|
formdef = FormDef.get(formdef_id)
|
||||||
|
except KeyError:
|
||||||
|
raise errors.TraversalError()
|
||||||
|
if formdata_id:
|
||||||
|
return redirect(formdef.get_url() + f'{formdata_id}/')
|
||||||
|
else:
|
||||||
|
return redirect(formdef.get_url())
|
||||||
|
|
||||||
|
|
||||||
class RootDirectory(Directory):
|
class RootDirectory(Directory):
|
||||||
_q_exports = [
|
_q_exports = [
|
||||||
'admin',
|
'admin',
|
||||||
|
@ -193,6 +213,7 @@ class RootDirectory(Directory):
|
||||||
'fargo',
|
'fargo',
|
||||||
'static',
|
'static',
|
||||||
'actions',
|
'actions',
|
||||||
|
('r', 'tiny_redirect'),
|
||||||
]
|
]
|
||||||
|
|
||||||
api = ApiDirectory()
|
api = ApiDirectory()
|
||||||
|
@ -200,6 +221,7 @@ class RootDirectory(Directory):
|
||||||
fargo = portfolio.FargoDirectory()
|
fargo = portfolio.FargoDirectory()
|
||||||
static = StaticsDirectory()
|
static = StaticsDirectory()
|
||||||
actions = ActionsDirectory()
|
actions = ActionsDirectory()
|
||||||
|
tiny_redirect = TinyRedirectDirectory()
|
||||||
|
|
||||||
forced_language = False
|
forced_language = False
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue