external_link.py 1.5 KB

1234567891011121314151617181920212223242526272829303132333435
  1. from datetime import datetime
  2. from sqlalchemy import Boolean, DateTime, ForeignKey, Integer, String, func
  3. from sqlalchemy.orm import Mapped, mapped_column
  4. from backend.app.core.database import Base
  5. class ExternalLink(Base):
  6. """External links for sidebar navigation."""
  7. __tablename__ = "external_links"
  8. id: Mapped[int] = mapped_column(primary_key=True)
  9. name: Mapped[str] = mapped_column(String(50))
  10. url: Mapped[str] = mapped_column(String(500))
  11. icon: Mapped[str] = mapped_column(String(50), default="link")
  12. custom_icon: Mapped[str | None] = mapped_column(String(255), nullable=True) # Filename of uploaded icon
  13. open_in_new_tab: Mapped[bool] = mapped_column(Boolean, default=False)
  14. sort_order: Mapped[int] = mapped_column(Integer, default=0)
  15. created_at: Mapped[datetime] = mapped_column(DateTime, server_default=func.now())
  16. updated_at: Mapped[datetime] = mapped_column(DateTime, server_default=func.now(), onupdate=func.now())
  17. class ExternalLinkBadge(Base):
  18. """A count on an external sidebar link, set by the app the link points to
  19. (Bambuddy Orders' To do, say). Kept apart from the link so that setting it
  20. every minute leaves the link's own ``updated_at`` alone."""
  21. __tablename__ = "external_link_badges"
  22. link_id: Mapped[int] = mapped_column(ForeignKey("external_links.id", ondelete="CASCADE"), primary_key=True)
  23. count: Mapped[int] = mapped_column(Integer, default=0)
  24. # When the app last reported; an old count isn't shown.
  25. updated_at: Mapped[datetime] = mapped_column(DateTime)