Add maintenance documentation links with model-specific wiki URLs (#59)

Features:
  - Add wiki_url field to MaintenanceType for custom type documentation links
  - Add printer_model to MaintenanceStatus for model-specific URL mapping
  - Display external link icon next to maintenance item names
  - Map system maintenance types to Bambu Lab wiki pages by printer model:
    - Lubricate Linear Rails, Clean Nozzle/Hotend, Check Belt Tension
    - Clean Carbon Rods (X1/P1 only), Clean Build Plate, Check PTFE Tube
    - HEPA/Carbon Filter, Left Nozzle Rail (H2 series)
  - Add Documentation Link input to custom type create/edit forms

  Bug fix:
  - Fix 500 error when assigning maintenance type to printer (lazy loading)

  Database:
  - Add migration for wiki_url column on maintenance_types table
This commit is contained in:
maziggy
2026-01-07 07:53:42 +01:00
parent fe1d10b705
commit 4f2a45c190
8 changed files with 218 additions and 62 deletions
+15 -1
View File
@@ -294,9 +294,11 @@ async def _get_printer_maintenance_internal(
id=item_id,
printer_id=printer_id,
printer_name=printer.name,
printer_model=printer.model,
maintenance_type_id=maint_type.id,
maintenance_type_name=maint_type.name,
maintenance_type_icon=maint_type.icon,
maintenance_type_wiki_url=getattr(maint_type, "wiki_url", None),
enabled=enabled,
interval_hours=interval,
interval_type=interval_type,
@@ -317,6 +319,7 @@ async def _get_printer_maintenance_internal(
return PrinterMaintenanceOverview(
printer_id=printer_id,
printer_name=printer.name,
printer_model=printer.model,
total_print_hours=total_hours,
maintenance_items=maintenance_items,
due_count=due_count,
@@ -417,7 +420,16 @@ async def assign_maintenance_type(
)
db.add(item)
await db.commit()
await db.refresh(item)
# Re-fetch with relationship loaded for response serialization
from sqlalchemy.orm import selectinload
result = await db.execute(
select(PrinterMaintenance)
.options(selectinload(PrinterMaintenance.maintenance_type))
.where(PrinterMaintenance.id == item.id)
)
item = result.scalar_one()
return item
@@ -494,9 +506,11 @@ async def perform_maintenance(
id=item.id,
printer_id=item.printer_id,
printer_name=printer.name,
printer_model=printer.model,
maintenance_type_id=item.maintenance_type_id,
maintenance_type_name=item.maintenance_type.name,
maintenance_type_icon=item.maintenance_type.icon,
maintenance_type_wiki_url=getattr(item.maintenance_type, "wiki_url", None),
enabled=item.enabled,
interval_hours=interval,
interval_type=interval_type,