Add device charge-all route, last-charged column, and CSRF fix for quick-assign

This commit is contained in:
2026-06-05 20:08:19 -05:00
parent de986a9305
commit 55ce963d79
4 changed files with 135 additions and 19 deletions
+51 -15
View File
@@ -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/<int:device_id>/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
# ------------------------------------------------------------------ #