summaryrefslogtreecommitdiffhomepage
path: root/apioforum/forum.py
diff options
context:
space:
mode:
Diffstat (limited to 'apioforum/forum.py')
-rw-r--r--apioforum/forum.py79
1 files changed, 60 insertions, 19 deletions
diff --git a/apioforum/forum.py b/apioforum/forum.py
index 1da6d27..a736af9 100644
--- a/apioforum/forum.py
+++ b/apioforum/forum.py
@@ -10,23 +10,45 @@ from .db import get_db
from .mdrender import render
from sqlite3 import OperationalError
+import datetime
bp = Blueprint("forum", __name__, url_prefix="/")
-
@bp.route("/")
-def view_forum():
+def not_actual_index():
+ return redirect("/1")
+
+def forum_path(forum_id):
db = get_db()
+ ancestors = db.execute("""
+ WITH RECURSIVE fs AS
+ (SELECT * FROM forums WHERE id = ?
+ UNION ALL
+ SELECT forums.* FROM forums, fs WHERE fs.parent=forums.id)
+ SELECT * FROM fs;
+ """,(forum_id,)).fetchall()
+ ancestors.reverse()
+ return ancestors
+
+@bp.route("/<int:forum_id>")
+def view_forum(forum_id):
+ db = get_db()
+ forum = db.execute("SELECT * FROM forums WHERE id = ?",(forum_id,)).fetchone()
threads = db.execute(
- """SELECT threads.id, threads.title, threads.creator, threads.created,
- threads.updated, threads.poll, count(posts.id) as num_replies, max(posts.id), posts.author as last_user
+ """SELECT
+ threads.id, threads.title, threads.creator, threads.created,
+ threads.updated, threads.poll, number_of_posts.num_replies,
+ most_recent_posts.created as mrp_created,
+ most_recent_posts.author as mrp_author,
+ most_recent_posts.id as mrp_id,
+ most_recent_posts.content as mrp_content
FROM threads
- INNER JOIN posts ON posts.thread = threads.id
- GROUP BY threads.id
+ INNER JOIN most_recent_posts ON most_recent_posts.thread = threads.id
+ INNER JOIN number_of_posts ON number_of_posts.thread = threads.id
+ WHERE threads.forum = ?
ORDER BY threads.updated DESC;
- """).fetchall()
+ """,(forum_id,)).fetchall()
thread_tags = {}
- preview_post = {}
thread_polls = {}
#todo: somehow optimise this
for thread in threads:
@@ -36,10 +58,6 @@ def view_forum():
WHERE thread_tags.thread = ?
ORDER BY tags.id;
""",(thread['id'],)).fetchall()
- preview_post[thread['id']] = db.execute(
- """SELECT * FROM posts WHERE thread = ?
- ORDER BY created DESC;
- """,(thread['id'],)).fetchone()
if thread['poll'] is not None:
# todo: make this not be duplicated from thread.py
@@ -64,18 +82,41 @@ def view_forum():
thread_polls[thread['id']]=poll
+ subforums_rows = db.execute("""
+ SELECT max(threads.updated) as updated, forums.* FROM forums
+ LEFT OUTER JOIN threads ON threads.forum=forums.id
+ WHERE parent = ?
+ GROUP BY forums.id
+ ORDER BY name ASC
+ """,(forum_id,)).fetchall()
+ subforums = []
+ for s in subforums_rows:
+ a={}
+ a.update(s)
+ if a['updated'] is not None:
+ a['updated'] = datetime.datetime.fromisoformat(a['updated'])
+ subforums.append(a)
+
+
+
+ print(thread_polls)
return render_template("view_forum.html",
+ forum=forum,
+ subforums=subforums,
threads=threads,
thread_tags=thread_tags,
- preview_post=preview_post,
- thread_polls=thread_polls
+ thread_polls=thread_polls,
)
-@bp.route("/create_thread",methods=("GET","POST"))
-def create_thread():
+@bp.route("/<int:forum_id>/create_thread",methods=("GET","POST"))
+def create_thread(forum_id):
db = get_db()
+ forum = db.execute("SELECT * FROM forums WHERE id = ?",(forum_id,)).fetchone()
+ if forum is None:
+ flash("that forum doesn't exist")
+ return redirect(url_for('index'))
if g.user is None:
flash("you need to be logged in to create a thread")
@@ -91,8 +132,8 @@ def create_thread():
if err is None:
cur = db.cursor()
cur.execute(
- "INSERT INTO threads (title,creator,created,updated) VALUES (?,?,current_timestamp,current_timestamp);",
- (title,g.user)
+ "INSERT INTO threads (title,creator,created,updated,forum) VALUES (?,?,current_timestamp,current_timestamp,?);",
+ (title,g.user,forum_id)
)
thread_id = cur.lastrowid
cur.execute(
@@ -124,7 +165,7 @@ def search():
""", (query,)).fetchall()
except OperationalError:
flash('your search query was malformed.')
- return redirect(url_for("forum.view_forum"))
+ return redirect(url_for("forum.not_actual_index"))
display_thread_id = [ True ] * len(results)
last_thread = None