opcje wydatkow w zbiorce
This commit is contained in:
60
app.py
60
app.py
@@ -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"],
|
||||
|
Reference in New Issue
Block a user