from flask import Flask, render_template, redirect, url_for, flash from flask_sqlalchemy import SQLAlchemy from datetime import datetime app = Flask(__name__) app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///projektmanagement.db' app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False app.config['SECRET_KEY'] = 'dein_sicherer_geheimer_schlüssel' # Anpassen für Produktionsumgebung db = SQLAlchemy(app) # Datenbankmodelle class Project(db.Model): id = db.Column(db.Integer, primary_key=True) name = db.Column(db.String(100), nullable=False) status = db.Column(db.String(50), nullable=False) class TeamMember(db.Model): id = db.Column(db.Integer, primary_key=True) name = db.Column(db.String(100), nullable=False) avatar = db.Column(db.String(200), nullable=False) tasks_completed = db.Column(db.Integer, nullable=False) performance = db.Column(db.Integer, nullable=False) class Activity(db.Model): id = db.Column(db.Integer, primary_key=True) user = db.Column(db.String(100), nullable=False) action = db.Column(db.String(50), nullable=False) item = db.Column(db.String(100), nullable=False) timestamp = db.Column(db.DateTime, default=datetime.utcnow) class Resource(db.Model): id = db.Column(db.Integer, primary_key=True) name = db.Column(db.String(100), nullable=False) allocation = db.Column(db.Integer, nullable=False) class Risk(db.Model): id = db.Column(db.Integer, primary_key=True) name = db.Column(db.String(100), nullable=False) level = db.Column(db.String(50), nullable=False) color = db.Column(db.String(20), nullable=False) # Initialisierung der Datenbank def initialize_database(): with app.app_context(): db.create_all() # Nur Beispiel-Daten hinzufügen, falls Datenbank leer ist if not Project.query.first(): db.session.add_all([ Project(name="Projekt A", status="active"), Project(name="Projekt B", status="completed"), Project(name="Projekt C", status="overdue") ]) db.session.add_all([ TeamMember(name="Max Mustermann", avatar="https://via.placeholder.com/40", tasks_completed=5, performance=75), TeamMember(name="Anna Müller", avatar="https://via.placeholder.com/40", tasks_completed=3, performance=50), TeamMember(name="Erik Schmidt", avatar="https://via.placeholder.com/40", tasks_completed=8, performance=90) ]) db.session.add_all([ Activity(user="Max Mustermann", action="erstellt", item="Projekt A"), Activity(user="Anna Müller", action="aktualisiert", item="Projekt B"), Activity(user="Erik Schmidt", action="gelöscht", item="Aufgabe 3") ]) db.session.add_all([ Resource(name="Entwicklung", allocation=80), Resource(name="Marketing", allocation=60), Resource(name="Vertrieb", allocation=40) ]) db.session.add_all([ Risk(name="Budgetüberschreitung", level="Mittel", color="bg-yellow-500"), Risk(name="Zeitverzögerung", level="Hoch", color="bg-red-500"), Risk(name="Ressourcenmangel", level="Niedrig", color="bg-green-500") ]) db.session.commit() # Hilfsfunktionen für Statistiken def get_active_projects(): return Project.query.filter_by(status="active").count() def get_completed_projects(): return Project.query.filter_by(status="completed").count() def get_overdue_tasks(): return Project.query.filter_by(status="overdue").count() def get_task_progress(): total = Project.query.count() completed = get_completed_projects() return round((completed / total) * 100) if total > 0 else 0 @app.route("/") def dashboard(): # Holt Daten aus der Datenbank und gibt sie an das Template weiter return render_template("dashboard.html", active_projects=get_active_projects(), completed_projects=get_completed_projects(), overdue_tasks=get_overdue_tasks(), task_progress=get_task_progress(), team_performance=TeamMember.query.all(), recent_activities=Activity.query.order_by(Activity.timestamp.desc()).all(), resources=Resource.query.all(), risks=Risk.query.all()) if __name__ == "__main__": initialize_database() # Initialisiert die Datenbank beim ersten Start app.run(debug=False, host='0.0.0.0')