Newer
Older
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
import logging
from django.core import mail
from django.dispatch import receiver
from django.conf import settings
from funkwhale_api.common import channels
from funkwhale_api.common import utils
from funkwhale_api.taskapp import celery
from funkwhale_api.federation import utils as federation_utils
from funkwhale_api.users import models as users_models
from . import models
from . import signals
logger = logging.getLogger(__name__)
@receiver(signals.report_created)
def broadcast_report_created(report, **kwargs):
from . import serializers
channels.group_send(
"admin.moderation",
{
"type": "event.send",
"text": "",
"data": {
"type": "report.created",
"report": serializers.ReportSerializer(report).data,
"unresolved_count": models.Report.objects.filter(
is_handled=False
).count(),
},
},
)
@receiver(signals.report_created)
def trigger_moderator_email(report, **kwargs):
if settings.MODERATION_EMAIL_NOTIFICATIONS_ENABLED:
utils.on_commit(send_new_report_email_to_moderators.delay, report_id=report.pk)
@celery.app.task(name="moderation.send_new_report_email_to_moderators")
@celery.require_instance(
models.Report.objects.select_related("submitter").filter(is_handled=False), "report"
)
def send_new_report_email_to_moderators(report):
moderators = users_models.User.objects.filter(
is_active=True, permission_moderation=True
)
if not moderators:
# we fallback on superusers
moderators = users_models.User.objects.filter(is_superuser=True)
moderators = sorted(moderators, key=lambda m: m.pk)
subject = "[{} moderation - {}] New report from {}".format(
settings.FUNKWHALE_HOSTNAME,
report.get_type_display(),
report.submitter.full_username if report.submitter else report.submitter_email,
)
detail_url = federation_utils.full_url(
"/manage/moderation/reports/{}".format(report.uuid)
)
unresolved_reports_url = federation_utils.full_url(
"/manage/moderation/reports?q=resolved:no"
)
unresolved_reports = models.Report.objects.filter(is_handled=False).count()
body = [
'{} just submitted a report in the "{}" category.'.format(
report.submitter.full_username
if report.submitter
else report.submitter_email,
report.get_type_display(),
),
"",
"Reported object: {} - {}".format(
report.target._meta.verbose_name.title(), str(report.target)
),
]
if hasattr(report.target, "get_absolute_url"):
body.append(
"Open public page: {}".format(
federation_utils.full_url(report.target.get_absolute_url())
)
)
if hasattr(report.target, "get_moderation_url"):
body.append(
"Open moderation page: {}".format(
federation_utils.full_url(report.target.get_moderation_url())
)
)
if report.summary:
body += ["", "Report content:", "", report.summary]
body += [
"",
"- To handle this report, please visit {}".format(detail_url),
"- To view all unresolved reports (currently {}), please visit {}".format(
unresolved_reports, unresolved_reports_url
),
"",
"—",
"",
"You are receiving this email because you are a moderator for {}.".format(
settings.FUNKWHALE_HOSTNAME
),
]
for moderator in moderators:
if not moderator.email:
logger.warning("Moderator %s has no email configured", moderator.username)
continue
mail.send_mail(
subject,
message="\n".join(body),
recipient_list=[moderator.email],
from_email=settings.DEFAULT_FROM_EMAIL,
)