From ab146f652a2682409c1cf04ff682e54da4b7eab9 Mon Sep 17 00:00:00 2001 From: Mouse Reeve Date: Tue, 16 May 2023 09:02:43 -0700 Subject: [PATCH 01/45] Adds action types to report comments table --- .../0179_reportcomment_comment_type.py | 18 ++++++++++++++++++ bookwyrm/models/report.py | 16 ++++++++++++++++ 2 files changed, 34 insertions(+) create mode 100644 bookwyrm/migrations/0179_reportcomment_comment_type.py diff --git a/bookwyrm/migrations/0179_reportcomment_comment_type.py b/bookwyrm/migrations/0179_reportcomment_comment_type.py new file mode 100644 index 000000000..fae6617df --- /dev/null +++ b/bookwyrm/migrations/0179_reportcomment_comment_type.py @@ -0,0 +1,18 @@ +# Generated by Django 3.2.18 on 2023-05-16 16:02 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('bookwyrm', '0178_auto_20230328_2132'), + ] + + operations = [ + migrations.AddField( + model_name='reportcomment', + name='comment_type', + field=models.CharField(choices=[('comment', 'Comment'), ('resolve', 'Resolved report'), ('reopen', 'Re-opened report'), ('message_reporter', 'Messaged reporter'), ('message_offender', 'Messaged reported user'), ('user_suspension', 'Suspended user'), ('user_deletion', 'Deleted user account'), ('block_domain', 'Blocked domain'), ('approve_domain', 'Approved domain'), ('delete_item', 'Deleted item')], default='comment', max_length=20), + ), + ] diff --git a/bookwyrm/models/report.py b/bookwyrm/models/report.py index f6e665053..9ab0d697e 100644 --- a/bookwyrm/models/report.py +++ b/bookwyrm/models/report.py @@ -1,6 +1,7 @@ """ flagged for moderation """ from django.core.exceptions import PermissionDenied from django.db import models +from django.utils.translation import gettext_lazy as _ from bookwyrm.settings import DOMAIN from .base_model import BookWyrmModel @@ -38,10 +39,25 @@ class Report(BookWyrmModel): ordering = ("-created_date",) +ReportCommentTypes = [ + ("comment", _("Comment")), + ("resolve", _("Resolved report")), + ("reopen", _("Re-opened report")), + ("message_reporter", _("Messaged reporter")), + ("message_offender", _("Messaged reported user")), + ("user_suspension", _("Suspended user")), + ("user_deletion", _("Deleted user account")), + ("block_domain", _("Blocked domain")), + ("approve_domain", _("Approved domain")), + ("delete_item", _("Deleted item")), +] class ReportComment(BookWyrmModel): """updates on a report""" user = models.ForeignKey("User", on_delete=models.PROTECT) + comment_type = models.CharField( + max_length=20, blank=False, default="comment", choices=ReportCommentTypes + ) note = models.TextField() report = models.ForeignKey(Report, on_delete=models.PROTECT) From b3a519c08205f4a9f3cd2b595dc5f4f62279dac9 Mon Sep 17 00:00:00 2001 From: Mouse Reeve Date: Tue, 16 May 2023 09:43:00 -0700 Subject: [PATCH 02/45] Converts report "comments" into broader "actions" table This table will now track all actions taken on a report, like resolving it, re-opening it, suspending the reported user, et cetera, in addition to comments. When there are multiple admins, this change will make it easier to understand what actions have been taken by whom on a report. --- .../0179_reportcomment_comment_type.py | 26 ++++++- bookwyrm/models/__init__.py | 2 +- bookwyrm/models/report.py | 73 ++++++++++++++---- .../templates/settings/reports/report.html | 76 +++++++++++++------ .../settings/reports/report_links_table.html | 12 ++- .../settings/users/delete_user_form.html | 2 +- .../users/user_moderation_actions.html | 6 +- bookwyrm/urls.py | 10 +-- bookwyrm/views/admin/link_domains.py | 12 ++- bookwyrm/views/admin/reports.py | 30 +++++--- bookwyrm/views/helpers.py | 4 +- 11 files changed, 185 insertions(+), 68 deletions(-) diff --git a/bookwyrm/migrations/0179_reportcomment_comment_type.py b/bookwyrm/migrations/0179_reportcomment_comment_type.py index fae6617df..a8a446096 100644 --- a/bookwyrm/migrations/0179_reportcomment_comment_type.py +++ b/bookwyrm/migrations/0179_reportcomment_comment_type.py @@ -6,13 +6,31 @@ from django.db import migrations, models class Migration(migrations.Migration): dependencies = [ - ('bookwyrm', '0178_auto_20230328_2132'), + ("bookwyrm", "0178_auto_20230328_2132"), ] operations = [ migrations.AddField( - model_name='reportcomment', - name='comment_type', - field=models.CharField(choices=[('comment', 'Comment'), ('resolve', 'Resolved report'), ('reopen', 'Re-opened report'), ('message_reporter', 'Messaged reporter'), ('message_offender', 'Messaged reported user'), ('user_suspension', 'Suspended user'), ('user_deletion', 'Deleted user account'), ('block_domain', 'Blocked domain'), ('approve_domain', 'Approved domain'), ('delete_item', 'Deleted item')], default='comment', max_length=20), + model_name="reportcomment", + name="action_type", + field=models.CharField( + choices=[ + ("comment", "Comment"), + ("resolve", "Resolved report"), + ("reopen", "Re-opened report"), + ("message_reporter", "Messaged reporter"), + ("message_offender", "Messaged reported user"), + ("user_suspension", "Suspended user"), + ("user_unsuspension", "Un-suspended user"), + ("user_perms", "Changed user permission level"), + ("user_deletion", "Deleted user account"), + ("block_domain", "Blocked domain"), + ("approve_domain", "Approved domain"), + ("delete_item", "Deleted item"), + ], + default="comment", + max_length=20, + ), ), + migrations.RenameModel("ReportComment", "ReportAction"), ] diff --git a/bookwyrm/models/__init__.py b/bookwyrm/models/__init__.py index f5b72f3e4..7b779190b 100644 --- a/bookwyrm/models/__init__.py +++ b/bookwyrm/models/__init__.py @@ -20,7 +20,7 @@ from .readthrough import ReadThrough, ProgressUpdate, ProgressMode from .user import User, KeyPair from .annual_goal import AnnualGoal from .relationship import UserFollows, UserFollowRequest, UserBlocks -from .report import Report, ReportComment +from .report import Report, ReportAction from .federated_server import FederatedServer from .group import Group, GroupMember, GroupMemberInvitation diff --git a/bookwyrm/models/report.py b/bookwyrm/models/report.py index 9ab0d697e..cf7a74b5d 100644 --- a/bookwyrm/models/report.py +++ b/bookwyrm/models/report.py @@ -7,6 +7,21 @@ from bookwyrm.settings import DOMAIN from .base_model import BookWyrmModel +# Report action enums +COMMENT = "comment" +RESOLVE = "resolve" +REOPEN = "reopen" +MESSAGE_REPORTER = "message_reporter" +MESSAGE_OFFENDER = "message_offender" +USER_SUSPENSION = "user_suspension" +USER_UNSUSPENSION = "user_unsuspension" +USER_DELETION = "user_deletion" +USER_PERMS = "user_perms" +BLOCK_DOMAIN = "block_domain" +APPROVE_DOMAIN = "approve_domain" +DELETE_ITEM = "delete_item" + + class Report(BookWyrmModel): """reported status or user""" @@ -33,30 +48,60 @@ class Report(BookWyrmModel): def get_remote_id(self): return f"https://{DOMAIN}/settings/reports/{self.id}" + def comment(self, user, note): + """comment on a report""" + ReportAction.objects.create( + action_type=COMMENT, user=user, note=note, report=self + ) + + def resolve(self, user): + """Mark a report as complete""" + self.resolved = True + self.save() + ReportAction.objects.create(action_type=RESOLVE, user=user, report=self) + + def reopen(self, user): + """Wait! This report isn't complete after all""" + self.resolved = False + self.save() + ReportAction.objects.create(action_type=REOPEN, user=user, report=self) + + @classmethod + def record_action(cls, report_id: int, action: str, user): + """Note that someone did something""" + if not report_id: + return + report = cls.objects.get(id=report_id) + ReportAction.objects.create(action_type=action, user=user, report=report) + class Meta: """set order by default""" ordering = ("-created_date",) -ReportCommentTypes = [ - ("comment", _("Comment")), - ("resolve", _("Resolved report")), - ("reopen", _("Re-opened report")), - ("message_reporter", _("Messaged reporter")), - ("message_offender", _("Messaged reported user")), - ("user_suspension", _("Suspended user")), - ("user_deletion", _("Deleted user account")), - ("block_domain", _("Blocked domain")), - ("approve_domain", _("Approved domain")), - ("delete_item", _("Deleted item")), +ReportActionTypes = [ + (COMMENT, _("Comment")), + (RESOLVE, _("Resolved report")), + (REOPEN, _("Re-opened report")), + (MESSAGE_REPORTER, _("Messaged reporter")), + (MESSAGE_OFFENDER, _("Messaged reported user")), + (USER_SUSPENSION, _("Suspended user")), + (USER_UNSUSPENSION, _("Un-suspended user")), + (USER_PERMS, _("Changed user permission level")), + (USER_DELETION, _("Deleted user account")), + (BLOCK_DOMAIN, _("Blocked domain")), + (APPROVE_DOMAIN, _("Approved domain")), + (DELETE_ITEM, _("Deleted item")), ] -class ReportComment(BookWyrmModel): + + +class ReportAction(BookWyrmModel): """updates on a report""" user = models.ForeignKey("User", on_delete=models.PROTECT) - comment_type = models.CharField( - max_length=20, blank=False, default="comment", choices=ReportCommentTypes + action_type = models.CharField( + max_length=20, blank=False, default="comment", choices=ReportActionTypes ) note = models.TextField() report = models.ForeignKey(Report, on_delete=models.PROTECT) diff --git a/bookwyrm/templates/settings/reports/report.html b/bookwyrm/templates/settings/reports/report.html index ca105701f..2c8221036 100644 --- a/bookwyrm/templates/settings/reports/report.html +++ b/bookwyrm/templates/settings/reports/report.html @@ -1,6 +1,7 @@ {% extends 'settings/layout.html' %} {% load i18n %} {% load humanize %} +{% load utilities %} {% load feed_page_tags %} {% block title %} @@ -21,7 +22,7 @@
- {% trans "Message reporter" %} + {% trans "Message reporter" %}
@@ -61,30 +62,59 @@ {% include 'settings/users/user_moderation_actions.html' with user=report.user %} {% endif %} -
-

{% trans "Moderator Comments" %}

- {% for comment in report.reportcomment_set.all %} -
-

{{ comment.note }}

-