You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@allura.apache.org by tv...@apache.org on 2013/08/26 16:00:53 UTC
[14/50] git commit: [#3154] ticket:390 Bulk export: discussion
[#3154] ticket:390 Bulk export: discussion
Project: http://git-wip-us.apache.org/repos/asf/incubator-allura/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-allura/commit/d79c80b5
Tree: http://git-wip-us.apache.org/repos/asf/incubator-allura/tree/d79c80b5
Diff: http://git-wip-us.apache.org/repos/asf/incubator-allura/diff/d79c80b5
Branch: refs/heads/tv/6595
Commit: d79c80b59943eaa896d69b4e234b499fa530828f
Parents: 8883480
Author: Yuriy Arhipov <yu...@yandex.ru>
Authored: Fri Jul 26 10:31:30 2013 +0400
Committer: Dave Brondsema <db...@slashdotmedia.com>
Committed: Thu Aug 22 20:04:42 2013 +0000
----------------------------------------------------------------------
Allura/allura/model/discuss.py | 9 ++--
ForgeDiscussion/forgediscussion/forum_main.py | 14 +++++-
ForgeDiscussion/forgediscussion/model/forum.py | 6 ---
.../forgediscussion/tests/test_app.py | 50 ++++++++++++++++++++
4 files changed, 69 insertions(+), 10 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/d79c80b5/Allura/allura/model/discuss.py
----------------------------------------------------------------------
diff --git a/Allura/allura/model/discuss.py b/Allura/allura/model/discuss.py
index d13b7e9..ec5ccdc 100644
--- a/Allura/allura/model/discuss.py
+++ b/Allura/allura/model/discuss.py
@@ -64,8 +64,9 @@ class Discussion(Artifact, ActivityObject):
shortname=self.shortname,
name=self.name,
description=self.description,
- threads=[dict(_id=t._id, subject=t.subject)
- for t in self.threads])
+ threads=[t.__json__() for t in self.thread_class().query.find(
+ dict(discussion_id=self._id)).sort(
+ 'last_post_date', pymongo.DESCENDING)])
@property
def activity_name(self):
@@ -169,7 +170,9 @@ class Thread(Artifact, ActivityObject):
subject=p.subject,
attachments=[dict(bytes=attach.length,
url=h.absurl(attach.url())) for attach in p.attachments])
- for p in self.posts if p.status == 'ok'])
+ for p in self.post_class().query.find(
+ dict(discussion_id=self.discussion_id, thread_id=self._id, status='ok')
+ ).sort('timestamp', pymongo.DESCENDING)])
@property
def activity_name(self):
http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/d79c80b5/ForgeDiscussion/forgediscussion/forum_main.py
----------------------------------------------------------------------
diff --git a/ForgeDiscussion/forgediscussion/forum_main.py b/ForgeDiscussion/forgediscussion/forum_main.py
index 730f007..2465312 100644
--- a/ForgeDiscussion/forgediscussion/forum_main.py
+++ b/ForgeDiscussion/forgediscussion/forum_main.py
@@ -19,12 +19,13 @@
import logging
import urllib
from itertools import islice
+import json
# Non-stdlib imports
import pymongo
from pylons import tmpl_context as c, app_globals as g
from pylons import request
-from tg import expose, redirect, flash, url, validate
+from tg import expose, redirect, flash, url, validate, jsonify
from tg.decorators import with_trailing_slash
from bson import ObjectId
from ming import schema
@@ -67,6 +68,7 @@ class ForgeDiscussionApp(Application):
PostClass=DM.ForumPost
AttachmentClass=DM.ForumAttachment
searchable=True
+ exportable=True
tool_label='Discussion'
tool_description="""
Collaborate with your community in your forum.
@@ -215,6 +217,16 @@ class ForgeDiscussionApp(Application):
DM.ForumPost.query.remove(dict(app_config_id=self.config._id))
super(ForgeDiscussionApp, self).uninstall(project)
+ def bulk_export(self, f):
+ f.write('{"forums": [')
+ forums = DM.Forum.query.find(dict(app_config_id=self.config._id)).sort('mod_date', pymongo.DESCENDING).all()
+ count = len(forums)
+ for i, forum in enumerate(forums):
+ json.dump(forum, f, cls=jsonify.GenericJSON)
+ if i < (count - 1):
+ f.write(',')
+ f.write(']}')
+
class ForumAdminController(DefaultAdminController):
def _check_security(self):
http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/d79c80b5/ForgeDiscussion/forgediscussion/model/forum.py
----------------------------------------------------------------------
diff --git a/ForgeDiscussion/forgediscussion/model/forum.py b/ForgeDiscussion/forgediscussion/model/forum.py
index 42d1dc0..84040da 100644
--- a/ForgeDiscussion/forgediscussion/model/forum.py
+++ b/ForgeDiscussion/forgediscussion/model/forum.py
@@ -194,12 +194,6 @@ 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/d79c80b5/ForgeDiscussion/forgediscussion/tests/test_app.py
----------------------------------------------------------------------
diff --git a/ForgeDiscussion/forgediscussion/tests/test_app.py b/ForgeDiscussion/forgediscussion/tests/test_app.py
new file mode 100644
index 0000000..d54ab5a
--- /dev/null
+++ b/ForgeDiscussion/forgediscussion/tests/test_app.py
@@ -0,0 +1,50 @@
+# -*- coding: utf-8 -*-
+
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied. See the License for the
+# specific language governing permissions and limitations
+# under the License.
+
+#-*- python -*-
+
+import tempfile
+import json
+from nose.tools import assert_equal
+
+from allura import model as M
+from forgediscussion.tests.functional.test_rest import TestDiscussionApiBase
+
+
+class TestBulkExport(TestDiscussionApiBase):
+
+ def test_bulk_export(self):
+ project = M.Project.query.get(shortname='test')
+ discussion = project.app_instance('discussion')
+ f = tempfile.TemporaryFile()
+ discussion.bulk_export(f)
+ f.seek(0)
+ discussion = json.loads(f.read())
+ forums = discussion['forums']
+
+ assert_equal(forums[0]['shortname'], u'general')
+ assert_equal(forums[0]['description'], u'Forum about anything you want to talk about.')
+ assert_equal(forums[0]['name'], u'General Discussion')
+ assert_equal(forums[0]['threads'][0]['posts'][0]['text'], u'Hi boys and girls')
+ assert_equal(forums[0]['threads'][0]['posts'][0]['subject'], u'Hi guys')
+ assert_equal(forums[0]['threads'][1]['posts'][0]['text'], u'1st post')
+ assert_equal(forums[0]['threads'][1]['posts'][0]['subject'], u"Let's talk")
+ assert_equal(forums[1]['shortname'], u'héllo')
+ assert_equal(forums[1]['description'], u'Say héllo here')
+ assert_equal(forums[1]['name'], u'Say Héllo')