def connect(self): """ Hook up the moderation methods to pre- and post-save signals from the comment models. """ comment_will_be_posted.connect(self.pre_save_moderation, sender=get_model()) comment_was_posted.connect(self.post_save_moderation, sender=get_model())
def approve(request, comment_id, next=None): """ Approve a comment (that is, mark it as public and non-removed). Confirmation on GET, action on POST. Requires the "can moderate comments" permission. Templates: :template:`comments/approve.html`, Context: comment the `comments.comment` object for approval """ comment = get_object_or_404( get_model(), pk=comment_id, ) # Delete on POST if request.method == 'POST': # Flag the comment as approved. perform_approve(request, comment) return next_redirect(request, fallback=next or 'comments-approve-done', c=comment.pk) # Render a form on GET else: return render(request, 'comments/approve.html', { 'comment': comment, "next": next })
def flag(request, comment_id, next=None): """ Flags a comment. Confirmation on GET, action on POST. Templates: :template:`comments/flag.html`, Context: comment the flagged `comments.comment` object """ comment = get_object_or_404(get_model(), pk=comment_id, site__pk=get_current_site(request).pk) # Flag on POST if request.method == 'POST': perform_flag(request, comment) return next_redirect(request, fallback=next or 'comments-flag-done', c=comment.pk) # Render a form on GET else: return render(request, 'comments/flag.html', { 'comment': comment, "next": next })
def delete(request, comment_id, next=None): """ Deletes a comment. Confirmation on GET, action on POST. Requires the "can moderate comments" permission. Templates: :template:`comments/delete.html`, Context: comment the flagged `comments.comment` object """ comment = get_object_or_404( get_model(), pk=comment_id, ) # Delete on POST if request.method == 'POST': # Flag the comment as deleted instead of actually deleting it. perform_delete(request, comment) return next_redirect(request, fallback=next or 'comments-delete-done', c=comment.pk) # Render a form on GET else: return render(request, 'comments/delete.html', { 'comment': comment, "next": next })
def items(self): qs = django_comments_tree.get_model().objects.filter( site__pk=self.site.pk, is_public=True, is_removed=False, ) return qs.order_by('-submit_date')[:40]
def test_dislikedit_cancels_likedit(self): if django.VERSION < (1, 5): return comment = django_comments_tree.get_model()\ .objects.for_app_models('tests.diary')[0] like_url = reverse("comments-tree-like", args=[comment.id]) request = request_factory.post(like_url) request.user = self.user request._dont_enforce_csrf_checks = True response = views.like(request, comment.id) flags = TreeCommentFlag.objects.filter(comment=comment, user=self.user, flag=LIKEDIT_FLAG) self.assertEqual(flags.count(), 1, f"Expected value to be 1") # Now we liked the comment again to cancel the flag. dislike_url = reverse("comments-tree-dislike", args=[comment.id]) request = request_factory.post(dislike_url) request.user = self.user request._dont_enforce_csrf_checks = True response = views.dislike(request, comment.id) flags = TreeCommentFlag.objects.filter(comment=comment, user=self.user, flag=LIKEDIT_FLAG) self.assertEqual(flags.count(), 0, f"Expected value to be 0") flags = TreeCommentFlag.objects.filter(comment=comment, user=self.user, flag=DISLIKEDIT_FLAG) self.assertEqual(flags.count(), 1, f"Expected value to be 1")
def confirmed(request): comment = None if 'c' in request.GET: try: comment = django_comments_tree.get_model().objects.get(pk=request.GET['c']) except (ObjectDoesNotExist, ValueError): pass return render(request, template, {'comment': comment})
def connect(self): super().connect() comment_will_be_posted.connect(self.pre_save_moderation, sender=TmpTreeComment) confirmation_received.connect(self.post_save_moderation, sender=TmpTreeComment) comment_was_flagged.connect(self.comment_flagged, sender=get_model()) super().connect()
def test_anonymous_user_redirected_when_flagging(self): comment = django_comments_tree.get_model()\ .objects.for_app_models('tests.diary')[0] flag_url = reverse("comments-flag", args=[comment.id]) request = request_factory.get(flag_url) request.user = AnonymousUser() response = views.FlagView.as_view()(request, comment.id) dest_url = '/accounts/login/?next=/comments/flag/2/' self.assertEqual(response.status_code, 302) self.assertEqual(response.url, dest_url)
def test_moderation_with_registered_user(self): user = User.objects.create_user("bob", "*****@*****.**", "pwd") self.assertEqual(self.mailer_app1.call_count, 0) self.post_valid_data(user) # Moderation class: # django_comments_tree.tests.models.DiaryCommentModerator # must trigger an email once comment has passed moderation. self.assertEqual(self.mailer_app1.call_count, 1) comment = django_comments_tree.get_model()\ .objects.for_app_models('tests.diary')[0] self.assertTrue(comment.is_public)
def test_moderation_with_unregistered_user(self): self.post_valid_data() self.assertEqual(self.mailer_app1.call_count, 0) self.assertEqual(self.mailer_app2.call_count, 1) mail_msg = self.mailer_app2.call_args[0][1] key = str( re.search(r'http://.+/confirm/(?P<key>[\S]+)/', mail_msg).group("key")) confirm_comment_url(key) self.assertEqual(self.mailer_app1.call_count, 1) self.assertEqual(self.mailer_app2.call_count, 1) comment = django_comments_tree.get_model()\ .objects.for_app_models('tests.diary')[0] self.assertTrue(comment.is_public)
def __init__(self, ctype=None, object_pk_expr=None, object_expr=None, as_varname=None, comment=None): if ctype is None and object_expr is None: raise template.TemplateSyntaxError( "Comment nodes must be given either a literal object or a ctype and object pk." ) self.comment_model = django_comments_tree.get_model() self.as_varname = as_varname self.ctype = ctype self.object_pk_expr = object_pk_expr self.object_expr = object_expr self.comment = comment
def test_anonymous_user_is_redirected(self): comment = django_comments_tree.get_model()\ .objects.for_app_models('tests.diary')[0] # Like it. like_url = reverse("comments-tree-like", args=[comment.id]) request = request_factory.get(like_url) request.user = AnonymousUser() response = views.like(request, comment.id) dest_url = '/accounts/login/?next=/comments/like/2/' self.assertEqual(response.status_code, 302) self.assertEqual(response.url, dest_url) # Dislike it. dislike_url = reverse("comments-tree-dislike", args=[comment.id]) request = request_factory.get(dislike_url) request.user = AnonymousUser() response = views.dislike(request, comment.id) dest_url = '/accounts/login/?next=/comments/dislike/2/' self.assertEqual(response.status_code, 302) self.assertEqual(response.url, dest_url)
def test_loggedin_user_can_flag_comment(self): comment = django_comments_tree.get_model()\ .objects.for_app_models('tests.diary')[0] flag_url = reverse("comments-flag", args=[comment.id]) request = request_factory.get(flag_url) request.user = self.user response = views.FlagView.as_view()(request, comment.id) self.assertEqual(response.status_code, 200) self.assertTrue(response.content.find(b'Flag comment') > -1) request = request_factory.post(flag_url) request.user = self.user request._dont_enforce_csrf_checks = True response = views.FlagView.as_view()(request, comment.id) self.assertEqual(response.status_code, 302) self.assertEqual(response.url, reverse("comments-flag-done") + "?c=2") flags = TreeCommentFlag.objects.filter( comment=comment, user=self.user, flag=TreeCommentFlag.SUGGEST_REMOVAL) self.assertEqual(flags.count(), 1, f"Expected value to be 1")
def test_loggedin_user_can_dislike(self): if django.VERSION < (1, 5): return comment = django_comments_tree.get_model()\ .objects.for_app_models('tests.diary')[0] dislike_url = reverse("comments-tree-dislike", args=[comment.id]) request = request_factory.get(dislike_url) request.user = self.user response = views.dislike(request, comment.id) self.assertEqual(response.status_code, 200) self.assertTrue(response.content.find(b'value="I dislike it"') > -1) request = request_factory.post(dislike_url) request.user = self.user request._dont_enforce_csrf_checks = True response = views.dislike(request, comment.id) self.assertEqual(response.status_code, 302) self.assertEqual(response.url, reverse("comments-tree-dislike-done") + "?c=2") flags = TreeCommentFlag.objects.filter(comment=comment, user=self.user, flag=DISLIKEDIT_FLAG) self.assertEqual(flags.count(), 1, f"Expected value to be 1")
'fields': ('submit_date', 'ip_address', 'is_public', 'is_removed') }), ) date_hierarchy = 'submit_date' ordering = ('submit_date', ) search_fields = [ 'object_id', 'user__username', 'user_name', 'user_email', 'comment' ] def thread_level(self, obj): rep = '|' if obj.level: rep += '-' * obj.level rep += " c%d to c%d" % (obj.id, obj.parent_id) else: rep += " c%d" % obj.id return rep def cid(self, obj): return 'c%d' % obj.id class BlackListedDomainAdmin(admin.ModelAdmin): search_fields = ['domain'] if get_model() is TreeComment: admin.site.register(TreeComment, TreeCommentsAdmin) admin.site.register(TreeCommentFlag) admin.site.register(BlackListedDomain, BlackListedDomainAdmin)