summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--apioforum/db.py27
-rw-r--r--apioforum/forum.py26
-rw-r--r--apioforum/static/style.css24
-rw-r--r--apioforum/templates/base.html2
-rw-r--r--apioforum/templates/create_thread.html2
-rw-r--r--apioforum/templates/view_forum.html7
-rw-r--r--apioforum/templates/view_thread.html8
7 files changed, 78 insertions, 18 deletions
diff --git a/apioforum/db.py b/apioforum/db.py
index e5159db..76aacc2 100644
--- a/apioforum/db.py
+++ b/apioforum/db.py
@@ -84,6 +84,33 @@ CREATE TABLE thread_tags (
ALTER TABLE users ADD COLUMN bio TEXT;
ALTER TABLE users ADD COLUMN joined TIMESTAMP;
""",
+"""
+CREATE TABLE forums (
+ id INTEGER PRIMARY KEY,
+ name TEXT NOT NULL,
+ parent INTEGER REFERENCES forums(id),
+ description TEXT
+);
+INSERT INTO forums (name,parent,description) values ('root',null,'the default root forum');
+
+PRAGMA foreign_keys = off;
+BEGIN TRANSACTION;
+CREATE TABLE threads_new (
+ id INTEGER PRIMARY KEY,
+ title TEXT NOT NULL,
+ creator TEXT NOT NULL,
+ created TIMESTAMP NOT NULL,
+ updated TIMESTAMP NOT NULL,
+ forum NOT NULL REFERENCES forums(id)
+);
+INSERT INTO threads_new (id,title,creator,created,updated,forum)
+ SELECT id,title,creator,created,updated,1 FROM threads;
+DROP TABLE threads;
+ALTER TABLE threads_new RENAME TO threads;
+COMMIT;
+PRAGMA foreign_keys = on;
+""",
+
]
def init_db():
diff --git a/apioforum/forum.py b/apioforum/forum.py
index fa6fcc8..09d3166 100644
--- a/apioforum/forum.py
+++ b/apioforum/forum.py
@@ -11,20 +11,27 @@ from .mdrender import render
from sqlite3 import OperationalError
-bp = Blueprint("forum", __name__, url_prefix="/")
+from sqlite3 import OperationalError
+bp = Blueprint("forum", __name__, url_prefix="/")
@bp.route("/")
-def view_forum():
+def not_actual_index():
+ return redirect("/1")
+
+@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, count(posts.id) as num_replies, max(posts.id), posts.author as last_user
FROM threads
INNER JOIN posts ON posts.thread = threads.id
+ WHERE threads.forum = ?
GROUP BY threads.id
ORDER BY threads.updated DESC;
- """).fetchall()
+ """,(forum_id,)).fetchall()
thread_tags = {}
preview_post = {}
#todo: somehow optimise this
@@ -40,14 +47,19 @@ def view_forum():
ORDER BY created DESC;
""",(thread['id'],)).fetchone()
return render_template("view_forum.html",
+ forum=forum,
threads=threads,
thread_tags=thread_tags,
preview_post=preview_post
)
-@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")
@@ -63,8 +75,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(
diff --git a/apioforum/static/style.css b/apioforum/static/style.css
index 5f193aa..86611f6 100644
--- a/apioforum/static/style.css
+++ b/apioforum/static/style.css
@@ -79,11 +79,11 @@ dt { font-weight: bold }
img { max-width: 100% }
-nav { float: right; padding: 5px; margin: 2px; border: 1px solid black; display:flex; align-items: center; flex-wrap: wrap }
-nav p { margin-left: 15px; margin-top: 0; margin-bottom: 0; margin-right: 10px; padding: 0 }
-nav p:first-of-type { margin-left:0.5em }
-nav a { color: blue; text-decoration: none }
-nav .links { display: flex; }
+nav#navbar { float: right; padding: 5px; margin: 2px; border: 1px solid black; display:flex; align-items: center; flex-wrap: wrap }
+nav#navbar p { margin-left: 15px; margin-top: 0; margin-bottom: 0; margin-right: 10px; padding: 0 }
+nav#navbar p:first-of-type { margin-left:0.5em }
+nav#navbar a { color: blue; text-decoration: none }
+nav#navbar .links { display: flex; }
/* todo: make the navbar less bad */
.flashmsg { border: 1px solid black; background-color: yellow; max-width: max-content; padding: 5px; clear: both;}
@@ -207,3 +207,17 @@ blockquote {
padding: 1px 3px;
border: 1px solid black;
}
+
+.breadcrumbs {
+ list-style: none;
+}
+
+.breadcrumbs li {
+ display: inline;
+}
+
+.breadcrumbs li+li::before {
+ content: "/\00a0";
+ padding: 8px;
+}
+
diff --git a/apioforum/templates/base.html b/apioforum/templates/base.html
index 637cc09..f462df2 100644
--- a/apioforum/templates/base.html
+++ b/apioforum/templates/base.html
@@ -9,7 +9,7 @@
<link rel="icon" href="//gh0.pw/favicon.ico">
</head>
<body>
- <nav>
+ <nav id="navbar">
<p style="font-family: monospace;"><b>apio</b><i>forum</i>&trade;</p>
<form class="search-form" action="/search">
<input type="search" placeholder="query" name="q">
diff --git a/apioforum/templates/create_thread.html b/apioforum/templates/create_thread.html
index 9de7312..04b4f42 100644
--- a/apioforum/templates/create_thread.html
+++ b/apioforum/templates/create_thread.html
@@ -4,7 +4,7 @@
{% endblock %}
{% block content %}
-<form action="{{url_for('forum.create_thread')}}", method="POST">
+<form method="POST">
<label for="title">thread title</label>
<input name="title" id="title">
<br>
diff --git a/apioforum/templates/view_forum.html b/apioforum/templates/view_forum.html
index d1489c8..f83503b 100644
--- a/apioforum/templates/view_forum.html
+++ b/apioforum/templates/view_forum.html
@@ -1,12 +1,11 @@
{% extends 'base.html' %}
{% from 'common.html' import ts, tag, disp_user, post_url %}
-{% block header %}<h1>{% block title %}apioforum{%endblock%}</h1>{%endblock%}
+{% block header %}<h1>{% block title %}{{forum.name}}{%endblock%}</h1>{%endblock%}
{%block nmcontent%}
<main class="widemain">
-<p>welcome to the apioforum</p>
-<p>forum rules: do not be a bad person. do not do bad things.</p>
+{{forum.description|md|safe}}
{% if g.user %}
-<p><a class="actionbutton" href="{{url_for('forum.create_thread')}}">create new thread</a></p>
+<p><a class="actionbutton" href="{{url_for('forum.create_thread',forum_id=forum.id)}}">create new thread</a></p>
{% else %}
<p>please log in to create a new thread</p>
{% endif %}
diff --git a/apioforum/templates/view_thread.html b/apioforum/templates/view_thread.html
index fb62880..ded2d52 100644
--- a/apioforum/templates/view_thread.html
+++ b/apioforum/templates/view_thread.html
@@ -2,6 +2,14 @@
{% extends 'base.html' %}
{% block header %}
<h1>{%block title %}{{thread.title}}{% endblock %}</h1>
+<nav aria-label="Breadcrumb">
+<ol class="breadcrumbs">
+ <li><a href="{{url_for('index')}}">apioforum</a></li>
+ <li><a href="#">the</a></li>
+ <li>the</li>
+</ol>
+</nav>
+
{% endblock %}
{%block content%}