import uuid from datetime import datetime from decimal import Decimal from sqlalchemy import Boolean, DateTime, Numeric, String, Text from sqlalchemy.dialects.postgresql import UUID from sqlalchemy.orm import Mapped, mapped_column, relationship from app.db.base import Base class Asset(Base): __tablename__ = "assets" id: Mapped[uuid.UUID] = mapped_column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4) symbol: Mapped[str] = mapped_column(Text, nullable=False, index=True) name: Mapped[str] = mapped_column(Text, nullable=False) type: Mapped[str] = mapped_column(String(30), nullable=False) # stock|etf|mutual_fund|bond|crypto|commodity|other currency: Mapped[str] = mapped_column(String(10), nullable=False) exchange: Mapped[str | None] = mapped_column(Text, nullable=True) isin: Mapped[str | None] = mapped_column(String(12), nullable=True) data_source: Mapped[str] = mapped_column(String(30), default="yahoo_finance", nullable=False) data_source_id: Mapped[str | None] = mapped_column(Text, nullable=True) last_price: Mapped[Decimal | None] = mapped_column(Numeric(20, 8), nullable=True) last_price_at: Mapped[datetime | None] = mapped_column(DateTime(timezone=True), nullable=True) price_change_24h: Mapped[Decimal | None] = mapped_column(Numeric(10, 4), nullable=True) is_active: Mapped[bool] = mapped_column(Boolean, default=True, nullable=False) created_at: Mapped[datetime] = mapped_column(DateTime(timezone=True), nullable=False) updated_at: Mapped[datetime] = mapped_column(DateTime(timezone=True), nullable=False) prices: Mapped[list["AssetPrice"]] = relationship(back_populates="asset", lazy="noload") # type: ignore[name-defined] holdings: Mapped[list["InvestmentHolding"]] = relationship(back_populates="asset", lazy="noload") # type: ignore[name-defined]