Browse Source

tentative de suppression des problèmes de doublons

Élie Bouttier 7 years ago
parent
commit
ddab53196a

+ 3 - 3
adhesions/admin.py

@@ -13,7 +13,7 @@ from .forms import UserCreationForm
 from .models import User, Corporation, Adhesion
 from accounts.models import Profile
 from services.models import Service
-from djadhere.utils import ActiveFilter
+from djadhere.utils import ActiveFilter, get_active_filter
 from banking.models import PaymentUpdate
 
 from datetime import timedelta
@@ -60,14 +60,14 @@ class ActiveServiceInline(ServiceInline):
     verbose_name_plural = 'Services actifs'
 
     def get_queryset(self, request):
-        return super().get_queryset(request).filter(has_active_allocations=True)
+        return super().get_queryset(request).filter(get_active_filter('allocation'))
 
 
 class InactiveServiceInline(ServiceInline):
     verbose_name_plural = 'Anciens services'
 
     def get_queryset(self, request):
-        return super().get_queryset(request).filter(has_active_allocations=False)
+        return super().get_queryset(request).exclude(get_active_filter('allocation'))
 
 
 ### Filters

+ 15 - 5
services/admin.py

@@ -87,9 +87,9 @@ class ActiveServiceFilter(admin.SimpleListFilter):
 
     def queryset(self, request, queryset):
         if self.value() == '0': # inactif
-            return queryset.exclude(get_active_filter('allocation')) # has_active_allocations=False ne fonctionne pas
+            return queryset.exclude(get_active_filter('allocation'))
         if self.value() == '1': # actif
-            return queryset.filter(has_active_allocations=True)
+            return queryset.filter(get_active_filter('allocation'))
 
 
 class RouteFilter(admin.SimpleListFilter):
@@ -189,6 +189,11 @@ class AllocationInline(admin.TabularInline):
     extra = 0
     show_change_link = True
 
+    def get_queryset(self, request):
+        qs = super().get_queryset(request)
+        qs = qs.select_related('resource', 'route')
+        return qs
+
     def get_formset(self, request, obj=None, **kwargs):
         formset = super().get_formset(request, obj, **kwargs)
         formset.request = request
@@ -208,7 +213,7 @@ class ActiveAllocationMixin:
         return existing + 1
 
     def get_queryset(self, request):
-        return super().get_queryset(request).filter(active=True)
+        return super().get_queryset(request).filter(get_active_filter())
 
 
 class InactiveAllocationMixin:
@@ -216,7 +221,7 @@ class InactiveAllocationMixin:
     max_num = 0
 
     def get_queryset(self, request):
-        return super().get_queryset(request).filter(active=False)
+        return super().get_queryset(request).exclude(get_active_filter())
 
 
 class ServiceAllocationMixin:
@@ -287,7 +292,7 @@ ends_resource.short_description = 'Terminer les allocations sélectionnées'
 
 class ServiceAdmin(admin.ModelAdmin):
     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_select_related = ('adhesion', 'adhesion__user', 'adhesion__user__profile', 'adhesion__corporation', 'service_type',)
     list_filter = (
         ActiveServiceFilter,
         ('service_type', admin.RelatedOnlyFieldListFilter),
@@ -297,6 +302,11 @@ class ServiceAdmin(admin.ModelAdmin):
     readonly_fields = ('get_contribution_link', 'is_active',)
     raw_id_fields = ('adhesion',)
 
+    def get_queryset(self, request):
+        qs = super().get_queryset(request)
+        qs = qs.prefetch_related('allocations',)
+        return qs
+
     get_adhesion_link = lambda self, service: service.adhesion.get_adhesion_link()
     get_adhesion_link.short_description = Adhesion.get_adhesion_link.short_description
 

+ 6 - 16
services/models.py

@@ -7,7 +7,6 @@ from django.contrib.auth.models import Group
 from django.contrib.contenttypes.fields import GenericRelation
 from django.core.exceptions import ValidationError
 from django.urls import reverse
-from django.utils import timezone
 from django.utils.html import format_html, mark_safe, escape
 from django.core.exceptions import PermissionDenied
 from django.core.validators import RegexValidator, MinValueValidator, MaxValueValidator
@@ -57,6 +56,7 @@ class IPResourceManager(models.Manager):
                         output_field=models.BooleanField()
                     )
         )
+        # Ouf, pas de duplication car l’IP ne peut être utilisé que par un service / une antenne !
         return qs
 
 
@@ -73,18 +73,6 @@ class ActiveAllocationManager(models.Manager):
         return qs
 
 
-class ActiveServiceManager(models.Manager):
-    def get_queryset(self):
-        qs = super().get_queryset()
-        qs = qs.annotate(
-                    has_active_allocations=models.Case(
-                        models.When(get_active_filter('allocation'), then=True),
-                        default=False,
-                        output_field=models.BooleanField()
-                    )
-        )
-        qs = qs.order_by('pk', '-has_active_allocations').distinct('pk') # complicated things here, do not touch if you're not sure
-        return qs
 
 
 class IPResource(models.Model):
@@ -150,8 +138,6 @@ class Service(models.Model):
 
     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()
@@ -164,7 +150,7 @@ class Service(models.Model):
             raise ValidationError("Un service du même type existe déjà avec ce label.")
 
     def is_active(self):
-        return self.has_active_allocations
+        return any(map(lambda allocation: allocation.is_active() , self.allocations.all()))
     is_active.boolean = True
     is_active.short_description = 'Actif'
 
@@ -295,6 +281,10 @@ class Allocation(models.Model):
                 raise ValidationError("La période d’allocation de cette ressource chevauche "
                                         "avec une période d’allocation précédente.")
 
+    def is_active(self):
+        now = timezone.now()
+        return self.start < now and (self.end is None or self.end > now)
+
     class Meta:
         abstract = True
         ordering = ['-start']

+ 2 - 2
services/templates/services/service_detail.html

@@ -2,8 +2,8 @@
 
 {% load bootstrap3 %}
 
-{% block usertab %}{% if service.adhesion == request.user.profile.adhesion %} class="active"{% endif %}{% endblock %}
-{% block corptab %}{% if service.adhesion != request.user.profile.adhesion %} active{% endif %}{% endblock %}
+{% block usertab %}{% if service.adhesion == request.user.adhesion %} class="active"{% endif %}{% endblock %}
+{% block corptab %}{% if service.adhesion != request.user.adhesion %} active{% endif %}{% endblock %}
 
 {% block content %}
 <div class="panel panel-{{ service.is_active|yesno:"success,danger"}}">

+ 3 - 2
services/templatetags/services.py

@@ -1,6 +1,7 @@
 from django import template
 
 from services.models import Service
+from djadhere.utils import get_active_filter
 
 
 register = template.Library()
@@ -8,12 +9,12 @@ register = template.Library()
 
 @register.filter
 def active(services):
-    return services.filter(has_active_allocations=True)
+    return services.filter(get_active_filter('allocation'))
 
 
 @register.filter
 def inactive(services):
-    return services.filter(has_active_allocations=False)
+    return services.exclude(get_active_filter('allocation'))
 
 
 @register.inclusion_tag('services/tags/deallocate_modal_div.html')

+ 1 - 1
services/views.py

@@ -7,4 +7,4 @@ from .models import Service
 class ServiceDetail(LoginRequiredMixin, DetailView):
     def get_queryset(self):
         adhesions = self.request.user.profile.adhesions.values_list('pk')
-        return Service.objects.filter(adhesion__pk__in=adhesions)
+        return Service.objects.filter(adhesion__pk__in=adhesions).order_by('service_type')