diff --git a/pedagogy/forms.py b/pedagogy/forms.py index 6510f8b6..ba7c8ead 100644 --- a/pedagogy/forms.py +++ b/pedagogy/forms.py @@ -77,4 +77,25 @@ class UVCommentForm(forms.ModelForm): class Meta: model = UVComment - fields = () + fields = ( + "author", + "uv", + "grade_global", + "grade_utility", + "grade_interest", + "grade_teaching", + "grade_work_load", + "comment", + ) + widgets = { + "comment": MarkdownInput, + "author": forms.HiddenInput, + "uv": forms.HiddenInput, + } + + def __init__(self, author_id, uv_id, *args, **kwargs): + super(UVCommentForm, self).__init__(*args, **kwargs) + self.fields["author"].queryset = User.objects.filter(id=author_id).all() + self.fields["author"].initial = author_id + self.fields["uv"].queryset = UV.objects.filter(id=uv_id).all() + self.fields["uv"].initial = uv_id diff --git a/pedagogy/migrations/0001_initial.py b/pedagogy/migrations/0001_initial.py index c18ff190..b8e8e81f 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-16 13:36 +# Generated by Django 1.11.20 on 2019-06-16 14:22 from __future__ import unicode_literals from django.conf import settings @@ -264,6 +264,15 @@ class Migration(migrations.Migration): verbose_name="author", ), ), + ( + "uv", + models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, + related_name="comments", + to="pedagogy.UV", + verbose_name="uv", + ), + ), ], ), migrations.CreateModel( diff --git a/pedagogy/models.py b/pedagogy/models.py index 98ecef3a..a6042770 100644 --- a/pedagogy/models.py +++ b/pedagogy/models.py @@ -152,6 +152,12 @@ class UVComment(models.Model): A comment about an UV """ + def is_owned_by(self, user): + """ + Is owned by a pedagogy admin, a superuser or the author himself + """ + return self.author == user or user.is_owner(self.uv) + author = models.ForeignKey( User, related_name="uv_comments", @@ -159,6 +165,7 @@ class UVComment(models.Model): null=False, blank=False, ) + uv = models.ForeignKey(UV, related_name="comments", verbose_name=_("uv")) comment = models.TextField(_("comment")) grade_global = models.IntegerField( _("global grade"), diff --git a/pedagogy/templates/pedagogy/guide.jinja b/pedagogy/templates/pedagogy/guide.jinja index fd6753ca..7cae4d8d 100644 --- a/pedagogy/templates/pedagogy/guide.jinja +++ b/pedagogy/templates/pedagogy/guide.jinja @@ -13,7 +13,7 @@ {% endif %} {% for uv in object_list %}

- {{ uv.code }} + {{ uv.code }} {% if user.is_owner(uv) -%} {% trans %}Edit{% endtrans %} {% trans %}Delete{% endtrans %} diff --git a/pedagogy/templates/pedagogy/uv_detail.jinja b/pedagogy/templates/pedagogy/uv_detail.jinja index 2385c473..71809080 100644 --- a/pedagogy/templates/pedagogy/uv_detail.jinja +++ b/pedagogy/templates/pedagogy/uv_detail.jinja @@ -10,4 +10,27 @@

{{ object.program|markdown }}

{{ object.skills|markdown }}

{{ object.key_concepts|markdown }}

+ + {% if object.comments.exists() %} +

{% trans %}Comments{% endtrans %}

+ {% for comment in object.comments.all() %} +

{{ comment.grade_global }}

+

{{ comment.grade_utility }}

+

{{ comment.grade_interest }}

+

{{ comment.grade_teaching }}

+

{{ comment.grade_work_load }}

+

{{ comment.comment }}

+ {% if user.is_owner(comment) %} +

{% trans %}Edit{% endtrans %}

+

{% trans %}Delete{% endtrans %}

+ {% endif %} + {% endfor %} + {% endif %} + +

{% trans %}Leave comment{% endtrans %}

+
+ {% csrf_token %} + {{ form.as_p() }} +

+
{% endblock %} \ No newline at end of file diff --git a/pedagogy/urls.py b/pedagogy/urls.py index c5d7b8b9..73bd91a5 100644 --- a/pedagogy/urls.py +++ b/pedagogy/urls.py @@ -31,9 +31,14 @@ urlpatterns = [ url(r"^$", UVListView.as_view(), name="guide"), url(r"^uv/(?P[0-9]+)$", UVDetailFormView.as_view(), name="uv_detail"), url( - r"^comment/(?P[0-9]+)$", - UVCommentDetailView.as_view(), - name="comment_detail", + r"^comment/(?P[0-9]+)/edit$", + UVCommentUpdateView.as_view(), + name="comment_edit", + ), + url( + r"^comment/(?P[0-9]+)/delete$", + UVCommentDeleteView.as_view(), + name="comment_delete", ), url( r"^comment/(?P[0-9]+)/report$", diff --git a/pedagogy/views.py b/pedagogy/views.py index ca01bc29..f545e4e0 100644 --- a/pedagogy/views.py +++ b/pedagogy/views.py @@ -42,7 +42,7 @@ from core.views import ( ) from pedagogy.forms import UVForm, UVCommentForm -from pedagogy.models import UV +from pedagogy.models import UV, UVComment # Some mixins @@ -82,13 +82,54 @@ class UVDetailFormView(CanViewMixin, CanCreateUVFunctionMixin, DetailFormView): template_name = "pedagogy/uv_detail.jinja" form_class = UVCommentForm + def get_form_kwargs(self): + kwargs = super(UVDetailFormView, self).get_form_kwargs() + kwargs["author_id"] = self.request.user.id + kwargs["uv_id"] = self.get_object().id + return kwargs -class UVCommentDetailView(DetailView): + def form_valid(self, form): + form.save() + return super(UVDetailFormView, self).form_valid(form) + + def get_success_url(self): + return reverse_lazy( + "pedagogy:uv_detail", kwargs={"uv_id": self.get_object().id} + ) + + +class UVCommentUpdateView(CanEditPropMixin, UpdateView): """ - Display a specified UVComment (for easy sharing of the comment) + Allow edit of a given comment """ - pass + model = UVComment + form_class = UVCommentForm + pk_url_kwarg = "comment_id" + template_name = "core/edit.jinja" + + def get_form_kwargs(self): + kwargs = super(UVCommentUpdateView, self).get_form_kwargs() + kwargs["author_id"] = self.request.user.id + kwargs["uv_id"] = self.get_object().uv.id + + return kwargs + + def get_success_url(self): + return reverse_lazy("pedagogy:uv_detail", kwargs={"uv_id": self.object.uv.id}) + + +class UVCommentDeleteView(CanEditPropMixin, DeleteView): + """ + Allow delete of a given comment + """ + + model = UVComment + pk_url_kwarg = "comment_id" + template_name = "core/delete_confirm.jinja" + + def get_success_url(self): + return reverse_lazy("pedagogy:uv_detail", kwargs={"uv_id": self.object.uv.id}) class UVListView(CanViewMixin, CanCreateUVFunctionMixin, ListView):