summaryrefslogtreecommitdiff
path: root/app/lib/django_comments/views/moderation.py
diff options
context:
space:
mode:
authorlxf <sng@luxagraf.net>2022-05-14 16:38:07 -0400
committerlxf <sng@luxagraf.net>2022-05-14 16:38:07 -0400
commitbb3973ffb714c932e9ec6dd6a751228dc71fe1d3 (patch)
tree6fa32f9392ad2ec32271349b86a4c1388fd6ba95 /app/lib/django_comments/views/moderation.py
initial commit
Diffstat (limited to 'app/lib/django_comments/views/moderation.py')
-rw-r--r--app/lib/django_comments/views/moderation.py166
1 files changed, 166 insertions, 0 deletions
diff --git a/app/lib/django_comments/views/moderation.py b/app/lib/django_comments/views/moderation.py
new file mode 100644
index 0000000..04c665f
--- /dev/null
+++ b/app/lib/django_comments/views/moderation.py
@@ -0,0 +1,166 @@
+from __future__ import absolute_import
+
+from django.contrib.auth.decorators import login_required, permission_required
+from django.contrib.sites.shortcuts import get_current_site
+from django.shortcuts import get_object_or_404, render
+from django.views.decorators.csrf import csrf_protect
+
+import django_comments
+from django_comments import signals
+from django_comments.views.utils import next_redirect, confirmation_view
+
+
+@csrf_protect
+@login_required
+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(django_comments.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})
+
+
+@csrf_protect
+@permission_required("django_comments.can_moderate")
+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(django_comments.get_model(),
+ pk=comment_id,
+ site__pk=get_current_site(request).pk)
+
+ # 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})
+
+
+@csrf_protect
+@permission_required("django_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: :template:`comments/approve.html`,
+ Context:
+ comment
+ the `comments.comment` object for approval
+ """
+ comment = get_object_or_404(django_comments.get_model(),
+ pk=comment_id,
+ site__pk=get_current_site(request).pk)
+
+ # 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})
+
+
+# The following functions actually perform the various flag/aprove/delete
+# actions. They've been broken out into separate functions to that they
+# may be called from admin actions.
+
+def perform_flag(request, comment):
+ """
+ Actually perform the flagging of a comment from a request.
+ """
+ flag, created = django_comments.models.CommentFlag.objects.get_or_create(
+ comment=comment,
+ user=request.user,
+ flag=django_comments.models.CommentFlag.SUGGEST_REMOVAL
+ )
+ signals.comment_was_flagged.send(
+ sender=comment.__class__,
+ comment=comment,
+ flag=flag,
+ created=created,
+ request=request,
+ )
+
+
+def perform_delete(request, comment):
+ flag, created = django_comments.models.CommentFlag.objects.get_or_create(
+ comment=comment,
+ user=request.user,
+ flag=django_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,
+ )
+
+
+def perform_approve(request, comment):
+ flag, created = django_comments.models.CommentFlag.objects.get_or_create(
+ comment=comment,
+ user=request.user,
+ flag=django_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,
+ )
+
+# Confirmation views.
+
+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.'
+)