diff -r 6641e941ef1e -r ff1a9aa48cfd app/django/contrib/comments/views/moderation.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/app/django/contrib/comments/views/moderation.py Tue Oct 14 16:00:59 2008 +0000 @@ -0,0 +1,204 @@ +from django import template +from django.conf import settings +from django.shortcuts import get_object_or_404, render_to_response +from django.contrib.auth.decorators import login_required, permission_required +from utils import next_redirect, confirmation_view +from django.core.paginator import Paginator, InvalidPage +from django.http import Http404 +from django.contrib import comments +from django.contrib.comments import signals + +#@login_required +def flag(request, comment_id, next=None): + """ + Flags a comment. Confirmation on GET, action on POST. + + Templates: `comments/flag.html`, + Context: + comment + the flagged `comments.comment` object + """ + comment = get_object_or_404(comments.get_model(), pk=comment_id, site__pk=settings.SITE_ID) + + # Flag on POST + if request.method == 'POST': + flag, created = comments.models.CommentFlag.objects.get_or_create( + comment = comment, + user = request.user, + flag = comments.models.CommentFlag.SUGGEST_REMOVAL + ) + signals.comment_was_flagged.send( + sender = comment.__class__, + comment = comment, + flag = flag, + created = created, + request = request, + ) + return next_redirect(request.POST.copy(), next, flag_done, c=comment.pk) + + # Render a form on GET + else: + return render_to_response('comments/flag.html', + {'comment': comment, "next": next}, + template.RequestContext(request) + ) +flag = login_required(flag) + +#@permission_required("comments.delete_comment") +def delete(request, comment_id, next=None): + """ + Deletes a comment. Confirmation on GET, action on POST. Requires the "can + moderate comments" permission. + + Templates: `comments/delete.html`, + Context: + comment + the flagged `comments.comment` object + """ + comment = get_object_or_404(comments.get_model(), pk=comment_id, site__pk=settings.SITE_ID) + + # Delete on POST + if request.method == 'POST': + # Flag the comment as deleted instead of actually deleting it. + flag, created = comments.models.CommentFlag.objects.get_or_create( + comment = comment, + user = request.user, + flag = comments.models.CommentFlag.MODERATOR_DELETION + ) + comment.is_removed = True + comment.save() + signals.comment_was_flagged.send( + sender = comment.__class__, + comment = comment, + flag = flag, + created = created, + request = request, + ) + return next_redirect(request.POST.copy(), next, delete_done, c=comment.pk) + + # Render a form on GET + else: + return render_to_response('comments/delete.html', + {'comment': comment, "next": next}, + template.RequestContext(request) + ) +delete = permission_required("comments.can_moderate")(delete) + +#@permission_required("comments.can_moderate") +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: `comments/approve.html`, + Context: + comment + the `comments.comment` object for approval + """ + comment = get_object_or_404(comments.get_model(), pk=comment_id, site__pk=settings.SITE_ID) + + # Delete on POST + if request.method == 'POST': + # Flag the comment as approved. + flag, created = comments.models.CommentFlag.objects.get_or_create( + comment = comment, + user = request.user, + flag = comments.models.CommentFlag.MODERATOR_APPROVAL, + ) + + comment.is_removed = False + comment.is_public = True + comment.save() + + signals.comment_was_flagged.send( + sender = comment.__class__, + comment = comment, + flag = flag, + created = created, + request = request, + ) + return next_redirect(request.POST.copy(), next, approve_done, c=comment.pk) + + # Render a form on GET + else: + return render_to_response('comments/approve.html', + {'comment': comment, "next": next}, + template.RequestContext(request) + ) + +approve = permission_required("comments.can_moderate")(approve) + + +#@permission_required("comments.can_moderate") +def moderation_queue(request): + """ + Displays a list of unapproved comments to be approved. + + Templates: `comments/moderation_queue.html` + Context: + comments + Comments to be approved (paginated). + empty + Is the comment list empty? + is_paginated + Is there more than one page? + results_per_page + Number of comments per page + has_next + Is there a next page? + has_previous + Is there a previous page? + page + The current page number + next + The next page number + pages + Number of pages + hits + Total number of comments + page_range + Range of page numbers + + """ + qs = comments.get_model().objects.filter(is_public=False, is_removed=False) + paginator = Paginator(qs, 100) + + try: + page = int(request.GET.get("page", 1)) + except ValueError: + raise Http404 + + try: + comments_per_page = paginator.page(page) + except InvalidPage: + raise Http404 + + return render_to_response("comments/moderation_queue.html", { + 'comments' : comments_per_page.object_list, + 'empty' : page == 1 and paginator.count == 0, + 'is_paginated': paginator.num_pages > 1, + 'results_per_page': 100, + 'has_next': comments_per_page.has_next(), + 'has_previous': comments_per_page.has_previous(), + 'page': page, + 'next': page + 1, + 'previous': page - 1, + 'pages': paginator.num_pages, + 'hits' : paginator.count, + 'page_range' : paginator.page_range + }, context_instance=template.RequestContext(request)) + +moderation_queue = permission_required("comments.can_moderate")(moderation_queue) + +flag_done = confirmation_view( + template = "comments/flagged.html", + doc = 'Displays a "comment was flagged" success page.' +) +delete_done = confirmation_view( + template = "comments/deleted.html", + doc = 'Displays a "comment was deleted" success page.' +) +approve_done = confirmation_view( + template = "comments/approved.html", + doc = 'Displays a "comment was approved" success page.' +)