backoffice: redirect to all fields view when page field is removed (#64336)

This commit is contained in:
Frédéric Péters 2022-04-20 09:56:29 +02:00
parent 84554d0572
commit c36375b568
2 changed files with 23 additions and 3 deletions

View File

@ -2655,6 +2655,7 @@ def test_form_limit_display_to_page(pub):
fields.PageField(id='2', label='2nd page', type='page'),
fields.StringField(id='3', label='string 2', type='string', varname='baz'),
fields.PageField(id='4', label='3rd page', type='page'),
fields.StringField(id='5', label='string 3', type='string', varname='baz2'),
]
formdef.store()
@ -2679,6 +2680,19 @@ def test_form_limit_display_to_page(pub):
assert not resp.pyquery('.form-pages-navigation a:first-child').hasClass('disabled')
assert resp.pyquery('.form-pages-navigation a:last-child').hasClass('disabled')
# remove field on current page
resp = resp.click(href='5/delete')
resp = resp.forms[0].submit()
assert resp.location == 'http://example.net/backoffice/forms/%s/fields/pages/4/#itemId_4' % formdef.id
resp = resp.follow()
# remove current page itself
resp = resp.click(href='4/delete')
resp = resp.forms[0].submit()
assert resp.location == 'http://example.net/backoffice/forms/%s/fields/#itemId_3' % formdef.id
# visit a page that doesn't exist
app.get('/backoffice/forms/1/fields/pages/123/', status=404)
def test_form_page_field_condition_types(pub):
create_superuser(pub)

View File

@ -131,9 +131,12 @@ class FieldDefPage(Directory):
def redirect_field_anchor(self, field):
anchor = '#itemId_%s' % field.id if field else ''
if self.page_id:
return redirect('../%s' % anchor)
else:
return redirect('../../fields/%s' % anchor)
# check page_id is (still) a valid page number
if self.page_id in (x.id for x in self.objectdef.fields):
return redirect('../%s' % anchor)
else:
return redirect('../../../%s' % anchor)
return redirect('../../fields/%s' % anchor)
def delete(self):
form = Form(enctype='multipart/form-data')
@ -327,6 +330,9 @@ class FieldsDirectory(Directory):
r += self.index_top()
ignore_hard_limits = get_publisher().has_site_option('ignore-hard-limits', default=True)
if self.page_id and self.page_id not in (x.id for x in self.objectdef.fields or []):
raise errors.TraversalError()
if self.objectdef.fields:
if len(self.objectdef.fields) >= self.fields_count_total_hard_limit:
r += htmltext('<div class="errornotice">')