masowa edycja kategorii, crop dla usera i poprawki w zapytaniach

This commit is contained in:
Mateusz Gruszczyński
2025-07-30 23:57:22 +02:00
parent f4523d0c95
commit 50de359838
6 changed files with 116 additions and 11 deletions

31
app.py
View File

@@ -1143,7 +1143,8 @@ def main_page():
# ostatnia kwota (w tym przypadku max = suma z ostatniego zapisu)
latest_expenses_map = dict(
db.session.query(
Expense.list_id, func.coalesce(func.max(Expense.amount), 0)
Expense.list_id,
func.coalesce(func.sum(Expense.amount), 0)
)
.filter(Expense.list_id.in_(all_ids))
.group_by(Expense.list_id)
@@ -1907,21 +1908,21 @@ def admin_panel():
.group_by(Item.list_id)
.all()
)
stats_map = {
s.list_id: (s.total_count or 0, s.purchased_count or 0) for s in stats
}
# Pobranie ostatnich kwot dla wszystkich list w jednym zapytaniu
latest_expenses_map = dict(
db.session.query(
Expense.list_id, func.coalesce(func.max(Expense.amount), 0)
Expense.list_id,
func.coalesce(func.sum(Expense.amount), 0)
)
.filter(Expense.list_id.in_(all_ids))
.group_by(Expense.list_id)
.all()
)
enriched_lists = []
for l in all_lists:
total_count, purchased_count = stats_map.get(l.id, (0, 0))
@@ -2024,6 +2025,7 @@ def admin_panel():
)
@app.route("/admin/delete_list/<int:list_id>")
@login_required
@admin_required
@@ -2634,6 +2636,27 @@ def recalculate_filesizes_all():
return redirect(url_for("admin_receipts", id="all"))
@app.route("/admin/mass_edit_categories", methods=["GET", "POST"])
@login_required
@admin_required
def admin_mass_edit_categories():
lists = ShoppingList.query.options(joinedload(ShoppingList.categories)).order_by(ShoppingList.created_at.desc()).all()
categories = Category.query.order_by(Category.name.asc()).all()
if request.method == "POST":
for lst in lists:
selected_ids = request.form.getlist(f"categories_{lst.id}")
lst.categories.clear()
if selected_ids:
cats = Category.query.filter(Category.id.in_(selected_ids)).all()
lst.categories.extend(cats)
db.session.commit()
flash("Zaktualizowano kategorie dla wybranych list", "success")
return redirect(url_for("admin_mass_edit_categories"))
return render_template("admin/mass_edit_categories.html", lists=lists, categories=categories)
@app.route("/healthcheck")
def healthcheck():
header_token = request.headers.get("X-Internal-Check")