From 36cc71044cfdb98a20f4421161c97aa291cb01ca Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20P=C3=A9ters?= Date: Sat, 27 Jan 2024 12:11:29 +0100 Subject: [PATCH] misc: add tiny /r/{formdef-id}-{formdata-id} URL redirections (#48159) --- tests/test_rootdirectory.py | 15 +++++++++++++++ wcs/root.py | 22 ++++++++++++++++++++++ 2 files changed, 37 insertions(+) diff --git a/tests/test_rootdirectory.py b/tests/test_rootdirectory.py index f9286f0e8..4dbf5f78b 100644 --- a/tests/test_rootdirectory.py +++ b/tests/test_rootdirectory.py @@ -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() diff --git a/wcs/root.py b/wcs/root.py index 02665d6aa..7be9c8be7 100644 --- a/wcs/root.py +++ b/wcs/root.py @@ -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