From 5b229fa362dae4cd22495765b7e7c7e21f44fde8 Mon Sep 17 00:00:00 2001 From: Mouse Reeve Date: Tue, 2 Jan 2024 13:57:19 -0800 Subject: [PATCH 01/18] Makes reports an activitypub model --- bookwyrm/activitypub/__init__.py | 1 + bookwyrm/activitypub/verbs.py | 10 ++++ .../migrations/0192_auto_20240102_2156.py | 57 +++++++++++++++++++ bookwyrm/models/report.py | 25 +++++--- 4 files changed, 86 insertions(+), 7 deletions(-) create mode 100644 bookwyrm/migrations/0192_auto_20240102_2156.py diff --git a/bookwyrm/activitypub/__init__.py b/bookwyrm/activitypub/__init__.py index 41decd68af..5789986378 100644 --- a/bookwyrm/activitypub/__init__.py +++ b/bookwyrm/activitypub/__init__.py @@ -24,6 +24,7 @@ from .verbs import Add, Remove from .verbs import Announce, Like from .verbs import Move +from .verbs import Flag # this creates a list of all the Activity types that we can serialize, # so when an Activity comes in from outside, we can check if it's known diff --git a/bookwyrm/activitypub/verbs.py b/bookwyrm/activitypub/verbs.py index a365f4cc07..13a303af71 100644 --- a/bookwyrm/activitypub/verbs.py +++ b/bookwyrm/activitypub/verbs.py @@ -268,3 +268,13 @@ def action(self, allow_external_connections=True): else: # we might do something with this to move other objects at some point pass + + +@dataclass(init=False) +class Flag(Verb): + """Report a user to their home server""" + + to: str + object: List[str] = None + links: List[str] = None + type: str = "Flag" diff --git a/bookwyrm/migrations/0192_auto_20240102_2156.py b/bookwyrm/migrations/0192_auto_20240102_2156.py new file mode 100644 index 0000000000..7537bbbaae --- /dev/null +++ b/bookwyrm/migrations/0192_auto_20240102_2156.py @@ -0,0 +1,57 @@ +# Generated by Django 3.2.23 on 2024-01-02 21:56 + +import bookwyrm.models.fields +from django.conf import settings +from django.db import migrations +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ("bookwyrm", "0191_merge_20240102_0326"), + ] + + operations = [ + migrations.AlterField( + model_name="report", + name="links", + field=bookwyrm.models.fields.ManyToManyField( + blank=True, to="bookwyrm.Link" + ), + ), + migrations.AlterField( + model_name="report", + name="note", + field=bookwyrm.models.fields.TextField(blank=True, null=True), + ), + migrations.AlterField( + model_name="report", + name="reporter", + field=bookwyrm.models.fields.ForeignKey( + on_delete=django.db.models.deletion.PROTECT, + related_name="reporter", + to=settings.AUTH_USER_MODEL, + ), + ), + migrations.AlterField( + model_name="report", + name="status", + field=bookwyrm.models.fields.ForeignKey( + blank=True, + null=True, + on_delete=django.db.models.deletion.PROTECT, + to="bookwyrm.status", + ), + ), + migrations.AlterField( + model_name="report", + name="user", + field=bookwyrm.models.fields.ForeignKey( + blank=True, + null=True, + on_delete=django.db.models.deletion.PROTECT, + to=settings.AUTH_USER_MODEL, + ), + ), + ] diff --git a/bookwyrm/models/report.py b/bookwyrm/models/report.py index 74a9bbe411..153ba6dc29 100644 --- a/bookwyrm/models/report.py +++ b/bookwyrm/models/report.py @@ -3,8 +3,11 @@ from django.db import models from django.utils.translation import gettext_lazy as _ +from bookwyrm import activitypub from bookwyrm.settings import DOMAIN +from .activitypub_mixin import ActivityMixin from .base_model import BookWyrmModel +from . import fields # Report action enums @@ -22,21 +25,29 @@ DELETE_ITEM = "delete_item" -class Report(BookWyrmModel): +class Report(ActivityMixin, BookWyrmModel): """reported status or user""" - reporter = models.ForeignKey( - "User", related_name="reporter", on_delete=models.PROTECT + activity_serializer = activitypub.Flag + + reporter = fields.ForeignKey( + "User", + related_name="reporter", + on_delete=models.PROTECT, + activitypub_field="actor", + ) + note = fields.TextField(null=True, blank=True, activitypub_field="content") + user = fields.ForeignKey( + "User", on_delete=models.PROTECT, null=True, blank=True, activitypub_field="to" ) - note = models.TextField(null=True, blank=True) - user = models.ForeignKey("User", on_delete=models.PROTECT, null=True, blank=True) - status = models.ForeignKey( + status = fields.ForeignKey( "Status", null=True, blank=True, on_delete=models.PROTECT, + activitypub_field="object", ) - links = models.ManyToManyField("Link", blank=True) + links = fields.ManyToManyField("Link", blank=True) resolved = models.BooleanField(default=False) def raise_not_editable(self, viewer): From 5c0ade5346726e39453c202b1c6cf7ea78969252 Mon Sep 17 00:00:00 2001 From: Mouse Reeve Date: Tue, 2 Jan 2024 14:38:35 -0800 Subject: [PATCH 02/18] Changes field names in report model so the reporter is "user" This is such an annoying change but it is objectively better. Just gotta be real sure they didn't get mixed up anywhere along the way. --- bookwyrm/emailing.py | 8 ++-- bookwyrm/forms/forms.py | 2 +- .../0193_rename_user_report_reported_user.py | 18 ++++++++ .../0194_rename_reporter_report_user.py | 18 ++++++++ bookwyrm/models/antispam.py | 8 ++-- bookwyrm/models/report.py | 23 ++++++---- bookwyrm/templates/report.html | 2 +- .../templates/settings/reports/report.html | 20 ++++---- .../settings/reports/report_header.html | 8 ++-- .../settings/reports/report_preview.html | 2 +- bookwyrm/templates/snippets/report_modal.html | 8 ++-- bookwyrm/tests/models/test_report_model.py | 46 +++++++++++++++++++ bookwyrm/tests/views/admin/test_reports.py | 18 +++++--- bookwyrm/tests/views/admin/test_user_admin.py | 2 +- bookwyrm/tests/views/test_notifications.py | 4 +- bookwyrm/tests/views/test_report.py | 10 ++-- 16 files changed, 145 insertions(+), 52 deletions(-) create mode 100644 bookwyrm/migrations/0193_rename_user_report_reported_user.py create mode 100644 bookwyrm/migrations/0194_rename_reporter_report_user.py create mode 100644 bookwyrm/tests/models/test_report_model.py diff --git a/bookwyrm/emailing.py b/bookwyrm/emailing.py index 5e08ebba13..758da962c0 100644 --- a/bookwyrm/emailing.py +++ b/bookwyrm/emailing.py @@ -50,9 +50,11 @@ def password_reset_email(reset_code): def moderation_report_email(report): """a report was created""" data = email_data() - data["reporter"] = report.reporter.localname or report.reporter.username - if report.user: - data["reportee"] = report.user.localname or report.user.username + data["reporter"] = report.user.localname or report.user.username + if report.reported_user: + data["reportee"] = ( + report.reported_user.localname or report.reported_user.username + ) data["report_link"] = report.remote_id data["link_domain"] = report.links.exists() diff --git a/bookwyrm/forms/forms.py b/bookwyrm/forms/forms.py index 3d555f308d..4764b871a7 100644 --- a/bookwyrm/forms/forms.py +++ b/bookwyrm/forms/forms.py @@ -44,7 +44,7 @@ class Meta: class ReportForm(CustomForm): class Meta: model = models.Report - fields = ["user", "reporter", "status", "links", "note"] + fields = ["reported_user", "user", "status", "links", "note"] class ReadThroughForm(CustomForm): diff --git a/bookwyrm/migrations/0193_rename_user_report_reported_user.py b/bookwyrm/migrations/0193_rename_user_report_reported_user.py new file mode 100644 index 0000000000..0633e69fa1 --- /dev/null +++ b/bookwyrm/migrations/0193_rename_user_report_reported_user.py @@ -0,0 +1,18 @@ +# Generated by Django 3.2.23 on 2024-01-02 22:16 + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ("bookwyrm", "0192_auto_20240102_2156"), + ] + + operations = [ + migrations.RenameField( + model_name="report", + old_name="user", + new_name="reported_user", + ), + ] diff --git a/bookwyrm/migrations/0194_rename_reporter_report_user.py b/bookwyrm/migrations/0194_rename_reporter_report_user.py new file mode 100644 index 0000000000..3c2c0f1802 --- /dev/null +++ b/bookwyrm/migrations/0194_rename_reporter_report_user.py @@ -0,0 +1,18 @@ +# Generated by Django 3.2.23 on 2024-01-02 22:17 + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ("bookwyrm", "0193_rename_user_report_reported_user"), + ] + + operations = [ + migrations.RenameField( + model_name="report", + old_name="reporter", + new_name="user", + ), + ] diff --git a/bookwyrm/models/antispam.py b/bookwyrm/models/antispam.py index 1067cbf1d7..da58e8aa68 100644 --- a/bookwyrm/models/antispam.py +++ b/bookwyrm/models/antispam.py @@ -109,9 +109,9 @@ def automod_users(reporter): return report_model.objects.bulk_create( [ report_model( - reporter=reporter, + user=reporter, note=_("Automatically generated report"), - user=u, + reported_user=u, ) for u in users ] @@ -143,9 +143,9 @@ def automod_statuses(reporter): return report_model.objects.bulk_create( [ report_model( - reporter=reporter, + user=reporter, note=_("Automatically generated report"), - user=s.user, + reported_user=s.user, status=s, ) for s in statuses diff --git a/bookwyrm/models/report.py b/bookwyrm/models/report.py index 153ba6dc29..9a9b0393c5 100644 --- a/bookwyrm/models/report.py +++ b/bookwyrm/models/report.py @@ -1,5 +1,4 @@ """ flagged for moderation """ -from django.core.exceptions import PermissionDenied from django.db import models from django.utils.translation import gettext_lazy as _ @@ -30,15 +29,19 @@ class Report(ActivityMixin, BookWyrmModel): activity_serializer = activitypub.Flag - reporter = fields.ForeignKey( + user = fields.ForeignKey( "User", - related_name="reporter", on_delete=models.PROTECT, activitypub_field="actor", ) note = fields.TextField(null=True, blank=True, activitypub_field="content") - user = fields.ForeignKey( - "User", on_delete=models.PROTECT, null=True, blank=True, activitypub_field="to" + reported_user = fields.ForeignKey( + "User", + related_name="reported_user", + on_delete=models.PROTECT, + null=True, + blank=True, + activitypub_field="to", ) status = fields.ForeignKey( "Status", @@ -50,11 +53,11 @@ class Report(ActivityMixin, BookWyrmModel): links = fields.ManyToManyField("Link", blank=True) resolved = models.BooleanField(default=False) - def raise_not_editable(self, viewer): - """instead of user being the owner field, it's reporter""" - if self.reporter == viewer or viewer.has_perm("bookwyrm.moderate_user"): - return - raise PermissionDenied() + def get_recipients(self, software=None): + """Send this to the public inbox of the offending instance""" + if self.user.local: + return None + return [self.user.shared_inbox or self.user.inbox] def get_remote_id(self): return f"https://{DOMAIN}/settings/reports/{self.id}" diff --git a/bookwyrm/templates/report.html b/bookwyrm/templates/report.html index be7ed68f7a..b1ea826925 100644 --- a/bookwyrm/templates/report.html +++ b/bookwyrm/templates/report.html @@ -6,5 +6,5 @@ {% endblock %} {% block content %} -{% include "snippets/report_modal.html" with user=user active=True static=True id="report-modal" %} +{% include "snippets/report_modal.html" with reported_user=reported_user active=True static=True id="report-modal" %} {% endblock %} diff --git a/bookwyrm/templates/settings/reports/report.html b/bookwyrm/templates/settings/reports/report.html index df45341c6d..f26892af51 100644 --- a/bookwyrm/templates/settings/reports/report.html +++ b/bookwyrm/templates/settings/reports/report.html @@ -27,7 +27,7 @@
{% trans "Update on your report:" as dm_template %} - {% include 'snippets/create_status/status.html' with type="direct" uuid=1 mention=report.reporter prepared_content=dm_template no_script=True %} + {% include 'snippets/create_status/status.html' with type="direct" uuid=1 mention=report.user prepared_content=dm_template no_script=True %}
@@ -56,10 +56,10 @@

