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 .models import User, Corporation, Adhesion
 from accounts.models import Profile
 from accounts.models import Profile
 from services.models import Service
 from services.models import Service
-from djadhere.utils import ActiveFilter
+from djadhere.utils import ActiveFilter, get_active_filter
 from banking.models import PaymentUpdate
 from banking.models import PaymentUpdate
 
 
 from datetime import timedelta
 from datetime import timedelta
@@ -60,14 +60,14 @@ class ActiveServiceInline(ServiceInline):
     verbose_name_plural = 'Services actifs'
     verbose_name_plural = 'Services actifs'
 
 
     def get_queryset(self, request):
     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):
 class InactiveServiceInline(ServiceInline):
     verbose_name_plural = 'Anciens services'
     verbose_name_plural = 'Anciens services'
 
 
     def get_queryset(self, request):
     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
 ### Filters

+ 15 - 5
services/admin.py

@@ -87,9 +87,9 @@ class ActiveServiceFilter(admin.SimpleListFilter):
 
 
     def queryset(self, request, queryset):
     def queryset(self, request, queryset):
         if self.value() == '0': # inactif
         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
         if self.value() == '1': # actif
-            return queryset.filter(has_active_allocations=True)
+            return queryset.filter(get_active_filter('allocation'))
 
 
 
 
 class RouteFilter(admin.SimpleListFilter):
 class RouteFilter(admin.SimpleListFilter):
@@ -189,6 +189,11 @@ class AllocationInline(admin.TabularInline):
     extra = 0
     extra = 0
     show_change_link = True
     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):
     def get_formset(self, request, obj=None, **kwargs):
         formset = super().get_formset(request, obj, **kwargs)
         formset = super().get_formset(request, obj, **kwargs)
         formset.request = request
         formset.request = request
@@ -208,7 +213,7 @@ class ActiveAllocationMixin:
         return existing + 1
         return existing + 1
 
 
     def get_queryset(self, request):
     def get_queryset(self, request):
-        return super().get_queryset(request).filter(active=True)
+        return super().get_queryset(request).filter(get_active_filter())
 
 
 
 
 class InactiveAllocationMixin:
 class InactiveAllocationMixin:
@@ -216,7 +221,7 @@ class InactiveAllocationMixin:
     max_num = 0
     max_num = 0
 
 
     def get_queryset(self, request):
     def get_queryset(self, request):
-        return super().get_queryset(request).filter(active=False)
+        return super().get_queryset(request).exclude(get_active_filter())
 
 
 
 
 class ServiceAllocationMixin:
 class ServiceAllocationMixin:
@@ -287,7 +292,7 @@ ends_resource.short_description = 'Terminer les allocations sélectionnées'
 
 
 class ServiceAdmin(admin.ModelAdmin):
 class ServiceAdmin(admin.ModelAdmin):
     list_display = ('id', 'get_adhesion_link', 'get_adherent_link', 'service_type', 'label', 'is_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_select_related = ('adhesion', 'adhesion__user', 'adhesion__user__profile', 'adhesion__corporation', 'service_type',)
     list_filter = (
     list_filter = (
         ActiveServiceFilter,
         ActiveServiceFilter,
         ('service_type', admin.RelatedOnlyFieldListFilter),
         ('service_type', admin.RelatedOnlyFieldListFilter),
@@ -297,6 +302,11 @@ class ServiceAdmin(admin.ModelAdmin):
     readonly_fields = ('get_contribution_link', 'is_active',)
     readonly_fields = ('get_contribution_link', 'is_active',)
     raw_id_fields = ('adhesion',)
     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 = lambda self, service: service.adhesion.get_adhesion_link()
     get_adhesion_link.short_description = Adhesion.get_adhesion_link.short_description
     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.contrib.contenttypes.fields import GenericRelation
 from django.core.exceptions import ValidationError
 from django.core.exceptions import ValidationError
 from django.urls import reverse
 from django.urls import reverse
-from django.utils import timezone
 from django.utils.html import format_html, mark_safe, escape
 from django.utils.html import format_html, mark_safe, escape
 from django.core.exceptions import PermissionDenied
 from django.core.exceptions import PermissionDenied
 from django.core.validators import RegexValidator, MinValueValidator, MaxValueValidator
 from django.core.validators import RegexValidator, MinValueValidator, MaxValueValidator
@@ -57,6 +56,7 @@ class IPResourceManager(models.Manager):
                         output_field=models.BooleanField()
                         output_field=models.BooleanField()
                     )
                     )
         )
         )
+        # Ouf, pas de duplication car l’IP ne peut être utilisé que par un service / une antenne !
         return qs
         return qs
 
 
 
 
@@ -73,18 +73,6 @@ class ActiveAllocationManager(models.Manager):
         return qs
         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):
 class IPResource(models.Model):
@@ -150,8 +138,6 @@ class Service(models.Model):
 
 
     contribution = models.OneToOneField(RecurringPayment, on_delete=models.CASCADE)
     contribution = models.OneToOneField(RecurringPayment, on_delete=models.CASCADE)
 
 
-    objects = ActiveServiceManager()
-
     def save(self, *args, **kwargs):
     def save(self, *args, **kwargs):
         if not hasattr(self, 'contribution'):
         if not hasattr(self, 'contribution'):
             self.contribution = RecurringPayment.objects.create()
             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.")
             raise ValidationError("Un service du même type existe déjà avec ce label.")
 
 
     def is_active(self):
     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.boolean = True
     is_active.short_description = 'Actif'
     is_active.short_description = 'Actif'
 
 
@@ -295,6 +281,10 @@ class Allocation(models.Model):
                 raise ValidationError("La période d’allocation de cette ressource chevauche "
                 raise ValidationError("La période d’allocation de cette ressource chevauche "
                                         "avec une période d’allocation précédente.")
                                         "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:
     class Meta:
         abstract = True
         abstract = True
         ordering = ['-start']
         ordering = ['-start']

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

@@ -2,8 +2,8 @@
 
 
 {% load bootstrap3 %}
 {% 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 %}
 {% block content %}
 <div class="panel panel-{{ service.is_active|yesno:"success,danger"}}">
 <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 django import template
 
 
 from services.models import Service
 from services.models import Service
+from djadhere.utils import get_active_filter
 
 
 
 
 register = template.Library()
 register = template.Library()
@@ -8,12 +9,12 @@ register = template.Library()
 
 
 @register.filter
 @register.filter
 def active(services):
 def active(services):
-    return services.filter(has_active_allocations=True)
+    return services.filter(get_active_filter('allocation'))
 
 
 
 
 @register.filter
 @register.filter
 def inactive(services):
 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')
 @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):
 class ServiceDetail(LoginRequiredMixin, DetailView):
     def get_queryset(self):
     def get_queryset(self):
         adhesions = self.request.user.profile.adhesions.values_list('pk')
         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')