moderation.py 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159
  1. from django import template
  2. from django.conf import settings
  3. from django.shortcuts import get_object_or_404, render_to_response
  4. from django.contrib.auth.decorators import login_required, permission_required
  5. from utils import next_redirect, confirmation_view
  6. from django.contrib import comments
  7. from django.contrib.comments import signals
  8. from django.views.decorators.csrf import csrf_protect
  9. @csrf_protect
  10. @login_required
  11. def flag(request, comment_id, next=None):
  12. """
  13. Flags a comment. Confirmation on GET, action on POST.
  14. Templates: `comments/flag.html`,
  15. Context:
  16. comment
  17. the flagged `comments.comment` object
  18. """
  19. comment = get_object_or_404(comments.get_model(), pk=comment_id, site__pk=settings.SITE_ID)
  20. # Flag on POST
  21. if request.method == 'POST':
  22. perform_flag(request, comment)
  23. return next_redirect(request.POST.copy(), next, flag_done, c=comment.pk)
  24. # Render a form on GET
  25. else:
  26. return render_to_response('comments/flag.html',
  27. {'comment': comment, "next": next},
  28. template.RequestContext(request)
  29. )
  30. @csrf_protect
  31. @permission_required("comments.can_moderate")
  32. def delete(request, comment_id, next=None):
  33. """
  34. Deletes a comment. Confirmation on GET, action on POST. Requires the "can
  35. moderate comments" permission.
  36. Templates: `comments/delete.html`,
  37. Context:
  38. comment
  39. the flagged `comments.comment` object
  40. """
  41. comment = get_object_or_404(comments.get_model(), pk=comment_id, site__pk=settings.SITE_ID)
  42. # Delete on POST
  43. if request.method == 'POST':
  44. # Flag the comment as deleted instead of actually deleting it.
  45. perform_delete(request, comment)
  46. return next_redirect(request.POST.copy(), next, delete_done, c=comment.pk)
  47. # Render a form on GET
  48. else:
  49. return render_to_response('comments/delete.html',
  50. {'comment': comment, "next": next},
  51. template.RequestContext(request)
  52. )
  53. @csrf_protect
  54. @permission_required("comments.can_moderate")
  55. def approve(request, comment_id, next=None):
  56. """
  57. Approve a comment (that is, mark it as public and non-removed). Confirmation
  58. on GET, action on POST. Requires the "can moderate comments" permission.
  59. Templates: `comments/approve.html`,
  60. Context:
  61. comment
  62. the `comments.comment` object for approval
  63. """
  64. comment = get_object_or_404(comments.get_model(), pk=comment_id, site__pk=settings.SITE_ID)
  65. # Delete on POST
  66. if request.method == 'POST':
  67. # Flag the comment as approved.
  68. perform_approve(request, comment)
  69. return next_redirect(request.POST.copy(), next, approve_done, c=comment.pk)
  70. # Render a form on GET
  71. else:
  72. return render_to_response('comments/approve.html',
  73. {'comment': comment, "next": next},
  74. template.RequestContext(request)
  75. )
  76. # The following functions actually perform the various flag/aprove/delete
  77. # actions. They've been broken out into seperate functions to that they
  78. # may be called from admin actions.
  79. def perform_flag(request, comment):
  80. """
  81. Actually perform the flagging of a comment from a request.
  82. """
  83. flag, created = comments.models.CommentFlag.objects.get_or_create(
  84. comment = comment,
  85. user = request.user,
  86. flag = comments.models.CommentFlag.SUGGEST_REMOVAL
  87. )
  88. signals.comment_was_flagged.send(
  89. sender = comment.__class__,
  90. comment = comment,
  91. flag = flag,
  92. created = created,
  93. request = request,
  94. )
  95. def perform_delete(request, comment):
  96. flag, created = comments.models.CommentFlag.objects.get_or_create(
  97. comment = comment,
  98. user = request.user,
  99. flag = comments.models.CommentFlag.MODERATOR_DELETION
  100. )
  101. comment.is_removed = True
  102. comment.save()
  103. signals.comment_was_flagged.send(
  104. sender = comment.__class__,
  105. comment = comment,
  106. flag = flag,
  107. created = created,
  108. request = request,
  109. )
  110. def perform_approve(request, comment):
  111. flag, created = comments.models.CommentFlag.objects.get_or_create(
  112. comment = comment,
  113. user = request.user,
  114. flag = comments.models.CommentFlag.MODERATOR_APPROVAL,
  115. )
  116. comment.is_removed = False
  117. comment.is_public = True
  118. comment.save()
  119. signals.comment_was_flagged.send(
  120. sender = comment.__class__,
  121. comment = comment,
  122. flag = flag,
  123. created = created,
  124. request = request,
  125. )
  126. # Confirmation views.
  127. flag_done = confirmation_view(
  128. template = "comments/flagged.html",
  129. doc = 'Displays a "comment was flagged" success page.'
  130. )
  131. delete_done = confirmation_view(
  132. template = "comments/deleted.html",
  133. doc = 'Displays a "comment was deleted" success page.'
  134. )
  135. approve_done = confirmation_view(
  136. template = "comments/approved.html",
  137. doc = 'Displays a "comment was approved" success page.'
  138. )