28 lines
887 B
Python
28 lines
887 B
Python
from typing import ClassVar, TypeVar
|
|
from humps import camelize
|
|
from enum import Enum
|
|
from pydantic import BaseModel, ConfigDict
|
|
|
|
T = TypeVar("T", bound=BaseModel)
|
|
|
|
class SearchType(Enum):
|
|
fuzzy = "fuzzy"
|
|
tokenized = "tokenized"
|
|
|
|
class MainModel(BaseModel):
|
|
_searchable_properties: ClassVar[list[str]] = []
|
|
"""
|
|
Searchable properties for the search API.
|
|
The first property will be used for sorting (order_by)
|
|
"""
|
|
model_config = ConfigDict(alias_generator=camelize, populate_by_name=True)
|
|
|
|
def cast(self, cls: type[T], **kwargs) -> T:
|
|
"""
|
|
Cast the current model to another with additional arguments. Useful for
|
|
transforming DTOs into models that are saved to a database
|
|
"""
|
|
create_data = {field: getattr(self, field) for field in self.__fields__ if field in cls.__fields__}
|
|
create_data.update(kwargs or {})
|
|
return cls(**create_data)
|