Community funktioniert nicht

This commit is contained in:
2025-05-02 08:25:06 +01:00
parent 693e542d5f
commit 29b44e5c52
3 changed files with 7 additions and 303 deletions

Binary file not shown.

292
app.py
View File

@@ -1482,290 +1482,12 @@ def refresh_mindmap():
def mindmap_page():
return render_template('mindmap.html')
# Weiterleitung für Groß-/Kleinschreibung
@app.route('/Community')
def Community():
# Direkte Umleitung ohne url_for zu verwenden, um Kreisverweise zu vermeiden
return redirect('/')
# Vermeidung der direkten Community-Route, die Probleme verursacht
# Einfache Umleitungen für Community/Forum-Routen
@app.route('/community')
def community():
"""Vermeidet direkten Zugriff auf Community-Forum"""
return redirect('/')
# Alternative Route für Community-Forum, die über das Menü erreichbar ist
@app.route('/Community')
@app.route('/forum')
def forum():
"""Alternative Route zum Community-Forum"""
if not current_user.is_authenticated:
# Wenn Benutzer nicht angemeldet ist, zeige eine Vorschauversion
forum_categories = ForumCategory.query.filter_by(is_active=True).limit(5).all()
categories_data = []
for category in forum_categories:
total_posts = ForumPost.query.filter_by(category_id=category.id, parent_id=None).count()
total_replies = ForumPost.query.filter(
ForumPost.category_id == category.id,
ForumPost.parent_id != None
).count()
categories_data.append({
'category': category,
'total_posts': total_posts,
'total_replies': total_replies,
'latest_post': None
})
return render_template('community/preview.html', categories_data=categories_data)
# Angemeldete Benutzer bekommen die vollständige Version
forum_categories = ForumCategory.query.filter_by(is_active=True).all()
categories_data = []
for category in forum_categories:
total_posts = ForumPost.query.filter_by(category_id=category.id, parent_id=None).count()
total_replies = ForumPost.query.filter(
ForumPost.category_id == category.id,
ForumPost.parent_id != None
).count()
latest_post = ForumPost.query.filter_by(category_id=category.id)\
.order_by(ForumPost.created_at.desc()).first()
categories_data.append({
'category': category,
'total_posts': total_posts,
'total_replies': total_replies,
'latest_post': latest_post
})
return render_template('community/index.html', categories_data=categories_data)
@app.route('/forum/category/<int:category_id>')
@login_required
def forum_category(category_id):
"""Zeigt alle Themen in einer bestimmten Kategorie an"""
category = ForumCategory.query.get_or_404(category_id)
# Haupt-Beiträge (Threads) in dieser Kategorie
threads = ForumPost.query.filter_by(
category_id=category_id,
parent_id=None
).order_by(ForumPost.is_pinned.desc(), ForumPost.created_at.desc()).all()
# Zähle Antworten und hole den neuesten Beitrag für jeden Thread
threads_data = []
for thread in threads:
reply_count = ForumPost.query.filter_by(parent_id=thread.id).count()
latest_reply = ForumPost.query.filter_by(parent_id=thread.id)\
.order_by(ForumPost.created_at.desc()).first()
threads_data.append({
'thread': thread,
'reply_count': reply_count,
'latest_reply': latest_reply
})
return render_template('community/category.html',
category=category,
threads_data=threads_data,
node=category.node)
@app.route('/forum/post/<int:post_id>')
@login_required
def forum_post(post_id):
"""Zeigt einen Beitrag und alle seine Antworten an"""
post = ForumPost.query.get_or_404(post_id)
# Wenn es sich um eine Antwort handelt, leite zur übergeordneten Beitragsseite weiter
if post.parent_id:
return redirect(url_for('forum_post', post_id=post.parent_id))
# Erhöhe die Ansichtszahl
post.view_count += 1
db.session.commit()
# Hole alle Antworten zu diesem Beitrag
replies = ForumPost.query.filter_by(parent_id=post_id)\
.order_by(ForumPost.created_at).all()
return render_template('community/post.html',
post=post,
replies=replies,
category=post.category)
@app.route('/forum/new-post/<int:category_id>', methods=['GET', 'POST'])
@login_required
def new_post(category_id):
"""Erstellt einen neuen Beitrag in einer Kategorie"""
category = ForumCategory.query.get_or_404(category_id)
if request.method == 'POST':
title = request.form.get('title')
content = request.form.get('content')
if not title or not content:
flash('Bitte fülle alle Pflichtfelder aus.', 'error')
return redirect(url_for('new_post', category_id=category_id))
# Neuen Beitrag erstellen
post = ForumPost(
title=title,
content=content,
user_id=current_user.id,
category_id=category_id
)
db.session.add(post)
db.session.commit()
flash('Dein Beitrag wurde erfolgreich erstellt.', 'success')
return redirect(url_for('forum_post', post_id=post.id))
return render_template('community/new_post.html', category=category)
@app.route('/forum/reply/<int:post_id>', methods=['POST'])
@login_required
def reply_to_post(post_id):
"""Antwortet auf einen bestehenden Beitrag"""
parent_post = ForumPost.query.get_or_404(post_id)
# Stelle sicher, dass der Beitrag nicht gesperrt ist
if parent_post.is_locked:
flash('Dieser Beitrag ist gesperrt und kann keine Antworten mehr erhalten.', 'error')
return redirect(url_for('forum_post', post_id=post_id))
content = request.form.get('content')
if not content:
flash('Die Antwort darf nicht leer sein.', 'error')
return redirect(url_for('forum_post', post_id=post_id))
# Erstelle eine Antwort
reply = ForumPost(
title=f"Re: {parent_post.title}",
content=content,
user_id=current_user.id,
category_id=parent_post.category_id,
parent_id=post_id
)
db.session.add(reply)
db.session.commit()
flash('Deine Antwort wurde erfolgreich hinzugefügt.', 'success')
return redirect(url_for('forum_post', post_id=post_id))
@app.route('/forum/edit-post/<int:post_id>', methods=['GET', 'POST'])
@login_required
def edit_post(post_id):
"""Bearbeitet einen bestehenden Beitrag"""
post = ForumPost.query.get_or_404(post_id)
# Überprüfe, ob der Benutzer der Autor ist oder Admin-Rechte hat
if post.user_id != current_user.id and current_user.role != 'admin':
flash('Du hast keine Berechtigung, diesen Beitrag zu bearbeiten.', 'error')
return redirect(url_for('forum_post', post_id=post.parent_id or post.id))
if request.method == 'POST':
title = request.form.get('title')
content = request.form.get('content')
if not title or not content:
flash('Bitte fülle alle Pflichtfelder aus.', 'error')
return redirect(url_for('edit_post', post_id=post_id))
# Aktualisiere den Beitrag
post.title = title
post.content = content
post.updated_at = datetime.utcnow()
db.session.commit()
flash('Dein Beitrag wurde erfolgreich aktualisiert.', 'success')
return redirect(url_for('forum_post', post_id=post.parent_id or post.id))
return render_template('community/edit_post.html', post=post)
@app.route('/forum/delete-post/<int:post_id>', methods=['POST'])
@login_required
def delete_post(post_id):
"""Löscht einen Beitrag"""
post = ForumPost.query.get_or_404(post_id)
# Überprüfe, ob der Benutzer der Autor ist oder Admin-Rechte hat
if post.user_id != current_user.id and current_user.role != 'admin':
flash('Du hast keine Berechtigung, diesen Beitrag zu löschen.', 'error')
return redirect(url_for('forum_post', post_id=post.parent_id or post.id))
# Bestimme, wohin nach dem Löschen weitergeleitet wird
if post.parent_id:
redirect_url = url_for('forum_post', post_id=post.parent_id)
else:
redirect_url = url_for('forum_category', category_id=post.category_id)
# Lösche den Beitrag und seine Antworten
if not post.parent_id: # Wenn es ein Hauptbeitrag ist, lösche auch alle Antworten
ForumPost.query.filter_by(parent_id=post_id).delete()
db.session.delete(post)
db.session.commit()
flash('Der Beitrag wurde erfolgreich gelöscht.', 'success')
return redirect(redirect_url)
@app.route('/forum/toggle-pin/<int:post_id>', methods=['POST'])
@login_required
def toggle_pin_post(post_id):
"""Fixiert oder löst einen Beitrag von der Fixierung"""
# Nur Admins und Moderatoren können Beiträge fixieren
if current_user.role not in ['admin', 'moderator']:
flash('Du hast keine Berechtigung, Beiträge zu fixieren.', 'error')
return redirect(url_for('forum_post', post_id=post_id))
post = ForumPost.query.get_or_404(post_id)
# Nur Hauptbeiträge können fixiert werden
if post.parent_id:
flash('Nur Hauptbeiträge können fixiert werden.', 'error')
return redirect(url_for('forum_post', post_id=post.parent_id))
# Ändere den Status
post.is_pinned = not post.is_pinned
db.session.commit()
status = 'fixiert' if post.is_pinned else 'nicht mehr fixiert'
flash(f'Der Beitrag ist jetzt {status}.', 'success')
return redirect(url_for('forum_post', post_id=post_id))
@app.route('/forum/toggle-lock/<int:post_id>', methods=['POST'])
@login_required
def toggle_lock_post(post_id):
"""Sperrt oder entsperrt einen Beitrag für weitere Antworten"""
# Nur Admins und Moderatoren können Beiträge sperren
if current_user.role not in ['admin', 'moderator']:
flash('Du hast keine Berechtigung, Beiträge zu sperren.', 'error')
return redirect(url_for('forum_post', post_id=post_id))
post = ForumPost.query.get_or_404(post_id)
# Nur Hauptbeiträge können gesperrt werden
if post.parent_id:
flash('Nur Hauptbeiträge können gesperrt werden.', 'error')
return redirect(url_for('forum_post', post_id=post.parent_id))
# Ändere den Status
post.is_locked = not post.is_locked
db.session.commit()
status = 'gesperrt' if post.is_locked else 'entsperrt'
flash(f'Der Beitrag ist jetzt {status}.', 'success')
return redirect(url_for('forum_post', post_id=post_id))
# Fehlerbehandlung
@app.errorhandler(404)
def not_found(e):
return jsonify({'error': 'Nicht gefunden'}), 404
@app.errorhandler(400)
def bad_request(e):
return jsonify({'error': 'Fehlerhafte Anfrage'}), 400
@app.errorhandler(500)
def server_error(e):
return jsonify({'error': 'Serverfehler'}), 500
@app.route('/Forum')
@app.route('/community_forum')
def redirect_to_index():
"""Leitet alle Community/Forum-URLs zur Startseite um"""
return redirect(url_for('index'))

