Source code for timelink.api.models.base_class

""" Base class, all modules must import this to share Metadata

   for 2.0 migration see:
   https://docs.sqlalchemy.org/en/20/changelog/whatsnew_20.html#whatsnew-20-orm-declarative-typing

"""

from typing import Any
from sqlalchemy import MetaData  # pylint: disable=import-error
from sqlalchemy.orm import DeclarativeBase  # pylint: disable=import-error
from sqlalchemy.orm import declared_attr  # pylint: disable=import-error

naming_convention = {
    "ix": "ix_%(column_0_label)s",
    "uq": "uq_%(table_name)s_%(column_0_name)s",
    "ck": "ck_%(table_name)s_`%(constraint_name)s`",
    "fk": "fk_%(table_name)s_%(column_0_name)s_%(referred_table_name)s",
    "pk": "pk_%(table_name)s",
}


[docs] class Base(DeclarativeBase): """Base class, all modules must import this to share Metadata""" # see https://alembic.sqlalchemy.org/en/latest/naming.html#naming-conventions metadata = MetaData(naming_convention=naming_convention) # see https://docs.sqlalchemy.org/en/20/changelog/migration_20.html#migration-20-step-six __allow_unmapped__: bool = True id: Any __name__: str # Generate __tablename__ automatically @declared_attr def __tablename__(cls) -> str: # pylint: disable=no-self-argument return cls.__name__.lower()
[docs] def get_all_base_subclasses(cls=None): """Get all base subclasses This function returns all ORM classes that inherit from Base, and so share the same metadata. """ if cls is None: cls = Base subclasses = set(cls.__subclasses__()) for subclass in subclasses.copy(): subclasses.update(get_all_base_subclasses(subclass)) return subclasses