feat(07-01): wire dashboard data and add /packages listing page
- Dashboard queries 5 most recent Printer records and 5 most recent driver-assigned ones - New /packages route lists printers with drivers, with intunewin/ninja download links - packages.html template extends base.html with Pico grid table - Dashboard printer/package items now link to detail pages - Quick action buttons wired to real routes (removed aria-disabled)
This commit is contained in:
+32
-2
@@ -15,12 +15,23 @@ templates = Jinja2Templates(directory=str(Path(__file__).parent.parent / "templa
|
|||||||
|
|
||||||
@router.get("/", response_class=HTMLResponse)
|
@router.get("/", response_class=HTMLResponse)
|
||||||
def dashboard(request: Request):
|
def dashboard(request: Request):
|
||||||
|
from imptune.db.models import Printer
|
||||||
|
|
||||||
|
recent_printers = list(
|
||||||
|
Printer.select().order_by(Printer.created_at.desc()).limit(5)
|
||||||
|
)
|
||||||
|
recent_packages = list(
|
||||||
|
Printer.select()
|
||||||
|
.where(Printer.driver.is_null(False))
|
||||||
|
.order_by(Printer.created_at.desc())
|
||||||
|
.limit(5)
|
||||||
|
)
|
||||||
return templates.TemplateResponse(
|
return templates.TemplateResponse(
|
||||||
request=request,
|
request=request,
|
||||||
name="dashboard.html",
|
name="dashboard.html",
|
||||||
context={
|
context={
|
||||||
"recent_printers": [],
|
"recent_printers": recent_printers,
|
||||||
"recent_packages": [],
|
"recent_packages": recent_packages,
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -126,3 +137,22 @@ def clients_page(request: Request):
|
|||||||
name="clients.html",
|
name="clients.html",
|
||||||
context={"clients": clients},
|
context={"clients": clients},
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
@router.get("/packages", response_class=HTMLResponse)
|
||||||
|
def packages_page(request: Request):
|
||||||
|
from imptune.db.models import Client, Driver, Printer
|
||||||
|
|
||||||
|
printers = list(
|
||||||
|
Printer.select(Printer, Client, Driver)
|
||||||
|
.join(Client, JOIN.LEFT_OUTER)
|
||||||
|
.switch(Printer)
|
||||||
|
.join(Driver, JOIN.LEFT_OUTER)
|
||||||
|
.where(Printer.driver.is_null(False))
|
||||||
|
.order_by(Printer.name)
|
||||||
|
)
|
||||||
|
return templates.TemplateResponse(
|
||||||
|
request=request,
|
||||||
|
name="packages.html",
|
||||||
|
context={"printers": printers},
|
||||||
|
)
|
||||||
|
|||||||
@@ -4,9 +4,9 @@
|
|||||||
<h1>Dashboard</h1>
|
<h1>Dashboard</h1>
|
||||||
|
|
||||||
<div class="quick-actions">
|
<div class="quick-actions">
|
||||||
<a href="#" aria-disabled="true" class="btn-action">New Printer</a>
|
<a href="/printers" class="btn-action">New Printer</a>
|
||||||
<a href="#" aria-disabled="true" class="btn-action">Upload Driver</a>
|
<a href="/drivers" class="btn-action">Upload Driver</a>
|
||||||
<a href="#" aria-disabled="true" class="btn-action">Export Package</a>
|
<a href="/packages" class="btn-action">Export Package</a>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<section class="recent-activity">
|
<section class="recent-activity">
|
||||||
@@ -17,7 +17,7 @@
|
|||||||
{% if recent_printers %}
|
{% if recent_printers %}
|
||||||
<ul>
|
<ul>
|
||||||
{% for printer in recent_printers %}
|
{% for printer in recent_printers %}
|
||||||
<li>{{ printer.name }} — {{ printer.ip_address }}</li>
|
<li><a href="/printers/{{ printer.id }}">{{ printer.name }}</a> — {{ printer.ip_address }}</li>
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
</ul>
|
</ul>
|
||||||
{% else %}
|
{% else %}
|
||||||
@@ -30,7 +30,7 @@
|
|||||||
{% if recent_packages %}
|
{% if recent_packages %}
|
||||||
<ul>
|
<ul>
|
||||||
{% for package in recent_packages %}
|
{% for package in recent_packages %}
|
||||||
<li>{{ package }}</li>
|
<li><a href="/printers/{{ package.id }}">{{ package.name }}</a>{% if package.client_id %} — {{ package.client.name }}{% endif %}</li>
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
</ul>
|
</ul>
|
||||||
{% else %}
|
{% else %}
|
||||||
|
|||||||
@@ -0,0 +1,37 @@
|
|||||||
|
{% extends "base.html" %}
|
||||||
|
|
||||||
|
{% block content %}
|
||||||
|
<h1>Packages</h1>
|
||||||
|
<p>Printers with drivers assigned — ready for deployment package export.</p>
|
||||||
|
|
||||||
|
{% if printers %}
|
||||||
|
<figure>
|
||||||
|
<table role="grid">
|
||||||
|
<thead>
|
||||||
|
<tr>
|
||||||
|
<th scope="col">Printer</th>
|
||||||
|
<th scope="col">Client</th>
|
||||||
|
<th scope="col">Driver</th>
|
||||||
|
<th scope="col">Downloads</th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
<tbody>
|
||||||
|
{% for printer in printers %}
|
||||||
|
<tr>
|
||||||
|
<td><a href="/printers/{{ printer.id }}">{{ printer.name }}</a></td>
|
||||||
|
<td>{% if printer.client_id %}{{ printer.client.name }}{% else %}—{% endif %}</td>
|
||||||
|
<td>{{ printer.driver.original_filename }}</td>
|
||||||
|
<td>
|
||||||
|
<a href="/printers/{{ printer.id }}/packages/intunewin">.intunewin</a>
|
||||||
|
|
|
||||||
|
<a href="/printers/{{ printer.id }}/packages/ninja">NinjaRMM ZIP</a>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
{% endfor %}
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
</figure>
|
||||||
|
{% else %}
|
||||||
|
<p class="empty-state">No package-ready printers yet. Assign a driver to a printer to enable package export.</p>
|
||||||
|
{% endif %}
|
||||||
|
{% endblock %}
|
||||||
Reference in New Issue
Block a user