From 2e1c3ce8b00bee59f4efc43d44b3dedcbda026bd Mon Sep 17 00:00:00 2001 From: marwin Date: Thu, 1 May 2025 21:04:37 +0100 Subject: [PATCH] Community erstellt --- __pycache__/app.cpython-313.pyc | Bin 69402 -> 80872 bytes __pycache__/models.cpython-313.pyc | Bin 22756 -> 25788 bytes app.py | 379 +++++++++++++++++----- templates/base.html | 18 ++ templates/community/category.html | 192 +++++++++++ templates/community/edit_post.html | 344 ++++++++++++++++++++ templates/community/index.html | 125 ++++++++ templates/community/new_post.html | 355 +++++++++++++++++++++ templates/community/post.html | 491 +++++++++++++++++++++++++++++ 9 files changed, 1818 insertions(+), 86 deletions(-) create mode 100644 templates/community/category.html create mode 100644 templates/community/edit_post.html create mode 100644 templates/community/index.html create mode 100644 templates/community/new_post.html create mode 100644 templates/community/post.html diff --git a/__pycache__/app.cpython-313.pyc b/__pycache__/app.cpython-313.pyc index 1ffc7eaad8ca2530b61afa4d26d1d53d9159859c..3f1a0c360c126e386fdbf0691121fa5d260ccad4 100644 GIT binary patch delta 22945 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 F`@a!xpyB`k delta 15130 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 N>*w^}Xqd=T`agqO&6WTF delta 1156 zcmZ8gZEQDS{NO!recvBX?mh2wp7XrtoO|m5yiGyg zm)zVOgLr0#$A;UzU3qr!rb;W7tgVWtk`E}?04j02xiDu{Sl5dDk+`;lA2UD80S^!5 z=L0a_I_`58=ol&JfW7#&V6}OlP`hYk2XTeN1yStEUyA*Xaj=UIIW~ipiBqA&%!a|2%K`KeN&0wk1R`of~3WFs?NP8WVv?lgK>lYJj7t`t6EN zNjje}@f?88uTPq35?(G&z>?Lpc_BA3;2eq0i#e!`SKxwPfCMIA5r?y>%IYf{FD2c5qk07j7`vk zC1o=u(=M3X%O*h!c9s=e&Je$WpjGTG{;(4NDIUhJGHdZ$bxz(%;+vIn=G=0Naj#18rAf8GaJHGg%|G0 zqDd;6rJ2V3+z- zD3YuF)x!WOTB^ev1d%ghbZ0mtZ;k|%= zoa4te+k|5M+T>q~{U{Wbj3OHSeuZS%2foqo0Qv55') +@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('/community/post/') +@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('/community/new-post/', 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('/community/reply/', 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('/community/edit-post/', 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('/community/delete-post/', 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('/community/toggle-pin/', 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('/community/toggle-lock/', 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): diff --git a/templates/base.html b/templates/base.html index ec774bd..b68067b 100644 --- a/templates/base.html +++ b/templates/base.html @@ -278,6 +278,13 @@ : '{{ 'nav-link-light-active' if request.endpoint == 'mindmap' else 'nav-link-light' }}'"> Mindmap + + Community + Mindmap + + Community + Mindmap + + Community + {% if current_user.is_authenticated %} diff --git a/templates/community/category.html b/templates/community/category.html new file mode 100644 index 0000000..4cea15e --- /dev/null +++ b/templates/community/category.html @@ -0,0 +1,192 @@ +{% extends 'base.html' %} + +{% block title %}{{ category.title }} - Forum{% endblock %} + +{% block extra_css %} + +{% endblock %} + +{% block content %} +
+ +
+ + Forum + + / + {{ category.title }} +
+ + +
+
+ +
+ +
+ + +
+

{{ category.title }}

+

{{ category.description }}

+
+
+ + + + + Neues Thema + +
+ + + + + +
+
+ +
+
+

Mindmap-Knotenpunkt: {{ node.name }}

+

In der Mindmap findest du weitere Informationen zu diesem Themenbereich.

+
+ +
+
+{% endblock %} + +{% block scripts %} + +{% endblock %} \ No newline at end of file diff --git a/templates/community/edit_post.html b/templates/community/edit_post.html new file mode 100644 index 0000000..8c77501 --- /dev/null +++ b/templates/community/edit_post.html @@ -0,0 +1,344 @@ +{% extends 'base.html' %} + +{% block title %}Beitrag bearbeiten{% endblock %} + +{% block extra_css %} + +{% endblock %} + +{% block content %} +
+ +
+ + Forum + + / + + {{ post.category.title }} + + / + {% if post.parent_id %} + + {{ post.parent.title }} + + / + {% endif %} + Beitrag bearbeiten +
+ + +
+

Beitrag bearbeiten

+

+ {% if post.parent_id %} + Antwort auf {{ post.parent.title }} + {% else %} + in der Kategorie {{ post.category.title }} + {% endif %} +

+
+ + +
+
+ + Beitrag bearbeiten +
+
+
+
+ +
+ +
+
+ +
+
+ +
+ + +
+
+ + +
+ +
+ + +
+
+ + +
+
+

Du kannst Knotenpunkte der Mindmap durch @Knotenname verlinken.

+

Dieser Editor unterstützt Markdown-Formatierung:

+
+ + + + + + + + + +
+
+
+
+ +
+ + Abbrechen + + +
+
+
+
+
+{% endblock %} + +{% block scripts %} + +{% endblock %} \ No newline at end of file diff --git a/templates/community/index.html b/templates/community/index.html new file mode 100644 index 0000000..aef5a13 --- /dev/null +++ b/templates/community/index.html @@ -0,0 +1,125 @@ +{% extends 'base.html' %} + +{% block title %}Community Forum{% endblock %} + +{% block extra_css %} + +{% endblock %} + +{% block content %} +
+ +
+

Community Forum

+

Diskutiere mit anderen Nutzern über die Hauptthemenbereiche der Mindmap

+
+ + + + + +
+

+ + So funktioniert das Forum +

+

Das Community-Forum ist nach den Hauptknotenpunkten der Systades-Mindmap strukturiert. + In deinen Beiträgen kannst du Knotenpunkte mit @Knotenname verlinken.

+
+
+
+

Fachliche Diskussionen

+

Tausche dich mit anderen zu spezifischen Themen aus

+
+
+
+

Wissensvernetzung

+

Verknüpfe Inhalte durch Knotenreferenzen

+
+
+
+

Markdown Support

+

Formatiere deine Beiträge mit Markdown

+
+
+
+
+{% endblock %} + +{% block scripts %} + +{% endblock %} \ No newline at end of file diff --git a/templates/community/new_post.html b/templates/community/new_post.html new file mode 100644 index 0000000..df4f115 --- /dev/null +++ b/templates/community/new_post.html @@ -0,0 +1,355 @@ +{% extends 'base.html' %} + +{% block title %}Neues Thema - {{ category.title }}{% endblock %} + +{% block extra_css %} + +{% endblock %} + +{% block content %} +
+ +
+ + Forum + + / + + {{ category.title }} + + / + Neues Thema +
+ + +
+

Neues Thema erstellen

+

in der Kategorie {{ category.title }}

+
+ + +
+
+ + Neues Thema +
+
+
+
+ +
+ +
+
+ +
+
+ +
+ + +
+
+ + +
+ +
+ + +
+
+ + +
+
+

Du kannst Knotenpunkte der Mindmap durch @Knotenname verlinken.

+

Dieser Editor unterstützt Markdown-Formatierung:

+
+ + + + + + + + + +
+
+
+
+ +
+ + Abbrechen + + +
+
+
+
+ + +
+
+ +
+
+

Mindmap-Knotenpunkt: {{ category.node.name }}

+

Dieser Diskussionsbereich ist mit dem Mindmap-Knotenpunkt "{{ category.node.name }}" verknüpft.

+
+ +
+
+{% endblock %} + +{% block scripts %} + +{% endblock %} \ No newline at end of file diff --git a/templates/community/post.html b/templates/community/post.html new file mode 100644 index 0000000..695b4db --- /dev/null +++ b/templates/community/post.html @@ -0,0 +1,491 @@ +{% extends 'base.html' %} + +{% block title %}{{ post.title }} - Forum{% endblock %} + +{% block extra_css %} + +{% endblock %} + +{% block content %} +
+ +
+ + Forum + + / + + {{ category.title }} + + / + {{ post.title }} +
+ + +
+

{{ post.title }}

+
+ {{ post.created_at.strftime('%d.%m.%Y, %H:%M') }} + {{ post.view_count }} Aufrufe + {{ replies|length }} Antworten + + {% if post.is_pinned or post.is_locked %} +
+ {% if post.is_pinned %} + + Angepinnt + + {% endif %} + {% if post.is_locked %} + + Gesperrt + + {% endif %} +
+ {% endif %} +
+
+ + +
+ +
+
+
+ +
+ {% if post.author.avatar %} + {{ post.author.username }} + {% else %} + {{ post.author.username[0].upper() }} + {% endif %} +
+ + +
+
{{ post.author.username }}
+
Erstellt am {{ post.created_at.strftime('%d.%m.%Y, %H:%M') }}
+
+
+ + +
+ {% if current_user.id == post.user_id or current_user.role == 'admin' %} + + + +
+ +
+ {% endif %} + + + {% if current_user.role in ['admin', 'moderator'] %} +
+
+ +
+
+ +
+ {% endif %} +
+
+
+ + +
+
+ {{ post.content|safe }} +
+ + {% if post.updated_at and post.updated_at != post.created_at %} +
+ Zuletzt bearbeitet: {{ post.updated_at.strftime('%d.%m.%Y, %H:%M') }} +
+ {% endif %} +
+
+ + +
+

+ + {{ replies|length }} Antworten +

+ + + {% if replies %} + {% for reply in replies %} +
+ +
+
+
+ +
+ {% if reply.author.avatar %} + {{ reply.author.username }} + {% else %} + {{ reply.author.username[0].upper() }} + {% endif %} +
+ + +
+
{{ reply.author.username }}
+
{{ reply.created_at.strftime('%d.%m.%Y, %H:%M') }}
+
+
+ + +
+ {% if current_user.id == reply.user_id or current_user.role == 'admin' %} + + + +
+ +
+ {% endif %} +
+
+
+ + +
+
+ {{ reply.content|safe }} +
+ + {% if reply.updated_at and reply.updated_at != reply.created_at %} +
+ Zuletzt bearbeitet: {{ reply.updated_at.strftime('%d.%m.%Y, %H:%M') }} +
+ {% endif %} +
+
+ {% endfor %} + {% else %} +
+
+

Noch keine Antworten

+

Sei der Erste, der auf diesen Beitrag antwortet!

+
+ {% endif %} +
+ + + {% if not post.is_locked %} +
+
+ + Antworten +
+
+
+
+ +
+ +
+
+

Du kannst Knotenpunkte der Mindmap durch @Knotenname verlinken.

+

Dieser Editor unterstützt Markdown-Formatierung:

+
+ + + + + + + + + +
+
+
+
+ +
+
+
+
+ {% else %} +
+ + Dieser Beitrag ist geschlossen. Es können keine neuen Antworten mehr verfasst werden. +
+ {% endif %} +
+{% endblock %} + +{% block scripts %} + +{% endblock %} \ No newline at end of file