support bammbu run as external django app (#2)

This commit is contained in:
RunLit
2026-02-22 21:32:58 +11:00
committed by GitHub
parent 6376b4cc94
commit ab6a7c0bcc
7 changed files with 62 additions and 5 deletions

View File

@@ -9,9 +9,11 @@
<p class="text-muted">Manage filament colors for auto-matching</p>
</div>
<div class="col-md-4 text-end">
{% if not is_basic_user %}
<a href="{% url 'bambu_run:filament_color_create' %}" class="btn btn-primary">
<i class="bi bi-plus-circle"></i> Add New Color
</a>
{% endif %}
<a href="{% url 'bambu_run:filament_list' %}" class="btn btn-outline-secondary">
<i class="bi bi-arrow-left"></i> Back to Inventory
</a>
@@ -70,8 +72,10 @@
</td>
<td class="align-middle">{{ color.brand }}</td>
<td class="align-middle">
{% if not is_basic_user %}
<a href="{% url 'bambu_run:filament_color_update' color.pk %}" class="btn btn-sm btn-warning">Edit</a>
<a href="{% url 'bambu_run:filament_color_delete' color.pk %}" class="btn btn-sm btn-danger">Delete</a>
{% endif %}
</td>
</tr>
{% empty %}

View File

@@ -13,7 +13,9 @@
<p class="text-body-secondary">Filament Spool Details</p>
</div>
<div class="col-auto">
{% if not is_basic_user %}
<a href="{% url 'bambu_run:filament_update' filament.pk %}" class="btn btn-warning">Edit</a>
{% endif %}
<a href="{% url 'bambu_run:filament_list' %}" class="btn btn-secondary">Back to List</a>
</div>
</div>
@@ -78,6 +80,7 @@
<!-- Usage Chart -->
<div class="card mb-4">
{% if not is_basic_user %}
<div class="card-header">
<div class="d-flex justify-content-between align-items-center flex-wrap gap-2">
<div>
@@ -118,6 +121,7 @@
</div>
</div>
</div>
{% endif %}
<div class="card-body">
<div class="chart-container" style="height: 300px;">
<canvas id="usageChart"></canvas>
@@ -199,6 +203,7 @@
{% block extra_js %}
<script src="https://cdn.jsdelivr.net/npm/chart.js@4.4.0"></script>
{% if not is_basic_user %}
<script>
const filamentId = {{ filament.pk }};
let usageChart = null;
@@ -308,4 +313,19 @@
// Initial load
fetchFilamentUsageData();
</script>
{% else %}
<script>
// Basic user: render static chart from server-provided data if available
document.addEventListener('DOMContentLoaded', function() {
const ctx = document.getElementById('usageChart');
if (ctx) {
new Chart(ctx.getContext('2d'), {
type: 'line',
data: { labels: [], datasets: [{ label: 'Remaining %', data: [], borderColor: 'rgb(75, 192, 192)', backgroundColor: 'rgba(75, 192, 192, 0.1)', tension: 0.3, fill: true }] },
options: { responsive: true, maintainAspectRatio: false, scales: { y: { beginAtZero: true, max: 100 } } }
});
}
});
</script>
{% endif %}
{% endblock %}

View File

@@ -145,7 +145,7 @@
<button type="submit" class="btn btn-primary">Save</button>
<a href="{% url 'bambu_run:filament_list' %}" class="btn btn-secondary">Cancel</a>
</div>
{% if form.instance.pk %}
{% if form.instance.pk and not is_basic_user %}
<button type="button" class="btn btn-danger" data-bs-toggle="modal" data-bs-target="#deleteModal" id="deleteBtn">
<i class="bi bi-trash-fill me-1"></i>Delete
</button>

View File

@@ -12,6 +12,7 @@
<h1>Filament Inventory</h1>
<p class="text-body-secondary">Manage your 3D printer filament spools</p>
</div>
{% if not is_basic_user %}
<div class="col-auto">
<a href="{% url 'bambu_run:filament_type_list' %}" class="btn btn-outline-info me-2">
<i class="bi bi-list-ul"></i> Manage Types
@@ -23,6 +24,7 @@
<i class="bi bi-plus-circle"></i> Add Filament
</a>
</div>
{% endif %}
</div>
<!-- Summary Cards -->
@@ -158,7 +160,9 @@
<td class="align-middle">{{ filament.last_used|date:"Y-m-d H:i"|default:"Never" }}</td>
<td class="align-middle">
<a href="{% url 'bambu_run:filament_detail' filament.pk %}" class="btn btn-sm btn-info">View</a>
{% if not is_basic_user %}
<a href="{% url 'bambu_run:filament_update' filament.pk %}" class="btn btn-sm btn-warning">Edit</a>
{% endif %}
</td>
</tr>
{% empty %}

View File

@@ -9,9 +9,11 @@
<p class="text-muted">Manage filament types (material, sub-type, brand)</p>
</div>
<div class="col-md-4 text-end">
{% if not is_basic_user %}
<a href="{% url 'bambu_run:filament_type_create' %}" class="btn btn-primary">
<i class="bi bi-plus-circle"></i> Add New Type
</a>
{% endif %}
<a href="{% url 'bambu_run:filament_list' %}" class="btn btn-outline-secondary">
<i class="bi bi-arrow-left"></i> Back to Inventory
</a>
@@ -60,8 +62,10 @@
</td>
<td class="align-middle">{{ ft.brand }}</td>
<td class="align-middle">
{% if not is_basic_user %}
<a href="{% url 'bambu_run:filament_type_update' ft.pk %}" class="btn btn-sm btn-warning">Edit</a>
<a href="{% url 'bambu_run:filament_type_delete' ft.pk %}" class="btn btn-sm btn-danger">Delete</a>
{% endif %}
</td>
</tr>
{% empty %}

View File

@@ -203,6 +203,7 @@
</div>
<!-- Date/Time Filter Controls -->
{% if not is_basic_user %}
<div class="row mb-4">
<div class="col-12">
<div class="card">
@@ -247,6 +248,7 @@
</div>
</div>
</div>
{% endif %}
<!-- Filament Timeline Chart - Full Width -->
<div class="row g-3 mb-4">
@@ -372,6 +374,7 @@
<script src="https://cdn.jsdelivr.net/npm/chartjs-plugin-annotation@3.0.1"></script>
<script src="{% static 'bambu_run/js/printer_charts.js' %}"></script>
<script src="{% static 'bambu_run/js/printer_charts_control.js' %}"></script>
{% if not is_basic_user %}
<div id="printerApiUrl" data-url="{% url 'bambu_run:printer_api' %}" style="display: none;"></div>
<script>
document.addEventListener('DOMContentLoaded', function() {
@@ -387,4 +390,18 @@
}
});
</script>
{% else %}
<script>
document.addEventListener('DOMContentLoaded', function() {
const printerData = {{ printer_data_json|safe }};
initPrinterCharts(printerData, null);
if (printerData.project_markers && printerData.project_markers.length > 0) {
setTimeout(function() {
addProjectMarkersToCharts(printerData.project_markers, printerData.timestamps);
}, 500);
}
});
</script>
{% endif %}
{% endblock %}

