diff --git a/ckanext/odsh/tests_wip/test_validation.py b/ckanext/odsh/tests_wip/test_validation.py index 21c02780f9a978e06bd9ce486091362b04f71906..746afc75da8b4c3d4514e205ed1ed7bed8d5545a 100644 --- a/ckanext/odsh/tests_wip/test_validation.py +++ b/ckanext/odsh/tests_wip/test_validation.py @@ -105,3 +105,11 @@ def test_validate_licenseAttributionByText(): ('extras', 0, 'key'): 'licenseAttributionByText', ('extras', 0, 'value'): ''} validate_licenseAttributionByText('key', data, {}, None) + +def test_tag_name_validator_invalid(): + with pytest.raises(Exception): + tag_name_validator('Foo\nBar', None) + + +def test_tag_name_validator_valid(): + tag_name_validator('Regionalplan für den Planungsraum_I: (5.8 – Windenergie_an_Land)', None) diff --git a/ckanext/odsh/validation.py b/ckanext/odsh/validation.py index d91731555d44d7d927071098ef0179b5ba015e8a..f7f35b3a08d99bc70acfcd8be66b28fe041ba3bc 100644 --- a/ckanext/odsh/validation.py +++ b/ckanext/odsh/validation.py @@ -293,6 +293,7 @@ def tag_string_convert(key, data, errors, context): for tag in tags: toolkit.get_validator('tag_length_validator')(tag, context) + tag_name_validator(tag, context) def validate_relatedPackage(data): @@ -313,6 +314,15 @@ def validate_formats(data, errors): return data +def tag_name_validator(value, context): + """Allow tag name to contain any characters but no newlines + """ + tagname_match = re.compile(r'/^(?=.*[^\n])[^\n]*$', re.UNICODE) + if not tagname_match.match(value): + raise toolkit.Invalid(_('Invalid tag: "%s". Tags cannot contain line breaks.') % (value)) + return value + + def get_validators(): return { 'known_spatial_uri': known_spatial_uri, @@ -320,4 +330,5 @@ def get_validators(): 'validate_licenseAttributionByText': validate_licenseAttributionByText, 'validate_relatedPackage': validate_relatedPackage, 'odsh_validate_format': validate_formats, + 'tag_name_validator': tag_name_validator, }