From 55ce963d795d1a684db138bcfa6aa54b081bd18f Mon Sep 17 00:00:00 2001 From: Darek Date: Fri, 5 Jun 2026 20:08:19 -0500 Subject: [PATCH] Add device charge-all route, last-charged column, and CSRF fix for quick-assign --- app.py | 66 ++++++++++++++++++++++++++++-------- templates/dashboard.html | 10 ++++-- templates/device_detail.html | 29 +++++++++++++++- tests/test_acceptance.py | 49 ++++++++++++++++++++++++++ 4 files changed, 135 insertions(+), 19 deletions(-) diff --git a/app.py b/app.py index f0810a2..9051481 100644 --- a/app.py +++ b/app.py @@ -23,6 +23,25 @@ def _parse_date(val: str) -> str | None: return None +def _record_charge(db, battery, date_val, increment, notes): + """Apply one charge event to battery. Caller must call db.commit().""" + if increment: + battery.charge_cycles = (battery.charge_cycles or 0) + 1 + battery.battery_percentage = 100 + db.add(BatteryPctLog( + battery_id=battery.id, + percentage=100, + recorded_at=datetime.utcnow().strftime("%Y-%m-%d %H:%M:%S"), + source="charge", + )) + db.add(ChargeLog( + battery_id=battery.id, + charged_date=date_val, + increment_cycles=increment, + notes=notes, + )) + + def create_app(config_object="config"): app = Flask(__name__) app.config.from_object(config_object) @@ -345,17 +364,7 @@ def create_app(config_object="config"): return redirect(url_for("battery_detail", battery_id=battery_id)) increment = 1 if request.form.get("increment_cycles") else 0 notes = request.form.get("notes", "").strip() or None - if increment: - battery.charge_cycles = (battery.charge_cycles or 0) + 1 - battery.battery_percentage = 100 - db.add(BatteryPctLog( - battery_id=battery_id, - percentage=100, - recorded_at=datetime.utcnow().strftime("%Y-%m-%d %H:%M:%S"), - source="charge", - )) - db.add(ChargeLog(battery_id=battery_id, charged_date=date_val, - increment_cycles=increment, notes=notes)) + _record_charge(db, battery, date_val, increment, notes) db.commit() flash("Charge log entry added.", "success") return redirect(url_for("battery_detail", battery_id=battery_id)) @@ -608,10 +617,7 @@ def create_app(config_object="config"): return redirect(url_for("dashboard")) increment = 1 if request.form.get("increment_cycles") else 0 for b in batteries: - db.add(ChargeLog(battery_id=b.id, charged_date=date_val, - increment_cycles=increment, notes=None)) - if increment: - b.charge_cycles = (b.charge_cycles or 0) + 1 + _record_charge(db, b, date_val, increment, notes=None) db.commit() flash( f"Logged charge date {date_val} for " @@ -997,6 +1003,36 @@ def create_app(config_object="config"): flash("No batteries were installed.", "warning") return redirect(url_for("device_detail", device_id=device_id)) + # ------------------------------------------------------------------ # + # Devices — charge all installed batteries + # ------------------------------------------------------------------ # + + @app.route("/device//charge-all", methods=["POST"]) + def device_charge_all(device_id): + device = db.get(Device, device_id) + if device is None: + abort(404) + date_val = _parse_date(request.form.get("charged_date", "").strip()) + if not date_val: + flash("A valid date (YYYY-MM-DD) is required.", "error") + return redirect(url_for("device_detail", device_id=device_id)) + increment = 1 if request.form.get("increment_cycles") else 0 + notes = request.form.get("notes", "").strip() or None + installed = [b for b in device.batteries if b.status == "installed"] + if not installed: + flash("No installed batteries to log.", "warning") + return redirect(url_for("device_detail", device_id=device_id)) + for battery in installed: + _record_charge(db, battery, date_val, increment, notes) + db.commit() + n = len(installed) + flash( + f"Logged charge for {n} batter{'y' if n == 1 else 'ies'} in {device.name}" + + (" (+cycles)." if increment else "."), + "success", + ) + return redirect(url_for("device_detail", device_id=device_id)) + # ------------------------------------------------------------------ # # Export # ------------------------------------------------------------------ # diff --git a/templates/dashboard.html b/templates/dashboard.html index 9add3ca..cc223c9 100644 --- a/templates/dashboard.html +++ b/templates/dashboard.html @@ -324,6 +324,7 @@