107 lines
4.6 KiB
Python
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')
|