changes to the Rechnungs Processing

This commit is contained in:
2026-08-29 08:55:03 +02:00
parent d08117e1a3
commit dd35b37fb5
2 changed files with 63 additions and 48 deletions
+18 -14
View File
@@ -2818,18 +2818,18 @@ def view_hauptvertrag(invoice_id):
flash("Kein Hauptvertrag für diese Rechnung vorhanden.", "error")
return redirect(url_for("my_invoices"))
# Sicherheitsprüfung
# Sicherheitsprüfung: Gehört die Rechnung dem User oder ist es ein Admin?
current_user = session.get("username")
is_admin = session.get("is_admin")
is_admin = session.get("is_admin", False)
if invoice.get("username") != current_user and not is_admin:
flash("Keine Berechtigung zum Anschauen dieses Hauptvertrags.", "error")
return redirect(url_for("my_invoices"))
file_data = invoice["hauptvertrag_data"]
mimetype = invoice.get("hauptvertrag_mimetype", "application/pdf")
filename = invoice.get("hauptvertrag_filename", "hauptvertrag")
filename = invoice.get("hauptvertrag_filename", "Hauptvertrag.pdf")
# Fallback für unterschiedliche Flask-Versionen (< 2.0 vs >= 2.0)
# Rückgabe als Stream an den Browser (inline anzeigen, nicht erzwingen als Download)
try:
return send_file(
io.BytesIO(file_data),
@@ -2838,6 +2838,7 @@ def view_hauptvertrag(invoice_id):
download_name=filename
)
except TypeError:
# Fallback für ältere Flask-Versionen (< 2.0)
return send_file(
io.BytesIO(file_data),
mimetype=mimetype,
@@ -2846,18 +2847,14 @@ def view_hauptvertrag(invoice_id):
)
except Exception as e:
# WICHTIG: Das schreibt den tatsächlichen Fehler in deine Docker-Logs!
import traceback
print(f"KRITISCHER FEHLER in view_hauptvertrag: {e}", flush=True)
traceback.print_exc()
flash("Fehler beim Abrufen der Datei aus der Datenbank.", "error")
return redirect(url_for("my_invoices"))
finally:
if client:
client.close()
@app.route('/my/invoices', methods=['GET', 'POST'])
@login_required
def my_invoices():
@@ -2902,7 +2899,13 @@ def my_invoices():
invoices = []
try:
client, col = _get_collection("invoices")
raw_invoices = list(col.find({"username": session.get("username")}).sort("created_at", -1))
# WICHTIG: "hauptvertrag_data" und "rechnung_data" (die schweren Binärdaten) bei der Abfrage ausschließen (0),
# um den Arbeitsspeicher (RAM) nicht zu überlasten!
raw_invoices = list(col.find(
{"username": session.get("username")},
{"hauptvertrag_data": 0, "rechnung_data": 0}
).sort("created_at", -1))
for inv in raw_invoices:
inv["id"] = str(inv["_id"])
@@ -2913,11 +2916,13 @@ def my_invoices():
except ValueError:
amt = 0.0
inv["amount_eur"] = amt
# Flag setzen, ob Vertrag in MongoDB liegt (ohne die schweren Binärdaten ins Template zu laden)
inv["has_hauptvertrag"] = "hauptvertrag_data" in inv
# Flags setzen, ob Verträge/Rechnungen in MongoDB existieren (anhand des Dateinamens)
inv["has_hauptvertrag"] = bool(inv.get("hauptvertrag_filename"))
inv["has_rechnung"] = bool(inv.get("rechnung_filename"))
invoices.append(inv)
except PyMongoError:
except Exception as e:
flash("Rechnungen konnten nicht geladen werden.", "error")
finally:
if client:
@@ -2936,7 +2941,7 @@ def my_invoices():
except ValueError:
amt = 0.0
item["amount_eur"] = amt
except PyMongoError:
except Exception:
flash("Instanz-Anfragen konnten nicht geladen werden.", "error")
finally:
if 'req_client' in locals() and req_client:
@@ -2944,7 +2949,6 @@ def my_invoices():
return render_template("my_invoices.html", invoices=invoices, instance_requests=instance_requests)
@app.route('/my/instance', methods=['GET', 'POST'])
@login_required
def my_instance_management():