12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091 |
- 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)
|