pedagogy: send notification to pedagogy admins at comment report

This commit is contained in:
Antoine Bartuccio 2019-07-04 15:32:00 +02:00
parent 75a2aefd69
commit 6e7d351e8e
Signed by: klmp200
GPG Key ID: E7245548C53F904B
5 changed files with 107 additions and 4 deletions

View File

@ -0,0 +1,40 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.11.20 on 2019-07-04 13:00
from __future__ import unicode_literals
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [("core", "0029_auto_20180426_2013")]
operations = [
migrations.AlterField(
model_name="notification",
name="type",
field=models.CharField(
choices=[
("POSTER_MODERATION", "A new poster needs to be moderated"),
("MAILING_MODERATION", "A new mailing list needs to be moderated"),
(
"PEDAGOGY_MODERATION",
"A new pedagogy comment has been signaled for moderation",
),
("NEWS_MODERATION", "There are %s fresh news to be moderated"),
("FILE_MODERATION", "New files to be moderated"),
(
"SAS_MODERATION",
"There are %s pictures to be moderated in the SAS",
),
("NEW_PICTURES", "You've been identified on some pictures"),
("REFILLING", "You just refilled of %s"),
("SELLING", "You just bought %s"),
("GENERIC", "You have a notification"),
],
default="GENERIC",
max_length=32,
verbose_name="type",
),
)
]

View File

@ -23,7 +23,7 @@
{% for widget in form.accepted_reports.subwidgets %} {% for widget in form.accepted_reports.subwidgets %}
{% set report = queryset.get(id=widget.data.value) %} {% set report = queryset.get(id=widget.data.value) %}
<tr> <tr>
<td>{{ report.comment.uv }}</td> <td><a href="{{ url('pedagogy:uv_detail', uv_id=report.comment.uv.id) }}">{{ report.comment.uv }}</a></td>
<td>{{ report.comment.comment|markdown }}</td> <td>{{ report.comment.comment|markdown }}</td>
<td>{{ report.reason|markdown }}</td> <td>{{ report.reason|markdown }}</td>
<td>{{ widget.tag() }}</td> <td>{{ widget.tag() }}</td>
@ -50,7 +50,7 @@
{% for widget in form.denied_reports.subwidgets %} {% for widget in form.denied_reports.subwidgets %}
{% set report = queryset.get(id=widget.data.value) %} {% set report = queryset.get(id=widget.data.value) %}
<tr> <tr>
<td>{{ report.comment.uv }}</td> <td><a href="{{ url('pedagogy:uv_detail', uv_id=report.comment.uv.id) }}">{{ report.comment.uv }}</a></td>
<td>{{ report.comment.comment|markdown }}</td> <td>{{ report.comment.comment|markdown }}</td>
<td>{{ report.reason|markdown }}</td> <td>{{ report.reason|markdown }}</td>
<td>{{ widget.tag() }}</td> <td>{{ widget.tag() }}</td>

View File

@ -22,11 +22,12 @@
# #
# #
from django.conf import settings
from django.test import TestCase from django.test import TestCase
from django.core.urlresolvers import reverse from django.core.urlresolvers import reverse
from django.core.management import call_command from django.core.management import call_command
from core.models import User from core.models import User, Notification
from pedagogy.models import UV, UVComment, UVCommentReport from pedagogy.models import UV, UVComment, UVCommentReport
@ -968,6 +969,7 @@ class UVCommentReportCreateTest(TestCase):
call_command("populate") call_command("populate")
self.krophil = User.objects.get(username="krophil") self.krophil = User.objects.get(username="krophil")
self.tutu = User.objects.get(username="tutu")
# Prepare a comment # Prepare a comment
comment_kwargs = create_uv_comment_template(self.krophil.id) comment_kwargs = create_uv_comment_template(self.krophil.id)
@ -1011,3 +1013,38 @@ class UVCommentReportCreateTest(TestCase):
) )
self.assertEquals(response.status_code, 403) self.assertEquals(response.status_code, 403)
self.assertFalse(UVCommentReport.objects.all().exists()) self.assertFalse(UVCommentReport.objects.all().exists())
def test_notifications(self):
self.assertFalse(
self.tutu.notifications.filter(type="PEDAGOGY_MODERATION").exists()
)
# Create a comment report
self.create_report_test("tutu", True)
# Check that a notification has been created for pedagogy admins
self.assertTrue(
self.tutu.notifications.filter(type="PEDAGOGY_MODERATION").exists()
)
# Check that only pedagogy admins recieves this notification
for notif in Notification.objects.filter(type="PEDAGOGY_MODERATION").all():
self.assertTrue(
notif.user.is_in_group(settings.SITH_GROUP_PEDAGOGY_ADMIN_ID)
)
# Check that notifications are not duplicated if not viewed
self.create_report_test("tutu", True)
self.assertEquals(
self.tutu.notifications.filter(type="PEDAGOGY_MODERATION").count(), 1
)
# Check that a new notification is created when the old one has been viewed
notif = self.tutu.notifications.filter(type="PEDAGOGY_MODERATION").first()
notif.viewed = True
notif.save()
self.create_report_test("tutu", True)
self.assertEquals(
self.tutu.notifications.filter(type="PEDAGOGY_MODERATION").count(), 2
)

