X-Git-Url: http://git.veekun.com/zzz-spline-forum.git/blobdiff_plain/53a1b80b0d77912434513cd878f71c2520fbc0a4..535d7e4b216ef66de41d3ec591902ecc6154ad9b:/splinext/forum/controllers/forum.py diff --git a/splinext/forum/controllers/forum.py b/splinext/forum/controllers/forum.py index 3628ff0..f2eb476 100644 --- a/splinext/forum/controllers/forum.py +++ b/splinext/forum/controllers/forum.py @@ -4,6 +4,7 @@ import math from pylons import cache, config, request, response, session, tmpl_context as c, url from pylons.controllers.util import abort, redirect +from pylons.decorators.secure import authenticate_form from routes import request_config from sqlalchemy.orm import joinedload from sqlalchemy.orm.exc import NoResultFound @@ -147,10 +148,21 @@ class ForumController(BaseController): c.write_thread_form = WriteThreadForm() - c.threads = c.forum.threads.options( - joinedload('last_post'), - joinedload('last_post.author'), - ) + # nb: This will never show post-less threads. Oh well! + threads_q = c.forum.threads \ + .join(forum_model.Thread.last_post) \ + .order_by(forum_model.Post.posted_time.desc()) \ + .options( + joinedload('last_post'), + joinedload('last_post.author'), + ) + c.num_threads = threads_q.count() + try: + c.skip = int(request.params.get('skip', 0)) + except ValueError: + abort(404) + c.per_page = 89 + c.threads = threads_q.offset(c.skip).limit(c.per_page) return render('/forum/threads.mako') @@ -163,6 +175,17 @@ class ForumController(BaseController): c.write_post_form = WritePostForm() + posts_q = c.thread.posts \ + .order_by(forum_model.Post.position.asc()) \ + .options(joinedload('author')) + c.num_posts = c.thread.post_count + try: + c.skip = int(request.params.get('skip', 0)) + except ValueError: + abort(404) + c.per_page = 89 + c.posts = posts_q.offset(c.skip).limit(c.per_page) + return render('/forum/posts.mako') @@ -178,11 +201,25 @@ class ForumController(BaseController): abort(404) c.write_thread_form = WriteThreadForm(request.params) + return render('/forum/write_thread.mako') - if request.method != 'POST' or not c.write_thread_form.validate(): - # Failure or initial request; show the form - return render('/forum/write_thread.mako') + @authenticate_form + def write_thread_commit(self, forum_id): + """Posts a new thread.""" + if not c.user.can('forum:create-thread'): + abort(403) + + try: + c.forum = meta.Session.query(forum_model.Forum) \ + .filter_by(id=forum_id).one() + except NoResultFound: + abort(404) + c.write_thread_form = WriteThreadForm(request.params) + + # Reshow the form on failure + if not c.write_thread_form.validate(): + return render('/forum/write_thread.mako') # Otherwise, add the post. c.forum = meta.Session.query(forum_model.Forum) \ @@ -194,10 +231,12 @@ class ForumController(BaseController): subject = c.write_thread_form.subject.data, post_count = 1, ) + source = c.write_thread_form.content.data post = forum_model.Post( position = 1, author_user_id = c.user.id, - content = c.write_thread_form.content.data, + raw_content = source, + content = spline.lib.markdown.translate(source), ) thread.posts.append(post) @@ -225,11 +264,25 @@ class ForumController(BaseController): abort(404) c.write_post_form = WritePostForm(request.params) + return render('/forum/write.mako') - if request.method != 'POST' or not c.write_post_form.validate(): - # Failure or initial request; show the form - return render('/forum/write.mako') + @authenticate_form + def write_commit(self, forum_id, thread_id): + """Post to a thread.""" + if not c.user.can('forum:create-post'): + abort(403) + try: + c.thread = meta.Session.query(forum_model.Thread) \ + .filter_by(id=thread_id, forum_id=forum_id).one() + except NoResultFound: + abort(404) + + c.write_post_form = WritePostForm(request.params) + + # Reshow the form on failure + if not c.write_post_form.validate(): + return render('/forum/write.mako') # Otherwise, add the post. c.thread = meta.Session.query(forum_model.Thread) \