{% trans "Reported links" %}

{% endif %} -{% if report.user %} -{% include 'settings/users/user_info.html' with user=report.user %} +{% if report.reported_user %} +{% include 'settings/users/user_info.html' with reported_user=report.reported_user %} -{% include 'settings/users/user_moderation_actions.html' with user=report.user %} +{% include 'settings/users/user_moderation_actions.html' with reported_user=report.reported_user %} {% endif %}
@@ -70,8 +70,8 @@

{% trans "Moderation Activity" %}

  • - {% blocktrans trimmed with user=report.reporter|username user_link=report.reporter.local_path %} - {{ user}} opened this report + {% blocktrans trimmed with reported_user=report.user|username user_link=report.user.local_path %} + {{ reported_user}} opened this report {% endblocktrans %}

    {{ report.created_date }} @@ -83,12 +83,12 @@

    {% trans "Moderation Activity" %}

    {% if comment.action_type == "comment" %} - {% blocktrans trimmed with user=comment.user|username user_link=comment.user.local_path %} - {{ user}} commented on this report: + {% blocktrans trimmed with reported_user=comment.reported_user|username user_link=comment.reported_user.local_path %} + {{ reported_user}} commented on this report: {% endblocktrans %} {% else %} - {% blocktrans trimmed with user=comment.user|username user_link=comment.user.local_path %} - {{ user}} took an action on this report: + {% blocktrans trimmed with reported_user=comment.reported_user|username user_link=comment.reported_user.local_path %} + {{ reported_user}} took an action on this report: {% endblocktrans %} {{ comment.get_action_type_display }} diff --git a/bookwyrm/templates/settings/reports/report_header.html b/bookwyrm/templates/settings/reports/report_header.html index b77c6c6ae6..1c9b01c9b2 100644 --- a/bookwyrm/templates/settings/reports/report_header.html +++ b/bookwyrm/templates/settings/reports/report_header.html @@ -3,14 +3,14 @@ {% if report.status %} -{% blocktrans trimmed with report_id=report.id username=report.user|username %} +{% blocktrans trimmed with report_id=report.id username=report.reported_user|username %} Report #{{ report_id }}: Status posted by @{{ username }} {% endblocktrans %} {% elif report.links.exists %} - {% if report.user %} - {% blocktrans trimmed with report_id=report.id username=report.user|username %} + {% if report.reported_user %} + {% blocktrans trimmed with report_id=report.id username=report.reported_user|username %} Report #{{ report_id }}: Link added by @{{ username }} {% endblocktrans %} {% else %} @@ -21,7 +21,7 @@ {% else %} -{% blocktrans trimmed with report_id=report.id username=report.user|username %} +{% blocktrans trimmed with report_id=report.id username=report.reported_user|username %} Report #{{ report_id }}: User @{{ username }} {% endblocktrans %} diff --git a/bookwyrm/templates/settings/reports/report_preview.html b/bookwyrm/templates/settings/reports/report_preview.html index bd0009c519..26afd273cf 100644 --- a/bookwyrm/templates/settings/reports/report_preview.html +++ b/bookwyrm/templates/settings/reports/report_preview.html @@ -21,7 +21,7 @@

    {% block card-footer %}