notification.py 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. """Notification provider model for push notifications."""
  2. from datetime import datetime
  3. from sqlalchemy import Boolean, Column, DateTime, ForeignKey, Integer, String, Text, Time
  4. from sqlalchemy.orm import relationship
  5. from backend.app.core.database import Base
  6. class NotificationProvider(Base):
  7. """Model for notification providers (WhatsApp, ntfy, Pushover, etc.)."""
  8. __tablename__ = "notification_providers"
  9. id = Column(Integer, primary_key=True, index=True)
  10. name = Column(String(100), nullable=False) # User-defined name
  11. provider_type = Column(String(50), nullable=False) # callmebot, ntfy, pushover, telegram, email
  12. enabled = Column(Boolean, default=True)
  13. # Provider-specific configuration stored as JSON string
  14. config = Column(Text, nullable=False)
  15. # Event triggers - print lifecycle
  16. on_print_start = Column(Boolean, default=False)
  17. on_print_complete = Column(Boolean, default=True)
  18. on_print_failed = Column(Boolean, default=True)
  19. on_print_stopped = Column(Boolean, default=True) # User cancelled/stopped print
  20. on_print_progress = Column(Boolean, default=False) # 25%, 50%, 75% milestones
  21. # Event triggers - printer status
  22. on_printer_offline = Column(Boolean, default=False)
  23. on_printer_error = Column(Boolean, default=False) # AMS issues, etc.
  24. on_filament_low = Column(Boolean, default=False)
  25. # Quiet hours (do not disturb)
  26. quiet_hours_enabled = Column(Boolean, default=False)
  27. quiet_hours_start = Column(String(5), nullable=True) # HH:MM format, e.g., "22:00"
  28. quiet_hours_end = Column(String(5), nullable=True) # HH:MM format, e.g., "07:00"
  29. # Optional: Link to specific printer (NULL = all printers)
  30. printer_id = Column(Integer, ForeignKey("printers.id", ondelete="SET NULL"), nullable=True)
  31. # Status tracking
  32. last_success = Column(DateTime, nullable=True)
  33. last_error = Column(Text, nullable=True)
  34. last_error_at = Column(DateTime, nullable=True)
  35. # Timestamps
  36. created_at = Column(DateTime, default=datetime.utcnow)
  37. updated_at = Column(DateTime, default=datetime.utcnow, onupdate=datetime.utcnow)
  38. # Relationships
  39. printer = relationship("Printer", back_populates="notification_providers")