View File

@@ -17,6 +17,11 @@ from .forms import FilamentForm, FilamentColorForm, FilamentTypeForm
class PrinterDashboardView(LoginRequiredMixin, TemplateView):
template_name = "bambu_run/printer_dashboard.html"
def _get_date_range(self, request):
"""Return (start_dt, end_dt) for the dashboard query. Override for custom date logic."""
time_24h_ago = timezone.now() - timedelta(hours=24)
return time_24h_ago, None # None means "now"
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context['bambu_run_base_template'] = app_settings.BASE_TEMPLATE
@@ -34,11 +39,14 @@ class PrinterDashboardView(LoginRequiredMixin, TemplateView):
tz = zoneinfo.ZoneInfo(app_settings.TIMEZONE)
# Last 24 hours of live data
time_24h_ago = timezone.now() - timedelta(hours=24)
# Get date range (overridable by subclasses)
start_dt, end_dt = self._get_date_range(self.request)
metrics = PrinterMetrics.objects.filter(
device=printer_device, timestamp__gte=time_24h_ago
).prefetch_related('filament_snapshots').order_by("timestamp")
device=printer_device, timestamp__gte=start_dt
)
if end_dt:
metrics = metrics.filter(timestamp__lte=end_dt)
metrics = metrics.prefetch_related('filament_snapshots').order_by("timestamp")
latest_metric = metrics.last()