- POST /drivers/upload: validates ZIP, parses INF, persists via DriverStore + Peewee - SHA256 dedup: get_or_create prevents duplicate Driver records - GET /drivers route added to pages.py with driver_data context - drivers.router registered in main.py - drivers.html template with HTMX upload form - partials/driver_list.html HTMX target with select dropdown and unused-file notice - Fixed conftest client fixture to use context manager (triggers lifespan/init_db) - [Rule 3] conftest: TestClient context manager required for lifespan trigger - [Rule 1] drivers.py: dynamic DRIVERS_DIR read so monkeypatch works in tests
26 lines
700 B
HTML
26 lines
700 B
HTML
{% extends "base.html" %}
|
|
{% block content %}
|
|
<h1>Drivers</h1>
|
|
|
|
<section>
|
|
<h2>Upload Driver Package</h2>
|
|
<form
|
|
hx-post="/drivers/upload"
|
|
hx-encoding="multipart/form-data"
|
|
hx-target="#driver-list"
|
|
hx-swap="outerHTML"
|
|
hx-indicator="#upload-spinner"
|
|
>
|
|
<label for="driver-file">Driver Package (ZIP containing .inf + driver files)</label>
|
|
<input type="file" id="driver-file" name="file" accept=".zip" required>
|
|
<button type="submit">Upload</button>
|
|
<span id="upload-spinner" class="htmx-indicator" aria-busy="true">Uploading...</span>
|
|
</form>
|
|
</section>
|
|
|
|
<section>
|
|
<h2>Driver Library</h2>
|
|
{% include "partials/driver_list.html" %}
|
|
</section>
|
|
{% endblock %}
|