misc: add tiny /r/{formdef-id}-{formdata-id} URL redirections (#48159)

This commit is contained in:
Frédéric Péters 2024-01-27 12:11:29 +01:00
parent 61fcfee1f5
commit 36cc71044c
2 changed files with 37 additions and 0 deletions

View File

@ -246,3 +246,18 @@ def test_postgresql_down(pub):
with mock.patch('psycopg2.connect', side_effect=psycopg2.OperationalError()):
resp = get_app(pub).get('/', status=503)
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()

View File

@ -171,6 +171,26 @@ class StaticsDirectory(Directory):
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):
_q_exports = [
'admin',
@ -193,6 +213,7 @@ class RootDirectory(Directory):
'fargo',
'static',
'actions',
('r', 'tiny_redirect'),
]
api = ApiDirectory()
@ -200,6 +221,7 @@ class RootDirectory(Directory):
fargo = portfolio.FargoDirectory()
static = StaticsDirectory()
actions = ActionsDirectory()
tiny_redirect = TinyRedirectDirectory()
forced_language = False