]> git.parisson.com Git - teleforma.git/commitdiff
add filters to scripts list view
authorYoan Le Clanche <yoan@ellington.pilotsystems.net>
Wed, 7 Mar 2018 11:46:23 +0000 (12:46 +0100)
committerYoan Le Clanche <yoan@ellington.pilotsystems.net>
Wed, 7 Mar 2018 11:46:23 +0000 (12:46 +0100)
teleforma/exam/models.py
teleforma/exam/templates/exam/scripts.html
teleforma/exam/views.py

index c88503ab7cd1bb3c3093d31b70b8080b75438e4e..16f4d009f3cca197e6024c98f228a5e002ef032c 100644 (file)
@@ -274,8 +274,11 @@ class Script(BaseResource):
         return unicode(self.title)
 
     def get_absolute_url(self):
+        period_id = None
+        if self.period:
+            period_id = self.period.id
         return reverse_lazy('teleforma-exam-script-detail',
-                            kwargs={'pk':self.id, 'period_id': self.period.id})
+                            kwargs={'pk':self.id, 'period_id': period_id})
 
     class Meta(MetaCore):
         verbose_name = _('Script')
index 3d6dc5d75acb25222d26225407cd7d6bfed8abb7..749f5c3d2ddb28184524b7420942a32914460680 100644 (file)
 {% endif %}
 <br />
 
+{% if profile > 0 %}
+<form method="GET">
+    <label for="corrector_select">{% trans "Corrector"%}</label>
+    <select name="corrector" id="corrector_select">
+       <option value="">---</option>
+       {% for corrector in correctors_list %}
+       <option value="{{corrector.0}}" {% if corrector.0 == corrector_selected %}selected="selected"{% endif %}>{{corrector.1}}</option>
+       {% endfor %}
+    </select>
+    <label for="course_select">{% trans "Course"%}</label>
+    <select name="course" id="course_select">
+       <option value="">---</option>
+       {% for course in courses_list %}
+       <option value="{{course.0}}" {% if course.0 == course_selected %}selected="selected"{% endif %}>{{course.1}}</option>
+       {% endfor %}
+    </select>
+    <label for="session_select">{% trans "Session"%}</label>
+    <select name="session" id="session_select">
+       <option value="">---</option>
+       {% for session in sessions_list %}
+       <option value="{{session.0}}" {% if session.0 == session_selected %}selected="selected"{% endif %}>{{session.1}}</option>
+       {% endfor %}
+    </select>
+    <label for="type_select">{% trans "Type"%}</label>
+    <select name="type" id="type_select">
+       <option value="">---</option>
+       {% for type in types_list %}
+       <option value="{{type.0}}" {% if type.0 == type_selected %}selected="selected"{% endif %}>{{type.1}}</option>
+       {% endfor %}
+    </select>
+    <input type="submit" value="Filtrer"/>
+</form>
+{% endif %}
+
  {% if object_list %}
   {% include "exam/inc/script_list.html" %}
  {% else %}
index 59142468075140a7f16fedd3fd0a400e9bcf3103..7640759b7f863aac028eb76c3915fae42fd76e39 100644 (file)
@@ -12,6 +12,10 @@ from django.utils.translation import ugettext_lazy as _
 
 import numpy as np
 
+STUDENT = 0
+CORRECTOR = 1
+PROFESSOR = 2
+
 
 class ScriptMixinView(View):
 
@@ -24,8 +28,37 @@ class ScriptMixinView(View):
             context['upload'] = datetime.datetime.now() <= self.period.date_exam_end
         else:
             context['upload'] = False
+
         return context
 
+class ScriptsListMixinView(ScriptMixinView):
+
+    def get_profile(self):
+        user = self.request.user
+        professor = user.professor.all()
+        if professor:
+            return PROFESSOR
+        if user.corrector_scripts:
+            return CORRECTOR
+        return STUDENT
+
+    def get_context_data(self, **kwargs):
+        context = super(ScriptsListMixinView, self).get_context_data(**kwargs)
+        context['profile'] = self.get_profile()
+
+        if context['profile'] >= CORRECTOR:
+            correctors = User.objects.filter(corrector_scripts__in=self.get_base_queryset()).order_by('last_name').distinct()
+            context['correctors_list'] = [(str(corrector.id), corrector.get_full_name()) for corrector in correctors]
+            context['corrector_selected'] = self.request.GET.get('corrector', str(self.request.user.id))
+            context['sessions_list'] = session_choices
+            context['session_selected'] = self.request.GET.get('session')
+            types = ScriptType.objects.all()
+            context['types_list'] = [(str(type.id), type.name) for type in types]
+            context['type_selected'] = self.request.GET.get('type')
+            courses = Course.objects.filter(scripts__in=self.get_base_queryset()).distinct()
+            context['courses_list'] = [(str(course.id), course.title) for course in courses]
+            context['course_selected'] = self.request.GET.get('course')
+        return context
 
 class ScriptView(ScriptMixinView, CourseAccessMixin, UpdateView):
 
@@ -73,11 +106,27 @@ class ScriptView(ScriptMixinView, CourseAccessMixin, UpdateView):
         return super(ScriptView, self).dispatch(*args, **kwargs)
 
 
