moderation.py 5.0 KB

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