diff --git a/lib/galaxy/managers/base.py b/lib/galaxy/managers/base.py index cc09af0059e..c5ea85ab5e9 100644 --- a/lib/galaxy/managers/base.py +++ b/lib/galaxy/managers/base.py @@ -46,6 +46,7 @@ from typing import ( ) import sqlalchemy +from slugify import slugify from sqlalchemy.orm import Query from sqlalchemy.orm.scoping import scoped_session from typing_extensions import Protocol @@ -1296,9 +1297,7 @@ def raise_filter_err(attr, op, val, msg): def is_valid_slug(slug): """Returns true if slug is valid.""" - - VALID_SLUG_RE = re.compile(r"^[^/:?#]+$") - return VALID_SLUG_RE.match(slug) + return slugify(slug, allow_unicode=True) == slug class SortableManager: diff --git a/lib/galaxy/managers/sharable.py b/lib/galaxy/managers/sharable.py index 9318dd2b559..cf7ff0a2a5c 100644 --- a/lib/galaxy/managers/sharable.py +++ b/lib/galaxy/managers/sharable.py @@ -20,6 +20,7 @@ from typing import ( Type, ) +from slugify import slugify from sqlalchemy import ( exists, false, @@ -309,16 +310,6 @@ class SharableModelManager( session.commit() return item - def _slugify(self, start_with): - # Replace whitespace with '-' - slug_base = re.sub(r"\s+", "-", start_with) - # Remove all /:?# characters. - slug_base = re.sub(r"[/:?#]", "", slug_base) - # Remove trailing '-'. - if slug_base.endswith("-"): - slug_base = slug_base[:-1] - return slug_base - def _default_slug_base(self, item): # override in subclasses if hasattr(item, "title"): @@ -334,7 +325,7 @@ class SharableModelManager( # Setup slug base. if cur_slug is None or cur_slug == "": - slug_base = self._slugify(self._default_slug_base(item)) + slug_base = slugify(self._default_slug_base(item), allow_unicode=True) else: slug_base = cur_slug