mirror of
https://github.com/maziggy/bambuddy.git
synced 2026-10-21 10:15:04 +02:00
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:
@@ -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,
|
||||
|
||||
@@ -387,6 +387,12 @@ async def run_migrations(conn):
|
||||
except Exception:
|
||||
pass
|
||||
|
||||
# Migration: Add wiki_url column to maintenance_types for documentation links
|
||||
try:
|
||||
await conn.execute(text("ALTER TABLE maintenance_types ADD COLUMN wiki_url VARCHAR(500)"))
|
||||
except Exception:
|
||||
pass
|
||||
|
||||
|
||||
async def seed_notification_templates():
|
||||
"""Seed default notification templates if they don't exist."""
|
||||
|
||||
@@ -20,6 +20,7 @@ class MaintenanceType(Base):
|
||||
# Interval type: "hours" (print hours) or "days" (calendar days)
|
||||
interval_type: Mapped[str] = mapped_column(String(20), default="hours")
|
||||
icon: Mapped[str | None] = mapped_column(String(50)) # Icon name for UI
|
||||
wiki_url: Mapped[str | None] = mapped_column(String(500)) # Documentation link
|
||||
is_system: Mapped[bool] = mapped_column(Boolean, default=False) # Pre-defined vs custom
|
||||
created_at: Mapped[datetime] = mapped_column(DateTime, server_default=func.now())
|
||||
|
||||
|
||||
@@ -13,6 +13,7 @@ class MaintenanceTypeBase(BaseModel):
|
||||
# "hours" = print hours, "days" = calendar days
|
||||
interval_type: str = Field(default="hours", pattern="^(hours|days)$")
|
||||
icon: str | None = None
|
||||
wiki_url: str | None = None # Documentation link for custom types
|
||||
|
||||
|
||||
class MaintenanceTypeCreate(MaintenanceTypeBase):
|
||||
@@ -25,6 +26,7 @@ class MaintenanceTypeUpdate(BaseModel):
|
||||
default_interval_hours: float | None = Field(default=None, ge=1.0)
|
||||
interval_type: str | None = Field(default=None, pattern="^(hours|days)$")
|
||||
icon: str | None = None
|
||||
wiki_url: str | None = None
|
||||
|
||||
|
||||
class MaintenanceTypeResponse(MaintenanceTypeBase):
|
||||
@@ -96,9 +98,11 @@ class MaintenanceStatus(BaseModel):
|
||||
id: int
|
||||
printer_id: int
|
||||
printer_name: str
|
||||
printer_model: str | None # For model-specific documentation links
|
||||
maintenance_type_id: int
|
||||
maintenance_type_name: str
|
||||
maintenance_type_icon: str | None
|
||||
maintenance_type_wiki_url: str | None # Custom wiki URL for the type
|
||||
enabled: bool
|
||||
# Interval configuration
|
||||
interval_hours: float # custom or default (hours for print-based, days for time-based)
|
||||
@@ -121,6 +125,7 @@ class PrinterMaintenanceOverview(BaseModel):
|
||||
|
||||
printer_id: int
|
||||
printer_name: str
|
||||
printer_model: str | None # For model-specific documentation links
|
||||
total_print_hours: float
|
||||
maintenance_items: list[MaintenanceStatus]
|
||||
due_count: int
|
||||
|
||||
Reference in New Issue
Block a user