You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@allura.apache.org by jo...@apache.org on 2013/06/27 00:57:03 UTC
[08/11] git commit: [#5650] ticket:323 Forum topic API endpoint
[#5650] ticket:323 Forum topic API endpoint
Project: http://git-wip-us.apache.org/repos/asf/incubator-allura/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-allura/commit/1a3f8468
Tree: http://git-wip-us.apache.org/repos/asf/incubator-allura/tree/1a3f8468
Diff: http://git-wip-us.apache.org/repos/asf/incubator-allura/diff/1a3f8468
Branch: refs/heads/master
Commit: 1a3f8468a9e9c66335694d94bd265c0d1bbbda74
Parents: 23d695c
Author: Igor Bondarenko <je...@gmail.com>
Authored: Fri May 3 12:49:45 2013 +0000
Committer: Cory Johns <cj...@slashdotmedia.com>
Committed: Wed Jun 26 22:56:12 2013 +0000
----------------------------------------------------------------------
Allura/allura/model/discuss.py | 1 +
.../forgediscussion/controllers/root.py | 27 ++++++++++++++++++--
ForgeDiscussion/forgediscussion/model/forum.py | 5 ++--
.../tests/functional/test_rest.py | 20 +++++++++++++++
4 files changed, 49 insertions(+), 4 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/1a3f8468/Allura/allura/model/discuss.py
----------------------------------------------------------------------
diff --git a/Allura/allura/model/discuss.py b/Allura/allura/model/discuss.py
index 9728994..a62312f 100644
--- a/Allura/allura/model/discuss.py
+++ b/Allura/allura/model/discuss.py
@@ -165,6 +165,7 @@ class Thread(Artifact, ActivityObject):
discussion_id=str(self.discussion_id),
subject=self.subject,
posts=[dict(slug=p.slug,
+ text=p.text,
subject=p.subject,
attachments=[dict(bytes=attach.length,
url=h.absurl(attach.url())) for attach in p.attachments])
http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/1a3f8468/ForgeDiscussion/forgediscussion/controllers/root.py
----------------------------------------------------------------------
diff --git a/ForgeDiscussion/forgediscussion/controllers/root.py b/ForgeDiscussion/forgediscussion/controllers/root.py
index bc70a13..cc21070 100644
--- a/ForgeDiscussion/forgediscussion/controllers/root.py
+++ b/ForgeDiscussion/forgediscussion/controllers/root.py
@@ -275,9 +275,8 @@ class ForumRestController(BaseController):
self.forum = model.Forum.query.get(
app_config_id=c.app.config._id,
shortname=forum)
- if not self.forum and not self.forum.deleted:
+ if not self.forum or self.forum.deleted:
raise exc.HTTPNotFound()
- super(ForumRestController, self).__init__()
def _check_security(self):
require_access(self.forum, 'read')
@@ -285,3 +284,27 @@ class ForumRestController(BaseController):
@expose('json:')
def index(self, **kw):
return dict(forum=self.forum)
+
+ @expose()
+ def _lookup(self, thread, thread_id, *remainder):
+ if thread == 'thread':
+ topic = model.Forum.thread_class().query.find(dict(
+ app_config_id=c.app.config._id,
+ discussion_id=self.forum._id,
+ _id=unquote(thread_id))).first()
+ if topic:
+ return ForumTopicRestController(self.forum, topic), remainder
+ raise exc.HTTPNotFound()
+
+class ForumTopicRestController(BaseController):
+
+ def __init__(self, forum, topic):
+ self.forum = forum
+ self.topic = topic
+
+ def _check_security(self):
+ require_access(self.forum, 'read')
+
+ @expose('json:')
+ def index(self, **kw):
+ return dict(topic=self.topic)
http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/1a3f8468/ForgeDiscussion/forgediscussion/model/forum.py
----------------------------------------------------------------------
diff --git a/ForgeDiscussion/forgediscussion/model/forum.py b/ForgeDiscussion/forgediscussion/model/forum.py
index 9622e89..d6c5ba1 100644
--- a/ForgeDiscussion/forgediscussion/model/forum.py
+++ b/ForgeDiscussion/forgediscussion/model/forum.py
@@ -146,7 +146,7 @@ class Forum(M.Discussion):
subject=t.subject,
num_replies=t.num_replies,
num_views=t.num_views,
- url=t.url(),
+ url=h.absurl('/rest' + t.url()),
last_post=t.last_post)
for t in self.all_threads]
return json
@@ -169,7 +169,7 @@ class ForumThread(M.Thread):
flags = FieldProperty([str])
discussion = RelationProperty(Forum)
- posts = RelationProperty('ForumPost')
+ posts = RelationProperty('ForumPost', via='thread_id')
first_post = RelationProperty('ForumPost', via='first_post_id')
@property
@@ -207,6 +207,7 @@ class ForumThread(M.Thread):
{'$set':dict(discussion_id=new_forum._id)})
self.discussion_id = new_forum._id
+
class ForumPostHistory(M.PostHistory):
class __mongometa__:
name='post_history'
http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/1a3f8468/ForgeDiscussion/forgediscussion/tests/functional/test_rest.py
----------------------------------------------------------------------
diff --git a/ForgeDiscussion/forgediscussion/tests/functional/test_rest.py b/ForgeDiscussion/forgediscussion/tests/functional/test_rest.py
index d11c282..f1de12e 100644
--- a/ForgeDiscussion/forgediscussion/tests/functional/test_rest.py
+++ b/ForgeDiscussion/forgediscussion/tests/functional/test_rest.py
@@ -4,6 +4,7 @@ from nose.tools import assert_equal
from allura.lib import helpers as h
from allura.tests import decorators as td
from alluratest.controller import TestRestApiBase
+from forgediscussion.model import ForumThread
class TestDiscussionApiBase(TestRestApiBase):
@@ -72,8 +73,27 @@ class TestRootRestController(TestDiscussionApiBase):
assert_equal(topics[0]['num_replies'], 1)
assert_equal(topics[0]['last_post']['author'], 'test-admin')
assert_equal(topics[0]['last_post']['text'], 'Hi boys and girls')
+ t = ForumThread.query.find({'subject': 'Hi guys'}).first()
+ url = 'http://localhost:80/rest/p/test/discussion/general/thread/%s/' % t._id
+ assert_equal(topics[0]['url'], url)
assert_equal(topics[1]['subject'], 'Let\'s talk')
assert_equal(topics[1]['num_views'], 0)
assert_equal(topics[1]['num_replies'], 1)
assert_equal(topics[1]['last_post']['author'], 'test-admin')
assert_equal(topics[1]['last_post']['text'], '1st post')
+ t = ForumThread.query.find({'subject': 'Let\'s talk'}).first()
+ url = 'http://localhost:80/rest/p/test/discussion/general/thread/%s/' % t._id
+ assert_equal(topics[1]['url'], url)
+
+ def test_topic(self):
+ forum = self.api_get('/rest/p/test/discussion/general/')
+ forum = forum.json['forum']
+ assert_equal(forum['name'], 'General Discussion')
+ assert_equal(forum['description'], 'Forum about anything you want to talk about.')
+ topics = forum['topics']
+ topic = self.api_get(topics[0]['url'][len('http://localhost:80'):])
+ topic = topic.json['topic']
+ assert_equal(len(topic['posts']), 1)
+ assert_equal(topic['subject'], 'Hi guys')
+ assert_equal(topic['posts'][0]['text'], 'Hi boys and girls')
+ assert_equal(topic['posts'][0]['subject'], 'Hi guys')