Initial commit: Open-Source Projektplattform für Schleswig-Holstein
- Flask-App mit SQLite, Projekt-Einreichung und Bewerbungen - Suche und Filter nach Kategorie - Modernes UI mit Bootstrap 5 und Custom CSS - 6 Demo-Projekte via seed_demo_data.py - Docker und docker-compose Support Made-with: Cursor
This commit is contained in:
95
app.py
Normal file
95
app.py
Normal file
@@ -0,0 +1,95 @@
|
||||
import os
|
||||
from flask import Flask, render_template, request, redirect, url_for
|
||||
|
||||
from models import db, Projekt, Bewerbung
|
||||
|
||||
app = Flask(__name__)
|
||||
os.makedirs(app.instance_path, exist_ok=True)
|
||||
app.config["SQLALCHEMY_DATABASE_URI"] = "sqlite:///" + os.path.join(
|
||||
app.instance_path, "projekte.db"
|
||||
)
|
||||
app.config["SQLALCHEMY_TRACK_MODIFICATIONS"] = False
|
||||
app.config["SECRET_KEY"] = os.environ.get("SECRET_KEY", "dev-secret-key")
|
||||
|
||||
db.init_app(app)
|
||||
|
||||
KATEGORIEN = [
|
||||
"Bau & Planung",
|
||||
"Verwaltung",
|
||||
"Bürgerdienste",
|
||||
"Demokratie & Partizipation",
|
||||
"Bildung",
|
||||
"Infrastruktur",
|
||||
]
|
||||
|
||||
|
||||
@app.route("/")
|
||||
def index():
|
||||
suche = request.args.get("suche", "").strip()
|
||||
kategorie = request.args.get("kategorie", "").strip()
|
||||
|
||||
query = Projekt.query
|
||||
if suche:
|
||||
query = query.filter(
|
||||
Projekt.titel.ilike(f"%{suche}%") | Projekt.beschreibung.ilike(f"%{suche}%")
|
||||
)
|
||||
if kategorie:
|
||||
query = query.filter(Projekt.kategorie == kategorie)
|
||||
projekte = query.order_by(Projekt.erstellt_am.desc()).all()
|
||||
|
||||
return render_template(
|
||||
"index.html",
|
||||
projekte=projekte,
|
||||
kategorien=KATEGORIEN,
|
||||
suche=suche,
|
||||
aktuelle_kategorie=kategorie,
|
||||
)
|
||||
|
||||
|
||||
@app.route("/projekt/<int:id>")
|
||||
def projekt_detail(id):
|
||||
projekt = Projekt.query.get_or_404(id)
|
||||
return render_template("projekt_detail.html", projekt=projekt)
|
||||
|
||||
|
||||
@app.route("/projekt/einreichen", methods=["GET", "POST"])
|
||||
def projekt_einreichen():
|
||||
if request.method == "POST":
|
||||
projekt = Projekt(
|
||||
titel=request.form.get("titel", "").strip(),
|
||||
beschreibung=request.form.get("beschreibung", "").strip(),
|
||||
kategorie=request.form.get("kategorie", "").strip(),
|
||||
behoerde=request.form.get("behoerde", "").strip(),
|
||||
kontakt_email=request.form.get("kontakt_email", "").strip(),
|
||||
)
|
||||
if projekt.titel and projekt.beschreibung and projekt.kategorie and projekt.behoerde and projekt.kontakt_email:
|
||||
db.session.add(projekt)
|
||||
db.session.commit()
|
||||
return redirect(url_for("index"))
|
||||
return render_template("projekt_einreichen.html", kategorien=KATEGORIEN)
|
||||
|
||||
|
||||
@app.route("/bewerbung", methods=["POST"])
|
||||
def bewerbung_abgeben():
|
||||
projekt_id = request.form.get("projekt_id", type=int)
|
||||
projekt = Projekt.query.get_or_404(projekt_id)
|
||||
bewerbung = Bewerbung(
|
||||
projekt_id=projekt_id,
|
||||
name=request.form.get("name", "").strip(),
|
||||
email=request.form.get("email", "").strip(),
|
||||
nachricht=request.form.get("nachricht", "").strip() or None,
|
||||
)
|
||||
if bewerbung.name and bewerbung.email:
|
||||
db.session.add(bewerbung)
|
||||
db.session.commit()
|
||||
return redirect(url_for("bewerbung_erfolg"))
|
||||
return redirect(url_for("projekt_detail", id=projekt_id))
|
||||
|
||||
|
||||
@app.route("/bewerbung/erfolg")
|
||||
def bewerbung_erfolg():
|
||||
return render_template("bewerbung_erfolg.html")
|
||||
|
||||
|
||||
with app.app_context():
|
||||
db.create_all()
|
||||
Reference in New Issue
Block a user