diff options
-rw-r--r-- | mediagoblin/db/models.py | 11 | ||||
-rw-r--r-- | mediagoblin/tests/test_misc.py | 31 |
2 files changed, 42 insertions, 0 deletions
diff --git a/mediagoblin/db/models.py b/mediagoblin/db/models.py index 38684e6f..97dc91dc 100644 --- a/mediagoblin/db/models.py +++ b/mediagoblin/db/models.py @@ -1008,6 +1008,17 @@ class TextComment(Base, TextCommentMixin, CommentingMixin): cascade="all, delete-orphan")) deletion_mode = Base.SOFT_DELETE + def soft_delete(self, *args, **kwargs): + # Find the GMR for this model. + gmr = GenericModelReference.query.filter_by( + obj_pk=self.id, + model_type=self.__tablename__ + ).first() + + # Delete the Comment object for this comment + Comment.query.filter_by(comment_id=gmr.id).delete() + return super(TextComment, self).soft_delete(*args, **kwargs) + def serialize(self, request): """ Unserialize to python dictionary for API """ target = self.get_reply_to() diff --git a/mediagoblin/tests/test_misc.py b/mediagoblin/tests/test_misc.py index 558a9bd7..34235209 100644 --- a/mediagoblin/tests/test_misc.py +++ b/mediagoblin/tests/test_misc.py @@ -138,3 +138,34 @@ def test_garbage_collection_task(test_app): # Now validate the image has been deleted assert MediaEntry.query.filter_by(id=entry_id).first() is None + +def test_comments_removed_when_graveyarded(test_app): + """ Checks comments which are tombstones are removed from collection """ + user = fixture_add_user() + media = fixture_media_entry( + uploader=user.id, + expunge=False, + fake_upload=False + ) + + # Add the TextComment + comment = TextComment() + comment.actor = user.id + comment.content = u"This is a comment that will be deleted." + comment.save() + + # Add a link for the comment + link = Comment() + link.target = media + link.comment = comment + link.save() + + # First double check it's there and all is well... + assert Comment.query.filter_by(target_id=link.target_id).first() is not None + + # Now delete the comment. + comment.delete() + + # Verify this also deleted the Comment link, ergo there is no comment left. + assert Comment.query.filter_by(target_id=link.target_id).first() is None + |