Add device charge-all route, last-charged column, and CSRF fix for quick-assign
This commit is contained in:
@@ -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
|
||||
# ------------------------------------------------------------------ #
|
||||
|
||||
Reference in New Issue
Block a user