You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@allura.apache.org by je...@apache.org on 2015/05/18 19:11:11 UTC
[1/3] allura git commit: [#1731] ticket:767 Mark comments as deleted
instead of actually deleting them
Repository: allura
Updated Branches:
refs/heads/ib/1731 [created] 4cb21fe51
[#1731] ticket:767 Mark comments as deleted instead of actually deleting them
Project: http://git-wip-us.apache.org/repos/asf/allura/repo
Commit: http://git-wip-us.apache.org/repos/asf/allura/commit/b3aaa54a
Tree: http://git-wip-us.apache.org/repos/asf/allura/tree/b3aaa54a
Diff: http://git-wip-us.apache.org/repos/asf/allura/diff/b3aaa54a
Branch: refs/heads/ib/1731
Commit: b3aaa54a4daad930347e59df47a3be98ae2cd312
Parents: 181bfb6
Author: Igor Bondarenko <je...@gmail.com>
Authored: Mon May 18 14:43:38 2015 +0000
Committer: Igor Bondarenko <je...@gmail.com>
Committed: Mon May 18 14:43:38 2015 +0000
----------------------------------------------------------------------
Allura/allura/lib/markdown_extensions.py | 3 ++-
Allura/allura/model/discuss.py | 26 +++++++++++---------
.../forgediscussion/controllers/root.py | 1 +
ForgeDiscussion/forgediscussion/forum_main.py | 7 +++++-
ForgeDiscussion/forgediscussion/site_stats.py | 4 ++-
ForgeImporters/forgeimporters/trac/tickets.py | 3 ++-
ForgeTracker/forgetracker/tracker_main.py | 8 ++++--
ForgeWiki/forgewiki/wiki_main.py | 7 ++++--
8 files changed, 40 insertions(+), 19 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/allura/blob/b3aaa54a/Allura/allura/lib/markdown_extensions.py
----------------------------------------------------------------------
diff --git a/Allura/allura/lib/markdown_extensions.py b/Allura/allura/lib/markdown_extensions.py
index 055a74a..9a68e1a 100644
--- a/Allura/allura/lib/markdown_extensions.py
+++ b/Allura/allura/lib/markdown_extensions.py
@@ -178,7 +178,8 @@ class TracRef2(Pattern):
comments = ticket.discussion_thread.post_class().query.find(dict(
discussion_id=ticket.discussion_thread.discussion_id,
thread_id=ticket.discussion_thread._id,
- status={'$in': ['ok', 'pending']})).sort('timestamp')
+ status={'$in': ['ok', 'pending']},
+ deleted=False)).sort('timestamp')
if comment_num <= comments.count():
return comments.all()[comment_num - 1].slug
http://git-wip-us.apache.org/repos/asf/allura/blob/b3aaa54a/Allura/allura/model/discuss.py
----------------------------------------------------------------------
diff --git a/Allura/allura/model/discuss.py b/Allura/allura/model/discuss.py
index 581eb21..aa16255 100644
--- a/Allura/allura/model/discuss.py
+++ b/Allura/allura/model/discuss.py
@@ -92,16 +92,15 @@ class Discussion(Artifact, ActivityObject):
self.num_topics = self.thread_class().query.find(
dict(discussion_id=self._id)).count()
self.num_posts = self.post_class().query.find(
- dict(discussion_id=self._id, status='ok')).count()
+ dict(discussion_id=self._id, status='ok', deleted=False)).count()
@LazyProperty
def last_post(self):
q = self.post_class().query.find(dict(
discussion_id=self._id,
- status='ok'
- ))\
- .sort('timestamp', pymongo.DESCENDING)\
- .limit(1)
+ status='ok',
+ deleted=False,
+ )).sort('timestamp', pymongo.DESCENDING).limit(1)
return q.first()
def url(self):
@@ -129,7 +128,7 @@ class Discussion(Artifact, ActivityObject):
super(Discussion, self).delete()
def find_posts(self, **kw):
- q = dict(kw, discussion_id=self._id)
+ q = dict(kw, discussion_id=self._id, deleted=False)
return self.post_class().query.find(q)
@@ -238,7 +237,9 @@ class Thread(Artifact, ActivityObject):
return Post.query.find(dict(
discussion_id=self.discussion_id,
thread_id=self._id,
- status={'$in': ['ok', 'pending']})).count()
+ status={'$in': ['ok', 'pending']},
+ deleted=False,
+ )).count()
def primary(self):
if self.ref is None:
@@ -340,12 +341,14 @@ class Thread(Artifact, ActivityObject):
def update_stats(self):
self.num_replies = self.post_class().query.find(
- dict(thread_id=self._id, status='ok')).count() - 1
+ dict(thread_id=self._id, status='ok', deleted=False)).count() - 1
@property
def last_post(self):
q = self.post_class().query.find(dict(
- thread_id=self._id)).sort('timestamp', pymongo.DESCENDING)
+ thread_id=self._id,
+ deleted=False,
+ )).sort('timestamp', pymongo.DESCENDING)
return q.first()
def create_post_threads(self, posts):
@@ -370,6 +373,7 @@ class Thread(Artifact, ActivityObject):
status={'$in': ['ok', 'pending']})
if status:
terms['status'] = status
+ terms['deleted'] = False
q = self.post_class().query.find(terms)
if style == 'threaded':
q = q.sort('full_slug')
@@ -675,8 +679,8 @@ class Post(Message, VersionedArtifact, ActivityObject):
return 'Re: ' + (self.subject or '(no subject)')
def delete(self):
- self.attachment_class().remove(dict(post_id=self._id))
- super(Post, self).delete()
+ self.deleted = True
+ session(self).flush(self)
self.thread.num_replies = max(0, self.thread.num_replies - 1)
def approve(self, file_info=None, notify=True, notification_text=None):
http://git-wip-us.apache.org/repos/asf/allura/blob/b3aaa54a/ForgeDiscussion/forgediscussion/controllers/root.py
----------------------------------------------------------------------
diff --git a/ForgeDiscussion/forgediscussion/controllers/root.py b/ForgeDiscussion/forgediscussion/controllers/root.py
index 7548cd0..9f6ab76 100644
--- a/ForgeDiscussion/forgediscussion/controllers/root.py
+++ b/ForgeDiscussion/forgediscussion/controllers/root.py
@@ -264,6 +264,7 @@ class RootController(BaseController, DispatchIndex, FeedController):
'$gte': datetime.combine(begin, time.min),
'$lte': datetime.combine(end, time.max),
},
+ 'deleted': False,
}},
{'$group': {
'_id': grouping,
http://git-wip-us.apache.org/repos/asf/allura/blob/b3aaa54a/ForgeDiscussion/forgediscussion/forum_main.py
----------------------------------------------------------------------
diff --git a/ForgeDiscussion/forgediscussion/forum_main.py b/ForgeDiscussion/forgediscussion/forum_main.py
index e66ec43..542b3f0 100644
--- a/ForgeDiscussion/forgediscussion/forum_main.py
+++ b/ForgeDiscussion/forgediscussion/forum_main.py
@@ -158,9 +158,14 @@ class ForgeDiscussionApp(Application):
for f in forums:
if has_access(f, 'read')():
if f.url() in request.url and h.has_access(f, 'moderate')():
+ num_moderate = DM.ForumPost.query.find({
+ 'discussion_id': f._id,
+ 'status': {'$ne': 'ok'},
+ 'deleted': False,
+ }).count()
moderate_link = SitemapEntry(
'Moderate', "%smoderate/" % f.url(), ui_icon=g.icons['pencil'],
- small=DM.ForumPost.query.find({'discussion_id': f._id, 'status': {'$ne': 'ok'}}).count())
+ small=num_moderate)
forum_links.append(
SitemapEntry(f.name, f.url(), small=f.num_topics))
url = c.app.url + 'create_topic/'
http://git-wip-us.apache.org/repos/asf/allura/blob/b3aaa54a/ForgeDiscussion/forgediscussion/site_stats.py
----------------------------------------------------------------------
diff --git a/ForgeDiscussion/forgediscussion/site_stats.py b/ForgeDiscussion/forgediscussion/site_stats.py
index 6918137..cabb5dd 100644
--- a/ForgeDiscussion/forgediscussion/site_stats.py
+++ b/ForgeDiscussion/forgediscussion/site_stats.py
@@ -22,4 +22,6 @@ from . import model as DM
def posts_24hr():
window = datetime.utcnow() - timedelta(hours=24)
- return DM.ForumPost.query.find({'timestamp': {'$gte': window}}).count()
+ q = {'timestamp': {'$gte': window},
+ 'deleted': False}
+ return DM.ForumPost.query.find(q).count()
http://git-wip-us.apache.org/repos/asf/allura/blob/b3aaa54a/ForgeImporters/forgeimporters/trac/tickets.py
----------------------------------------------------------------------
diff --git a/ForgeImporters/forgeimporters/trac/tickets.py b/ForgeImporters/forgeimporters/trac/tickets.py
index 177652b..466b4f7 100644
--- a/ForgeImporters/forgeimporters/trac/tickets.py
+++ b/ForgeImporters/forgeimporters/trac/tickets.py
@@ -169,7 +169,8 @@ class TracImportSupport(ImportSupport):
comments = ticket.discussion_thread.post_class().query.find(dict(
discussion_id=ticket.discussion_thread.discussion_id,
thread_id=ticket.discussion_thread._id,
- status={'$in': ['ok', 'pending']})).sort('timestamp')
+ status={'$in': ['ok', 'pending']},
+ deleted=False)).sort('timestamp')
if comment <= comments.count():
return comments.all()[comment - 1].slug
http://git-wip-us.apache.org/repos/asf/allura/blob/b3aaa54a/ForgeTracker/forgetracker/tracker_main.py
----------------------------------------------------------------------
diff --git a/ForgeTracker/forgetracker/tracker_main.py b/ForgeTracker/forgetracker/tracker_main.py
index 52e7b28..596ec54 100644
--- a/ForgeTracker/forgetracker/tracker_main.py
+++ b/ForgeTracker/forgetracker/tracker_main.py
@@ -354,8 +354,11 @@ class ForgeTrackerApp(Application):
links.append(SitemapEntry('View Stats', self.config.url()
+ 'stats', ui_icon=g.icons['stats']))
discussion = c.app.config.discussion
- pending_mod_count = M.Post.query.find(
- {'discussion_id': discussion._id, 'status': 'pending'}).count()
+ pending_mod_count = M.Post.query.find({
+ 'discussion_id': discussion._id,
+ 'status': 'pending',
+ 'deleted': False,
+ }).count()
if pending_mod_count and has_access(discussion, 'moderate')():
links.append(
SitemapEntry(
@@ -1022,6 +1025,7 @@ class RootController(BaseController, FeedController):
q = dict(
discussion_id=c.app.config.discussion_id,
status='ok',
+ deleted=False,
)
if when is not None:
q['timestamp'] = {'$gte': when}
http://git-wip-us.apache.org/repos/asf/allura/blob/b3aaa54a/ForgeWiki/forgewiki/wiki_main.py
----------------------------------------------------------------------
diff --git a/ForgeWiki/forgewiki/wiki_main.py b/ForgeWiki/forgewiki/wiki_main.py
index 5f15779..a87ce8d 100644
--- a/ForgeWiki/forgewiki/wiki_main.py
+++ b/ForgeWiki/forgewiki/wiki_main.py
@@ -231,8 +231,11 @@ The wiki uses [Markdown](%s) syntax.
links += [SitemapEntry('Browse Pages', self.url + 'browse_pages/'),
SitemapEntry('Browse Labels', self.url + 'browse_tags/')]
discussion = c.app.config.discussion
- pending_mod_count = M.Post.query.find(
- {'discussion_id': discussion._id, 'status': 'pending'}).count() if discussion else 0
+ pending_mod_count = M.Post.query.find({
+ 'discussion_id': discussion._id,
+ 'status': 'pending',
+ 'deleted': False
+ }).count() if discussion else 0
if pending_mod_count and h.has_access(discussion, 'moderate')():
links.append(
SitemapEntry(
[3/3] allura git commit: [#1731] ticket:767 Fix tests
Posted by je...@apache.org.
[#1731] ticket:767 Fix tests
Project: http://git-wip-us.apache.org/repos/asf/allura/repo
Commit: http://git-wip-us.apache.org/repos/asf/allura/commit/4cb21fe5
Tree: http://git-wip-us.apache.org/repos/asf/allura/tree/4cb21fe5
Diff: http://git-wip-us.apache.org/repos/asf/allura/diff/4cb21fe5
Branch: refs/heads/ib/1731
Commit: 4cb21fe5124fe7a76c7e238266b25ca3ab2b4430
Parents: 41a9ec9
Author: Igor Bondarenko <je...@gmail.com>
Authored: Mon May 18 16:38:25 2015 +0000
Committer: Igor Bondarenko <je...@gmail.com>
Committed: Mon May 18 16:38:25 2015 +0000
----------------------------------------------------------------------
Allura/allura/tests/functional/test_discuss.py | 3 ++-
.../unit/controllers/test_discussion_moderation_controller.py | 2 +-
2 files changed, 3 insertions(+), 2 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/allura/blob/4cb21fe5/Allura/allura/tests/functional/test_discuss.py
----------------------------------------------------------------------
diff --git a/Allura/allura/tests/functional/test_discuss.py b/Allura/allura/tests/functional/test_discuss.py
index 31e454e..cd30f44 100644
--- a/Allura/allura/tests/functional/test_discuss.py
+++ b/Allura/allura/tests/functional/test_discuss.py
@@ -171,7 +171,8 @@ class TestDiscuss(TestController):
post = M.Post.query.find().first()
assert post.status == 'ok'
self.app.post(post_link + 'moderate', params=dict(delete='delete'))
- assert M.Post.query.find().count() == 0
+ assert M.Post.query.find().count() == 1
+ assert M.Post.query.find({'deleted': False}).count() == 0
@patch.object(M.Thread, 'is_spam')
def test_feed_does_not_include_comments_held_for_moderation(self, is_spam):
http://git-wip-us.apache.org/repos/asf/allura/blob/4cb21fe5/Allura/allura/tests/unit/controllers/test_discussion_moderation_controller.py
----------------------------------------------------------------------
diff --git a/Allura/allura/tests/unit/controllers/test_discussion_moderation_controller.py b/Allura/allura/tests/unit/controllers/test_discussion_moderation_controller.py
index e6dc38d..e604222 100644
--- a/Allura/allura/tests/unit/controllers/test_discussion_moderation_controller.py
+++ b/Allura/allura/tests/unit/controllers/test_discussion_moderation_controller.py
@@ -68,7 +68,7 @@ class TestWhenModerating(WithDatabase):
ThreadLocalORMSession.flush_all()
def get_post(self):
- return model.Post.query.get(slug='mypost')
+ return model.Post.query.get(slug='mypost', deleted=False)
class TestIndexWithNoPosts(WithDatabase):
[2/3] allura git commit: [#1731] ticket:767 Add script to re-create
'fake' deleted parents
Posted by je...@apache.org.
[#1731] ticket:767 Add script to re-create 'fake' deleted parents
Project: http://git-wip-us.apache.org/repos/asf/allura/repo
Commit: http://git-wip-us.apache.org/repos/asf/allura/commit/41a9ec99
Tree: http://git-wip-us.apache.org/repos/asf/allura/tree/41a9ec99
Diff: http://git-wip-us.apache.org/repos/asf/allura/diff/41a9ec99
Branch: refs/heads/ib/1731
Commit: 41a9ec99ca43cb809859cbc4e88cd22f3033a905
Parents: b3aaa54
Author: Igor Bondarenko <je...@gmail.com>
Authored: Mon May 18 16:10:09 2015 +0000
Committer: Igor Bondarenko <je...@gmail.com>
Committed: Mon May 18 16:33:10 2015 +0000
----------------------------------------------------------------------
.../allura/scripts/create_deleted_comments.py | 74 ++++++++++++++++++++
1 file changed, 74 insertions(+)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/allura/blob/41a9ec99/Allura/allura/scripts/create_deleted_comments.py
----------------------------------------------------------------------
diff --git a/Allura/allura/scripts/create_deleted_comments.py b/Allura/allura/scripts/create_deleted_comments.py
new file mode 100644
index 0000000..b0e7260
--- /dev/null
+++ b/Allura/allura/scripts/create_deleted_comments.py
@@ -0,0 +1,74 @@
+# 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.
+
+import argparse
+import logging
+
+from ming.odm import session
+from pylons import tmpl_context as c
+
+from allura.scripts import ScriptTask
+from allura.model import Post
+from allura.lib.utils import chunked_find
+from forgediscussion.model import ForumPost
+
+
+log = logging.getLogger(__name__)
+
+
+class CreateDeletedComments(ScriptTask):
+
+ @classmethod
+ def execute(cls, options):
+ models = [Post, ForumPost]
+ # Find all posts that have parent_id, but does not have actual parent
+ # and create fake parent for them
+ for model in models:
+ for chunk in chunked_find(model, {'parent_id': {'$ne': None}}):
+ for post in chunk:
+ if not post.parent:
+ log.info('Creating deleted parent for %s %s',
+ model.__mongometa__.name, post._id)
+ c.project = post.app_config.project
+ slug = post.slug.rsplit('/', 1)[0]
+ full_slug = post.full_slug.rsplit('/', 1)[0]
+ author = c.project.admins()[0]
+ deleted_post = model(
+ _id=post.parent_id,
+ deleted=True,
+ text="Automatically created in place of deleted post",
+ app_id=post.app_id,
+ app_config_id=post.app_config_id,
+ discussion_id=post.discussion_id,
+ thread_id=post.thread_id,
+ author_id=author._id,
+ slug=slug,
+ full_slug=full_slug,
+ )
+ session(deleted_post).flush(deleted_post)
+
+ @classmethod
+ def parser(cls):
+ parser = argparse.ArgumentParser(
+ description='Create comments marked as deleted in place of '
+ 'actually deleted parent comments (ticket:#1731)'
+ )
+ return parser
+
+
+if __name__ == '__main__':
+ CreateDeletedComments.main()