avoir des URLs raccourcies (#48159) #1076
|
@ -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()
|
||||
|
|
|
@ -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()
|
||||
|
|
|
@ -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)
|
||||
|
||||
|
|
22
wcs/root.py
22
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
|
||||
|
||||
|
|
|
@ -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)
|
||||
|
|
Loading…
Reference in New Issue