from django.contrib import admin from django.db.models import Q from django.utils import timezone from .models import Service, ServiceType, IPResource, ResourceAllocation from banking.admin import PaymentInline, ValidatedPaymentInline, PendingOrNewPaymentInline class AllocationInline(admin.TabularInline): model = ResourceAllocation extra = 1 can_delete = False class ServiceTypeFilter(admin.SimpleListFilter): title = 'type de service' parameter_name = 'type' def lookups(self, request, model_admin): service_types = ServiceType.objects.all() if not request.user.is_superuser: service_types = service_types.filter(group=request.user.groups.all()) return service_types.values_list('pk', 'name') def queryset(self, request, queryset): if self.value(): return queryset.filter(service_type__pk=self.value()) class ServiceAdmin(admin.ModelAdmin): list_display = ('id', 'adherent', 'service_type', 'label', 'active') list_filter = ('active', ServiceTypeFilter,) def get_form(self, request, obj=None, **kwargs): # get_inlines does not exists :-( if request.user.has_perm('banking.validate_payment'): self.inlines = (PaymentInline,) else: self.inlines = (ValidatedPaymentInline, PendingOrNewPaymentInline,) self.inlines = self.inlines + (AllocationInline,) return super().get_form(request, obj, **kwargs) def get_queryset(self, request): qs = super().get_queryset(request) if request.user.is_superuser: return qs return qs.filter(service_type__group__in=request.user.groups.all()) def get_readonly_fields(self, request, obj=None): fields = super().get_readonly_fields(request, obj) if not request.user.is_superuser: return fields + ('service_type', 'ip_resources',) return fields class InUseFilter(admin.SimpleListFilter): title = 'disponibilité' parameter_name = 'available' def lookups(self, request, model_admin): return ( (1, 'Disponible'), (0, 'Non disponible'), ) def queryset(self, request, queryset): # On utilise le même filtre que get_active_filter(), mais préfixé par « allocation__ » … # Ce billet donne une technique avec une classe PrefixedQ pour éviter cette duplication de code : # https://hackerluddite.wordpress.com/2012/07/07/making-django-orm-more-dry-with-prefixes-and-qs/ now = timezone.now() if self.value() == '0': # non disponible return queryset.filter(Q(allocation__start__lte=now) & (Q(allocation__end__isnull=True) | Q(allocation__end__gte=now))) if self.value() == '1': # disponible return queryset.exclude(Q(allocation__start__lte=now) & (Q(allocation__end__isnull=True) | Q(allocation__end__gte=now))) class IPResourceAdmin(admin.ModelAdmin): list_display = ('__str__', 'in_use_view') list_filter = (InUseFilter,) inlines = (AllocationInline,) def in_use_view(self, obj): return not obj.in_use in_use_view.short_description = 'Disponible' in_use_view.boolean = True admin.site.register(ServiceType) admin.site.register(Service, ServiceAdmin) admin.site.register(IPResource, IPResourceAdmin) admin.site.register(ResourceAllocation)