You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@allura.apache.org by jo...@apache.org on 2013/06/27 00:57:04 UTC

[09/11] git commit: [#5650] ticket:323 Pagination for forum (topics list)

[#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