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:56 UTC
[01/11] git commit: [#5650] ticket:323 REST API endpoint for forum
Updated Branches:
refs/heads/master 6d2320f7f -> a36f8c391
[#5650] ticket:323 REST API endpoint for forum
Project: http://git-wip-us.apache.org/repos/asf/incubator-allura/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-allura/commit/383f697a
Tree: http://git-wip-us.apache.org/repos/asf/incubator-allura/tree/383f697a
Diff: http://git-wip-us.apache.org/repos/asf/incubator-allura/diff/383f697a
Branch: refs/heads/master
Commit: 383f697a66b34e7314f5ec1d39aa7a4200b12888
Parents: d998b4f
Author: Igor Bondarenko <je...@gmail.com>
Authored: Thu May 2 13:11:12 2013 +0000
Committer: Cory Johns <cj...@slashdotmedia.com>
Committed: Wed Jun 26 22:56:11 2013 +0000
----------------------------------------------------------------------
.../forgediscussion/controllers/root.py | 46 ++++++++++++++++++++
.../tests/functional/test_rest.py | 18 +++++++-
2 files changed, 63 insertions(+), 1 deletion(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/383f697a/ForgeDiscussion/forgediscussion/controllers/root.py
----------------------------------------------------------------------
diff --git a/ForgeDiscussion/forgediscussion/controllers/root.py b/ForgeDiscussion/forgediscussion/controllers/root.py
index 47cc297..74d5d18 100644
--- a/ForgeDiscussion/forgediscussion/controllers/root.py
+++ b/ForgeDiscussion/forgediscussion/controllers/root.py
@@ -20,6 +20,7 @@ import logging
from urllib import unquote
from itertools import imap
+import pymongo
from tg import expose, validate, redirect, flash, response
from tg.decorators import with_trailing_slash
from pylons import tmpl_context as c, app_globals as g
@@ -217,6 +218,10 @@ class RootRestController(BaseController):
def _check_security(self):
require_access(c.app, 'read')
+ @expose()
+ def _lookup(self, forum, *remainder):
+ return ForumRestController(unquote(forum)), remainder
+
@expose('json:')
def index(self, **kw):
forums = model.Forum.query.find(dict(
@@ -272,3 +277,44 @@ class RootRestController(BaseController):
raise
log.exception(e)
return dict(status=False, errors=[str(e)])
+
+
+class ForumRestController(BaseController):
+
+ def __init__(self, forum):
+ self.forum = model.Forum.query.get(
+ app_config_id=c.app.config._id,
+ shortname=forum)
+ if not self.forum and not self.forum.deleted:
+ raise exc.HTTPNotFound()
+ super(ForumRestController, self).__init__()
+
+ def _check_security(self):
+ require_access(self.forum, 'read')
+
+ @expose('json:')
+ def index(self, **kw):
+ topics = model.ForumThread.query.find(
+ dict(discussion_id=self.forum._id, num_replies={'$gt': 0}))
+ topics = topics.sort([('flags', pymongo.DESCENDING),
+ ('last_post_date', pymongo.DESCENDING)])
+ json = {
+ 'forum': {
+ 'name': self.forum.name,
+ 'description': self.forum.description,
+ 'topics': [],
+ }
+ }
+ for t in topics:
+ topic = {
+ 'subject': t.subject,
+ 'num_views': t.num_views,
+ 'num_replies': t.num_replies,
+ 'url': h.absurl('/rest' + t.url()),
+ 'last_post': {
+ 'author': t.last_post.author().display_name,
+ 'date': t.last_post.mod_date
+ },
+ }
+ json['forum']['topics'].append(topic)
+ return json
http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/383f697a/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 e7070ea..d094175 100644
--- a/ForgeDiscussion/forgediscussion/tests/functional/test_rest.py
+++ b/ForgeDiscussion/forgediscussion/tests/functional/test_rest.py
@@ -16,7 +16,7 @@ class TestDiscussionApiBase(TestRestApiBase):
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', 'Let\'s talk', '1st post')
self.create_topic('general', 'Hi guys', 'Hi guys')
def create_forum(self, shortname, name, description):
@@ -57,3 +57,19 @@ class TestRootRestController(TestDiscussionApiBase):
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/')
+
+ def test_forum(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']
+ assert_equal(len(topics), 2)
+ assert_equal(topics[0]['subject'], 'Hi guys')
+ assert_equal(topics[0]['num_views'], 0)
+ assert_equal(topics[0]['num_replies'], 1)
+ assert_equal(topics[0]['last_post']['author'], 'Test Admin')
+ 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')
[03/11] git commit: [#5650] ticket:323 Fix ordering in paginated
results
Posted by jo...@apache.org.
[#5650] ticket:323 Fix ordering in paginated results
Project: http://git-wip-us.apache.org/repos/asf/incubator-allura/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-allura/commit/98669129
Tree: http://git-wip-us.apache.org/repos/asf/incubator-allura/tree/98669129
Diff: http://git-wip-us.apache.org/repos/asf/incubator-allura/diff/98669129
Branch: refs/heads/master
Commit: 9866912972b3939023fc9e94fd934a5adfb3fef9
Parents: 44ad385
Author: Igor Bondarenko <je...@gmail.com>
Authored: Tue May 7 10:23:35 2013 +0000
Committer: Cory Johns <cj...@slashdotmedia.com>
Committed: Wed Jun 26 22:56:12 2013 +0000
----------------------------------------------------------------------
ForgeDiscussion/forgediscussion/controllers/root.py | 10 ++++------
1 file changed, 4 insertions(+), 6 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/98669129/ForgeDiscussion/forgediscussion/controllers/root.py
----------------------------------------------------------------------
diff --git a/ForgeDiscussion/forgediscussion/controllers/root.py b/ForgeDiscussion/forgediscussion/controllers/root.py
index 1f577f2..11d6c6c 100644
--- a/ForgeDiscussion/forgediscussion/controllers/root.py
+++ b/ForgeDiscussion/forgediscussion/controllers/root.py
@@ -228,7 +228,7 @@ class RootRestController(BaseController):
forums = model.Forum.query.find(dict(
app_config_id=c.app.config._id,
parent_id=None, deleted=False)
- ).skip(start).limit(limit)
+ ).sort([('shortname', pymongo.ASCENDING)]).skip(start).limit(limit)
count = forums.count()
json = dict(forums=[dict(_id=f._id,
name=f.name,
@@ -334,13 +334,11 @@ class ForumTopicRestController(BaseController):
@expose('json:')
def index(self, limit=100, page=0, **kw):
limit, page, start = g.handle_paging(int(limit), int(page))
- posts = model.ForumPost.query.find(dict(thread_id=self.topic._id))
- posts = posts.skip(start).limit(limit)
- count = posts.count()
+ posts = self.topic.query_posts(page=page, limit=limit, style='')
json = {}
json['topic'] = self.topic.__json__()
- json['topic']['posts'] = posts.all()
- json['count'] = count
+ json['count'] = posts.count()
json['page'] = page
json['limit'] = limit
+ json['topic']['posts'] = posts.all()
return json
[07/11] git commit: [#5650] ticket:323 Test for permission checking
Posted by jo...@apache.org.
[#5650] ticket:323 Test for permission checking
Project: http://git-wip-us.apache.org/repos/asf/incubator-allura/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-allura/commit/fda008fd
Tree: http://git-wip-us.apache.org/repos/asf/incubator-allura/tree/fda008fd
Diff: http://git-wip-us.apache.org/repos/asf/incubator-allura/diff/fda008fd
Branch: refs/heads/master
Commit: fda008fd88d81f7eb17590803119be61ec1532be
Parents: ed29d9d
Author: Igor Bondarenko <je...@gmail.com>
Authored: Fri May 3 13:53:41 2013 +0000
Committer: Cory Johns <cj...@slashdotmedia.com>
Committed: Wed Jun 26 22:56:12 2013 +0000
----------------------------------------------------------------------
.../tests/functional/test_rest.py | 24 ++++++++++++++++++++
1 file changed, 24 insertions(+)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/fda008fd/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 d335d6b..5909822 100644
--- a/ForgeDiscussion/forgediscussion/tests/functional/test_rest.py
+++ b/ForgeDiscussion/forgediscussion/tests/functional/test_rest.py
@@ -3,6 +3,7 @@ from nose.tools import assert_equal
from allura.lib import helpers as h
from allura.tests import decorators as td
+from allura import model as M
from alluratest.controller import TestRestApiBase
from forgediscussion.model import ForumThread
@@ -113,3 +114,26 @@ class TestRootRestController(TestDiscussionApiBase):
assert_equal(resp.json['count'], 2)
assert_equal(resp.json['page'], 1)
assert_equal(resp.json['limit'], 1)
+
+ def test_security(self):
+ p = M.Project.query.get(shortname='test')
+ acl = p.app_instance('discussion').config.acl
+ anon = M.ProjectRole.by_name('*anonymous')._id
+ auth = M.ProjectRole.by_name('*authenticated')._id
+ anon_read = M.ACE.allow(anon, 'read')
+ auth_read = M.ACE.allow(auth, 'read')
+ acl.remove(anon_read)
+ acl.append(auth_read)
+ self.api_get('/rest/p/test/discussion/')
+ self.app.get('/rest/p/test/discussion/',
+ extra_environ={'username': '*anonymous'},
+ status=401)
+ self.api_get('/rest/p/test/discussion/general/')
+ self.app.get('/rest/p/test/discussion/general/',
+ extra_environ={'username': '*anonymous'},
+ status=401)
+ t = ForumThread.query.find({'subject': 'Hi guys'}).first()
+ self.api_get('/rest/p/test/discussion/general/thread/%s/' % t._id)
+ self.app.get('/rest/p/test/discussion/general/thread/%s/' % t._id,
+ extra_environ={'username': '*anonymous'},
+ status=401)
[02/11] git commit: [#5650] ticket:323 REST API endpoint for forum
list
Posted by jo...@apache.org.
[#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/')
[11/11] git commit: [#5650] ticket:323 Pagination for topic's posts
Posted by jo...@apache.org.
[#5650] ticket:323 Pagination for topic's posts
Project: http://git-wip-us.apache.org/repos/asf/incubator-allura/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-allura/commit/44ad385c
Tree: http://git-wip-us.apache.org/repos/asf/incubator-allura/tree/44ad385c
Diff: http://git-wip-us.apache.org/repos/asf/incubator-allura/diff/44ad385c
Branch: refs/heads/master
Commit: 44ad385c3eb62b2ec6723e16d06d47eaed691a92
Parents: f1b854c
Author: Igor Bondarenko <je...@gmail.com>
Authored: Tue May 7 09:50:04 2013 +0000
Committer: Cory Johns <cj...@slashdotmedia.com>
Committed: Wed Jun 26 22:56:12 2013 +0000
----------------------------------------------------------------------
.../forgediscussion/controllers/root.py | 14 ++++++++++++--
ForgeDiscussion/forgediscussion/model/forum.py | 6 ++++++
.../tests/functional/test_rest.py | 19 +++++++++++++++++++
3 files changed, 37 insertions(+), 2 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/44ad385c/ForgeDiscussion/forgediscussion/controllers/root.py
----------------------------------------------------------------------
diff --git a/ForgeDiscussion/forgediscussion/controllers/root.py b/ForgeDiscussion/forgediscussion/controllers/root.py
index 7ff7fcb..1f577f2 100644
--- a/ForgeDiscussion/forgediscussion/controllers/root.py
+++ b/ForgeDiscussion/forgediscussion/controllers/root.py
@@ -332,5 +332,15 @@ class ForumTopicRestController(BaseController):
require_access(self.forum, 'read')
@expose('json:')
- def index(self, **kw):
- return dict(topic=self.topic)
+ def index(self, limit=100, page=0, **kw):
+ limit, page, start = g.handle_paging(int(limit), int(page))
+ posts = model.ForumPost.query.find(dict(thread_id=self.topic._id))
+ posts = posts.skip(start).limit(limit)
+ count = posts.count()
+ json = {}
+ json['topic'] = self.topic.__json__()
+ json['topic']['posts'] = posts.all()
+ json['count'] = count
+ json['page'] = page
+ json['limit'] = limit
+ return json
http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/44ad385c/ForgeDiscussion/forgediscussion/model/forum.py
----------------------------------------------------------------------
diff --git a/ForgeDiscussion/forgediscussion/model/forum.py b/ForgeDiscussion/forgediscussion/model/forum.py
index e8f920a..1a4a734 100644
--- a/ForgeDiscussion/forgediscussion/model/forum.py
+++ b/ForgeDiscussion/forgediscussion/model/forum.py
@@ -200,6 +200,12 @@ class ForumThread(M.Thread):
{'$set':dict(discussion_id=new_forum._id)})
self.discussion_id = new_forum._id
+ def __json__(self):
+ return dict(
+ _id=self._id,
+ discussion_id=str(self.discussion_id),
+ subject=self.subject)
+
class ForumPostHistory(M.PostHistory):
class __mongometa__:
http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/44ad385c/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 87c2fda..45ef742 100644
--- a/ForgeDiscussion/forgediscussion/tests/functional/test_rest.py
+++ b/ForgeDiscussion/forgediscussion/tests/functional/test_rest.py
@@ -131,6 +131,25 @@ class TestRootRestController(TestDiscussionApiBase):
assert_equal(resp.json['page'], 1)
assert_equal(resp.json['limit'], 1)
+ def test_topic_pagination(self):
+ thread = ForumThread.query.find({'subject': 'Hi guys'}).first()
+ thread.post('Hi guy', 'I am second post')
+ url = '/rest/p/test/discussion/general/thread/%s/' % thread._id
+ resp = self.app.get(url + '?limit=1')
+ posts = resp.json['topic']['posts']
+ assert_equal(len(posts), 1)
+ assert_equal(posts[0]['text'], 'Hi boys and girls')
+ assert_equal(resp.json['count'], 2)
+ assert_equal(resp.json['page'], 0)
+ assert_equal(resp.json['limit'], 1)
+ resp = self.app.get(url + '?limit=1&page=1')
+ posts = resp.json['topic']['posts']
+ assert_equal(len(posts), 1)
+ assert_equal(posts[0]['text'], 'I am second post')
+ assert_equal(resp.json['count'], 2)
+ assert_equal(resp.json['page'], 1)
+ assert_equal(resp.json['limit'], 1)
+
def test_security(self):
p = M.Project.query.get(shortname='test')
acl = p.app_instance('discussion').config.acl
[05/11] git commit: [#5650] ticket:323 Permission checks for private
forums
Posted by jo...@apache.org.
[#5650] ticket:323 Permission checks for private forums
Project: http://git-wip-us.apache.org/repos/asf/incubator-allura/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-allura/commit/2be7cd4e
Tree: http://git-wip-us.apache.org/repos/asf/incubator-allura/tree/2be7cd4e
Diff: http://git-wip-us.apache.org/repos/asf/incubator-allura/diff/2be7cd4e
Branch: refs/heads/master
Commit: 2be7cd4e7a1572ee866455f88b42ff71c5c1f118
Parents: 9866912
Author: Igor Bondarenko <je...@gmail.com>
Authored: Tue May 7 10:49:03 2013 +0000
Committer: Cory Johns <cj...@slashdotmedia.com>
Committed: Wed Jun 26 22:56:12 2013 +0000
----------------------------------------------------------------------
ForgeDiscussion/forgediscussion/controllers/root.py | 2 +-
.../forgediscussion/tests/functional/test_rest.py | 15 +++++++++++++++
2 files changed, 16 insertions(+), 1 deletion(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/2be7cd4e/ForgeDiscussion/forgediscussion/controllers/root.py
----------------------------------------------------------------------
diff --git a/ForgeDiscussion/forgediscussion/controllers/root.py b/ForgeDiscussion/forgediscussion/controllers/root.py
index 11d6c6c..67e51ca 100644
--- a/ForgeDiscussion/forgediscussion/controllers/root.py
+++ b/ForgeDiscussion/forgediscussion/controllers/root.py
@@ -237,7 +237,7 @@ class RootRestController(BaseController):
num_topics=f.num_topics,
last_post=f.last_post,
url=h.absurl('/rest' + f.url()))
- for f in forums])
+ for f in forums if has_access(f, 'read')])
json['limit'] = limit
json['page'] = page
json['count'] = count
http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/2be7cd4e/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 45ef742..9f22589 100644
--- a/ForgeDiscussion/forgediscussion/tests/functional/test_rest.py
+++ b/ForgeDiscussion/forgediscussion/tests/functional/test_rest.py
@@ -172,3 +172,18 @@ class TestRootRestController(TestDiscussionApiBase):
self.app.get('/rest/p/test/discussion/general/thread/%s/' % t._id,
extra_environ={'username': '*anonymous'},
status=401)
+
+ def test_private_forums(self):
+ r = self.app.get('/p/test/admin/discussion/forums')
+ form = r.forms[0]
+ if form['forum-0.shortname'].value == u'héllo':
+ form['forum-0.members_only'] = True
+ else:
+ form['forum-1.members_only'] = True
+ form.submit()
+ r = self.api_get('/rest/p/test/discussion/')
+ assert_equal(len(r.json['forums']), 2)
+ r = self.app.get('/rest/p/test/discussion/',
+ extra_environ={'username': '*anonymous'})
+ assert_equal(len(r.json['forums']), 1)
+ assert_equal(r.json['forums'][0]['shortname'], 'general')
[09/11] git commit: [#5650] ticket:323 Pagination for forum (topics
list)
Posted by jo...@apache.org.
[#5650] ticket:323 Pagination for forum (topics 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/f1b854c9
Tree: http://git-wip-us.apache.org/repos/asf/incubator-allura/tree/f1b854c9
Diff: http://git-wip-us.apache.org/repos/asf/incubator-allura/diff/f1b854c9
Branch: refs/heads/master
Commit: f1b854c9b455856ac3f01360465acd614221008c
Parents: fda008f
Author: Igor Bondarenko <je...@gmail.com>
Authored: Tue May 7 09:31:57 2013 +0000
Committer: Cory Johns <cj...@slashdotmedia.com>
Committed: Wed Jun 26 22:56:12 2013 +0000
----------------------------------------------------------------------
.../forgediscussion/controllers/root.py | 23 ++++++++++++++++++--
ForgeDiscussion/forgediscussion/model/forum.py | 7 ------
.../tests/functional/test_rest.py | 16 ++++++++++++++
3 files changed, 37 insertions(+), 9 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/f1b854c9/ForgeDiscussion/forgediscussion/controllers/root.py
----------------------------------------------------------------------
diff --git a/ForgeDiscussion/forgediscussion/controllers/root.py b/ForgeDiscussion/forgediscussion/controllers/root.py
index bef02b1..7ff7fcb 100644
--- a/ForgeDiscussion/forgediscussion/controllers/root.py
+++ b/ForgeDiscussion/forgediscussion/controllers/root.py
@@ -26,6 +26,7 @@ from pylons import tmpl_context as c, app_globals as g
from pylons import request
from formencode import validators
from webob import exc
+import pymongo
from allura.lib.security import require_access, has_access, require_authenticated
from allura.lib.search import search_app
@@ -289,8 +290,26 @@ class ForumRestController(BaseController):
require_access(self.forum, 'read')
@expose('json:')
- def index(self, **kw):
- return dict(forum=self.forum)
+ def index(self, limit=100, page=0, **kw):
+ limit, page, start = g.handle_paging(int(limit), int(page))
+ topics = model.Forum.thread_class().query.find(dict(discussion_id=self.forum._id))
+ topics = topics.sort([('flags', pymongo.DESCENDING),
+ ('last_post_date', pymongo.DESCENDING)])
+ topics = topics.skip(start).limit(limit)
+ count = topics.count()
+ json = {}
+ json['forum'] = self.forum.__json__()
+ json['forum']['topics'] = [dict(_id=t._id,
+ subject=t.subject,
+ num_replies=t.num_replies,
+ num_views=t.num_views,
+ url=h.absurl('/rest' + t.url()),
+ last_post=t.last_post)
+ for t in topics]
+ json['count'] = count
+ json['page'] = page
+ json['limit'] = limit
+ return json
@expose()
def _lookup(self, thread, thread_id, *remainder):
http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/f1b854c9/ForgeDiscussion/forgediscussion/model/forum.py
----------------------------------------------------------------------
diff --git a/ForgeDiscussion/forgediscussion/model/forum.py b/ForgeDiscussion/forgediscussion/model/forum.py
index d6c5ba1..e8f920a 100644
--- a/ForgeDiscussion/forgediscussion/model/forum.py
+++ b/ForgeDiscussion/forgediscussion/model/forum.py
@@ -142,13 +142,6 @@ class Forum(M.Discussion):
def __json__(self):
json = super(Forum, self).__json__()
json.pop('threads') # it's always empty and useless here
- json['topics'] = [dict(_id=t._id,
- subject=t.subject,
- num_replies=t.num_replies,
- num_views=t.num_views,
- url=h.absurl('/rest' + t.url()),
- last_post=t.last_post)
- for t in self.all_threads]
return json
class ForumFile(M.File):
http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/f1b854c9/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 5909822..87c2fda 100644
--- a/ForgeDiscussion/forgediscussion/tests/functional/test_rest.py
+++ b/ForgeDiscussion/forgediscussion/tests/functional/test_rest.py
@@ -115,6 +115,22 @@ class TestRootRestController(TestDiscussionApiBase):
assert_equal(resp.json['page'], 1)
assert_equal(resp.json['limit'], 1)
+ def test_forum_pagination(self):
+ resp = self.app.get('/rest/p/test/discussion/general/?limit=1')
+ topics = resp.json['forum']['topics']
+ assert_equal(len(topics), 1)
+ assert_equal(topics[0]['subject'], 'Hi guys')
+ assert_equal(resp.json['count'], 2)
+ assert_equal(resp.json['page'], 0)
+ assert_equal(resp.json['limit'], 1)
+ resp = self.app.get('/rest/p/test/discussion/general/?limit=1&page=1')
+ topics = resp.json['forum']['topics']
+ assert_equal(len(topics), 1)
+ assert_equal(topics[0]['subject'], 'Let\'s talk')
+ assert_equal(resp.json['count'], 2)
+ assert_equal(resp.json['page'], 1)
+ assert_equal(resp.json['limit'], 1)
+
def test_security(self):
p = M.Project.query.get(shortname='test')
acl = p.app_instance('discussion').config.acl
[04/11] git commit: [#5650] ticket:323 Pagination for forum list
Posted by jo...@apache.org.
[#5650] ticket:323 Pagination 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/ed29d9db
Tree: http://git-wip-us.apache.org/repos/asf/incubator-allura/tree/ed29d9db
Diff: http://git-wip-us.apache.org/repos/asf/incubator-allura/diff/ed29d9db
Branch: refs/heads/master
Commit: ed29d9dbc0fa5569526a3a4373808c4290304d48
Parents: 1a3f846
Author: Igor Bondarenko <je...@gmail.com>
Authored: Fri May 3 13:25:11 2013 +0000
Committer: Cory Johns <cj...@slashdotmedia.com>
Committed: Wed Jun 26 22:56:12 2013 +0000
----------------------------------------------------------------------
ForgeDiscussion/forgediscussion/controllers/root.py | 13 ++++++++++---
.../forgediscussion/tests/functional/test_rest.py | 16 ++++++++++++++++
2 files changed, 26 insertions(+), 3 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/ed29d9db/ForgeDiscussion/forgediscussion/controllers/root.py
----------------------------------------------------------------------
diff --git a/ForgeDiscussion/forgediscussion/controllers/root.py b/ForgeDiscussion/forgediscussion/controllers/root.py
index cc21070..bef02b1 100644
--- a/ForgeDiscussion/forgediscussion/controllers/root.py
+++ b/ForgeDiscussion/forgediscussion/controllers/root.py
@@ -222,11 +222,14 @@ class RootRestController(BaseController):
return ForumRestController(unquote(forum)), remainder
@expose('json:')
- def index(self, **kw):
+ def index(self, limit=100, page=0, **kw):
+ limit, page, start = g.handle_paging(int(limit), int(page))
forums = model.Forum.query.find(dict(
app_config_id=c.app.config._id,
- parent_id=None, deleted=False)).all()
- return dict(forums=[dict(_id=f._id,
+ parent_id=None, deleted=False)
+ ).skip(start).limit(limit)
+ count = forums.count()
+ json = dict(forums=[dict(_id=f._id,
name=f.name,
shortname=f.shortname,
description=f.description,
@@ -234,6 +237,10 @@ class RootRestController(BaseController):
last_post=f.last_post,
url=h.absurl('/rest' + f.url()))
for f in forums])
+ json['limit'] = limit
+ json['page'] = page
+ json['count'] = count
+ return json
@expose('json:')
def validate_import(self, doc=None, username_mapping=None, **kw):
http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/ed29d9db/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 f1de12e..d335d6b 100644
--- a/ForgeDiscussion/forgediscussion/tests/functional/test_rest.py
+++ b/ForgeDiscussion/forgediscussion/tests/functional/test_rest.py
@@ -97,3 +97,19 @@ class TestRootRestController(TestDiscussionApiBase):
assert_equal(topic['subject'], 'Hi guys')
assert_equal(topic['posts'][0]['text'], 'Hi boys and girls')
assert_equal(topic['posts'][0]['subject'], 'Hi guys')
+
+ def test_forum_list_pagination(self):
+ resp = self.app.get('/rest/p/test/discussion/?limit=1')
+ forums = resp.json['forums']
+ assert_equal(len(forums), 1)
+ assert_equal(forums[0]['name'], 'General Discussion')
+ assert_equal(resp.json['count'], 2)
+ assert_equal(resp.json['page'], 0)
+ assert_equal(resp.json['limit'], 1)
+ resp = self.app.get('/rest/p/test/discussion/?limit=1&page=1')
+ forums = resp.json['forums']
+ assert_equal(len(forums), 1)
+ assert_equal(forums[0]['name'], u'Say Héllo')
+ assert_equal(resp.json['count'], 2)
+ assert_equal(resp.json['page'], 1)
+ assert_equal(resp.json['limit'], 1)
[10/11] git commit: [#5650] Fixed threads and posts relation
Posted by jo...@apache.org.
[#5650] Fixed threads and posts relation
Signed-off-by: Cory Johns <cj...@slashdotmedia.com>
Project: http://git-wip-us.apache.org/repos/asf/incubator-allura/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-allura/commit/a36f8c39
Tree: http://git-wip-us.apache.org/repos/asf/incubator-allura/tree/a36f8c39
Diff: http://git-wip-us.apache.org/repos/asf/incubator-allura/diff/a36f8c39
Branch: refs/heads/master
Commit: a36f8c39178ca771a3adccd84b7062b7c76cb50d
Parents: 2be7cd4
Author: Cory Johns <cj...@slashdotmedia.com>
Authored: Wed Jun 26 22:55:56 2013 +0000
Committer: Cory Johns <cj...@slashdotmedia.com>
Committed: Wed Jun 26 22:56:12 2013 +0000
----------------------------------------------------------------------
Allura/allura/model/discuss.py | 4 ++--
ForgeDiscussion/forgediscussion/model/forum.py | 14 ++++----------
2 files changed, 6 insertions(+), 12 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/a36f8c39/Allura/allura/model/discuss.py
----------------------------------------------------------------------
diff --git a/Allura/allura/model/discuss.py b/Allura/allura/model/discuss.py
index a62312f..7699d33 100644
--- a/Allura/allura/model/discuss.py
+++ b/Allura/allura/model/discuss.py
@@ -55,8 +55,8 @@ class Discussion(Artifact, ActivityObject):
num_posts = FieldProperty(int, if_missing=0)
subscriptions = FieldProperty({str: bool})
- threads = RelationProperty('Thread')
- posts = RelationProperty('Post')
+ threads = RelationProperty('Thread', via='discussion_id')
+ posts = RelationProperty('Post', via='discussion_id')
def __json__(self):
return dict(
http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/a36f8c39/ForgeDiscussion/forgediscussion/model/forum.py
----------------------------------------------------------------------
diff --git a/ForgeDiscussion/forgediscussion/model/forum.py b/ForgeDiscussion/forgediscussion/model/forum.py
index 1a4a734..b5206c6 100644
--- a/ForgeDiscussion/forgediscussion/model/forum.py
+++ b/ForgeDiscussion/forgediscussion/model/forum.py
@@ -40,8 +40,8 @@ class Forum(M.Discussion):
type_s = 'Discussion'
parent_id = FieldProperty(schema.ObjectId, if_missing=None)
- threads = RelationProperty('ForumThread')
- posts = RelationProperty('ForumPost')
+ threads = RelationProperty('ForumThread', via='discussion_id')
+ posts = RelationProperty('ForumPost', via='discussion_id')
members_only = FieldProperty(bool, if_missing=False)
anon_posts = FieldProperty(bool, if_missing=False)
monitoring_email = FieldProperty(str, if_missing=None)
@@ -55,10 +55,9 @@ class Forum(M.Discussion):
return ForumThread
@LazyProperty
- def all_threads(self):
+ def sorted_threads(self):
threads = self.thread_class().query.find(dict(discussion_id=self._id))
- threads = threads.sort([('flags', pymongo.DESCENDING),
- ('last_post_date', pymongo.DESCENDING)]).all()
+ threads = threads.sort([('last_post_date', pymongo.DESCENDING)]).all()
sorted_threads = chain(
(t for t in threads if 'Announcement' in t.flags),
(t for t in threads if 'Sticky' in t.flags and 'Announcement' not in t.flags),
@@ -139,11 +138,6 @@ class Forum(M.Discussion):
self.app.config.options.mount_point)))
return super(Forum, self).get_mail_footer(notification, toaddr)
- def __json__(self):
- json = super(Forum, self).__json__()
- json.pop('threads') # it's always empty and useless here
- return json
-
class ForumFile(M.File):
forum_id=FieldProperty(schema.ObjectId)
[06/11] git commit: [#5650] ticket:323 Refactor APIs to use models'
__json__ method
Posted by jo...@apache.org.
[#5650] ticket:323 Refactor APIs to use models' __json__ method
Project: http://git-wip-us.apache.org/repos/asf/incubator-allura/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-allura/commit/23d695c4
Tree: http://git-wip-us.apache.org/repos/asf/incubator-allura/tree/23d695c4
Diff: http://git-wip-us.apache.org/repos/asf/incubator-allura/diff/23d695c4
Branch: refs/heads/master
Commit: 23d695c41b40094344a3d70971b9e168ca63e7c4
Parents: 383f697
Author: Igor Bondarenko <je...@gmail.com>
Authored: Fri May 3 09:10:47 2013 +0000
Committer: Cory Johns <cj...@slashdotmedia.com>
Committed: Wed Jun 26 22:56:12 2013 +0000
----------------------------------------------------------------------
.../forgediscussion/controllers/root.py | 51 ++++----------------
ForgeDiscussion/forgediscussion/model/forum.py | 19 +++++++-
.../tests/functional/test_rest.py | 12 +++--
3 files changed, 34 insertions(+), 48 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/23d695c4/ForgeDiscussion/forgediscussion/controllers/root.py
----------------------------------------------------------------------
diff --git a/ForgeDiscussion/forgediscussion/controllers/root.py b/ForgeDiscussion/forgediscussion/controllers/root.py
index 74d5d18..bc70a13 100644
--- a/ForgeDiscussion/forgediscussion/controllers/root.py
+++ b/ForgeDiscussion/forgediscussion/controllers/root.py
@@ -20,7 +20,6 @@ import logging
from urllib import unquote
from itertools import imap
-import pymongo
from tg import expose, validate, redirect, flash, response
from tg.decorators import with_trailing_slash
from pylons import tmpl_context as c, app_globals as g
@@ -227,23 +226,14 @@ class RootRestController(BaseController):
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
+ return dict(forums=[dict(_id=f._id,
+ name=f.name,
+ shortname=f.shortname,
+ description=f.description,
+ num_topics=f.num_topics,
+ last_post=f.last_post,
+ url=h.absurl('/rest' + f.url()))
+ for f in forums])
@expose('json:')
def validate_import(self, doc=None, username_mapping=None, **kw):
@@ -294,27 +284,4 @@ class ForumRestController(BaseController):
@expose('json:')
def index(self, **kw):
- topics = model.ForumThread.query.find(
- dict(discussion_id=self.forum._id, num_replies={'$gt': 0}))
- topics = topics.sort([('flags', pymongo.DESCENDING),
- ('last_post_date', pymongo.DESCENDING)])
- json = {
- 'forum': {
- 'name': self.forum.name,
- 'description': self.forum.description,
- 'topics': [],
- }
- }
- for t in topics:
- topic = {
- 'subject': t.subject,
- 'num_views': t.num_views,
- 'num_replies': t.num_replies,
- 'url': h.absurl('/rest' + t.url()),
- 'last_post': {
- 'author': t.last_post.author().display_name,
- 'date': t.last_post.mod_date
- },
- }
- json['forum']['topics'].append(topic)
- return json
+ return dict(forum=self.forum)
http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/23d695c4/ForgeDiscussion/forgediscussion/model/forum.py
----------------------------------------------------------------------
diff --git a/ForgeDiscussion/forgediscussion/model/forum.py b/ForgeDiscussion/forgediscussion/model/forum.py
index 352e620..9622e89 100644
--- a/ForgeDiscussion/forgediscussion/model/forum.py
+++ b/ForgeDiscussion/forgediscussion/model/forum.py
@@ -19,6 +19,7 @@ import re
import logging
from itertools import chain
+import pymongo
from ming import schema
from ming.utils import LazyProperty
from ming.orm import FieldProperty, RelationProperty, ForeignIdProperty, Mapper
@@ -54,8 +55,10 @@ class Forum(M.Discussion):
return ForumThread
@LazyProperty
- def threads(self):
- threads = self.thread_class().query.find(dict(discussion_id=self._id)).all()
+ def all_threads(self):
+ threads = self.thread_class().query.find(dict(discussion_id=self._id))
+ threads = threads.sort([('flags', pymongo.DESCENDING),
+ ('last_post_date', pymongo.DESCENDING)]).all()
sorted_threads = chain(
(t for t in threads if 'Announcement' in t.flags),
(t for t in threads if 'Sticky' in t.flags and 'Announcement' not in t.flags),
@@ -136,6 +139,18 @@ class Forum(M.Discussion):
self.app.config.options.mount_point)))
return super(Forum, self).get_mail_footer(notification, toaddr)
+ def __json__(self):
+ json = super(Forum, self).__json__()
+ json.pop('threads') # it's always empty and useless here
+ json['topics'] = [dict(_id=t._id,
+ subject=t.subject,
+ num_replies=t.num_replies,
+ num_views=t.num_views,
+ url=t.url(),
+ last_post=t.last_post)
+ for t in self.all_threads]
+ return json
+
class ForumFile(M.File):
forum_id=FieldProperty(schema.ObjectId)
http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/23d695c4/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 d094175..d11c282 100644
--- a/ForgeDiscussion/forgediscussion/tests/functional/test_rest.py
+++ b/ForgeDiscussion/forgediscussion/tests/functional/test_rest.py
@@ -17,7 +17,7 @@ class TestDiscussionApiBase(TestRestApiBase):
h.set_context('test', 'discussion', neighborhood='Projects')
self.create_forum('héllo', 'Say Héllo', 'Say héllo here')
self.create_topic('general', 'Let\'s talk', '1st post')
- self.create_topic('general', 'Hi guys', 'Hi guys')
+ self.create_topic('general', 'Hi guys', 'Hi boys and girls')
def create_forum(self, shortname, name, description):
r = self.app.get('/admin/discussion/forums')
@@ -52,11 +52,13 @@ class TestRootRestController(TestDiscussionApiBase):
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[0]['last_post']['author'], 'test-admin')
+ assert_equal(forums[0]['last_post']['text'], 'Hi boys and girls')
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/')
+ assert_equal(forums[1]['last_post'], None)
def test_forum(self):
forum = self.api_get('/rest/p/test/discussion/general/')
@@ -68,8 +70,10 @@ class TestRootRestController(TestDiscussionApiBase):
assert_equal(topics[0]['subject'], 'Hi guys')
assert_equal(topics[0]['num_views'], 0)
assert_equal(topics[0]['num_replies'], 1)
- assert_equal(topics[0]['last_post']['author'], 'Test Admin')
+ assert_equal(topics[0]['last_post']['author'], 'test-admin')
+ assert_equal(topics[0]['last_post']['text'], 'Hi boys and girls')
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']['author'], 'test-admin')
+ assert_equal(topics[1]['last_post']['text'], '1st post')
[08/11] git commit: [#5650] ticket:323 Forum topic API endpoint
Posted by jo...@apache.org.
[#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')