Poll Zabbix for toner levels on a schedule and email/webhook on a downward crossing. Warning fires at or below the warning threshold (default 5%), critical at the critical threshold (default 0%); both thresholds are settings. State lives in printersupplyalerts so an alert fires once per crossing and re-arms after a refill. Recipients mirror the printedparts pattern: plugin-scoped shopdb users + roles + free-text emails (falling back to the site alert_recipients), and a chosen support team's webhook (falling back to the site alert_webhook_url). - PrinterSupplyAlert model + migration printers0002supplyalerts - alerttier(remaining, warning, critical) + check_supplies poller - flask printers check-toner-alerts CLI (run via scheduled task/cron) - printers alert settings + Low-Toner Alerts settings page - 7 tests: tier boundaries, once-per-crossing + re-arm, toner-only scope, custom thresholds, support-team webhook routing
42 lines
1.3 KiB
Python
42 lines
1.3 KiB
Python
"""Per-printer supply alert state.
|
|
|
|
The supply poller (flask printers check-toner-alerts) is stateless: it reads
|
|
live levels from Zabbix each run. To alert once per downward crossing (and
|
|
re-arm after a refill) it needs to remember the last tier it alerted for each
|
|
printer + supply. One row per (printerid, supplykey); supplykey is the toner
|
|
color (black/cyan/magenta/yellow) or the raw item name when color is unknown.
|
|
"""
|
|
|
|
from shopdb.extensions import db
|
|
from shopdb.core.models.base import BaseModel
|
|
|
|
|
|
class PrinterSupplyAlert(BaseModel):
|
|
"""Last-alerted tier for one printer supply. lasttier in ok/warning/critical."""
|
|
|
|
__tablename__ = 'printersupplyalerts'
|
|
|
|
printersupplyalertid = db.Column(db.Integer, primary_key=True)
|
|
printerid = db.Column(
|
|
db.Integer,
|
|
db.ForeignKey('printers.printerid', ondelete='CASCADE'),
|
|
nullable=False,
|
|
index=True,
|
|
)
|
|
supplykey = db.Column(
|
|
db.String(64),
|
|
nullable=False,
|
|
comment='Toner color, or Zabbix item name when color is unknown',
|
|
)
|
|
lasttier = db.Column(
|
|
db.String(16),
|
|
nullable=False,
|
|
default='ok',
|
|
comment='Last tier alerted: ok, warning, or critical',
|
|
)
|
|
|
|
__table_args__ = (
|
|
db.UniqueConstraint('printerid', 'supplykey',
|
|
name='uq_printersupplyalert_printer_key'),
|
|
)
|