from datetime import datetime, timezone from sqlalchemy import DateTime, Float, ForeignKey, Integer, String, Text from sqlalchemy.orm import Mapped, mapped_column, relationship from .database import Base class MapObject(Base): __tablename__ = "map_objects" id: Mapped[int] = mapped_column(Integer, primary_key=True, index=True) name: Mapped[str] = mapped_column(String(255), nullable=False) description: Mapped[str] = mapped_column(Text, default="") type: Mapped[str] = mapped_column(String(50), nullable=False) latitude: Mapped[float] = mapped_column(Float, nullable=False) longitude: Mapped[float] = mapped_column(Float, nullable=False) created_at: Mapped[datetime] = mapped_column( DateTime, default=lambda: datetime.now(timezone.utc), ) media: Mapped[list["ObjectMedia"]] = relationship( back_populates="object", cascade="all, delete-orphan", ) class ObjectMedia(Base): __tablename__ = "object_media" id: Mapped[int] = mapped_column(Integer, primary_key=True, index=True) object_id: Mapped[int] = mapped_column( ForeignKey("map_objects.id", ondelete="CASCADE"), nullable=False, index=True, ) stored_name: Mapped[str] = mapped_column(String(255), nullable=False) original_name: Mapped[str] = mapped_column(String(255), nullable=False) content_type: Mapped[str] = mapped_column(String(100), nullable=False) size: Mapped[int] = mapped_column(Integer, nullable=False) created_at: Mapped[datetime] = mapped_column( DateTime, default=lambda: datetime.now(timezone.utc), ) object: Mapped["MapObject"] = relationship(back_populates="media")