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