from collections.abc import Mapping from datetime import datetime from typing import Any import sqlalchemy as sa from sqlalchemy import inspect from sqlalchemy.orm import DeclarativeBase from .sqltypes import NaiveUTCDateTime class Base(DeclarativeBase): type_annotation_map = { str: sa.Text, datetime: NaiveUTCDateTime, } def __init__(self, **kw: Any): # noqa mapper = inspect(self).mapper # type: ignore[union-attr] for column in mapper.columns: if ( column.default and (default := getattr(column.default, "arg")) is not None ): attr = mapper.get_property_by_column(column) if callable(default): kw.setdefault(attr.key, default(None)) elif not isinstance(default, sa.Function): kw.setdefault(attr.key, default) for attr, value in kw.items(): setattr(self, attr, value) def set(self, values: Mapping[str, Any]) -> None: for field, value in values.items(): if hasattr(self, field): setattr(self, field, value)