avoir des URLs raccourcies (#48159) #1076

Merged
fpeters merged 2 commits from wip/48159-tiny-url into main 2024-01-29 14:45:45 +01:00
5 changed files with 78 additions and 1 deletions

View File

@ -846,6 +846,7 @@ def test_lazy_formdata(pub, variable_test_data):
assert lazy_formdata.backoffice_submission_url == formdef.get_backoffice_submission_url()
assert lazy_formdata.frontoffice_submission_url == formdef.get_url()
assert lazy_formdata.api_url == formdata.get_api_url()
assert lazy_formdata.short_url == formdata.get_short_url()
assert lazy_formdata.attachments
assert lazy_formdata.geoloc['base'] == {'lat': 1, 'lon': 2}
assert lazy_formdata.geoloc['base_lon'] == 2
@ -5748,3 +5749,29 @@ def test_reverse_links(pub):
assert context['form_reverse_links_formdef_foobar_bar_1_form_internal_id'] == formdata2.id
assert len(context['form_reverse_links_carddef_card_2_foo']) == 1
assert context['form_reverse_links_carddef_card_2_foo_0_form_internal_id'] == carddata2.id
def test_no_short_url(pub):
CardDef.wipe()
carddef = CardDef()
carddef.name = 'card'
carddef.store()
carddata = carddef.data_class()()
carddata.just_created()
carddata.store()
lazy_carddata = LazyFormData(carddata)
assert 'short_url' not in lazy_carddata.inspect_keys()
FormDef.wipe()
formdef = FormDef()
formdef.name = 'form'
formdef.store()
formdata = formdef.data_class()()
lazy_formdata = LazyFormData(formdata)
assert 'short_url' not in lazy_formdata.inspect_keys()
formdata.just_created()
formdata.store()
assert 'short_url' in lazy_formdata.inspect_keys()

View File

@ -246,3 +246,21 @@ 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()
assert formdata.get_short_url() == f'http://example.net/r/{formdef1.id}-{formdata.id}'
resp = app.get(formdata.get_short_url(), status=302)
assert resp.location == formdata.get_url()

View File

@ -899,6 +899,10 @@ class FormData(StorableObject):
token.store()
return urllib.parse.urljoin(get_publisher().get_frontoffice_url(), f'/code/{token.id}/load')
def get_short_url(self):
assert self.id
return urllib.parse.urljoin(get_publisher().get_frontoffice_url(), f'/r/{self.formdef.id}-{self.id}')
def get_display_id(self):
return str(self.id_display or self.id)

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

View File

@ -765,7 +765,9 @@ class LazyFormData(LazyFormDef):
self._formdata = formdata
def inspect_keys(self):
hidden_keys = ('field', 'inspect_keys', 'page_no', 'formdef', 'objects')
hidden_keys = {'field', 'inspect_keys', 'page_no', 'formdef', 'objects'}
if self.type != 'formdef' or not self._formdata.id:
hidden_keys.add('short_url')
for key in dir(self):
if key[0] == '_' or key in hidden_keys:
continue
@ -831,6 +833,10 @@ class LazyFormData(LazyFormDef):
def api_url(self):
return self._formdata.get_api_url()
@property
def short_url(self):
return self._formdata.get_short_url()
@property
def uri(self):
return '%s/%s/' % (self._formdef.url_name, self._formdata.id)