Exemplo n.º 1
0
    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
        })
Exemplo n.º 5
0
 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]
Exemplo n.º 6
0
 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")
Exemplo n.º 7
0
 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})
Exemplo n.º 8
0
 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()
Exemplo n.º 9
0
 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)
Exemplo n.º 10
0
    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)
Exemplo n.º 11
0
 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)
Exemplo n.º 12
0
 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
Exemplo n.º 13
0
 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)
Exemplo n.º 14
0
 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")
Exemplo n.º 15
0
 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")
Exemplo n.º 16
0
            '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)