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