diff --git a/pedagogy/forms.py b/pedagogy/forms.py index eed140b7..ed883189 100644 --- a/pedagogy/forms.py +++ b/pedagogy/forms.py @@ -27,7 +27,7 @@ from django import forms from core.views.forms import MarkdownInput from core.models import User -from pedagogy.models import UV, UVComment +from pedagogy.models import UV, UVComment, UVCommentReport class UVForm(forms.ModelForm): @@ -100,3 +100,25 @@ class UVCommentForm(forms.ModelForm): self.fields["author"].initial = author_id self.fields["uv"].queryset = UV.objects.filter(id=uv_id).all() self.fields["uv"].initial = uv_id + + +class UVCommentReportForm(forms.ModelForm): + """ + Form handeling creation and edit of an UVReport + """ + + class Meta: + model = UVCommentReport + fields = ("comment", "reporter", "reason") + widgets = { + "comment": forms.HiddenInput, + "reporter": forms.HiddenInput, + "reason": MarkdownInput, + } + + def __init__(self, reporter_id, comment_id, *args, **kwargs): + super(UVCommentReportForm, self).__init__(*args, **kwargs) + self.fields["reporter"].queryset = User.objects.filter(id=reporter_id).all() + self.fields["reporter"].initial = reporter_id + self.fields["comment"].queryset = UVComment.objects.filter(id=comment_id).all() + self.fields["comment"].initial = comment_id diff --git a/pedagogy/migrations/0001_initial.py b/pedagogy/migrations/0001_initial.py index 9b4133f8..83658e8c 100644 --- a/pedagogy/migrations/0001_initial.py +++ b/pedagogy/migrations/0001_initial.py @@ -1,5 +1,5 @@ # -*- coding: utf-8 -*- -# Generated by Django 1.11.20 on 2019-06-18 20:07 +# Generated by Django 1.11.20 on 2019-06-19 23:05 from __future__ import unicode_literals from django.conf import settings @@ -190,7 +190,7 @@ class Migration(migrations.Migration): verbose_name="ID", ), ), - ("comment", models.TextField(verbose_name="comment")), + ("comment", models.TextField(blank=True, verbose_name="comment")), ( "grade_global", models.IntegerField( @@ -281,7 +281,26 @@ class Migration(migrations.Migration): serialize=False, verbose_name="ID", ), - ) + ), + ("reason", models.TextField(verbose_name="reason")), + ( + "comment", + models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, + related_name="reports", + to="pedagogy.UVComment", + verbose_name="report", + ), + ), + ( + "reporter", + models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, + related_name="reported_uv_comment", + to=settings.AUTH_USER_MODEL, + verbose_name="reporter", + ), + ), ], ), migrations.CreateModel( diff --git a/pedagogy/models.py b/pedagogy/models.py index 30b3076b..4c097c8e 100644 --- a/pedagogy/models.py +++ b/pedagogy/models.py @@ -176,7 +176,7 @@ class UVComment(models.Model): blank=False, ) uv = models.ForeignKey(UV, related_name="comments", verbose_name=_("uv")) - comment = models.TextField(_("comment")) + comment = models.TextField(_("comment"), blank=True) grade_global = models.IntegerField( _("global grade"), validators=[validators.MinValueValidator(-1), validators.MaxValueValidator(4)], @@ -251,4 +251,19 @@ class UVCommentReport(models.Model): Report an inapropriate comment """ - pass + def is_owned_by(self, user): + """ + Is owned by a pedagogy admin, a superuser or the author himself + """ + return self.reporter == user or user.is_owner(self.comment.uv) + + comment = models.ForeignKey( + UVComment, + related_name="reports", + verbose_name=_("report"), + on_delete=models.CASCADE, + ) + reporter = models.ForeignKey( + User, related_name="reported_uv_comment", verbose_name=_("reporter") + ) + reason = models.TextField(_("reason")) diff --git a/pedagogy/templates/pedagogy/uv_detail.jinja b/pedagogy/templates/pedagogy/uv_detail.jinja index e18f1b1d..b7c2a41f 100644 --- a/pedagogy/templates/pedagogy/uv_detail.jinja +++ b/pedagogy/templates/pedagogy/uv_detail.jinja @@ -28,6 +28,7 @@ {% if user.is_owner(comment) %}

{% trans %}Edit{% endtrans %}

{% trans %}Delete{% endtrans %}

+

{% trans %}Report{% endtrans %}

{% endif %} {% endfor %} {% endif %} diff --git a/pedagogy/urls.py b/pedagogy/urls.py index 7d90c735..5527bf3b 100644 --- a/pedagogy/urls.py +++ b/pedagogy/urls.py @@ -46,7 +46,6 @@ urlpatterns = [ name="comment_report", ), # Moderation - url(r"^reported$", UVCommentReportListView.as_view(), name="comment_report_list"), url(r"^moderation$", UVModerationFormView.as_view(), name="moderation"), # Administration : Create Update Delete Edit url(r"^uv/create$", UVCreateView.as_view(), name="uv_create"), diff --git a/pedagogy/views.py b/pedagogy/views.py index bdc2fa2f..6551ee40 100644 --- a/pedagogy/views.py +++ b/pedagogy/views.py @@ -35,6 +35,7 @@ from django.core import serializers from django.utils import html from django.http import HttpResponse from django.core.urlresolvers import reverse_lazy +from django.shortcuts import get_object_or_404 from core.views import ( DetailFormView, @@ -46,8 +47,8 @@ from core.views import ( from haystack.query import SearchQuerySet -from pedagogy.forms import UVForm, UVCommentForm -from pedagogy.models import UV, UVComment +from pedagogy.forms import UVForm, UVCommentForm, UVCommentReportForm +from pedagogy.models import UV, UVComment, UVCommentReport # Some mixins @@ -200,25 +201,34 @@ class UVListView(CanViewMixin, CanCreateUVFunctionMixin, ListView): return queryset.filter(id__in=([o.object.id for o in qs])) -class UVCommentReportCreateView(CreateView): +class UVCommentReportCreateView(CanCreateMixin, CreateView): """ Create a new report for an inapropriate comment """ - pass + model = UVCommentReport + form_class = UVCommentReportForm + template_name = "core/edit.jinja" + + def dispatch(self, request, *args, **kwargs): + self.uv_comment = get_object_or_404(UVComment, pk=kwargs["comment_id"]) + return super(UVCommentReportCreateView, self).dispatch(request, *args, **kwargs) + + def get_form_kwargs(self): + kwargs = super(UVCommentReportCreateView, self).get_form_kwargs() + kwargs["reporter_id"] = self.request.user.id + kwargs["comment_id"] = self.uv_comment.id + return kwargs + + def get_success_url(self): + return reverse_lazy( + "pedagogy:uv_detail", kwargs={"uv_id": self.uv_comment.uv.id} + ) -class UVCommentReportListView(ListView): +class UVModerationFormView(CanEditPropMixin, FormView): """ - List all UV reports for moderation (Privileged) - """ - - pass - - -class UVModerationFormView(FormView): - """ - List all UVs to moderate and allow to moderate them (Privileged) + Moderation interface (Privileged) """ pass