1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132
|
"""Example domain objects for testing."""
import datetime
from sqlalchemy import Column, FetchedValue, ForeignKey, String, Table, func
from sqlalchemy.orm import Mapped, declared_attr, mapped_column, relationship
from sqlalchemy.orm.decl_base import _TableArgsType as TableArgsType # pyright: ignore[reportPrivateUsage]
from advanced_alchemy.base import BigIntAuditBase, BigIntBase, merge_table_arguments
from advanced_alchemy.mixins import SlugKey
from advanced_alchemy.types import EncryptedString, EncryptedText, FileObject, FileObjectList, StoredObject
from advanced_alchemy.types.file_object import storages
class BigIntAuthor(BigIntAuditBase):
"""The Author domain object."""
name: Mapped[str] = mapped_column(String(length=100))
string_field: Mapped[str] = mapped_column(String(20), default="static value", nullable=True)
dob: Mapped[datetime.date] = mapped_column(nullable=True)
books: Mapped[list["BigIntBook"]] = relationship(
lazy="selectin",
back_populates="author",
cascade="all, delete",
)
class BigIntBook(BigIntBase):
"""The Book domain object."""
title: Mapped[str] = mapped_column(String(length=250)) # pyright: ignore
author_id: Mapped[int] = mapped_column(ForeignKey("big_int_author.id")) # pyright: ignore
author: Mapped[BigIntAuthor] = relationship( # pyright: ignore
lazy="joined",
innerjoin=True,
back_populates="books",
)
class BigIntSlugBook(BigIntBase, SlugKey):
"""The Book domain object with a slug key."""
title: Mapped[str] = mapped_column(String(length=250)) # pyright: ignore
author_id: Mapped[str] = mapped_column(String(length=250)) # pyright: ignore
@declared_attr.directive
@classmethod
def __table_args__(cls) -> TableArgsType:
return merge_table_arguments(
cls,
table_args={"comment": "Slugbook"},
)
class BigIntEventLog(BigIntAuditBase):
"""The event log domain object."""
logged_at: Mapped[datetime.datetime] = mapped_column(default=datetime.datetime.now()) # pyright: ignore
payload: Mapped[dict] = mapped_column(default=lambda: {}) # pyright: ignore
class BigIntModelWithFetchedValue(BigIntBase):
"""The ModelWithFetchedValue BigIntBase."""
val: Mapped[int] # pyright: ignore
updated: Mapped[datetime.datetime] = mapped_column( # pyright: ignore
server_default=func.current_timestamp(),
onupdate=func.current_timestamp(),
server_onupdate=FetchedValue(),
)
bigint_item_tag = Table(
"bigint_item_tag",
BigIntBase.metadata,
Column("item_id", ForeignKey("big_int_item.id"), primary_key=True), # pyright: ignore
Column("tag_id", ForeignKey("big_int_tag.id"), primary_key=True), # pyright: ignore
)
class BigIntItem(BigIntBase):
name: Mapped[str] = mapped_column(String(length=50)) # pyright: ignore
description: Mapped[str] = mapped_column(String(length=100), nullable=True) # pyright: ignore
tags: Mapped[list["BigIntTag"]] = relationship(secondary=lambda: bigint_item_tag, back_populates="items")
class BigIntTag(BigIntBase):
"""The event log domain object."""
name: Mapped[str] = mapped_column(String(length=50)) # pyright: ignore
items: Mapped[list[BigIntItem]] = relationship(secondary=lambda: bigint_item_tag, back_populates="tags")
class BigIntRule(BigIntAuditBase):
"""The rule domain object."""
name: Mapped[str] = mapped_column(String(length=250)) # pyright: ignore
config: Mapped[dict] = mapped_column(default=lambda: {}) # pyright: ignore
class BigIntSecret(BigIntBase):
"""The secret domain model."""
secret: Mapped[str] = mapped_column(
EncryptedString(key="super_secret"),
)
long_secret: Mapped[str] = mapped_column(
EncryptedText(key="super_secret"),
)
length_validated_secret: Mapped[str] = mapped_column(
EncryptedString(key="super_secret", length=10),
nullable=True,
)
class BigIntFileDocument(BigIntBase):
"""The file document domain model."""
title: Mapped[str] = mapped_column(String(length=100))
attachment: Mapped[FileObject] = mapped_column(
StoredObject(backend="memory"),
nullable=True,
)
required_file: Mapped[FileObject] = mapped_column(StoredObject(backend="memory"), nullable=True)
required_files: Mapped[FileObjectList] = mapped_column(
StoredObject(backend="memory", multiple=True),
nullable=True,
)
if not storages.is_registered("memory"):
storages.register_backend("memory://", "memory")
|