View File

@ -35,8 +35,9 @@ from django.core import serializers
from django.utils import html from django.utils import html
from django.http import HttpResponse from django.http import HttpResponse
from django.core.exceptions import PermissionDenied, ObjectDoesNotExist from django.core.exceptions import PermissionDenied, ObjectDoesNotExist
from django.core.urlresolvers import reverse_lazy from django.core.urlresolvers import reverse_lazy, reverse
from django.shortcuts import get_object_or_404 from django.shortcuts import get_object_or_404
from django.conf import settings
from core.views import ( from core.views import (
DetailFormView, DetailFormView,
@ -45,6 +46,7 @@ from core.views import (
CanViewMixin, CanViewMixin,
CanEditPropMixin, CanEditPropMixin,
) )
from core.models import RealGroup, Notification
from haystack.query import SearchQuerySet from haystack.query import SearchQuerySet
@ -226,6 +228,26 @@ class UVCommentReportCreateView(CanCreateMixin, CreateView):
kwargs["comment_id"] = self.uv_comment.id kwargs["comment_id"] = self.uv_comment.id
return kwargs return kwargs
def form_valid(self, form):
resp = super(UVCommentReportCreateView, self).form_valid(form)
# Send a message to moderation admins
for user in (
RealGroup.objects.filter(id=settings.SITH_GROUP_PEDAGOGY_ADMIN_ID)
.first()
.users.all()
):
if not user.notifications.filter(
type="PEDAGOGY_MODERATION", viewed=False
).exists():
Notification(
user=user,
url=reverse("pedagogy:moderation"),
type="PEDAGOGY_MODERATION",
).save()
return resp
def get_success_url(self): def get_success_url(self):
return reverse_lazy( return reverse_lazy(
"pedagogy:uv_detail", kwargs={"uv_id": self.uv_comment.uv.id} "pedagogy:uv_detail", kwargs={"uv_id": self.uv_comment.uv.id}

View File

@ -560,6 +560,10 @@ SITH_LAUNDERETTE_PRICES = {"WASHING": 1.0, "DRYING": 0.75}
SITH_NOTIFICATIONS = [ SITH_NOTIFICATIONS = [
("POSTER_MODERATION", _("A new poster needs to be moderated")), ("POSTER_MODERATION", _("A new poster needs to be moderated")),
("MAILING_MODERATION", _("A new mailing list needs to be moderated")), ("MAILING_MODERATION", _("A new mailing list needs to be moderated")),
(
"PEDAGOGY_MODERATION",
_("A new pedagogy comment has been signaled for moderation"),
),
("NEWS_MODERATION", _("There are %s fresh news to be moderated")), ("NEWS_MODERATION", _("There are %s fresh news to be moderated")),
("FILE_MODERATION", _("New files to be moderated")), ("FILE_MODERATION", _("New files to be moderated")),
("SAS_MODERATION", _("There are %s pictures to be moderated in the SAS")), ("SAS_MODERATION", _("There are %s pictures to be moderated in the SAS")),