-class ScriptsView(ScriptMixinView, ListView):
+class ScriptsView(ScriptsListMixinView, ListView):
 
     model = Script
     template_name='exam/scripts.html'
 
+    def get_form_queryset(self):
+        QT = ~Q(pk=None)
+        corrector = self.request.GET.get('corrector')
+        type = self.request.GET.get('type')
+        session = self.request.GET.get('session')
+        course = self.request.GET.get('course')
+        if type:
+            QT = Q(type__id=int(type)) & QT
+        if session:
+            QT = Q(session=session) & QT
+        if course:
+            QT = Q(course__id=int(course)) & QT
+        if corrector:
+            QT = Q(corrector__id=int(corrector)) & QT
+        return QT
+
     @method_decorator(login_required)
     def dispatch(self, *args, **kwargs):
         return super(ScriptsView, self).dispatch(*args, **kwargs)
@@ -85,20 +134,31 @@ class ScriptsView(ScriptMixinView, ListView):
 
 class ScriptsPendingView(ScriptsView):
 
+    def get_base_queryset(self):
+        period = Period.objects.get(id=self.kwargs['period_id'])
+        QT = Q(status__in=(2, 3), period=period)
+        return Script.objects.filter(QT)
+        
+
     def get_queryset(self):
         user = self.request.user
         period = Period.objects.get(id=self.kwargs['period_id'])
 
-        QT = Q(status=2, author=user, period=period)
-        QT = Q(status=3, author=user, period=period) | QT
-        QT = Q(status=3, corrector=user, period=period) | QT
+        if self.request.GET.get('corrector') is not None:
+            QT = Q(status__in=(2, 3), period=period)
+        else:
+            QT = Q(status=2, author=user, period=period)
+            QT = Q(status=3, author=user, period=period) | QT
+            QT = Q(status=3, corrector=user, period=period) | QT
 
-        professor = user.professor.all()
-        if professor:
-            professor = professor[0]
-            for course in professor.courses.all():
-                QT = Q(status=2, period=period, course=course) | QT
-                QT = Q(status=3, period=period, course=course) | QT
+            professor = user.professor.all()
+            if professor:
+                professor = professor[0]
+                for course in professor.courses.all():
+                    QT = Q(status=2, period=period, course=course) | QT
+                    QT = Q(status=3, period=period, course=course) | QT
+
+        QT = self.get_form_queryset() & QT
 
         return Script.objects.filter(QT)
 
@@ -110,22 +170,31 @@ class ScriptsPendingView(ScriptsView):
 
 class ScriptsTreatedView(ScriptsView):
 
+    def get_base_queryset(self):
+        period = Period.objects.get(id=self.kwargs['period_id'])
+        QT = Q(status__in=(4, 5), period=period)
+        return Script.objects.filter(QT)
+
     def get_queryset(self):
         user = self.request.user
         period = Period.objects.get(id=self.kwargs['period_id'])
 
-        QT = Q(status=4, author=user, period=period)
-        QT = Q(status=5, author=user, period=period) | QT
-        QT = Q(status=4, corrector=user, period=period) | QT
-        QT = Q(status=5, corrector=user, period=period) | QT
-
-        professor = user.professor.all()
-        if professor:
-            professor = professor[0]
-            for course in professor.courses.all():
-                QT = Q(status=4, period=period, course=course) | QT
-                QT = Q(status=5, period=period, course=course) | QT
-
+        if self.request.GET.get('corrector') is not None:
+            QT = Q(status__in=(4, 5), period=period)
+        else:
+            QT = Q(status=4, author=user, period=period)
+            QT = Q(status=5, author=user, period=period) | QT
+            QT = Q(status=4, corrector=user, period=period) | QT
+            QT = Q(status=5, corrector=user, period=period) | QT
+
+            professor = user.professor.all()
+            if professor:
+                professor = professor[0]
+                for course in professor.courses.all():
+                    QT = Q(status=4, period=period, course=course) | QT
+                    QT = Q(status=5, period=period, course=course) | QT
+
+        QT = self.get_form_queryset() & QT
         return Script.objects.filter(QT)
 
     def get_context_data(self, **kwargs):
@@ -136,18 +205,27 @@ class ScriptsTreatedView(ScriptsView):
 
 class ScriptsRejectedView(ScriptsView):
 
+    def get_base_queryset(self):
+        period = Period.objects.get(id=self.kwargs['period_id'])
+        QT = Q(status=0)
+        return Script.objects.filter(QT)
+
     def get_queryset(self):
         user = self.request.user
         period = Period.objects.get(id=self.kwargs['period_id'])
-        QT = Q(status=0, author=user)
-        QT = Q(status=0, corrector=user) | QT
+        if self.request.GET.get('corrector') is not None:
+            QT = Q(status=0)
+        else:
+            QT = Q(status=0, author=user)
+            QT = Q(status=0, corrector=user) | QT
 
-        professor = user.professor.all()
-        if professor:
-            professor = professor[0]
-            for course in professor.courses.all():
-                QT = Q(status=0, period=period, course=course) | QT
+            professor = user.professor.all()
+            if professor:
+                professor = professor[0]
+                for course in professor.courses.all():
+                    QT = Q(status=0, period=period, course=course) | QT
 
+        QT = self.get_form_queryset() & QT
         return Script.objects.filter(QT)
 
     def get_context_data(self, **kwargs):