Files
2024-11-08 23:04:20 +01:00

107 lines
4.6 KiB
Python

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')