Show the kiosk label prefix, and let a plugin declare the settings it owns

This commit is contained in:
2026-08-06 18:17:56 -04:00
parent 307de925f1
commit c674000ccc
15 changed files with 1070 additions and 475 deletions

View File

@@ -9,7 +9,7 @@ from flask import Flask, Blueprint
import click
from shopdb.plugins.base import BasePlugin, PluginMeta
from shopdb.api import db, AssetType, Setting
from shopdb.api import db, AssetType
from .models import (
Printer, PrinterType, ModelSupply, PrinterDriver, PrinterSupplyAlert
@@ -106,40 +106,65 @@ class PrintersPlugin(BasePlugin):
with app.app_context():
self._ensure_asset_type()
self._ensure_printer_types()
self._seed_settings()
logger.info("Printers plugin installed")
def on_enable(self, app: Flask) -> None:
# Idempotent re-seed so settings added in later versions reach sites
# that installed earlier (enable runs on every upgrade cycle).
with app.app_context():
self._seed_settings()
def get_settings_defaults(self) -> List[dict]:
"""Low-toner alert settings.
def _seed_settings(self) -> None:
"""Seed low-toner alert recipient settings (idempotent)."""
defaults = [
('printers_alert_email', '', 'string',
'Comma-separated low-toner alert recipients; empty uses the '
'site alert_recipients'),
('printers_alert_userids', '', 'string',
'Comma-separated shopdb user ids whose account emails receive '
'low-toner alerts'),
('printers_alert_roleids', '', 'string',
'Comma-separated role ids; every active member of these roles '
'receives low-toner alerts'),
('printers_alert_supportteamid', '', 'string',
'Support team whose webhook receives low-toner alerts; empty '
'uses the site alert_webhook_url'),
('printers_alert_warning_threshold', '5', 'integer',
'Toner percent remaining at or below which a warning email fires'),
('printers_alert_critical_threshold', '0', 'integer',
'Toner percent remaining at or below which a critical email fires'),
The framework seeds these at install, at enable, and on every
`flask plugin upgrade-all`, so a key added in a later version reaches a
site that installed an earlier one.
"""
return [
{
'key': 'printers_alert_email',
'value': '',
'valuetype': 'string',
'category': 'printers',
'description': 'Comma-separated low-toner alert recipients; '
'empty uses the site alert_recipients',
},
{
'key': 'printers_alert_userids',
'value': '',
'valuetype': 'string',
'category': 'printers',
'description': 'Comma-separated shopdb user ids whose account '
'emails receive low-toner alerts',
},
{
'key': 'printers_alert_roleids',
'value': '',
'valuetype': 'string',
'category': 'printers',
'description': 'Comma-separated role ids; every active member '
'of these roles receives low-toner alerts',
},
{
'key': 'printers_alert_supportteamid',
'value': '',
'valuetype': 'string',
'category': 'printers',
'description': 'Support team whose webhook receives low-toner '
'alerts; empty uses the site alert_webhook_url',
},
{
'key': 'printers_alert_warning_threshold',
'value': '5',
'valuetype': 'integer',
'category': 'printers',
'description': 'Toner percent remaining at or below which a '
'warning email fires',
},
{
'key': 'printers_alert_critical_threshold',
'value': '0',
'valuetype': 'integer',
'category': 'printers',
'description': 'Toner percent remaining at or below which a '
'critical email fires',
},
]
for key, value, valuetype, description in defaults:
if Setting.get(key) is None:
Setting.set(key, value, valuetype=valuetype,
category='printers', description=description)
db.session.commit()
def _ensure_asset_type(self) -> None:
"""Ensure printer asset type exists."""