from django.contrib import admin from django.db import models from django.forms import ModelForm from django.utils import timezone from django.core.urlresolvers import reverse from django.utils.html import format_html from djadhere.utils import get_active_filter from banking.models import Payment from banking.admin import PaymentInline from .models import Service, ServiceType, IPResource, ResourceAllocation ### Filters class ResourceInUseFilter(admin.SimpleListFilter): title = 'disponibilité' parameter_name = 'available' def lookups(self, request, model_admin): return ( (1, 'Disponible'), (0, 'Non disponible'), ) def queryset(self, request, queryset): now = timezone.now() active_filter = get_active_filter('allocation') if self.value() == '0': # non disponible return queryset.filter(active_filter) if self.value() == '1': # disponible return queryset.exclude(active_filter) class AllocationStatusFilter(admin.SimpleListFilter): title = 'statut' parameter_name = 'status' def lookups(self, request, model_admin): return ( (1, 'En cours'), (0, 'Terminée'), ) def queryset(self, request, queryset): now = timezone.now() active_filter = get_active_filter() if self.value() == '0': # inactif return queryset.exclude(active_filter) if self.value() == '1': # actif return queryset.filter(active_filter) class ServiceTypeFilter(admin.SimpleListFilter): title = 'type de service' parameter_name = 'type' def lookups(self, request, model_admin): return ServiceType.objects.values_list('pk', 'name') def queryset(self, request, queryset): if self.value(): return queryset.filter(service_type__pk=self.value()) ### Helpers def get_foreignkey_link_func(field): def foreignkey_link(self, instance): obj = getattr(instance, field) url = reverse('admin:%s_%s_change' % (obj._meta.app_label, obj._meta.model_name), args=(obj.id,)) return format_html(u'{}', url, str(obj)) return foreignkey_link ### Inlines class AllocationInline(admin.TabularInline): model = ResourceAllocation extra = 0 fields = ('id', 'service', 'resource', 'start', 'end') raw_id_fields = ('service', 'resource',) verbose_name_plural = 'Allocations' ### Actions def ends_resource(resource, request, queryset): now = timezone.now() queryset.exclude(start__lte=now, end__isnull=False).update(end=now) ends_resource.short_description = 'Terminer les allocations sélectionnées' ### ModelAdmin class ServiceAdmin(admin.ModelAdmin): list_display = ('id', 'adhesion', 'service_type', 'label', 'active') list_filter = ('active', ServiceTypeFilter,) inlines = (PaymentInline, AllocationInline,) search_fields = ('id', 'service_type__name', 'label') raw_id_fields = ('adhesion',) class IPResourceAdmin(admin.ModelAdmin): list_display = ('__str__', 'in_use_display') list_filter = (ResourceInUseFilter,) fields =('ip', 'mask',) search_fields = ('ip',) inlines = (AllocationInline,) def in_use_display(self, obj): return not obj.in_use in_use_display.short_description = 'Disponible' in_use_display.boolean = True class ResourceAllocationAdmin(admin.ModelAdmin): list_display = ('id', 'resource_link', 'service_link', 'start', 'end',) list_filter = (AllocationStatusFilter,) actions = (ends_resource,) raw_id_fields = ('service',) search_fields = ('resource__ip', 'service__id', 'service__service_type__name', 'service__label') resource_link = get_foreignkey_link_func('resource') resource_link.short_description = 'Ressource' service_link = get_foreignkey_link_func('service') service_link.short_description = 'Service' admin.site.register(ServiceType) admin.site.register(Service, ServiceAdmin) admin.site.register(IPResource, IPResourceAdmin) admin.site.register(ResourceAllocation, ResourceAllocationAdmin)