aboutsummaryrefslogtreecommitdiff
path: root/views.py
diff options
context:
space:
mode:
authorAlban Gruin2018-01-28 21:16:42 +0100
committerAlban Gruin2018-01-28 21:16:42 +0100
commit7f575d53d17df6f1e6ade6e0bf6c06049c5a21ef (patch)
treea59b4fac3d24cebde6e7207a2fbac3f3a56d888c /views.py
parente815411b1d10ba0c94fa19a942033957a341f3fc (diff)
Requête de liste des salles optimisée pour PostgreSQL
Diffstat (limited to 'views.py')
-rw-r--r--views.py21
1 files changed, 21 insertions, 0 deletions
diff --git a/views.py b/views.py
index 842a02e..5ce9816 100644
--- a/views.py
+++ b/views.py
@@ -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