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')