bookwyrm/bookwyrm/models/report.py

113 lines
3.4 KiB
Python
Raw Normal View History

2021-03-09 01:16:59 +00:00
""" flagged for moderation """
from django.core.exceptions import PermissionDenied
2021-03-09 01:16:59 +00:00
from django.db import models
from django.utils.translation import gettext_lazy as _
from bookwyrm.settings import BASE_URL
2021-03-09 01:16:59 +00:00
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"
2021-03-09 01:16:59 +00:00
class Report(BookWyrmModel):
2021-04-26 16:15:42 +00:00
"""reported status or user"""
2021-03-09 01:16:59 +00:00
reporter = models.ForeignKey(
"User", related_name="reporter", on_delete=models.PROTECT
)
note = models.TextField(null=True, blank=True)
2022-07-06 00:19:03 +00:00
user = models.ForeignKey("User", on_delete=models.PROTECT, null=True, blank=True)
2022-02-24 20:48:52 +00:00
status = models.ForeignKey(
"Status",
null=True,
blank=True,
on_delete=models.PROTECT,
)
2022-01-10 22:55:10 +00:00
links = models.ManyToManyField("Link", blank=True)
2021-03-09 01:16:59 +00:00
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()
2022-01-30 16:50:53 +00:00
def get_remote_id(self):
return f"{BASE_URL}/settings/reports/{self.id}"
2022-01-30 16:50:53 +00:00
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",)