mirror of
https://github.com/galaxyproject/galaxy.git
synced 2026-09-24 16:30:27 +08:00
Add LibraryFolderDatabaseIdField
Handles the decoding and encoding of Library Folders which ID must start with an 'F'
This commit is contained in:
+28
-10
@@ -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):
|
||||
|
||||
@@ -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),
|
||||
}
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user