Browse Source

suppression du champs actif des services

Élie Bouttier 7 years ago
parent
commit
ce5ac7522b
4 changed files with 59 additions and 7 deletions
  1. 2 2
      adhesions/admin.py
  2. 20 3
      services/admin.py
  3. 19 0
      services/migrations/0040_remove_service_active.py
  4. 18 2
      services/models.py

+ 2 - 2
adhesions/admin.py

@@ -41,8 +41,8 @@ class ServiceInline(admin.StackedInline):
     model = Service
     extra = 0
     show_change_link = True
-    fields = ('service_type', 'label',)
-    readonly_fields = ('service_type', 'label',)
+    fields = ('service_type', 'label', 'is_active',)
+    readonly_fields = ('service_type', 'label', 'is_active',)
 
     def has_add_permission(self, request):
         return False

+ 20 - 3
services/admin.py

@@ -47,6 +47,23 @@ class ResourceInUseFilter(admin.SimpleListFilter):
             return queryset.filter(available_filter)
 
 
+class ActiveServiceFilter(admin.SimpleListFilter):
+    title = 'actif'
+    parameter_name = 'active'
+
+    def lookups(self, request, model_admin):
+        return (
+            (1, 'Actif'),
+            (0, 'Inactif'),
+        )
+
+    def queryset(self, request, queryset):
+        if self.value() == '0': # inactif
+            return queryset.filter(active=False)
+        if self.value() == '1': # actif
+            return queryset.filter(active=True)
+
+
 class RouteFilter(admin.SimpleListFilter):
     title = 'route'
     parameter_name = 'route'
@@ -184,15 +201,15 @@ ends_resource.short_description = 'Terminer les allocations sélectionnées'
 ### ModelAdmin
 
 class ServiceAdmin(admin.ModelAdmin):
-    list_display = ('id', 'get_adhesion_link', 'get_adherent_link', 'service_type', 'label', 'active')
+    list_display = ('id', 'get_adhesion_link', 'get_adherent_link', 'service_type', 'label', 'is_active',)
     list_select_related = ('adhesion', 'adhesion__user', 'adhesion__user__profile', 'adhesion__corporation', 'service_type')
     list_filter = (
-        'active',
+        ActiveServiceFilter,
         ('service_type', admin.RelatedOnlyFieldListFilter),
     )
     inlines = (ServiceAllocationInline,)
     search_fields = ('=id', 'service_type__name', 'label', 'notes',)
-    fields = ('adhesion', 'service_type', 'label', 'notes', 'active', 'get_contribution_link',)
+    fields = ('adhesion', 'service_type', 'label', 'notes', 'get_contribution_link',)
     readonly_fields = ('get_contribution_link',)
     raw_id_fields = ('adhesion',)
 

+ 19 - 0
services/migrations/0040_remove_service_active.py

@@ -0,0 +1,19 @@
+# -*- coding: utf-8 -*-
+# Generated by Django 1.11.9 on 2018-01-21 18:52
+from __future__ import unicode_literals
+
+from django.db import migrations
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('services', '0039_auto_20180108_1355'),
+    ]
+
+    operations = [
+        migrations.RemoveField(
+            model_name='service',
+            name='active',
+        ),
+    ]

+ 18 - 2
services/models.py

@@ -73,6 +73,19 @@ class ActiveAllocationManager(models.Manager):
         return qs
 
 
+class ActiveServiceManager(models.Manager):
+    def get_queryset(self):
+        qs = super().get_queryset()
+        qs = qs.annotate(
+                    active=models.Case(
+                        models.When(get_active_filter('allocation'), then=True),
+                        default=False,
+                        output_field=models.BooleanField()
+                    )
+        ).distinct()
+        return qs
+
+
 class IPResource(models.Model):
     CATEGORIES = (
         (0, 'IP Public'),
@@ -121,11 +134,12 @@ class Service(models.Model):
                                      verbose_name='Type de service')
     label = models.CharField(blank=True, default='', max_length=128)
     notes = models.TextField(blank=True, default='')
-    active = models.BooleanField(default=True, verbose_name='actif')
     created = models.DateTimeField(auto_now_add=True)
 
     contribution = models.OneToOneField(RecurringPayment, on_delete=models.CASCADE)
 
+    objects = ActiveServiceManager()
+
     def save(self, *args, **kwargs):
         if not hasattr(self, 'contribution'):
             self.contribution = RecurringPayment.objects.create()
@@ -138,7 +152,9 @@ class Service(models.Model):
             raise ValidationError("Un service du même type existe déjà avec ce label.")
 
     def is_active(self):
-        return self.allocations.filter(get_active_filter()).exists()
+        return self.active
+    is_active.boolean = True
+    is_active.short_description = 'Actif'
 
     def get_absolute_url(self):
         return reverse('admin:%s_%s_change' % (self._meta.app_label, self._meta.model_name), args=(self.pk,))