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.' )