From 15b43573810a8127c7a7c124130681ab89356e2d Mon Sep 17 00:00:00 2001
From: Thorge Petersen <petersen@rz.uni-kiel.de>
Date: Thu, 22 Jun 2023 10:05:30 +0200
Subject: [PATCH] Override default tag_name_validator to allow any tag name

---
 ckanext/odsh/tests_wip/test_validation.py |  8 ++++++++
 ckanext/odsh/validation.py                | 11 +++++++++++
 2 files changed, 19 insertions(+)

diff --git a/ckanext/odsh/tests_wip/test_validation.py b/ckanext/odsh/tests_wip/test_validation.py
index 21c02780..746afc75 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 d9173155..f7f35b3a 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,
     }
-- 
GitLab