opcje wydatkow w zbiorce

This commit is contained in:
Mateusz Gruszczyński
2025-09-20 16:19:30 +02:00
parent b9e85ab5d4
commit 0b221696d4
5 changed files with 158 additions and 16 deletions

60
app.py
View File

@@ -65,6 +65,15 @@ class Zbiorka(db.Model):
passive_deletes=True,
)
wydatki = db.relationship(
"Wydatek",
backref="zbiorka",
lazy=True,
order_by="Wydatek.data.desc()",
cascade="all, delete-orphan",
passive_deletes=True,
)
class Wplata(db.Model):
id = db.Column(db.Integer, primary_key=True)
@@ -80,6 +89,18 @@ class Wplata(db.Model):
zbiorka = db.relationship("Zbiorka", back_populates="wplaty")
class Wydatek(db.Model):
id = db.Column(db.Integer, primary_key=True)
zbiorka_id = db.Column(
db.Integer,
db.ForeignKey("zbiorka.id", ondelete="CASCADE"),
nullable=False,
)
kwota = db.Column(db.Float, nullable=False)
data = db.Column(db.DateTime, default=datetime.utcnow)
opis = db.Column(db.Text, nullable=True)
class GlobalSettings(db.Model):
id = db.Column(db.Integer, primary_key=True)
numer_konta = db.Column(db.String(50), nullable=False)
@@ -193,10 +214,20 @@ def page_not_found(e):
@app.route("/zbiorka/<int:zbiorka_id>")
def zbiorka(zbiorka_id):
zb = Zbiorka.query.get_or_404(zbiorka_id)
# Jeżeli zbiórka jest ukryta i użytkownik nie jest administratorem, zwróć 404
if zb.ukryta and (not current_user.is_authenticated or not current_user.is_admin):
abort(404)
return render_template("zbiorka.html", zbiorka=zb)
# scalona oś czasu: wpłaty + wydatki
aktywnosci = [
{"typ": "wpłata", "kwota": w.kwota, "opis": w.opis, "data": w.data}
for w in zb.wplaty
] + [
{"typ": "wydatek", "kwota": x.kwota, "opis": x.opis, "data": x.data}
for x in zb.wydatki
]
aktywnosci.sort(key=lambda a: a["data"], reverse=True)
return render_template("zbiorka.html", zbiorka=zb, aktywnosci=aktywnosci)
# TRASY LOGOWANIA I REJESTRACJI
@@ -551,6 +582,31 @@ def admin_ustawienia():
)
@app.route("/admin/zbiorka/<int:zbiorka_id>/wydatek/dodaj", methods=["GET", "POST"])
@login_required
def dodaj_wydatek(zbiorka_id):
if not current_user.is_admin:
flash("Brak uprawnień", "danger")
return redirect(url_for("index"))
zb = Zbiorka.query.get_or_404(zbiorka_id)
if request.method == "POST":
try:
kwota = float(request.form["kwota"])
if kwota <= 0:
raise ValueError
except (KeyError, ValueError):
flash("Nieprawidłowa kwota", "danger")
return redirect(url_for("dodaj_wydatek", zbiorka_id=zbiorka_id))
opis = request.form.get("opis", "")
nowy_wydatek = Wydatek(zbiorka_id=zb.id, kwota=kwota, opis=opis)
zb.stan -= kwota
db.session.add(nowy_wydatek)
db.session.commit()
flash("Wydatek został dodany", "success")
return redirect(url_for("admin_dashboard"))
return render_template("admin/dodaj_wydatek.html", zbiorka=zb)
@app.route(
"/admin/zbiorka/oznacz/niezrealizowana/<int:zbiorka_id>",
methods=["POST"],