49 lines
1.8 KiB
Python
49 lines
1.8 KiB
Python
"""BoardImage junction model."""
|
|
import uuid
|
|
from datetime import datetime
|
|
from sqlalchemy import Column, DateTime, ForeignKey, Integer, UniqueConstraint
|
|
from sqlalchemy.dialects.postgresql import JSONB, UUID
|
|
from sqlalchemy.orm import relationship
|
|
|
|
from app.database.base import Base
|
|
|
|
|
|
class BoardImage(Base):
|
|
"""Junction table connecting boards and images with position/transformation data."""
|
|
|
|
__tablename__ = "board_images"
|
|
|
|
id = Column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4)
|
|
board_id = Column(UUID(as_uuid=True), ForeignKey("boards.id", ondelete="CASCADE"), nullable=False, index=True)
|
|
image_id = Column(UUID(as_uuid=True), ForeignKey("images.id", ondelete="CASCADE"), nullable=False, index=True)
|
|
position = Column(JSONB, nullable=False)
|
|
transformations = Column(
|
|
JSONB,
|
|
nullable=False,
|
|
default={
|
|
"scale": 1.0,
|
|
"rotation": 0,
|
|
"opacity": 1.0,
|
|
"flipped_h": False,
|
|
"flipped_v": False,
|
|
"greyscale": False
|
|
}
|
|
)
|
|
z_order = Column(Integer, nullable=False, default=0, index=True)
|
|
group_id = Column(UUID(as_uuid=True), ForeignKey("groups.id", ondelete="SET NULL"), nullable=True, index=True)
|
|
created_at = Column(DateTime, nullable=False, default=datetime.utcnow)
|
|
updated_at = Column(DateTime, nullable=False, default=datetime.utcnow, onupdate=datetime.utcnow)
|
|
|
|
__table_args__ = (
|
|
UniqueConstraint("board_id", "image_id", name="uq_board_image"),
|
|
)
|
|
|
|
# Relationships
|
|
board = relationship("Board", back_populates="board_images")
|
|
image = relationship("Image", back_populates="board_images")
|
|
group = relationship("Group", back_populates="board_images")
|
|
|
|
def __repr__(self) -> str:
|
|
return f"<BoardImage(board_id={self.board_id}, image_id={self.image_id})>"
|
|
|