123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208 |
- 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 .models import Service, ServiceType, IPResource, Route, ResourceAllocation
- from djadhere.utils import get_active_filter
- ### 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.pk,))
- return format_html(u'<a href="{}">{}</a>', url, str(obj))
- return foreignkey_link
- ### Inlines
- class AllocationInline(admin.TabularInline):
- model = ResourceAllocation
- extra = 0
- fields = ('id', 'service', 'resource', 'route', 'start', 'end')
- raw_id_fields = ('service', 'resource',)
- verbose_name_plural = 'Allocations'
- def get_max_num(self, request, obj=None, **kwargs):
- existing = obj.allocations.count() if obj else 0
- # pour simplifier la validation, on ajoute qu’une allocation à la fois
- return existing + 1
- def has_delete_permission(self, request, obj=None):
- return False
- ### 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 = (AllocationInline,)
- search_fields = ('id', 'service_type__name', 'label')
- raw_id_fields = ('adhesion',)
- def get_actions(self, request):
- actions = super().get_actions(request)
- if 'delete_selected' in actions:
- del actions['delete_selected']
- return actions
- def has_delete_permission(self, request, obj=None):
- return False
- class IPResourceAdmin(admin.ModelAdmin):
- list_display = ('__str__', 'in_use_display')
- list_filter = (ResourceInUseFilter,)
- fields = ('ip',)
- readonly_fields = ('ip',)
- 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
- def get_actions(self, request):
- actions = super().get_actions(request)
- if 'delete_selected' in actions:
- del actions['delete_selected']
- return actions
- def has_add_permission(self, request, obj=None):
- return False
- def has_delete_permission(self, request, obj=None):
- return False
- class RouteAdmin(admin.ModelAdmin):
- fields = ('name',)
- readonly_fields = ('name',)
- def has_add_permission(self, request, obj=None):
- return False
- def get_actions(self, request):
- actions = super().get_actions(request)
- if 'delete_selected' in actions:
- del actions['delete_selected']
- return actions
- def has_delete_permission(self, request, obj=None):
- return False
- class ResourceAllocationAdmin(admin.ModelAdmin):
- list_display = ('id', 'resource_link', 'service_link', 'start', 'end',)
- list_filter = (AllocationStatusFilter,)
- actions = (ends_resource,)
- raw_id_fields = ('resource', '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'
- def get_actions(self, request):
- actions = super().get_actions(request)
- if 'delete_selected' in actions:
- del actions['delete_selected']
- return actions
- def has_delete_permission(self, request, obj=None):
- return False
- class ServiceTypeAdmin(admin.ModelAdmin):
- fields = ('name',)
- readonly_fields = ('name',)
- def get_actions(self, request):
- actions = super().get_actions(request)
- if 'delete_selected' in actions:
- del actions['delete_selected']
- return actions
- def has_add_permission(self, request, obj=None):
- return False
- def has_delete_permission(self, request, obj=None):
- return False
- admin.site.register(ServiceType, ServiceTypeAdmin)
- admin.site.register(Service, ServiceAdmin)
- admin.site.register(IPResource, IPResourceAdmin)
- admin.site.register(Route, RouteAdmin)
- admin.site.register(ResourceAllocation, ResourceAllocationAdmin)
|