feat(mcp): add list_print_jobs tool

This commit is contained in:
RNL
2026-08-19 22:06:51 +10:00
parent 39e4638f6a
commit 31d0cb677e
2 changed files with 145 additions and 0 deletions

71
tests/test_mcp_jobs.py Normal file
View File

@@ -0,0 +1,71 @@
import pytest
from datetime import timedelta
from django.utils import timezone
from bambu_run.models import Printer, PrintJob, BambuCloudTask
from bambu_run.mcp.jobs import list_print_jobs
@pytest.mark.django_db
def test_list_print_jobs_orders_most_recent_first():
p = Printer.objects.create(name="RNL-H2C", model="H2C", is_active=True)
now = timezone.now()
older = PrintJob.objects.create(device=p, project_name="Old", start_time=now - timedelta(days=1), final_status="FINISH")
newer = PrintJob.objects.create(device=p, project_name="New", start_time=now, final_status="FINISH")
result = list_print_jobs()
assert [j["id"] for j in result["jobs"]] == [newer.id, older.id]
@pytest.mark.django_db
def test_list_print_jobs_filters_by_status_running():
p = Printer.objects.create(name="RNL-H2C", model="H2C", is_active=True)
running = PrintJob.objects.create(device=p, project_name="Live", start_time=timezone.now(), final_status=None)
PrintJob.objects.create(device=p, project_name="Done", start_time=timezone.now(), final_status="FINISH")
result = list_print_jobs(status="running")
assert [j["id"] for j in result["jobs"]] == [running.id]
@pytest.mark.django_db
def test_list_print_jobs_limit_hard_ceiling_100():
p = Printer.objects.create(name="RNL-H2C", model="H2C", is_active=True)
now = timezone.now()
PrintJob.objects.bulk_create([
PrintJob(device=p, project_name=f"Job {i}", start_time=now - timedelta(hours=i), final_status="FINISH")
for i in range(150)
])
result = list_print_jobs(limit=1000)
assert len(result["jobs"]) == 100
@pytest.mark.django_db
def test_list_print_jobs_prefers_cloud_weight_and_tags_source():
p = Printer.objects.create(name="RNL-H2C", model="H2C", is_active=True)
cloud = BambuCloudTask.objects.create(task_id=1, design_title="Cool Bracket", weight_grams=70.10)
PrintJob.objects.create(
device=p, project_name="raw_name", start_time=timezone.now(),
final_status="FINISH", cloud_task=cloud,
)
result = list_print_jobs()
job = result["jobs"][0]
assert job["display_name"] == "Cool Bracket"
assert job["filament_grams"] == 70.10
assert job["filament_grams_source"] == "cloud"
assert job["cost"] is None
@pytest.mark.django_db
def test_list_print_jobs_display_name_falls_back_to_project_name():
p = Printer.objects.create(name="RNL-H2C", model="H2C", is_active=True)
PrintJob.objects.create(device=p, project_name="raw_project", start_time=timezone.now(), final_status="FINISH")
result = list_print_jobs()
assert result["jobs"][0]["display_name"] == "raw_project"