pending_upload.py 2.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  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. # The virtual printer it came in on: approving stores the file in that
  22. # printer's File Manager folder. NULL for uploads from before this was
  23. # recorded, or once that virtual printer is deleted.
  24. virtual_printer_id: Mapped[int | None] = mapped_column(
  25. ForeignKey("virtual_printers.id", ondelete="SET NULL"), nullable=True
  26. )
  27. # Status: pending, archived, discarded
  28. status: Mapped[str] = mapped_column(String(20), default="pending")
  29. # User additions (before archiving)
  30. tags: Mapped[str | None] = mapped_column(Text, nullable=True)
  31. notes: Mapped[str | None] = mapped_column(Text, nullable=True)
  32. project_id: Mapped[int | None] = mapped_column(ForeignKey("projects.id", ondelete="SET NULL"), nullable=True)
  33. # After archiving - link to created archive
  34. archived_id: Mapped[int | None] = mapped_column(ForeignKey("print_archives.id", ondelete="SET NULL"), nullable=True)
  35. # Timestamps
  36. uploaded_at: Mapped[datetime] = mapped_column(DateTime, server_default=func.now())
  37. archived_at: Mapped[datetime | None] = mapped_column(DateTime, nullable=True)
  38. # Relationships
  39. project: Mapped["Project | None"] = relationship()
  40. archive: Mapped["PrintArchive | None"] = relationship()
  41. from backend.app.models.archive import PrintArchive # noqa: E402
  42. from backend.app.models.project import Project # noqa: E402