summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--apioforum/forum.py33
-rw-r--r--apioforum/templates/create_thread.html14
-rw-r--r--apioforum/templates/view_forum.html1
-rw-r--r--apioforum/templates/view_thread.html6
-rw-r--r--apioforum/thread.py33
5 files changed, 83 insertions, 4 deletions
diff --git a/apioforum/forum.py b/apioforum/forum.py
index c09b0e8..261da15 100644
--- a/apioforum/forum.py
+++ b/apioforum/forum.py
@@ -2,7 +2,8 @@
# currently there is only ever one forum however
from flask import (
- Blueprint, render_template
+ Blueprint, render_template, request,
+ g, redirect, url_for
)
from .db import get_db
@@ -13,3 +14,33 @@ def view_forum():
db = get_db()
threads = db.execute("SELECT * FROM threads ORDER BY updated DESC LIMIT 10;").fetchall()
return render_template("view_forum.html",threads=threads)
+
+@bp.route("/create_thread",methods=("GET","POST"))
+def create_thread():
+ db = get_db()
+ if request.method == "POST":
+ title = request.form['title']
+ content = request.form['content']
+ err = None
+ if g.user is None:
+ err = "you need to be logged in to create a thread"
+ elif len(title.strip()) == 0 or len(content.strip()) == 0:
+ err = "title and content can't be empty"
+
+ if err is None:
+ cur = db.cursor()
+ cur.execute(
+ "INSERT INTO threads (title,creator,created,updated) VALUES (?,?,current_timestamp,current_timestamp);",
+ (title,g.user)
+ )
+ thread_id = cur.lastrowid
+ cur.execute(
+ "INSERT INTO posts (thread,created,author,content) VALUES (?,current_timestamp,?,?);",
+ (thread_id,g.user,content)
+ )
+ db.commit()
+ return redirect(url_for('thread.view_thread',thread_id=thread_id))
+
+
+ return render_template("create_thread.html")
+
diff --git a/apioforum/templates/create_thread.html b/apioforum/templates/create_thread.html
new file mode 100644
index 0000000..b8d204c
--- /dev/null
+++ b/apioforum/templates/create_thread.html
@@ -0,0 +1,14 @@
+{% extends 'base.html' %}
+{% block header %}
+<h1>{% block title %}create thread{% endblock %}</h1>
+{% endblock %}
+
+{% block content %}
+<form action="{{url_for('forum.create_thread')}}", method="POST">
+ <label for="title">thread title</label>
+ <input name="title" id="title">
+ <label for="content">thread content</label>
+ <textarea name="content" id="content"></textarea>
+ <input type="submit" value="yes">
+</form>
+{% endblock %}
diff --git a/apioforum/templates/view_forum.html b/apioforum/templates/view_forum.html
index 2140c7a..13e35a8 100644
--- a/apioforum/templates/view_forum.html
+++ b/apioforum/templates/view_forum.html
@@ -2,6 +2,7 @@
{% block header %}<h1>{% block title %}apio forum george etc{%endblock%}</h1>{%endblock%}
{%block content%}
<p>the</p>
+<a href="{{url_for('forum.create_thread')}}">create thread</a>
<table>
<tr>
<th>id</th>
diff --git a/apioforum/templates/view_thread.html b/apioforum/templates/view_thread.html
index ebbcd3b..718df4e 100644
--- a/apioforum/templates/view_thread.html
+++ b/apioforum/templates/view_thread.html
@@ -9,7 +9,7 @@
<dl>
{% for post in posts %}
<dt>{{post.author}} {{post.created}}</dt>
-<dd>{{post.content}}</dd>
+<dd>{{rendered_posts[loop.index0] | safe}}<dd>
{% else %}
<dt>there weren't</dt>
<dd>any posts</dd>
@@ -17,6 +17,10 @@
</dl>
{% if g.user %}
<p>loggedi n as {{ g.user }}</p>
+<form action="{{url_for('thread.create_post',thread_id=thread_id)}}" method="POST">
+ <textarea name="content"></textarea>
+ <input type="submit" value="yes">
+</form>
{% else %}
<p>not logged in</p>
{% endif %}
diff --git a/apioforum/thread.py b/apioforum/thread.py
index 2276e84..638ff7f 100644
--- a/apioforum/thread.py
+++ b/apioforum/thread.py
@@ -1,8 +1,11 @@
# view posts in thread
from flask import (
- Blueprint, render_template, abort
+ Blueprint, render_template, abort, request, g, redirect,
+ url_for, flash
)
+from markdown import markdown
+from markupsafe import escape
from .db import get_db
bp = Blueprint("thread", __name__, url_prefix="/thread")
@@ -18,5 +21,31 @@ def view_thread(thread_id):
"SELECT * FROM posts WHERE thread = ? ORDER BY created ASC;",
(thread_id,)
).fetchall()
- return render_template("view_thread.html",posts=posts,thread=thread)
+ rendered_posts = [markdown(escape(q['content'])) for q in posts]
+ return render_template("view_thread.html",posts=posts,thread=thread,thread_id=thread_id,rendered_posts=rendered_posts)
+@bp.route("/<int:thread_id>/create_post", methods=("POST",))
+def create_post(thread_id):
+ if g.user is None:
+ flash("you need to log in before you can post")
+ return redirect(url_for('thread.view_thread',thread_id=thread_id))
+ else:
+ db = get_db()
+ content = request.form['content']
+ thread = db.execute("SELECT * FROM threads WHERE id = ?;",(thread_id,)).fetchone()
+ if len(content.strip()) == 0:
+ flash("you cannot post an empty message")
+ elif not thread:
+ flash("that thread does not exist")
+ else:
+ db.execute(
+ "INSERT INTO posts (thread,author,content,created) VALUES (?,?,?,current_timestamp);",
+ (thread_id,g.user,content)
+ )
+ db.execute(
+ "UPDATE threads SET updated = current_timestamp WHERE id = ?;",
+ (thread_id,)
+ )
+ db.commit()
+ flash("post posted postfully")
+ return redirect(url_for('thread.view_thread',thread_id=thread_id))