diff options
| -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): | 
