misc: update default validation error messages (#76350) #693

Merged
fpeters merged 2 commits from wip/76350-new-validation-error-messages into main 2023-09-19 13:24:21 +02:00
9 changed files with 161 additions and 87 deletions

View File

@ -2266,7 +2266,7 @@ def test_form_edit_string_field_validation(pub):
# check default error message is not saved
resp.form['validation$value_django'] = ''
resp.form['validation$type'] = 'time'
resp.form['validation$error_message'] = 'Invalid time'
resp.form['validation$error_message'] = 'You should enter a valid time, between 00:00 and 23:59.'
resp = resp.form.submit('submit').follow()
assert FormDef.get(formdef.id).fields[0].validation == {
'type': 'time',

View File

@ -469,16 +469,25 @@ def test_tests_edit_data_mark_as_failing(pub):
# other error
resp.forms[0]['f1'] = 'abcdefg'
resp = resp.forms[0].submit('submit')
assert 'If test should fail on error "Only digits are allowed", click button below.' in resp.text
assert (
'If test should fail on error "You should enter digits only, for example: 123.", click button below.'
in resp.text
)
assert 'Mark as failing' in resp.text
# click mark as failing button
resp = resp.forms[1].submit().follow()
assert 'abcdefg' in resp.text
assert escape('This test is expected to fail on error "Only digits are allowed".') in resp.text
assert (
escape('This test is expected to fail on error "You should enter digits only, for example: 123.".')
in resp.text
)
resp = resp.click('Edit data')
assert 'This test is expected to fail on error "Only digits are allowed".' in resp.text
assert (
'This test is expected to fail on error "You should enter digits only, for example: 123.".'
in resp.text
)
resp.form['f1'] = '1234567'
resp = resp.form.submit('submit').follow()
@ -520,7 +529,10 @@ def test_tests_edit_data_mark_as_failing_hidden_error(pub):
resp = app.get('/backoffice/forms/1/tests/%s/edit-data/' % testdef.id)
resp = resp.form.submit('submit')
assert 'If test should fail on error "Only digits are allowed", click button below.' in resp.text
assert (
'If test should fail on error "You should enter digits only, for example: 123.", click button below.'
in resp.text
)
def test_tests_edit_data_mark_as_failing_required_field(pub):
@ -560,7 +572,10 @@ def test_tests_edit_data_mark_as_failing_required_field(pub):
resp = resp.form.submit('submit')
assert resp.pyquery('#form_error_f1').text() == 'required field'
assert 'Mark as failing' in resp.text
assert 'If test should fail on error "Only digits are allowed", click button below.' in resp.text
assert (
'If test should fail on error "You should enter digits only, for example: 123.", click button below.'
in resp.text
)
def test_tests_edit_data_is_in_backoffice(pub):
@ -705,7 +720,7 @@ def test_tests_manual_run(pub):
resp = resp.click('#%s' % result.id)
assert 'Started by: Manual run.' in resp.text
assert 'Success!' not in resp.text
assert 'Only digits are allowed.' in resp.text
assert 'You should enter digits only, for example: 123.' in resp.text
assert 'disabled' not in resp.text
TestDef.remove_object(testdef.id)
@ -744,7 +759,7 @@ def test_tests_run_order(pub):
resp = app.get('/backoffice/forms/1/tests/results/')
resp = resp.click('Run tests').follow()
assert resp.text.count('Success!') == 1
assert resp.text.count('Only digits are allowed') == 1
assert resp.text.count('You should enter digits only, for example: 123.') == 1
assert resp.text.index('Failing test') < resp.text.index('Passing test')

View File

@ -62,7 +62,7 @@ def test_backoffice_filter(pub):
resp.forms['listing-settings']['filter-start'].checked = True
resp = resp.forms['listing-settings'].submit()
assert resp.text.count('>invalid date<') == 1 # only the one from <template>
assert resp.text.count('>You should enter a valid date.<') == 1 # only the one from <template>
resp.forms['listing-settings']['filter-start-value'] = datetime.datetime(2015, 2, 1).strftime('%Y-%m-%d')
resp = resp.forms['listing-settings'].submit()
assert resp.text.count('<td>baz</td>') == 0

View File

@ -2317,7 +2317,11 @@ def test_field_live_validation(pub):
resp.form['f1'] = 'abc'
live_resp = app.post(url + '?field=f1', params=resp.form.submit_fields())
assert live_resp.json == {'err': 1, 'msg': 'Only digits are allowed', 'badInput': True}
assert live_resp.json == {
'err': 1,
'msg': 'You should enter digits only, for example: 123.',
'badInput': True,
}
def test_block_field_live_validation(pub):
@ -2353,7 +2357,11 @@ def test_block_field_live_validation(pub):
resp.form['f2$element0$f1'] = 'abc'
live_resp = app.post(url + '?field=f2__element0__f1', params=resp.form.submit_fields())
assert live_resp.json == {'err': 1, 'msg': 'Only digits are allowed', 'badInput': True}
assert live_resp.json == {
'err': 1,
'msg': 'You should enter digits only, for example: 123.',
'badInput': True,
}
live_resp = app.post(url + '?field=f2__element0__fX', params=resp.form.submit_fields())
assert live_resp.json == {'err': 2, 'msg': 'unknown sub field'}

View File

@ -306,7 +306,8 @@ def test_validation_string_field(pub):
with pytest.raises(TestError) as excinfo:
testdef.run(formdef)
assert (
str(excinfo.value) == 'Invalid value "xxx" for field "String field digits": Only digits are allowed.'
str(excinfo.value)
== 'Invalid value "xxx" for field "String field digits": You should enter digits only, for example: 123.'
)
@ -643,7 +644,10 @@ def test_validation_email_field(pub):
testdef = TestDef.create_from_formdata(formdef, formdata)
with pytest.raises(TestError) as excinfo:
testdef.run(formdef)
assert str(excinfo.value) == 'Invalid value "xxx" for field "Test": must be a valid email address.'
assert (
str(excinfo.value)
== 'Invalid value "xxx" for field "Test": You should enter a valid email address, for example name@example.com.'
)
def test_validation_boolean_field(pub):
@ -691,7 +695,7 @@ def test_validation_date_field(pub):
testdef = TestDef.create_from_formdata(formdef, formdata)
with pytest.raises(TestError) as excinfo:
testdef.run(formdef)
assert str(excinfo.value) == 'Invalid value "1312-01-01" for field "Test": invalid date.'
assert str(excinfo.value) == 'Invalid value "1312-01-01" for field "Test": You should enter a valid date.'
def test_validation_map_field(pub):
@ -769,7 +773,7 @@ def test_validation_file_field(pub):
testdef = TestDef.create_from_formdata(formdef, formdata)
with pytest.raises(TestError) as excinfo:
testdef.run(formdef)
assert str(excinfo.value) == 'Invalid value "hop.pdf" for field "File": forbidden file type.'
assert str(excinfo.value) == 'Invalid value "hop.pdf" for field "File": forbidden file type'
def test_validation_block_field(pub):
@ -1029,7 +1033,7 @@ def test_expected_error(pub):
formdata.data['1'] = 'abcdef'
testdef = TestDef.create_from_formdata(formdef, formdata)
testdef.expected_error = 'Only digits are allowed'
testdef.expected_error = 'You should enter digits only, for example: 123.'
testdef.run(formdef)
@ -1057,19 +1061,22 @@ def test_expected_error_conditional_field(pub):
testdef = TestDef.create_from_formdata(formdef, formdata)
with pytest.raises(TestError) as excinfo:
testdef.run(formdef)
assert str(excinfo.value) == 'Invalid value "b" for field "Text 2": Only digits are allowed.'
assert (
str(excinfo.value)
== 'Invalid value "b" for field "Text 2": You should enter digits only, for example: 123.'
)
testdef = TestDef.create_from_formdata(formdef, formdata)
testdef.expected_error = 'Only digits are allowed'
testdef.expected_error = 'You should enter digits only, for example: 123.'
testdef.run(formdef)
formdata.data['1'] = 'b'
testdef = TestDef.create_from_formdata(formdef, formdata)
testdef.expected_error = 'Only digits are allowed'
testdef.expected_error = 'You should enter digits only, for example: 123.'
with pytest.raises(TestError) as excinfo:
testdef.run(formdef)
assert str(excinfo.value) == (
'Expected error "Only digits are allowed" but got error "Tried to fill field "Text 2" on '
'Expected error "You should enter digits only, for example: 123." but got error "Tried to fill field "Text 2" on '
'page 1 but it is hidden." instead.'
)

View File

@ -891,7 +891,7 @@ def test_wcsextrastringwidget_builtin_validation():
widget.field = fakefield
mock_form_submission(req, widget, {'test': 'az'})
assert widget.has_error()
assert widget.error == 'Only digits are allowed'
assert widget.error == 'You should enter digits only, for example: 123.'
fakefield.validation = {'type': 'zipcode-fr'}
widget = WcsExtraStringWidget('test', value='foo', required=False)
@ -903,7 +903,7 @@ def test_wcsextrastringwidget_builtin_validation():
widget.field = fakefield
mock_form_submission(req, widget, {'test': '1234'})
assert widget.has_error()
assert widget.error == 'Invalid zip code'
assert widget.error == 'You should enter a 5-digits zip code, for example 75014.'
def test_wcsextrastringwidget_phone():
@ -925,7 +925,7 @@ def test_wcsextrastringwidget_phone():
widget.field = fakefield
mock_form_submission(req, widget, {'test': invalid_case})
assert widget.has_error()
assert widget.error == 'Invalid phone number'
assert widget.error == 'You should enter a valid phone number.'
# and check it gets a special HTML input type
widget = WcsExtraStringWidget('test', value='foo', required=False)
@ -955,7 +955,7 @@ def test_wcsextrastringwidget_phone_fr():
widget.field = fakefield
mock_form_submission(req, widget, {'test': 'az'})
assert widget.has_error()
assert widget.error == 'Invalid phone number'
assert widget.error == 'You should enter a valid 10-digits phone number, for example 06 39 98 89 93.'
widget = WcsExtraStringWidget('test', value='foo', required=False)
widget.field = fakefield
@ -988,14 +988,14 @@ def test_wcsextrastringwidget_mobile_local():
widget.field = fakefield
mock_form_submission(req, widget, {'test': '01 23 45 67 89'})
assert widget.has_error()
assert widget.error == 'Invalid phone number'
assert widget.error == 'You should enter a valid mobile phone number.'
# extra characters
widget = WcsExtraStringWidget('test', value='foo', required=False)
widget.field = fakefield
mock_form_submission(req, widget, {'test': '06 30 98 67 89 abc'})
assert widget.has_error()
assert widget.error == 'Invalid phone number'
assert widget.error == 'You should enter a valid mobile phone number.'
pub.load_site_options()
if not pub.site_options.has_section('options'):
@ -1043,7 +1043,7 @@ def test_wcsextrastringwidget_siren_validation():
widget.field = fakefield
mock_form_submission(req, widget, {'test': '443170130'})
assert widget.has_error()
assert widget.error == 'Invalid SIREN code'
assert widget.error == 'You should enter a valid 9-digits SIREN code, for example 443170139.'
assert widget.value == '443170130'
widget = WcsExtraStringWidget('test', value='foo', required=False)
@ -1104,7 +1104,7 @@ def test_wcsextrastringwidget_siret_validation():
widget.field = fakefield
mock_form_submission(req, widget, {'test': '44317013900037'})
assert widget.has_error()
assert widget.error == 'Invalid SIRET code'
assert widget.error == 'You should enter a valid 14-digits SIRET code, for example 44317013900036.'
assert widget.value == '44317013900037'
widget = WcsExtraStringWidget('test', value='foo', required=False)
@ -1165,7 +1165,10 @@ def test_wcsextrastringwidget_nir_validation():
widget.field = fakefield
mock_form_submission(req, widget, {'test': '42'})
assert widget.has_error()
assert widget.error == 'Invalid NIR'
assert (
widget.error
== 'You should enter a valid 15-digits social security number, for example 294037512000522.'
)
assert widget.value == '42'
widget = WcsExtraStringWidget('test', value='foo', required=False)
@ -1282,7 +1285,10 @@ def test_wcsextrastringwidget_iban_validation():
widget.field = fakefield
mock_form_submission(req, widget, {'test': iban.replace(' ', '')})
assert widget.has_error()
assert widget.error == 'Invalid IBAN'
assert (
widget.error
== 'You should enter a valid IBAN code, it should have between 14 and 34 characters, for example FR7600001000010000000000101.'
)
def test_wcsextrastringwidget_time():
@ -1304,7 +1310,7 @@ def test_wcsextrastringwidget_time():
widget.field = fakefield
mock_form_submission(req, widget, {'test': invalid_case})
assert widget.has_error()
assert widget.error == 'Invalid time'
assert widget.error == 'You should enter a valid time, between 00:00 and 23:59.'
# and check it gets a special HTML input type
widget = WcsExtraStringWidget('test', value='foo', required=False)

View File

@ -6536,92 +6536,117 @@ msgid "forbidden file type"
msgstr "type de fichier interdit"
#: qommon/form.py
msgid "must be a valid email address"
msgstr "doit être une adresse électronique valide"
msgid "You should enter a valid email address, for example name@example.com."
msgstr "Veuillez saisir une adresse électronique, par exemple nom@example.com."
#: qommon/form.py
msgid "invalid address domain"
msgstr "domaine de ladresse invalide"
msgid "Invalid address domain, you should check it and try again."
msgstr ""
"Le domaine de ladresse nest pas valide. Veuillez vérifier et réessayer."
#: qommon/form.py
msgid "Digits"
msgstr "Chiffres"
#: qommon/form.py
msgid "Only digits are allowed"
msgstr "Seuls des chiffres sont autorisés"
msgid "You should enter digits only, for example: 123."
msgstr "Veuillez ne saisir que des chiffres, par exemple 123."
#: qommon/form.py
msgid "Phone Number"
msgstr "Numéro de téléphone"
#: qommon/form.py
msgid "Invalid phone number"
msgstr "Numéro de téléphone invalide"
msgid "You should enter a valid phone number."
msgstr "Veuillez saisir un numéro de téléphone valide."
#: qommon/form.py
msgid "Phone Number (France)"
msgstr "Numéro de téléphone (France)"
#: qommon/form.py
msgid ""
"You should enter a valid 10-digits phone number, for example 06 39 98 89 93."
msgstr ""
"Veuillez saisir un numéro de téléphone à 10 chiffres, par exemple 06 39 98 "
"89 93."
#: qommon/form.py
msgid "Mobile Phone Number (local)"
msgstr "Numéro de téléphone mobile (local)"
#: qommon/form.py
msgid "You should enter a valid mobile phone number."
msgstr "Veuillez saisir un numéro de téléphone mobile valide."
#: qommon/form.py
msgid "Zip Code (France)"
msgstr "Code postal (France)"
#: qommon/form.py
msgid "Invalid zip code"
msgstr "Code postal invalide"
msgid "You should enter a 5-digits zip code, for example 75014."
msgstr "Veuillez saisir un code postal à 5 chiffres, par exemple 75014."
#: qommon/form.py
msgid "SIREN Code (France)"
msgstr "Code SIREN (France)"
#: qommon/form.py
msgid "Invalid SIREN code"
msgstr "Code SIREN invalide"
msgid "You should enter a valid 9-digits SIREN code, for example 443170139."
msgstr "Veuillez saisir un SIREN à 9 chiffres, par exemple 443170139."
#: qommon/form.py
msgid "SIRET Code (France)"
msgstr "Code SIRET (France)"
#: qommon/form.py
msgid "Invalid SIRET code"
msgstr "Code SIRET invalide"
msgid ""
"You should enter a valid 14-digits SIRET code, for example 44317013900036."
msgstr "Veuillez saisir un SIRET à 14 chiffres, par exemple 44317013900036."
#: qommon/form.py
msgid "NIR (France)"
msgstr "Numéro de sécurité sociale / NIR (France)"
#: qommon/form.py
msgid "Invalid NIR"
msgstr "Numéro de sécurité sociale invalide"
msgid ""
"You should enter a valid 15-digits social security number, for example "
"294037512000522."
msgstr ""
"Veuillez saisir un numéro de sécurité sociale à 15 chiffres, par exemple "
"294037512000522."
#: qommon/form.py
msgid "National register number (Belgium)"
msgstr "Numéro au registre national (Belgique)"
#: qommon/form.py
msgid "Invalid national register number"
msgstr "Numéro au registre national invalide"
msgid ""
"You should enter a valid 11-digits national register number, for example "
"85073003328."
msgstr ""
"Veuillez saisir un numéro de registre national à 11 chiffres, par exemple "
"85073003328."
#: qommon/form.py
msgid "IBAN"
msgstr "IBAN"
#: qommon/form.py
msgid "Invalid IBAN"
msgstr "IBAN invalide"
msgid ""
"You should enter a valid IBAN code, it should have between 14 and 34 "
"characters, for example FR7600001000010000000000101."
msgstr ""
"Veuillez saisir un IBAN composé d'au moins 14 et de maximum 34 caractères "
"alphanumériques, par exemple FR7600001000010000000000101."
Outdated
Review

J'aurais pas ajouté «alphanumériques» parce que personne ne sait ce que ça veut dire.

J'aurais pas ajouté «alphanumériques» parce que personne ne sait ce que ça veut dire.

J'ai repris le message d'Anaïs.

J'ai repris le message d'Anaïs.
#: qommon/form.py
msgid "Time"
msgstr "Heure"
#: qommon/form.py
msgid "Invalid time"
msgstr "Heure invalide"
msgid "You should enter a valid time, between 00:00 and 23:59."
msgstr "Veuillez saisir une heure comprise entre 00:00 et 23:59."
#: qommon/form.py
msgid "Regular Expression"
@ -6648,22 +6673,20 @@ msgid "invalid value"
msgstr "valeur invalide"
#: qommon/form.py
msgid "invalid date"
msgstr "date invalide"
msgid "You should enter a valid date."
msgstr "Veuillez saisir une date valide"
#: qommon/form.py
#, python-format
msgid "invalid date: date must be on or after %s"
msgstr "date invalide : la date doit être postérieure ou égale à %s"
msgid "You should enter a valid date. It must be on or after %s."
msgstr ""
"Veuillez saisir une date valide. Elle doit être postérieure ou égale à %s."
Outdated
Review

Ca va donner un truc comme « Elle doit être postérieure ou égale à 31/12/2023 » ?

Je trouve que ça serait plus compréhensible d'avoir « Elle doit être avant le 31/12/2023 » (parce que "postérieure/antérieure" moi ça me demande 10 secondes de réflexion à chaque lecture). Bon, après, je ne sais pas comment dire le "ou égale", « Elle doit être égale à, ou avant le 31/12/2023 » c'est affreux.

En tout cas sans doute remplacer le « à %s » par « le %s » ?

Ca va donner un truc comme « Elle doit être postérieure ou égale à 31/12/2023 » ? Je trouve que ça serait plus compréhensible d'avoir « Elle doit être avant le 31/12/2023 » (parce que "postérieure/antérieure" moi ça me demande 10 secondes de réflexion à chaque lecture). Bon, après, je ne sais pas comment dire le "ou égale", « Elle doit être égale à, ou avant le 31/12/2023 » c'est affreux. En tout cas sans doute remplacer le « à %s » par « le %s » ?

Le ticket ne change pas cette partie des messages; j'en verrais bien un autre.

Le ticket ne change pas cette partie des messages; j'en verrais bien un autre.

ou peut-être vite fait, ces idées :

  • Elle doit être après le DATE (inclus) ?
  • Elle doit être supérieure ou égale à DATE ?
ou peut-être vite fait, ces idées : * Elle doit être après le DATE (inclus) ? * Elle doit être supérieure ou égale à DATE ?
#: qommon/form.py
#, python-format
msgid "invalid date; date must be on or before %s"
msgstr "date invalide : la date doit être antérieure ou égale à %s"
#: qommon/form.py
msgid "invalid time"
msgstr "heure invalide"
msgid "You should enter a valid date. It must be on or before %s."
msgstr ""
"Veuillez saisir une date valide. Elle doit être antérieure ou égale à %s."
#: qommon/form.py
msgid "invalid regular expression"
@ -9840,8 +9863,8 @@ msgstr "Valeur vide"
#: testdef.py
#, python-format
msgid "%(error)s for field %(label)s: %(details)s."
msgstr "%(error)s pour le champ %(label)s : %(details)s."
msgid "%(error)s for field %(label)s: %(details)s"
msgstr "%(error)s pour le champ %(label)s : %(details)s"
#: users.py
#, python-format

View File

@ -1096,7 +1096,7 @@ class EmailWidget(StringWidget):
)
def get_type_mismatch_message(self):
return _('must be a valid email address')
return _('You should enter a valid email address, for example name@example.com.')
def _parse(self, request):
StringWidget._parse(self, request)
@ -1120,20 +1120,20 @@ class EmailWidget(StringWidget):
if [x for x in domain.split('.') if not x]:
# empty parts in domain, ex: @example..net, or
# @.example.net
self.set_error(_('invalid address domain'))
self.set_error(_('Invalid address domain, you should check it and try again.'))
return
domain = force_str(domain, 'utf-8', errors='ignore')
try:
domain = force_str(domain.encode('idna'))
except UnicodeError:
self.set_error(_('invalid address domain'))
self.set_error(_('Invalid address domain, you should check it and try again.'))
return
if domain == 'localhost':
return
try:
dns.resolver.query(force_str(domain), 'MX')
except dns.exception.DNSException:
self.set_error(_('invalid address domain'))
self.set_error(_('Invalid address domain, you should check it and try again.'))
class OptGroup:
@ -1224,7 +1224,7 @@ class ValidationWidget(CompositeWidget):
{
'title': _('Digits'),
'regex': r'\d+',
'error_message': _('Only digits are allowed'),
'error_message': _('You should enter digits only, for example: 123.'),
},
),
(
@ -1232,7 +1232,7 @@ class ValidationWidget(CompositeWidget):
{
'title': _('Phone Number'),
'regex': r'\+?[-\(\)\d\.\s/]+',
'error_message': _('Invalid phone number'),
'error_message': _('You should enter a valid phone number.'),
'html_input_type': 'tel',
'normalize_for_fts': misc.normalize_phone_number_for_fts,
},
@ -1242,7 +1242,9 @@ class ValidationWidget(CompositeWidget):
{
'title': _('Phone Number (France)'),
'function': 'validate_phone_fr',
'error_message': _('Invalid phone number'),
'error_message': _(
'You should enter a valid 10-digits phone number, for example 06 39 98 89 93.'
),
'html_input_type': 'tel',
'normalize_for_fts': misc.normalize_phone_number_for_fts,
},
@ -1252,7 +1254,7 @@ class ValidationWidget(CompositeWidget):
{
'title': _('Mobile Phone Number (local)'),
'function': 'validate_mobile_phone_local',
'error_message': _('Invalid phone number'),
'error_message': _('You should enter a valid mobile phone number.'),
'html_input_type': 'tel',
'normalize_for_fts': misc.normalize_phone_number_for_fts,
},
@ -1262,7 +1264,7 @@ class ValidationWidget(CompositeWidget):
{
'title': _('Zip Code (France)'),
'regex': r'\d{5}',
'error_message': _('Invalid zip code'),
'error_message': _('You should enter a 5-digits zip code, for example 75014.'),
},
),
(
@ -1270,7 +1272,9 @@ class ValidationWidget(CompositeWidget):
{
'title': _('SIREN Code (France)'),
'function': 'validate_siren',
'error_message': _('Invalid SIREN code'),
'error_message': _(
'You should enter a valid 9-digits SIREN code, for example 443170139.'
),
'normalize_function': lambda v: v.upper().strip().replace(' ', ''),
},
),
@ -1279,7 +1283,9 @@ class ValidationWidget(CompositeWidget):
{
'title': _('SIRET Code (France)'),
'function': 'validate_siret',
'error_message': _('Invalid SIRET code'),
'error_message': _(
'You should enter a valid 14-digits SIRET code, for example 44317013900036.'
),
'normalize_function': lambda v: v.upper().strip().replace(' ', ''),
},
),
@ -1287,7 +1293,10 @@ class ValidationWidget(CompositeWidget):
'nir-fr',
{
'title': _('NIR (France)'),
'error_message': _('Invalid NIR'),
'error_message': _(
'You should enter a valid 15-digits social security number, '
Review

Subtilité, c'est n'est pas un nombre (15-digits) car le département est 2A ou 2B pour la région Corse... Mais bon, sans doute que les personnes nées en corse le savent, partout on demande les "15 chiffres"... Laissons ainsi.

Subtilité, c'est n'est pas un nombre (15-digits) car le département est 2A ou 2B pour la région Corse... Mais bon, sans doute que les personnes nées en corse le savent, partout on demande les "15 chiffres"... Laissons ainsi.
Review

J'ai repris le message proposé par Anaïs.

J'ai repris le message proposé par Anaïs.
'for example 294037512000522.'
),
'function': 'validate_nir',
'normalize_function': lambda v: v.upper().strip().replace(' ', ''),
},
@ -1296,7 +1305,10 @@ class ValidationWidget(CompositeWidget):
'nrn-be',
{
'title': _('National register number (Belgium)'),
'error_message': _('Invalid national register number'),
'error_message': _(
'You should enter a valid 11-digits national register number, '
'for example 85073003328.'
),
'function': 'validate_belgian_nrn',
},
),
@ -1305,7 +1317,10 @@ class ValidationWidget(CompositeWidget):
{
'title': _('IBAN'),
'function': 'validate_iban',
'error_message': _('Invalid IBAN'),
'error_message': _(
'You should enter a valid IBAN code, it should have between 14 and 34 characters, '
'for example FR7600001000010000000000101.'
),
'normalize_function': lambda v: v.upper().strip().replace(' ', ''),
},
),
@ -1314,7 +1329,7 @@ class ValidationWidget(CompositeWidget):
{
'title': _('Time'),
'regex': r'([01]?[0-9]|2[0-3]):[0-5][0-9]',
'error_message': _('Invalid time'),
'error_message': _('You should enter a valid time, between 00:00 and 23:59.'),
'html_input_type': 'time',
},
),
@ -1572,15 +1587,15 @@ class DateWidget(StringWidget):
yield 'range_overflow'
def get_type_mismatch_message(self):
return _('invalid date')
return _('You should enter a valid date.')
def get_range_underflow_message(self):
return _('invalid date: date must be on or after %s') % strftime(
return _('You should enter a valid date. It must be on or after %s.') % strftime(
misc.date_format(), self.minimum_date
)
def get_range_overflow_message(self):
return _('invalid date; date must be on or before %s') % strftime(
return _('You should enter a valid date. It must be on or before %s.') % strftime(
misc.date_format(), self.maximum_date
)
@ -1599,12 +1614,12 @@ class DateWidget(StringWidget):
self.value = None
elif self.minimum_date and value[:3] < self.minimum_date.timetuple()[:3]:
self.set_error(
_('invalid date: date must be on or after %s')
_('You should enter a valid date. It must be on or after %s.')
% strftime(misc.date_format(), self.minimum_date)
)
elif self.maximum_date and value[:3] > self.maximum_date.timetuple()[:3]:
self.set_error(
_('invalid date; date must be on or before %s')
_('You should enter a valid date. It must be on or before %s.')
% strftime(misc.date_format(), self.maximum_date)
)
@ -1664,7 +1679,7 @@ class TimeWidget(DateWidget):
value = datetime.datetime.strptime(self.value, self.get_format_string())
self.value = strftime(self.get_format_string(), value)
except ValueError:
self.set_error(_('invalid time'))
self.set_error(_('You should enter a valid time, between 00:00 and 23:59.'))
self.value = None
return

View File

@ -307,7 +307,7 @@ class TestDef(sql.TestDef):
error_msg = _('Invalid value "%s"') % value if value else _('Empty value')
raise TestError(
_('%(error)s for field %(label)s: %(details)s.')
_('%(error)s for field %(label)s: %(details)s')
% {
'error': error_msg,
'label': field_label,