Browse Source

correction services stats: filtre services actifs

Élie Bouttier 8 years ago
parent
commit
2469373ab5
3 changed files with 26 additions and 15 deletions
  1. 6 13
      services/admin.py
  2. 2 2
      services/management/commands/servicesstats.py
  3. 18 0
      services/models.py

+ 6 - 13
services/admin.py

@@ -33,17 +33,13 @@ class ServiceStatusFilter(admin.SimpleListFilter):
         )
 
     def queryset(self, request, queryset):
-        # Designed with a Karnaugh map, should be correct...
         now = timezone.now()
         if self.value() == 'forthcoming':
-            return queryset.filter(Q(start__isnull=True, end__isnull=True) \
-                                   | Q(start__gt=now))
+            return queryset.filter(Service.get_forthcoming_filter())
         if self.value() == 'ongoing':
-            return queryset.filter(Q(start__lte=now, end__isnull=True) \
-                                   | Q(start__lte=now, end__gt=now) \
-                                   | Q(start__isnull=True, end__gt=now))
+            return queryset.filter(Service.get_ongoing_filter())
         if self.value() == 'finished':
-            return queryset.filter(end__lte=now)
+            return queryset.filter(Service.get_finished_filter())
 
 
 class ServiceAdmin(admin.ModelAdmin):
@@ -80,14 +76,11 @@ class InUseFilter(admin.SimpleListFilter):
         )
 
     def queryset(self, request, queryset):
-        now = timezone.now()
-        in_use_filter = (Q(service__start__isnull=True) | Q(service__start__lte=now)) \
-                      & (Q(service__end__isnull=True) | Q(service__end__gt=now)) \
-                      & (Q(service__start__isnull=True) | Q(service__end__isnull=True))
+        ongoing_filter = Service.get_ongoing_filter()
         if self.value() == '0':
-            return queryset.filter(in_use_filter)
+            return queryset.filter(ongoing_filter)
         if self.value() == '1':
-            return queryset.exclude(in_use_filter)
+            return queryset.exclude(ongoing_filter)
 
 
 class IPResourceAdmin(admin.ModelAdmin):

+ 2 - 2
services/management/commands/servicesstats.py

@@ -4,7 +4,7 @@ from django.utils import timezone
 
 from decimal import Decimal
 
-from services.models import ServiceType
+from services.models import Service, ServiceType
 
 
 class Command(BaseCommand):
@@ -16,7 +16,7 @@ class Command(BaseCommand):
         lines = []
         for service_type in ServiceType.objects.all():
             now = timezone.now()
-            services = service_type.services.exclude(start__gt=now).exclude(end__lte=now)
+            services = service_type.services.filter(Service.get_ongoing_filter())
             ntotal = services.count()
             services = services.exclude(adherent=None)
             nadh = services.count()

+ 18 - 0
services/models.py

@@ -1,4 +1,5 @@
 from django.db import models
+from django.db.models import Q
 from django.core.validators import MaxValueValidator
 from django.utils import timezone
 from django.contrib.auth.models import Group
@@ -61,6 +62,23 @@ class Service(models.Model):
     start = models.DateTimeField(null=True, blank=True, verbose_name='Début du service')
     end = models.DateTimeField(null=True, blank=True, verbose_name='Fin du service')
 
+    # Designed with a Karnaugh map, should be correct...
+    @staticmethod
+    def get_forthcoming_filter():
+        now = timezone.now()
+        return Q(start__isnull=True, end__isnull=True) \
+             | Q(start__gt=now)
+    @staticmethod
+    def get_ongoing_filter():
+        now = timezone.now()
+        return Q(start__lte=now, end__isnull=True) \
+             | Q(start__lte=now, end__gt=now) \
+             | Q(start__isnull=True, end__gt=now)
+    @staticmethod
+    def get_finished_filter():
+        now = timezone.now()
+        return Q(end__lte=now)
+
     @property
     def is_ongoing(self):
         if (not self.start or self.start < timezone.now()) \