project_bom.py 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142
  1. from datetime import datetime
  2. from sqlalchemy import DateTime, ForeignKey, Integer, String, Text, func
  3. from sqlalchemy.orm import Mapped, mapped_column, relationship
  4. from backend.app.core.database import Base
  5. class ProjectBOMItem(Base):
  6. """Bill of Materials item for a project."""
  7. __tablename__ = "project_bom_items"
  8. id: Mapped[int] = mapped_column(primary_key=True)
  9. project_id: Mapped[int] = mapped_column(ForeignKey("projects.id", ondelete="CASCADE"))
  10. name: Mapped[str] = mapped_column(String(255))
  11. quantity_needed: Mapped[int] = mapped_column(Integer, default=1)
  12. quantity_printed: Mapped[int] = mapped_column(Integer, default=0)
  13. # Optional link to archive that prints this part
  14. archive_id: Mapped[int | None] = mapped_column(ForeignKey("print_archives.id", ondelete="SET NULL"), nullable=True)
  15. # Reference to attachment filename (STL file)
  16. stl_filename: Mapped[str | None] = mapped_column(String(255), nullable=True)
  17. # Notes about this part
  18. notes: Mapped[str | None] = mapped_column(Text, nullable=True)
  19. # Sort order
  20. sort_order: Mapped[int] = mapped_column(Integer, default=0)
  21. # Timestamps
  22. created_at: Mapped[datetime] = mapped_column(DateTime, server_default=func.now())
  23. updated_at: Mapped[datetime] = mapped_column(DateTime, server_default=func.now(), onupdate=func.now())
  24. # Relationships
  25. project: Mapped["Project"] = relationship(back_populates="bom_items")
  26. archive: Mapped["PrintArchive | None"] = relationship()
  27. from backend.app.models.archive import PrintArchive # noqa: E402
  28. from backend.app.models.project import Project # noqa: E402