misc: limit length of form titles (#75596) #186

Merged
fpeters merged 1 commits from wip/75596-max-title-length into main 2023-03-24 09:47:41 +01:00
3 changed files with 27 additions and 8 deletions

View File

@ -85,6 +85,13 @@ def test_forms_new(pub):
assert formdef.fields == []
assert formdef.disabled is True
# check max title length
resp = app.get('/backoffice/forms/')
resp = resp.click('New Form')
resp.forms[0]['name'] = 'form title ' * 30
resp = resp.forms[0].submit()
assert resp.pyquery('#form_error_name').text() == 'Too long, value must be at most 250 characters.'
# check workflow selection is available when there are workflows
Workflow.wipe()
workflow = Workflow(name='Workflow One')

View File

@ -130,7 +130,9 @@ class FormDefUI:
formdef = self.formdef
else:
formdef = self.formdef_class()
form.add(StringWidget, 'name', title=_('Name'), required=True, size=40, value=formdef.name)
form.add(
StringWidget, 'name', title=_('Name'), required=True, size=40, value=formdef.name, maxlength=250
)
categories = self.get_categories()
if categories:
if is_global_accessible(self.section):
@ -1073,7 +1075,14 @@ class FormDefPage(Directory):
# if name and url name are in sync, keep them that way
kwargs['data-slug-sync'] = 'url_name'
form.add(
StringWidget, 'name', title=_('Name'), required=True, size=40, value=self.formdef.name, **kwargs
StringWidget,
'name',
title=_('Name'),
required=True,
size=40,
value=self.formdef.name,
maxlength=250,
**kwargs,
)
disabled_url_name = bool(self.formdef.data_class().count())
@ -1260,7 +1269,7 @@ class FormDefPage(Directory):
def duplicate(self):
form = Form(enctype='multipart/form-data')
name_widget = form.add(StringWidget, 'name', title=_('Name'), required=True, size=30)
name_widget = form.add(StringWidget, 'name', title=_('Name'), required=True, size=30, maxlength=250)
form.add_submit('submit', _('Submit'))
form.add_submit('cancel', _('Cancel'))
if form.get_widget('cancel').parse():

View File

@ -569,6 +569,7 @@ class StringWidget(QuixoteStringWidget):
del kwargs['readonly']
elif 'readonly' in kwargs:
kwargs['readonly'] = 'readonly'
self.maxlength = kwargs.get('maxlength', None)
self.validation_function = kwargs.pop('validation_function', None)
super().__init__(name, *args, **kwargs)
@ -576,11 +577,13 @@ class StringWidget(QuixoteStringWidget):
QuixoteStringWidget._parse(self, request)
if self.value:
self.value = self.value.strip()
if self.value and self.validation_function:
try:
self.validation_function(self.value)
except ValueError as e:
self.error = str(e)
if self.maxlength and len(self.value) > self.maxlength:
self.error = _('Too long, value must be at most %d characters.') % self.maxlength
elif self.validation_function:
try:
self.validation_function(self.value)
except ValueError as e:
self.error = str(e)
def render_content(self):
attrs = {'id': 'form_' + self.get_name_for_id()}