import uuid from sqlalchemy import Column, String, Boolean, Date, ForeignKey, UniqueConstraint from sqlalchemy.dialects.postgresql import UUID from sqlalchemy.orm import relationship from backend.database import Base class User(Base): __tablename__ = "users" id = Column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4) name = Column(String, nullable=False) items = relationship("Item", back_populates="user", cascade="all, delete") tags = relationship("Tag", back_populates="user", cascade="all, delete") trips = relationship("Trip", back_populates="user", cascade="all, delete") class Item(Base): __tablename__ = "items" id = Column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4) user_id = Column(UUID(as_uuid=True), ForeignKey("users.id"), nullable=False) name = Column(String, nullable=False) # z.B. "Zahnbürste" oder "{days} x Vitamin D3" user = relationship("User", back_populates="items") tags = relationship("ItemTag", back_populates="item", cascade="all, delete") trip_items = relationship("TripItem", back_populates="item", cascade="all, delete") class Tag(Base): __tablename__ = "tags" __table_args__ = (UniqueConstraint("user_id", "name", name="uq_tag_user_name"),) id = Column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4) user_id = Column(UUID(as_uuid=True), ForeignKey("users.id"), nullable=False) name = Column(String, nullable=False) user = relationship("User", back_populates="tags") items = relationship("ItemTag", back_populates="tag", cascade="all, delete") trip_selected_tags = relationship("TripTagSelected", back_populates="tag", cascade="all, delete") trip_marked_tags = relationship("TripTagMarked", back_populates="tag", cascade="all, delete") trip_items = relationship("TripItem", back_populates="tag") class ItemTag(Base): __tablename__ = "item_tags" item_id = Column(UUID(as_uuid=True), ForeignKey("items.id", ondelete="CASCADE"), primary_key=True) tag_id = Column(UUID(as_uuid=True), ForeignKey("tags.id", ondelete="CASCADE"), primary_key=True) item = relationship("Item", back_populates="tags") tag = relationship("Tag", back_populates="items") class Trip(Base): __tablename__ = "trips" id = Column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4) user_id = Column(UUID(as_uuid=True), ForeignKey("users.id"), nullable=False) name = Column(String) start_date = Column(Date) end_date = Column(Date) user = relationship("User", back_populates="trips") selected_tags = relationship("TripTagSelected", back_populates="trip", cascade="all, delete") marked_tags = relationship("TripTagMarked", back_populates="trip", cascade="all, delete") trip_items = relationship("TripItem", back_populates="trip", cascade="all, delete") class TripTagSelected(Base): __tablename__ = "trip_tag_selected" trip_id = Column(UUID(as_uuid=True), ForeignKey("trips.id", ondelete="CASCADE"), primary_key=True) tag_id = Column(UUID(as_uuid=True), ForeignKey("tags.id"), primary_key=True) trip = relationship("Trip", back_populates="selected_tags") tag = relationship("Tag", back_populates="trip_selected_tags") class TripTagMarked(Base): __tablename__ = "trip_tag_marked" trip_id = Column(UUID(as_uuid=True), ForeignKey("trips.id", ondelete="CASCADE"), primary_key=True) tag_id = Column(UUID(as_uuid=True), ForeignKey("tags.id"), primary_key=True) trip = relationship("Trip", back_populates="marked_tags") tag = relationship("Tag", back_populates="trip_marked_tags") class TripItem(Base): __tablename__ = "trip_items" id = Column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4) trip_id = Column(UUID(as_uuid=True), ForeignKey("trips.id", ondelete="CASCADE"), nullable=False) item_id = Column(UUID(as_uuid=True), ForeignKey("items.id"), nullable=False) name_calculated = Column(String, nullable=False) checked = Column(Boolean, nullable=False, default=False) tag_id = Column(UUID(as_uuid=True), ForeignKey("tags.id"), nullable=True) # null = gemeinsames Item trip = relationship("Trip", back_populates="trip_items") item = relationship("Item", back_populates="trip_items") tag = relationship("Tag", back_populates="trip_items")