diff --git a/stages/admin.py b/stages/admin.py index 0df6bd1..d84d436 100644 --- a/stages/admin.py +++ b/stages/admin.py @@ -5,7 +5,6 @@ import zipfile from django import forms from django.contrib import admin from django.db import models -from django.db.models import Case, Count, When from django.http import HttpResponse from django.urls import reverse from django.utils.html import format_html @@ -63,9 +62,7 @@ class ArchivedListFilter(admin.BooleanFieldListFilter): class KlassRelatedListFilter(admin.RelatedFieldListFilter): def field_choices(self, field, request, model_admin): return [ - (k.pk, k.name) for k in Klass.objects.annotate( - num_students=Count(Case(When(student__archived=False, then=1))) - ).filter(num_students__gt=0).order_by('name') + (k.pk, k.name) for k in Klass.active.order_by('name') ] diff --git a/stages/models.py b/stages/models.py index 294ee14..abd6a38 100644 --- a/stages/models.py +++ b/stages/models.py @@ -4,6 +4,7 @@ from datetime import date, timedelta from django.conf import settings from django.db import models +from django.db.models import Case, Count, When from . import utils @@ -47,6 +48,13 @@ class Level(models.Model): return None +class ActiveKlassManager(models.Manager): + def get_queryset(self): + return super().get_queryset().annotate( + num_students=Count(Case(When(student__archived=False, then=1))) + ).filter(num_students__gt=0) + + class Klass(models.Model): name = models.CharField(max_length=10, verbose_name='Nom', unique=True) section = models.ForeignKey(Section, verbose_name='Filière', on_delete=models.PROTECT) @@ -54,6 +62,9 @@ class Klass(models.Model): teacher = models.ForeignKey('Teacher', blank=True, null=True, on_delete=models.SET_NULL, verbose_name='Maître de classe') + objects = models.Manager() + active = ActiveKlassManager() + class Meta: verbose_name = "Classe" diff --git a/stages/views.py b/stages/views.py index 14cde77..58516a2 100644 --- a/stages/views.py +++ b/stages/views.py @@ -15,7 +15,7 @@ from django.contrib import messages from django.core.files import File from django.core.mail import EmailMessage from django.db import transaction -from django.db.models import Case, Count, Value, When, Q, Sum +from django.db.models import Count, Value, Q, Sum from django.db.models.functions import Concat from django.http import HttpResponse, HttpResponseNotAllowed, HttpResponseRedirect from django.shortcuts import get_object_or_404, redirect @@ -83,8 +83,7 @@ class CorporationView(DetailView): class KlassListView(ListView): - queryset = Klass.objects.all().annotate(num_students=Count(Case(When(student__archived=False, then=1))) - ).filter(num_students__gt=0).order_by('section', 'name') + queryset = Klass.active.order_by('section', 'name') template_name = 'classes.html' @@ -1043,10 +1042,7 @@ def print_mentor_ede_compensation_form(request, pk): def print_klass_list(request): - query = Klass.objects.all( - ).annotate(num_students=Count(Case(When(student__archived=False, then=1))) - ).filter(num_students__gt=0 - ).order_by('section', 'name') + query = Klass.active.order_by('section', 'name') filename = 'archive_RolesDeClasses.zip' path = os.path.join(tempfile.gettempdir(), filename)