diff --git a/pedagogy/models.py b/pedagogy/models.py index 8e40e03d..62eb8bf8 100644 --- a/pedagogy/models.py +++ b/pedagogy/models.py @@ -28,6 +28,9 @@ from django.utils import timezone from django.core import validators from django.conf import settings from django.utils.functional import cached_property +from django.core.urlresolvers import reverse + +from rest_framework import serializers from core.models import User @@ -58,6 +61,9 @@ class UV(models.Model): return int(sum(comments.values_list(field, flat=True)) / comments.count()) + def get_absolute_url(self): + return reverse("pedagogy:uv_detail", kwargs={"uv_id": self.id}) + @cached_property def grade_global_average(self): return self.__grade_average_generic("grade_global") @@ -302,3 +308,30 @@ class UVCommentReport(models.Model): User, related_name="reported_uv_comment", verbose_name=_("reporter") ) reason = models.TextField(_("reason")) + + +# Custom serializers + + +class UVSerializer(serializers.ModelSerializer): + """ + Custom seralizer for UVs + Allow adding more informations like absolute_url + """ + + class Meta: + model = UV + fields = "__all__" + + absolute_url = serializers.SerializerMethodField() + update_url = serializers.SerializerMethodField() + delete_url = serializers.SerializerMethodField() + + def get_absolute_url(self, obj): + return obj.get_absolute_url() + + def get_update_url(self, obj): + return reverse("pedagogy:uv_update", kwargs={"uv_id": obj.id}) + + def get_delete_url(self, obj): + return reverse("pedagogy:uv_delete", kwargs={"uv_id": obj.id}) diff --git a/pedagogy/templates/pedagogy/guide.jinja b/pedagogy/templates/pedagogy/guide.jinja index 28d90334..7cc24d30 100644 --- a/pedagogy/templates/pedagogy/guide.jinja +++ b/pedagogy/templates/pedagogy/guide.jinja @@ -31,6 +31,7 @@ P

+ {% if can_create_uv(user) %}

@@ -38,7 +39,7 @@


