diff options
Diffstat (limited to 'models.py')
-rw-r--r-- | models.py | 33 |
1 files changed, 13 insertions, 20 deletions
@@ -16,7 +16,7 @@ from functools import reduce from django.db import models -from django.db.models import Manager, OuterRef, Q, Subquery, Value +from django.db.models import Manager, Q from django.db.models.functions import ExtractWeek, ExtractYear from django.utils import timezone from django.utils.text import slugify @@ -162,26 +162,19 @@ class Group(SlugModel): class RoomManager(Manager): def qsjps(self, begin, end): - # On compte tous les cours correspondant à chaque salle - # commençant avant la fin de l’intervalle et finissant après - # le début de l’intervalle. Ces cours se trouvent à un moment - # dans l’intervalle, et la salle assignée à ce cours ne peut - # donc pas être sélectionnée. Pour accélérer la requête, on - # s’arrête au premier cours trouvé. + # On récupère la liste des cours qui commencent avant la fin + # de l’intervalle sélectionné et qui terminent après le début + # de l’intervalle, c’est-à-dire qu’au moins une partie du + # cours se déroule pendant l’intervalle. On récupère ensuite + # la liste des salles dans lesquelles se déroulent ces + # cours. On exclu les cours n’ayant aucune salle assignée. courses = Course.objects.filter(begin__lt=end, end__gt=begin, - rooms=OuterRef("pk")) \ - .annotate(c=Value(1, - output_field=models.IntegerField())) \ - .values_list("c", flat=True)[:1] - - # On sélectionne toutes les salles qui n’ont aucun de cours se - # trouvant au moins en partie dans l’intervalle entré par - # l’utilisateur. - rooms = self.get_queryset().annotate( - c=Subquery(courses, output_field=models.IntegerField())) \ - .filter(c__isnull=True).order_by("name") - - return rooms + rooms__isnull=False) \ + .values_list("rooms", flat=True) + + # On sélectionne ensuite les salles qui ne sont pas dans la + # liste récupérée plus haut, et on les trie par leur nom. + return self.get_queryset().exclude(pk__in=courses).order_by("name") class Room(SlugModel): |