From 5e2a2639240e50b974b0f51f96d4533d9e2d0cc7 Mon Sep 17 00:00:00 2001 From: davelopez <46503462+davelopez@users.noreply.github.com> Date: Wed, 10 Aug 2022 09:22:57 +0200 Subject: [PATCH] Add LibraryFolderDatabaseIdField Handles the decoding and encoding of Library Folders which ID must start with an 'F' --- lib/galaxy/schema/fields.py | 38 +++++++++++++++++++++++++++---------- lib/galaxy/schema/schema.py | 2 ++ 2 files changed, 30 insertions(+), 10 deletions(-) diff --git a/lib/galaxy/schema/fields.py b/lib/galaxy/schema/fields.py index e3375ec6564..4c1d5713ad9 100644 --- a/lib/galaxy/schema/fields.py +++ b/lib/galaxy/schema/fields.py @@ -26,6 +26,15 @@ class BaseDatabaseIdField: def validate(cls, v): return v + @classmethod + def ensure_valid(cls, v: str): + len_v = len(v) + if len_v % ENCODED_ID_LENGTH_MULTIPLE: + raise ValueError("Invalid id length, must be multiple of 16") + m = ENCODED_DATABASE_ID_PATTERN.fullmatch(v.lower()) + if not m: + raise ValueError("Invalid characters in encoded ID") + @classmethod def __modify_schema__(cls, field_schema): # __modify_schema__ should mutate the dict it receives in place, @@ -46,22 +55,31 @@ class DecodedDatabaseIdField(int, BaseDatabaseIdField): def validate(cls, v): if not isinstance(v, str): raise TypeError("String required") - if v.startswith("F"): - # Library Folder ids start with an additional "F" - v = v[1:] - len_v = len(v) - if len_v % ENCODED_ID_LENGTH_MULTIPLE: - raise ValueError("Invalid id length, must be multiple of 16") - m = ENCODED_DATABASE_ID_PATTERN.fullmatch(v.lower()) - if not m: - raise ValueError("Invalid characters in encoded ID") + cls.ensure_valid(v) return cls(cls.security.decode_id(v)) @classmethod - def encode(cls, v): + def encode(cls, v) -> str: return cls.security.encode_id(v) +class LibraryFolderDatabaseIdField(int, BaseDatabaseIdField): + @classmethod + def validate(cls, v): + if not isinstance(v, str): + raise TypeError("String required") + if not v.startswith("F"): + raise TypeError("Invalid library folder ID. Folder IDs must start with an 'F'") + v = v[1:] + cls.ensure_valid(v) + return cls(cls.security.decode_id(v)) + + @classmethod + def encode(cls, v) -> str: + return f"F{cls.security.encode_id(v)}" + + +# TODO: remove after replace class EncodedDatabaseIdField(str, BaseDatabaseIdField): @classmethod def validate(cls, v): diff --git a/lib/galaxy/schema/schema.py b/lib/galaxy/schema/schema.py index 0beb9cde9a2..5511e123c07 100644 --- a/lib/galaxy/schema/schema.py +++ b/lib/galaxy/schema/schema.py @@ -40,6 +40,7 @@ from galaxy.model import ( from galaxy.schema.fields import ( DecodedDatabaseIdField, EncodedDatabaseIdField, + LibraryFolderDatabaseIdField, ModelClassField, ) from galaxy.schema.types import ( @@ -188,6 +189,7 @@ class Model(BaseModel): json_encoders = { # This will ensure all IDs are encoded when serialized to JSON DecodedDatabaseIdField: lambda v: DecodedDatabaseIdField.encode(v), + LibraryFolderDatabaseIdField: lambda v: LibraryFolderDatabaseIdField.encode(v), }