|
@@ -16,6 +16,7 @@ from backend.app.core.auth import RequirePermissionIfAuthEnabled
|
|
|
from backend.app.core.database import get_db
|
|
from backend.app.core.database import get_db
|
|
|
from backend.app.core.permissions import Permission
|
|
from backend.app.core.permissions import Permission
|
|
|
from backend.app.models.printer import Printer
|
|
from backend.app.models.printer import Printer
|
|
|
|
|
+from backend.app.models.settings import Settings
|
|
|
from backend.app.models.user import User
|
|
from backend.app.models.user import User
|
|
|
from backend.app.services.firmware_check import get_firmware_service
|
|
from backend.app.services.firmware_check import get_firmware_service
|
|
|
from backend.app.services.firmware_update import (
|
|
from backend.app.services.firmware_update import (
|
|
@@ -70,6 +71,37 @@ class LatestFirmwareInfo(BaseModel):
|
|
|
release_notes: str | None = None
|
|
release_notes: str | None = None
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
+async def _checks_enabled(db: AsyncSession) -> bool:
|
|
|
|
|
+ """The "Check printer firmware" setting (default on).
|
|
|
|
|
+
|
|
|
|
|
+ Enforced here and not only in the UI: the printers page asks before its
|
|
|
|
|
+ settings have loaded, so a check switched off still went out to bambulab.com
|
|
|
|
|
+ once per printer on every page load.
|
|
|
|
|
+ """
|
|
|
|
|
+ value = (
|
|
|
|
|
+ await db.execute(select(Settings.value).where(Settings.key == "check_printer_firmware"))
|
|
|
|
|
+ ).scalar_one_or_none()
|
|
|
|
|
+ return (value or "true").lower() != "false"
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
|
|
+def _current_version(printer_id: int) -> str | None:
|
|
|
|
|
+ mqtt_client = printer_manager.get_client(printer_id)
|
|
|
|
|
+ if mqtt_client and mqtt_client.state:
|
|
|
|
|
+ return mqtt_client.state.firmware_version
|
|
|
|
|
+ return None
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
|
|
+def _not_checked(printer: Printer) -> FirmwareUpdateInfo:
|
|
|
|
|
+ return FirmwareUpdateInfo(
|
|
|
|
|
+ printer_id=printer.id,
|
|
|
|
|
+ printer_name=printer.name,
|
|
|
|
|
+ model=printer.model or "Unknown",
|
|
|
|
|
+ current_version=_current_version(printer.id),
|
|
|
|
|
+ latest_version=None,
|
|
|
|
|
+ update_available=False,
|
|
|
|
|
+ )
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
@router.get("/updates", response_model=FirmwareUpdatesResponse)
|
|
@router.get("/updates", response_model=FirmwareUpdatesResponse)
|
|
|
async def check_firmware_updates(
|
|
async def check_firmware_updates(
|
|
|
db: AsyncSession = Depends(get_db),
|
|
db: AsyncSession = Depends(get_db),
|
|
@@ -90,6 +122,9 @@ async def check_firmware_updates(
|
|
|
result = await db.execute(select(Printer).where(Printer.is_active.is_(True)))
|
|
result = await db.execute(select(Printer).where(Printer.is_active.is_(True)))
|
|
|
printers = result.scalars().all()
|
|
printers = result.scalars().all()
|
|
|
|
|
|
|
|
|
|
+ if not await _checks_enabled(db):
|
|
|
|
|
+ return FirmwareUpdatesResponse(updates=[_not_checked(p) for p in printers], updates_available=0)
|
|
|
|
|
+
|
|
|
updates = []
|
|
updates = []
|
|
|
updates_available = 0
|
|
updates_available = 0
|
|
|
|
|
|
|
@@ -142,11 +177,10 @@ async def check_printer_firmware(
|
|
|
if not printer:
|
|
if not printer:
|
|
|
raise HTTPException(status_code=404, detail="Printer not found")
|
|
raise HTTPException(status_code=404, detail="Printer not found")
|
|
|
|
|
|
|
|
- # Get current firmware version from MQTT state
|
|
|
|
|
- current_version = None
|
|
|
|
|
- mqtt_client = printer_manager.get_client(printer.id)
|
|
|
|
|
- if mqtt_client and mqtt_client.state:
|
|
|
|
|
- current_version = mqtt_client.state.firmware_version
|
|
|
|
|
|
|
+ if not await _checks_enabled(db):
|
|
|
|
|
+ return _not_checked(printer)
|
|
|
|
|
+
|
|
|
|
|
+ current_version = _current_version(printer.id)
|
|
|
|
|
|
|
|
# Check for update
|
|
# Check for update
|
|
|
model = printer.model or "Unknown"
|
|
model = printer.model or "Unknown"
|