diff options
| -rw-r--r-- | views.py | 21 | 
1 files changed, 21 insertions, 0 deletions
| @@ -15,7 +15,10 @@  import datetime +from django.contrib.postgres.aggregates import ArrayAgg +from django.db import connection  from django.db.models import Count, Max +from django.db.models.expressions import RawSQL  from django.db.models.functions import ExtractWeek, ExtractYear, Length  from django.http import Http404  from django.shortcuts import get_object_or_404, render @@ -117,6 +120,24 @@ def rooms(request):      start, _ = get_week(*get_current_week())      end = start + datetime.timedelta(weeks=4) +    if connection.vendor == "postgresql": +        # Si le SGBD est PostgreSQL, on utilise une requête à base de +        # ArrayAgg. Elle présente l’avantage d’être plus rapide que la +        # requête « généraliste » et de ne pas nécessiter de +        # traitement après.  On récupère chaque salle ayant un cours +        # dans le mois à venir. Pour chacun de ses cours, on ne +        # récupère que le premier jour de la semaine, et si jamais ce +        # jour n’est pas déjà dans la liste des semaines de cours +        # (« weeks »), on l’y rajoute. +        rooms = Room.objects.filter(course__begin__gte=start, +                                    course__begin__lt=end) \ +                            .order_by("name") \ +                            .annotate(weeks=ArrayAgg( +                                RawSQL("date_trunc('week', edt_course.begin)", +                                       []), distinct=True)) + +        return render(request, "group_list.html", {"groups": rooms}) +      # Récupération des salles et de toutes les semaines où elles sont      # concernées.      # Cette requête associe chaque salle à toutes les semaines où un | 
