misc: limit length of form titles (#75596) #186
|
@ -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')
|
||||
|
|
|
@ -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():
|
||||
|
|
|
@ -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()}
|
||||
|
|
Loading…
Reference in New Issue