diff options
Diffstat (limited to 'models.py')
-rw-r--r-- | models.py | 23 |
1 files changed, 21 insertions, 2 deletions
@@ -16,7 +16,7 @@ from functools import reduce from django.db import models -from django.db.models import Manager, Q +from django.db.models import Manager, OuterRef, Q, Subquery, Value from django.db.models.functions import ExtractWeek, ExtractYear from django.utils import timezone from django.utils.text import slugify @@ -162,7 +162,26 @@ class Group(SlugModel): class RoomManager(Manager): def qsjps(self, begin, end): - return None + # 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é. + 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 class Room(SlugModel): |