from django.contrib import admin from django.db.models import Q from django.utils import timezone from .models import Service, ServiceType, IPResource from banking.admin import PaymentInline 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 ServiceStatusFilter(admin.SimpleListFilter): 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): now = timezone.now() if self.value() == 'forthcoming': return queryset.filter(Service.get_forthcoming_filter()) if self.value() == 'ongoing': return queryset.filter(Service.get_ongoing_filter()) if self.value() == 'finished': return queryset.filter(Service.get_finished_filter()) class ServiceAdmin(admin.ModelAdmin): list_display = ('id', 'adherent', 'service_type', 'start', 'end', 'status') list_filter = (ServiceStatusFilter, ServiceTypeFilter,) inlines = (PaymentInline,) 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) 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): ongoing_filter = Service.get_ongoing_filter() if self.value() == '0': return queryset.filter(ongoing_filter) if self.value() == '1': return queryset.exclude(ongoing_filter) class IPResourceAdmin(admin.ModelAdmin): list_display = ('__str__', 'in_use_view') list_filter = (InUseFilter,) 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(Service, ServiceAdmin) admin.site.register(ServiceType) admin.site.register(IPResource, IPResourceAdmin)