bookwyrm/bookwyrm/models/report.py

136 lines
4.1 KiB
Python
Raw Normal View History

2021-03-09 01:16:59 +00:00
""" flagged for moderation """
from django.db import models
from django.utils.translation import gettext_lazy as _
2024-01-02 21:57:19 +00:00
from bookwyrm import activitypub
2022-01-30 16:50:53 +00:00
from bookwyrm.settings import DOMAIN
2024-01-02 21:57:19 +00:00
from .activitypub_mixin import ActivityMixin
2021-03-09 01:16:59 +00:00
from .base_model import BookWyrmModel
2024-01-02 21:57:19 +00:00
from . import fields
2021-03-09 01:16:59 +00:00
# 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"
2024-01-02 21:57:19 +00:00
class Report(ActivityMixin, BookWyrmModel):
2021-04-26 16:15:42 +00:00
"""reported status or user"""
2021-03-09 01:16:59 +00:00
2024-01-02 21:57:19 +00:00
activity_serializer = activitypub.Flag
user = fields.ForeignKey(
2024-01-02 21:57:19 +00:00
"User",
on_delete=models.PROTECT,
activitypub_field="actor",
)
note = fields.TextField(null=True, blank=True, activitypub_field="content")
reported_user = fields.ForeignKey(
"User",
related_name="reported_user",
on_delete=models.PROTECT,
null=True,
blank=True,
activitypub_field="to",
2021-03-09 01:16:59 +00:00
)
2024-01-02 21:57:19 +00:00
status = fields.ForeignKey(
2022-02-24 20:48:52 +00:00
"Status",
null=True,
blank=True,
on_delete=models.PROTECT,
2024-01-02 21:57:19 +00:00
activitypub_field="object",
2022-02-24 20:48:52 +00:00
)
2024-01-02 21:57:19 +00:00
links = fields.ManyToManyField("Link", blank=True)
2021-03-09 01:16:59 +00:00
resolved = models.BooleanField(default=False)
allow_broadcast = models.BooleanField(default=False)
def broadcast(self, activity, sender, *args, **kwargs):
"""only need to send an activity for remote offenders"""
# don't try to broadcast if the reporter doesn't want you to,
# or if the reported user is local
if self.reported_user.local or not self.allow_broadcast:
return
super().broadcast(activity, sender, *args, **kwargs)
2021-03-09 01:16:59 +00:00
def get_recipients(self, software=None):
"""Send this to the public inbox of the offending instance"""
if self.reported_user.local:
return []
return [self.reported_user.shared_inbox or self.reported_user.inbox]
2022-01-30 16:50:53 +00:00
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)
2021-03-09 02:36:34 +00:00
class Meta:
2022-01-10 22:55:10 +00:00
"""set order by default"""
2021-03-09 20:57:38 +00:00
2021-03-12 01:38:21 +00:00
ordering = ("-created_date",)
2021-03-09 01:16:59 +00:00
2021-03-09 20:57:38 +00:00
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 ReportAction(BookWyrmModel):
2021-04-26 16:15:42 +00:00
"""updates on a report"""
2021-03-09 01:16:59 +00:00
user = models.ForeignKey("User", on_delete=models.PROTECT)
action_type = models.CharField(
max_length=20, blank=False, default="comment", choices=ReportActionTypes
)
2021-03-09 01:16:59 +00:00
note = models.TextField()
report = models.ForeignKey(Report, on_delete=models.PROTECT)
2021-03-12 23:56:54 +00:00
class Meta:
2021-04-26 16:15:42 +00:00
"""sort comments"""
2021-03-12 23:56:54 +00:00
2023-06-21 22:01:35 +00:00
ordering = ("created_date",)