12 Commits

Author SHA1 Message Date
RNL
c395d06db4 aded favicon and fixed ui issues 2026-02-21 14:59:08 +11:00
RNL
27844b5b44 fixed chart missing whitenoise and not rendering 2026-02-21 14:33:27 +11:00
RNL
7af47718e6 added icon and fixed text trunction issue 2026-02-20 19:33:04 +11:00
RNL
4eb2a40186 removed standalone css from dashboard css 2026-02-19 23:57:36 +11:00
RNL
d2787c02fd added side bar toggle 2026-02-19 14:12:28 +11:00
RNL
1bb9686f7b allow local network hosts 2026-02-19 13:44:41 +11:00
RNL
1581739228 print full token to copy paste 2026-02-19 13:36:58 +11:00
RNL
6330529d03 use migrations from django migrate 2026-02-19 11:43:46 +11:00
RNL
ff8b45b648 migrations up to date model 2026-02-19 11:28:00 +11:00
RNL
8ecf2864ef update instruction to do migration; mqtt login more verbose 2026-02-19 10:16:17 +11:00
RNL
5983d80293 project root add to managepy 2026-02-18 23:31:19 +11:00
RNL
aee1615d36 bypass bambu cloud api opencb requirement 2026-02-18 23:18:15 +11:00
7 changed files with 5 additions and 62 deletions

View File

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

View File

@@ -13,9 +13,7 @@
<p class="text-body-secondary">Filament Spool Details</p> <p class="text-body-secondary">Filament Spool Details</p>
</div> </div>
<div class="col-auto"> <div class="col-auto">
{% if not is_basic_user %}
<a href="{% url 'bambu_run:filament_update' filament.pk %}" class="btn btn-warning">Edit</a> <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> <a href="{% url 'bambu_run:filament_list' %}" class="btn btn-secondary">Back to List</a>
</div> </div>
</div> </div>
@@ -80,7 +78,6 @@
<!-- Usage Chart --> <!-- Usage Chart -->
<div class="card mb-4"> <div class="card mb-4">
{% if not is_basic_user %}
<div class="card-header"> <div class="card-header">
<div class="d-flex justify-content-between align-items-center flex-wrap gap-2"> <div class="d-flex justify-content-between align-items-center flex-wrap gap-2">
<div> <div>
@@ -121,7 +118,6 @@
</div> </div>
</div> </div>
</div> </div>
{% endif %}
<div class="card-body"> <div class="card-body">
<div class="chart-container" style="height: 300px;"> <div class="chart-container" style="height: 300px;">
<canvas id="usageChart"></canvas> <canvas id="usageChart"></canvas>
@@ -203,7 +199,6 @@
{% block extra_js %} {% block extra_js %}
<script src="https://cdn.jsdelivr.net/npm/chart.js@4.4.0"></script> <script src="https://cdn.jsdelivr.net/npm/chart.js@4.4.0"></script>
{% if not is_basic_user %}
<script> <script>
const filamentId = {{ filament.pk }}; const filamentId = {{ filament.pk }};
let usageChart = null; let usageChart = null;
@@ -313,19 +308,4 @@
// Initial load // Initial load
fetchFilamentUsageData(); fetchFilamentUsageData();
</script> </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 %} {% endblock %}

View File

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

View File

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

View File

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

View File

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

View File

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