Community funktioniert nicht
This commit is contained in:
Binary file not shown.
292
app.py
292
app.py
@@ -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'))
|
||||
@@ -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'">
|
||||
|
||||
Reference in New Issue
Block a user