pending_upload.py 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
  1. """Pending upload model for virtual printer queue mode."""
  2. from datetime import datetime
  3. from sqlalchemy import DateTime, ForeignKey, Integer, String, Text, func
  4. from sqlalchemy.orm import Mapped, mapped_column, relationship
  5. from backend.app.core.database import Base
  6. class PendingUpload(Base):
  7. """Pending upload from virtual printer awaiting user review."""
  8. __tablename__ = "pending_uploads"
  9. id: Mapped[int] = mapped_column(primary_key=True)
  10. # File info
  11. filename: Mapped[str] = mapped_column(String(255))
  12. file_path: Mapped[str] = mapped_column(String(500)) # Temp storage path
  13. file_size: Mapped[int] = mapped_column(Integer)
  14. # Embedded 3MF Title metadata, captured at FTP-receive time so the review
  15. # card and the eventual archive's print_name agree on which name to show
  16. # (#1152 follow-up). NULL when the 3MF has no title or the metadata read
  17. # failed — the response model falls back to the filename stem in that case.
  18. metadata_print_name: Mapped[str | None] = mapped_column(String(255), nullable=True)
  19. # Source info
  20. source_ip: Mapped[str | None] = mapped_column(String(45), nullable=True)
  21. # Status: pending, archived, discarded
  22. status: Mapped[str] = mapped_column(String(20), default="pending")
  23. # User additions (before archiving)
  24. tags: Mapped[str | None] = mapped_column(Text, nullable=True)
  25. notes: Mapped[str | None] = mapped_column(Text, nullable=True)
  26. project_id: Mapped[int | None] = mapped_column(ForeignKey("projects.id", ondelete="SET NULL"), nullable=True)
  27. # After archiving - link to created archive
  28. archived_id: Mapped[int | None] = mapped_column(ForeignKey("print_archives.id", ondelete="SET NULL"), nullable=True)
  29. # Timestamps
  30. uploaded_at: Mapped[datetime] = mapped_column(DateTime, server_default=func.now())
  31. archived_at: Mapped[datetime | None] = mapped_column(DateTime, nullable=True)
  32. # Relationships
  33. project: Mapped["Project | None"] = relationship()
  34. archive: Mapped["PrintArchive | None"] = relationship()
  35. from backend.app.models.archive import PrintArchive # noqa: E402
  36. from backend.app.models.project import Project # noqa: E402