aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--app/models.py9
-rw-r--r--app/templates/threads/view.html21
-rw-r--r--app/views/threads.py35
3 files changed, 61 insertions, 4 deletions
diff --git a/app/models.py b/app/models.py
index ef26bbd..2487e73 100644
--- a/app/models.py
+++ b/app/models.py
@@ -731,6 +731,15 @@ class Thread(db.Model):
watchers = db.relationship("User", secondary=watchers, lazy="subquery", \
backref=db.backref("watching", lazy=True))
+
+ def getSubscribeURL(self):
+ return url_for("thread_subscribe_page",
+ id=self.id)
+
+ def getUnsubscribeURL(self):
+ return url_for("thread_unsubscribe_page",
+ id=self.id)
+
def checkPerm(self, user, perm):
if not user.is_authenticated:
return not self.private
diff --git a/app/templates/threads/view.html b/app/templates/threads/view.html
index 397fba3..71580de 100644
--- a/app/templates/threads/view.html
+++ b/app/templates/threads/view.html
@@ -6,11 +6,24 @@ Threads
{% block content %}
<h1>{% if thread.private %}&#x1f512; {% endif %}{{ thread.title }}</h1>
+ {% if thread.package or current_user.is_authenticated %}
+ {% if thread.package %}
+ <p>Package: <a href="{{ thread.package.getDetailsURL() }}">{{ thread.package.title }}</a></p>
+ {% endif %}
- {% if thread.package %}
- <p>
- Package: <a href="{{ thread.package.getDetailsURL() }}">{{ thread.package.title }}</a>
- </p>
+ {% if current_user.is_authenticated %}
+ {% if current_user in thread.watchers %}
+ <form method="post" action="{{ thread.getUnsubscribeURL() }}">
+ <input type="hidden" name="csrf_token" value="{{ csrf_token() }}" />
+ <input type="submit" value="Unsubscribe" />
+ </form>
+ {% else %}
+ <form method="post" action="{{ thread.getSubscribeURL() }}">
+ <input type="hidden" name="csrf_token" value="{{ csrf_token() }}" />
+ <input type="submit" value="Subscribe" />
+ </form>
+ {% endif %}
+ {% endif %}
{% endif %}
{% if thread.private %}
diff --git a/app/views/threads.py b/app/views/threads.py
index 316ca4d..37ac3d1 100644
--- a/app/views/threads.py
+++ b/app/views/threads.py
@@ -32,6 +32,41 @@ def threads_page():
query = query.filter_by(private=False)
return render_template("threads/list.html", threads=query.all())
+
+@app.route("/threads/<int:id>/subscribe/", methods=["POST"])
+@login_required
+def thread_subscribe_page(id):
+ thread = Thread.query.get(id)
+ if thread is None or not thread.checkPerm(current_user, Permission.SEE_THREAD):
+ abort(404)
+
+ if current_user in thread.watchers:
+ flash("Already subscribed!", "success")
+ else:
+ flash("Subscribed to thread", "success")
+ thread.watchers.append(current_user)
+ db.session.commit()
+
+ return redirect(url_for("thread_page", id=id))
+
+
+@app.route("/threads/<int:id>/unsubscribe/", methods=["POST"])
+@login_required
+def thread_unsubscribe_page(id):
+ thread = Thread.query.get(id)
+ if thread is None or not thread.checkPerm(current_user, Permission.SEE_THREAD):
+ abort(404)
+
+ if current_user in thread.watchers:
+ flash("Unsubscribed!", "success")
+ thread.watchers.remove(current_user)
+ db.session.commit()
+ else:
+ flash("Not subscribed to thread", "success")
+
+ return redirect(url_for("thread_page", id=id))
+
+
@app.route("/threads/<int:id>/", methods=["GET", "POST"])
def thread_page(id):
clearNotifications(url_for("thread_page", id=id))