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:56:57 UTC

[02/11] git commit: [#5650] ticket:323 REST API endpoint for forum list

[#5650] ticket:323 REST API endpoint for forum list


Project: http://git-wip-us.apache.org/repos/asf/incubator-allura/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-allura/commit/d998b4f3
Tree: http://git-wip-us.apache.org/repos/asf/incubator-allura/tree/d998b4f3
Diff: http://git-wip-us.apache.org/repos/asf/incubator-allura/diff/d998b4f3

Branch: refs/heads/master
Commit: d998b4f3203df713087b0fe0ce4f62db9929ac3c
Parents: 6d2320f
Author: Igor Bondarenko <je...@gmail.com>
Authored: Thu May 2 12:11:30 2013 +0000
Committer: Cory Johns <cj...@slashdotmedia.com>
Committed: Wed Jun 26 22:56:11 2013 +0000

----------------------------------------------------------------------
 .../forgediscussion/controllers/root.py         | 26 +++++++++
 .../tests/functional/test_rest.py               | 59 ++++++++++++++++++++
 2 files changed, 85 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/d998b4f3/ForgeDiscussion/forgediscussion/controllers/root.py
----------------------------------------------------------------------
diff --git a/ForgeDiscussion/forgediscussion/controllers/root.py b/ForgeDiscussion/forgediscussion/controllers/root.py
index 8d18847..47cc297 100644
--- a/ForgeDiscussion/forgediscussion/controllers/root.py
+++ b/ForgeDiscussion/forgediscussion/controllers/root.py
@@ -214,6 +214,32 @@ class RootController(BaseController, DispatchIndex, FeedController):
 
 class RootRestController(BaseController):
 
+    def _check_security(self):
+        require_access(c.app, 'read')
+
+    @expose('json:')
+    def index(self, **kw):
+        forums = model.Forum.query.find(dict(
+                        app_config_id=c.app.config._id,
+                        parent_id=None, deleted=False)).all()
+        json = {'forums': []}
+        for f in forums:
+            if h.has_access(f, 'read')():
+                forum = {
+                    'name': f.name,
+                    'description': f.description,
+                    'url': h.absurl('/rest' + f.url()),
+                    'num_topics': f.num_topics,
+                }
+                if f.last_post:
+                    forum['last_post'] = {
+                        'author': f.last_post.author().display_name,
+                        'subject': f.last_post.subject,
+                        'date': f.last_post.mod_date
+                    }
+                json['forums'].append(forum)
+        return json
+
     @expose('json:')
     def validate_import(self, doc=None, username_mapping=None, **kw):
         require_access(c.project, 'admin')

http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/d998b4f3/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
new file mode 100644
index 0000000..e7070ea
--- /dev/null
+++ b/ForgeDiscussion/forgediscussion/tests/functional/test_rest.py
@@ -0,0 +1,59 @@
+# coding: utf-8
+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
+
+
+class TestDiscussionApiBase(TestRestApiBase):
+
+    def setUp(self):
+        super(TestDiscussionApiBase, self).setUp()
+        self.setup_with_tools()
+
+    @td.with_discussion
+    def setup_with_tools(self):
+        h.set_context('test', 'discussion', neighborhood='Projects')
+        self.create_forum('héllo', 'Say Héllo', 'Say héllo here')
+        self.create_topic('general', 'Lets talk', '1st post')
+        self.create_topic('general', 'Hi guys', 'Hi guys')
+
+    def create_forum(self, shortname, name, description):
+        r = self.app.get('/admin/discussion/forums')
+        r.forms[1]['add_forum.shortname'] = 'héllo'
+        r.forms[1]['add_forum.name'] = 'Say Héllo'
+        r.forms[1]['add_forum.description'] = 'Say héllo here'
+        r.forms[1].submit()
+
+    def create_topic(self, forum, subject, text):
+        r = self.app.get('/discussion/create_topic/')
+        f = r.html.find('form', {'action': '/p/test/discussion/save_new_topic'})
+        params = dict()
+        inputs = f.findAll('input')
+        for field in inputs:
+            if field.has_key('name'):
+                params[field['name']] = field.has_key('value') and field['value'] or ''
+        params[f.find('textarea')['name']] = text
+        params[f.find('select')['name']] = forum
+        params[f.find('input', {'style': 'width: 90%'})['name']] = subject
+        r = self.app.post('/discussion/save_new_topic', params=params)
+
+
+class TestRootRestController(TestDiscussionApiBase):
+
+    def test_forum_list(self):
+        forums = self.api_get('/rest/p/test/discussion/')
+        forums = forums.json['forums']
+        assert_equal(len(forums), 2)
+        forums = sorted(forums, key=lambda x: x['name'])
+        assert_equal(forums[0]['name'], 'General Discussion')
+        assert_equal(forums[0]['description'], 'Forum about anything you want to talk about.')
+        assert_equal(forums[0]['num_topics'], 2)
+        assert_equal(forums[0]['url'], 'http://localhost:80/rest/p/test/discussion/general/')
+        assert_equal(forums[0]['last_post']['subject'], 'Hi guys')
+        assert_equal(forums[0]['last_post']['author'], 'Test Admin')
+        assert_equal(forums[1]['name'], u'Say Héllo')
+        assert_equal(forums[1]['description'], u'Say héllo here')
+        assert_equal(forums[1]['num_topics'], 0)
+        assert_equal(forums[1]['url'], 'http://localhost:80/rest/p/test/discussion/h%C3%A9llo/')