pedagogy: functional but basic uv comment system

This commit is contained in:
Antoine Bartuccio 2019-06-16 17:02:45 +02:00
parent b7c2da53fe
commit 5003e57338
Signed by: klmp200
GPG Key ID: E7245548C53F904B
7 changed files with 116 additions and 10 deletions

View File

@ -77,4 +77,25 @@ class UVCommentForm(forms.ModelForm):
class Meta: class Meta:
model = UVComment 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

View File

@ -1,5 +1,5 @@
# -*- coding: utf-8 -*- # -*- 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 __future__ import unicode_literals
from django.conf import settings from django.conf import settings
@ -264,6 +264,15 @@ class Migration(migrations.Migration):
verbose_name="author", verbose_name="author",
), ),
), ),
(
"uv",
models.ForeignKey(
on_delete=django.db.models.deletion.CASCADE,
related_name="comments",
to="pedagogy.UV",
verbose_name="uv",
),
),
], ],
), ),
migrations.CreateModel( migrations.CreateModel(

View File

@ -152,6 +152,12 @@ class UVComment(models.Model):
A comment about an UV 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( author = models.ForeignKey(
User, User,
related_name="uv_comments", related_name="uv_comments",
@ -159,6 +165,7 @@ class UVComment(models.Model):
null=False, null=False,
blank=False, blank=False,
) )
uv = models.ForeignKey(UV, related_name="comments", verbose_name=_("uv"))
comment = models.TextField(_("comment")) comment = models.TextField(_("comment"))
grade_global = models.IntegerField( grade_global = models.IntegerField(
_("global grade"), _("global grade"),

View File

@ -13,7 +13,7 @@
{% endif %} {% endif %}
{% for uv in object_list %} {% for uv in object_list %}
<p> <p>
{{ uv.code }} <a href="{{ url('pedagogy:uv_detail', uv_id=uv.id) }}">{{ uv.code }}</a>
{% if user.is_owner(uv) -%} {% if user.is_owner(uv) -%}
<a href="{{ url('pedagogy:uv_update', uv_id=uv.id) }}">{% trans %}Edit{% endtrans %}</a> <a href="{{ url('pedagogy:uv_update', uv_id=uv.id) }}">{% trans %}Edit{% endtrans %}</a>
<a href="{{ url('pedagogy:uv_delete', uv_id=uv.id) }}">{% trans %}Delete{% endtrans %}</a> <a href="{{ url('pedagogy:uv_delete', uv_id=uv.id) }}">{% trans %}Delete{% endtrans %}</a>

View File

@ -10,4 +10,27 @@
<p>{{ object.program|markdown }}</p> <p>{{ object.program|markdown }}</p>
<p>{{ object.skills|markdown }}</p> <p>{{ object.skills|markdown }}</p>
<p>{{ object.key_concepts|markdown }}</p> <p>{{ object.key_concepts|markdown }}</p>
{% if object.comments.exists() %}
<h2>{% trans %}Comments{% endtrans %}</h2>
{% for comment in object.comments.all() %}
<p>{{ comment.grade_global }}</p>
<p>{{ comment.grade_utility }}</p>
<p>{{ comment.grade_interest }}</p>
<p>{{ comment.grade_teaching }}</p>
<p>{{ comment.grade_work_load }}</p>
<p>{{ comment.comment }}</p>
{% if user.is_owner(comment) %}
<p><a href="{{ url('pedagogy:comment_edit', comment_id=comment.id) }}">{% trans %}Edit{% endtrans %}</a></p>
<p><a href="{{ url('pedagogy:comment_delete', comment_id=comment.id) }}">{% trans %}Delete{% endtrans %}</a></p>
{% endif %}
{% endfor %}
{% endif %}
<h2>{% trans %}Leave comment{% endtrans %}</h2>
<form action="{{ url('pedagogy:uv_detail', uv_id=object.id) }}" method="post" enctype="multipart/form-data">
{% csrf_token %}
{{ form.as_p() }}
<p><input type="submit" value="{% trans %}Comment{% endtrans %}" /></p>
</form>
{% endblock %} {% endblock %}

View File

@ -31,9 +31,14 @@ urlpatterns = [
url(r"^$", UVListView.as_view(), name="guide"), url(r"^$", UVListView.as_view(), name="guide"),
url(r"^uv/(?P<uv_id>[0-9]+)$", UVDetailFormView.as_view(), name="uv_detail"), url(r"^uv/(?P<uv_id>[0-9]+)$", UVDetailFormView.as_view(), name="uv_detail"),
url( url(
r"^comment/(?P<comment_id>[0-9]+)$", r"^comment/(?P<comment_id>[0-9]+)/edit$",
UVCommentDetailView.as_view(), UVCommentUpdateView.as_view(),
name="comment_detail", name="comment_edit",
),
url(
r"^comment/(?P<comment_id>[0-9]+)/delete$",
UVCommentDeleteView.as_view(),
name="comment_delete",
), ),
url( url(
r"^comment/(?P<comment_id>[0-9]+)/report$", r"^comment/(?P<comment_id>[0-9]+)/report$",

View File

@ -42,7 +42,7 @@ from core.views import (
) )
from pedagogy.forms import UVForm, UVCommentForm from pedagogy.forms import UVForm, UVCommentForm
from pedagogy.models import UV from pedagogy.models import UV, UVComment
# Some mixins # Some mixins
@ -82,13 +82,54 @@ class UVDetailFormView(CanViewMixin, CanCreateUVFunctionMixin, DetailFormView):
template_name = "pedagogy/uv_detail.jinja" template_name = "pedagogy/uv_detail.jinja"
form_class = UVCommentForm 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): class UVListView(CanViewMixin, CanCreateUVFunctionMixin, ListView):