Browse Source

la date de début d’un service est facultative

Élie Bouttier 8 years ago
parent
commit
dd061729b2
4 changed files with 62 additions and 18 deletions
  1. 9 3
      accounts/admin.py
  2. 20 10
      services/admin.py
  3. 20 0
      services/migrations/0005_auto_20170102_0003.py
  4. 13 5
      services/models.py

+ 9 - 3
accounts/admin.py

@@ -10,13 +10,19 @@ from adhesions.admin import ProfileInline, AdherentInline
 class UserAdmin(AuthUserAdmin):
     inlines = (ProfileInline, AdherentInline,)
 
+    def get_readonly_fields(self, request, obj=None):
+        readonly_fields = super().get_readonly_fields(request, obj)
+        if not request.user.is_superuser:
+            readonly_fields += ('username',)
+        return readonly_fields
+
     def get_fieldsets(self, request, obj=None):
         if request.user.is_superuser:
-            return self.fieldsets
+            return AuthUserAdmin.fieldsets
         else:
             return (
-                self.fieldsets[0],
-                self.fieldsets[1],
+                (None, {'fields': ('username',)}),
+                AuthUserAdmin.fieldsets[1],
             )
 
     def user_change_password(self, request, id):

+ 20 - 10
services/admin.py

@@ -22,31 +22,39 @@ class ServiceTypeFilter(admin.SimpleListFilter):
 
 
 class ServiceStatusFilter(admin.SimpleListFilter):
-    title = 'status du service'
+    title = 'statut'
     parameter_name = 'status'
 
     def lookups(self, request, model_admin):
         return (
+            ('forthcoming', 'Non commencé'),
             ('ongoing', 'En cours'),
             ('finished', 'Terminé'),
         )
 
     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))
         if self.value() == 'ongoing':
-            return queryset.filter(end__isnull=True)
+            return queryset.filter(Q(start__lte=now, end__isnull=True) \
+                                   | Q(start__lte=now, end__gt=now) \
+                                   | Q(start__isnull=True, end__gt=now))
         if self.value() == 'finished':
-            return queryset.filter(end__isnull=False)
+            return queryset.filter(end__lte=now)
 
 
 class ServiceAdmin(admin.ModelAdmin):
-    list_display = ('id', 'adherent', 'service_type', 'start', 'end_view',)
+    list_display = ('id', 'adherent', 'service_type', 'start', 'end', 'status')
     list_filter = (ServiceStatusFilter, ServiceTypeFilter,)
     inlines = (PaymentInline,)
 
-    def end_view(self, obj):
-        return obj.end
-    end_view.short_description = 'Fin du service'
-    end_view.empty_value_display = 'Service en cours'
+    def status(self, obj):
+        return obj.is_ongoing
+    status.short_description = 'En cours'
+    status.boolean = True
 
     def get_queryset(self, request):
         qs = super().get_queryset(request)
@@ -72,8 +80,10 @@ class InUseFilter(admin.SimpleListFilter):
         )
 
     def queryset(self, request, queryset):
-        in_use_filter = Q(service__start__gte=timezone.now()) \
-                | Q(service__end__isnull=True)
+        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))
         if self.value() == '0':
             return queryset.filter(in_use_filter)
         if self.value() == '1':

+ 20 - 0
services/migrations/0005_auto_20170102_0003.py

@@ -0,0 +1,20 @@
+# -*- coding: utf-8 -*-
+# Generated by Django 1.10.4 on 2017-01-01 23:03
+from __future__ import unicode_literals
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('services', '0004_remove_adherent_contribution'),
+    ]
+
+    operations = [
+        migrations.AlterField(
+            model_name='service',
+            name='start',
+            field=models.DateTimeField(blank=True, null=True, verbose_name='Début du service'),
+        ),
+    ]

+ 13 - 5
services/models.py

@@ -3,6 +3,7 @@ from django.core.validators import MaxValueValidator
 from django.utils import timezone
 from django.contrib.auth.models import Group
 from django.contrib.contenttypes.fields import GenericRelation
+from django.core.exceptions import ValidationError
 
 from adhesions.models import Adherent
 from banking.models import Payment
@@ -57,15 +58,22 @@ class Service(models.Model):
                                    related_query_name='service')
     ip_resources = models.ManyToManyField(IPResource, blank=True,
                                           verbose_name='Ressources IP')
-    start = models.DateTimeField(verbose_name='Début du service')
+    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')
 
     @property
-    def status(self):
-        if self.end:
-            return 'Terminé le %s' % self.end
+    def is_ongoing(self):
+        if (not self.start or self.start < timezone.now()) \
+                and (not self.end or self.end > timezone.now()) \
+                and (self.start or self.end):
+            return True
         else:
-            return 'En cours'
+            return False
+
+    def clean(self):
+        if self.start and self.end and self.start > self.end:
+            raise ValidationError("La date de début du service doit être antérieur "
+                                  "à la date de fin du service.")
 
     def __str__(self):
         return str(self.service_type) + ' ' + str(self.adherent)