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
|
from __future__ import annotations
from datetime import datetime
from typing import TYPE_CHECKING
from sqlalchemy import Boolean, DateTime, ForeignKey, Integer, String, Table
from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column, relationship
Base = DeclarativeBase()
if TYPE_CHECKING:
from .image import Image
collection_images = Table(
"collection_images",
Base.metadata,
mapped_column(
"collection_id", Integer, ForeignKey("collections.id"), primary_key=True
),
mapped_column("image_id", Integer, ForeignKey("images.id"), primary_key=True),
)
class Collection(Base):
__tablename__ = "collections"
id: Mapped[int] = mapped_column(Integer, primary_key=True)
user_id: Mapped[int] = mapped_column(ForeignKey("users.id"), nullable=False)
name: Mapped[str] = mapped_column(String(100), nullable=False)
description: Mapped[str | None] = mapped_column(String(500), nullable=True)
is_private: Mapped[bool] = mapped_column(Boolean, default=False, nullable=False)
created_at: Mapped[datetime] = mapped_column(
DateTime(timezone=True), default=datetime.utcnow
)
images: Mapped[list["Image"]] = relationship(
"Image",
secondary=collection_images,
back_populates="collections",
)
|