Initial commit: Flask battery tracker app
- Flask + SQLAlchemy (MariaDB-compatible schema) battery tracking web app - 40 pre-seeded batteries (Eneloop, BONAI, Energizer NiMH) across 5 devices - Business rules: block retired assignment, brand-mix warnings, capacity checks - Mobile-friendly Jinja2 templates with inline CSS - waitress WSGI server via systemd user service (sbin/install-service.sh) - SQLite → MariaDB migration script (migrate_to_mariadb.py) - 26 passing acceptance tests (pytest + Flask test client) Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,70 @@
|
||||
{% extends "base.html" %}
|
||||
{% block title %}{{ battery.label }} — Battery Tracker{% endblock %}
|
||||
|
||||
{% block content %}
|
||||
<h1>{{ battery.label }}</h1>
|
||||
|
||||
<div class="card">
|
||||
<table style="width:auto;border:none;">
|
||||
<tr>
|
||||
<td style="padding:0.3rem 1rem 0.3rem 0;font-weight:600;color:#64748b;border:none;">Label</td>
|
||||
<td style="border:none;">{{ battery.label }}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td style="padding:0.3rem 1rem 0.3rem 0;font-weight:600;color:#64748b;border:none;">Brand</td>
|
||||
<td style="border:none;">{{ battery.brand }}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td style="padding:0.3rem 1rem 0.3rem 0;font-weight:600;color:#64748b;border:none;">Status</td>
|
||||
<td style="border:none;"><span class="badge badge-{{ battery.status }}">{{ battery.status|capitalize }}</span></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td style="padding:0.3rem 1rem 0.3rem 0;font-weight:600;color:#64748b;border:none;">Device</td>
|
||||
<td style="border:none;">
|
||||
{% if battery.device %}
|
||||
<a href="{{ url_for('device_detail', device_id=battery.device.id) }}">{{ battery.device.name }}</a>
|
||||
{% else %}
|
||||
<span class="text-muted">None</span>
|
||||
{% endif %}
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</div>
|
||||
|
||||
<!-- Notes -->
|
||||
<div class="card">
|
||||
<h2>Notes</h2>
|
||||
<form method="post" action="{{ url_for('battery_edit_notes', battery_id=battery.id) }}">
|
||||
<div class="form-group">
|
||||
<textarea name="notes" placeholder="No notes yet…">{{ battery.notes or '' }}</textarea>
|
||||
</div>
|
||||
<button class="btn btn-primary" type="submit">Save Notes</button>
|
||||
</form>
|
||||
</div>
|
||||
|
||||
<!-- Actions -->
|
||||
<div class="card">
|
||||
<h2>Actions</h2>
|
||||
<div class="form-actions">
|
||||
{% if battery.is_available() %}
|
||||
<a class="btn btn-primary" href="{{ url_for('battery_assign', battery_id=battery.id) }}">Assign to Device</a>
|
||||
{% endif %}
|
||||
|
||||
{% if battery.is_installed() %}
|
||||
<form method="post" action="{{ url_for('battery_unassign', battery_id=battery.id) }}">
|
||||
<button class="btn btn-warning" type="submit">Unassign</button>
|
||||
</form>
|
||||
{% endif %}
|
||||
|
||||
{% if not battery.is_retired() %}
|
||||
<form method="post" action="{{ url_for('battery_retire', battery_id=battery.id) }}">
|
||||
<button class="btn btn-secondary" type="submit">Retire Battery</button>
|
||||
</form>
|
||||
{% endif %}
|
||||
|
||||
<a class="btn btn-danger" href="{{ url_for('battery_delete', battery_id=battery.id) }}">Delete Battery</a>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<a class="text-muted" href="{{ url_for('dashboard') }}">← Back to Dashboard</a>
|
||||
{% endblock %}
|
||||
Reference in New Issue
Block a user