View File

@@ -278,13 +278,6 @@
: '{{ 'nav-link-light-active' if request.endpoint == 'mindmap' else 'nav-link-light' }}'">
<i class="fa-solid fa-diagram-project mr-2"></i>Mindmap
</a>
<a href="{{ url_for('forum') }}"
class="nav-link flex items-center"
x-bind:class="darkMode
? '{{ 'nav-link-active' if request.endpoint == 'forum' else '' }}'
: '{{ 'nav-link-light-active' if request.endpoint == 'forum' else 'nav-link-light' }}'">
<i class="fa-solid fa-users mr-2"></i>Community
</a>
<a href="{{ url_for('search_thoughts_page') }}"
class="nav-link flex items-center"
x-bind:class="darkMode
@@ -456,13 +449,6 @@
: '{{ 'bg-purple-500/10 text-gray-900' if request.endpoint == 'mindmap' else 'text-gray-700 hover:bg-gray-100 hover:text-gray-900' }}'">
<i class="fa-solid fa-diagram-project w-5 mr-3"></i>Mindmap
</a>
<a href="{{ url_for('forum') }}"
class="block py-3.5 px-4 rounded-xl transition-all duration-200 flex items-center"
x-bind:class="darkMode
? '{{ 'bg-purple-500/20 text-white' if request.endpoint == 'forum' else 'text-white/80 hover:bg-gray-800/80 hover:text-white' }}'
: '{{ 'bg-purple-500/10 text-gray-900' if request.endpoint == 'forum' else 'text-gray-700 hover:bg-gray-100 hover:text-gray-900' }}'">
<i class="fa-solid fa-users w-5 mr-3"></i>Community
</a>
<a href="{{ url_for('search_thoughts_page') }}"
class="block py-3.5 px-4 rounded-xl transition-all duration-200 flex items-center"
x-bind:class="darkMode
@@ -541,10 +527,6 @@
:class="darkMode ? 'text-gray-300 hover:text-white' : 'text-gray-600 hover:text-gray-900'">
Mindmap
</a>
<a href="{{ url_for('forum') }}" class="text-sm transition-all duration-200"
:class="darkMode ? 'text-gray-300 hover:text-white' : 'text-gray-600 hover:text-gray-900'">
Community
</a>
{% if current_user.is_authenticated %}
<a href="{{ url_for('profile') }}" class="text-sm transition-all duration-200"
:class="darkMode ? 'text-gray-300 hover:text-white' : 'text-gray-600 hover:text-gray-900'">