{% endif %} - +
@@ -51,7 +52,7 @@ {% endif %} - + {% for uv in object_list %} @@ -68,21 +69,38 @@
{% trans %}UV{% endtrans %}
{{ uv.code }}
{% endblock content %} \ No newline at end of file diff --git a/pedagogy/tests.py b/pedagogy/tests.py index 7811e5c2..f32a7ef9 100644 --- a/pedagogy/tests.py +++ b/pedagogy/tests.py @@ -673,28 +673,28 @@ class UVSearchTest(TestCase): response.content, [ { - "model": "pedagogy.uv", - "pk": 1, - "fields": { - "code": "PA00", - "author": 0, - "credit_type": "OM", - "semester": "AUTUMN_AND_SPRING", - "language": "FR", - "credits": 5, - "department": "HUMA", - "title": "Participation dans une association \u00e9tudiante", - "manager": "Laurent HEYBERGER", - "objectives": "* Permettre aux \u00e9tudiants de r\u00e9aliser, pendant un semestre, un projet culturel ou associatif et de le valoriser.", - "program": "* Semestre pr\u00e9c\u00e9dent proposition d'un projet et d'un cahier des charges\n* Evaluation par un jury de six membres\n* Si accord r\u00e9alisation dans le cadre de l'UV\n* Compte-rendu de l'exp\u00e9rience\n* Pr\u00e9sentation", - "skills": "* G\u00e9rer un projet associatif ou une action \u00e9ducative en autonomie:\n* en produisant un cahier des charges qui -d\u00e9finit clairement le contexte du projet personnel -pose les jalons de ce projet -estime de mani\u00e8re r\u00e9aliste les moyens et objectifs du projet -d\u00e9finit exactement les livrables attendus\n * en \u00e9tant capable de respecter ce cahier des charges ou, le cas \u00e9ch\u00e9ant, de r\u00e9viser le cahier des charges de mani\u00e8re argument\u00e9e.\n* Relater son exp\u00e9rience dans un rapport:\n* qui permettra \u00e0 d'autres \u00e9tudiants de poursuivre les actions engag\u00e9es\n* qui montre la capacit\u00e9 \u00e0 s'auto-\u00e9valuer et \u00e0 adopter une distance critique sur son action.", - "key_concepts": "* Autonomie\n* Responsabilit\u00e9\n* Cahier des charges\n* Gestion de projet", - "hours_CM": 0, - "hours_TD": 0, - "hours_TP": 0, - "hours_THE": 121, - "hours_TE": 4, - }, + "id": 1, + "absolute_url": "/pedagogy/uv/1", + "update_url": "/pedagogy/uv/1/edit", + "delete_url": "/pedagogy/uv/1/delete", + "code": "PA00", + "author": 0, + "credit_type": "OM", + "semester": "AUTUMN_AND_SPRING", + "language": "FR", + "credits": 5, + "department": "HUMA", + "title": "Participation dans une association \u00e9tudiante", + "manager": "Laurent HEYBERGER", + "objectives": "* Permettre aux \u00e9tudiants de r\u00e9aliser, pendant un semestre, un projet culturel ou associatif et de le valoriser.", + "program": "* Semestre pr\u00e9c\u00e9dent proposition d'un projet et d'un cahier des charges\n* Evaluation par un jury de six membres\n* Si accord r\u00e9alisation dans le cadre de l'UV\n* Compte-rendu de l'exp\u00e9rience\n* Pr\u00e9sentation", + "skills": "* G\u00e9rer un projet associatif ou une action \u00e9ducative en autonomie:\n* en produisant un cahier des charges qui -d\u00e9finit clairement le contexte du projet personnel -pose les jalons de ce projet -estime de mani\u00e8re r\u00e9aliste les moyens et objectifs du projet -d\u00e9finit exactement les livrables attendus\n * en \u00e9tant capable de respecter ce cahier des charges ou, le cas \u00e9ch\u00e9ant, de r\u00e9viser le cahier des charges de mani\u00e8re argument\u00e9e.\n* Relater son exp\u00e9rience dans un rapport:\n* qui permettra \u00e0 d'autres \u00e9tudiants de poursuivre les actions engag\u00e9es\n* qui montre la capacit\u00e9 \u00e0 s'auto-\u00e9valuer et \u00e0 adopter une distance critique sur son action.", + "key_concepts": "* Autonomie\n* Responsabilit\u00e9\n* Cahier des charges\n* Gestion de projet", + "hours_CM": 0, + "hours_TD": 0, + "hours_TP": 0, + "hours_THE": 121, + "hours_TE": 4, } ], ) diff --git a/pedagogy/views.py b/pedagogy/views.py index 112cda87..55e3fdb1 100644 --- a/pedagogy/views.py +++ b/pedagogy/views.py @@ -25,13 +25,11 @@ from django.views.generic import ( CreateView, DeleteView, - DetailView, UpdateView, ListView, FormView, View, ) -from django.core import serializers from django.utils import html from django.http import HttpResponse from django.core.exceptions import PermissionDenied, ObjectDoesNotExist @@ -39,6 +37,9 @@ from django.core.urlresolvers import reverse_lazy, reverse from django.shortcuts import get_object_or_404 from django.conf import settings +from haystack.query import SearchQuerySet +from rest_framework.renderers import JSONRenderer + from core.views import ( DetailFormView, CanCreateMixin, @@ -48,15 +49,13 @@ from core.views import ( ) from core.models import RealGroup, Notification -from haystack.query import SearchQuerySet - from pedagogy.forms import ( UVForm, UVCommentForm, UVCommentReportForm, UVCommentModerationForm, ) -from pedagogy.models import UV, UVComment, UVCommentReport +from pedagogy.models import UV, UVComment, UVCommentReport, UVSerializer # Some mixins @@ -166,7 +165,7 @@ class UVListView(CanViewMixin, CanCreateUVFunctionMixin, ListView): # Return serialized response return HttpResponse( - serializers.serialize("json", self.get_queryset()), + JSONRenderer().render(UVSerializer(self.get_queryset(), many=True).data), content_type="application/json", )