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