from django.contrib import admin
from django.utils.html import format_html
from django.urls import reverse
from mptt.admin import MPTTModelAdmin
from .models import Equipment, Category, Location
class EquipmentInline(admin.StackedInline):
model = Equipment
list_display = ('location', 'category', 'quantity',)
class CategoryFilter(admin.SimpleListFilter):
title = 'Catégorie'
parameter_name = 'category'
def lookups(self, request, model_admin):
return [ (c.pk, ' ' * c.get_level() + c.name) for c in Category.objects.all() ]
def queryset(self, request, queryset):
try:
category = Category.objects.get(pk=int(self.value()))
except (TypeError, ValueError, Category.DoesNotExist):
pass
else:
categories = category.get_descendants(include_self=True)
queryset = queryset.filter(category__in=categories)
return queryset
class CategoryAdmin(MPTTModelAdmin):
search_fields = ['name']
list_display = ('__str__', 'equipement_list_link',)
def equipement_list_link(self, category):
url = reverse('admin:%s_%s_changelist' % (Equipment._meta.app_label, Equipment._meta.model_name))
url += '?category=%d' % category.pk
return format_html(u'{}', url, 'voir la liste des équipements')
equipement_list_link.short_description = 'Équipements'
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):
# Interdiction de supprimer la catégorie si elle contient des équipements
return obj and not Equipment.objects.filter(category__in=obj.get_descendants(include_self=True)).exists()
class LocationAdmin(admin.ModelAdmin):
list_display = ('__str__', 'equipement_list_link',)
inlines = (EquipmentInline,)
def equipement_list_link(self, location):
url = reverse('admin:%s_%s_changelist' % (Equipment._meta.app_label, Equipment._meta.model_name))
url += '?location__id__exact=%d' % location.pk
return format_html(u'{}', url, 'voir la liste des équipements')
equipement_list_link.short_description = 'Équipements'
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):
# Interdiction de supprimer l’emplacement si il contient des équipements
return obj and not obj.equipment_set.exists()
class EquipmentAdmin(admin.ModelAdmin):
list_display = ('location', 'category', 'quantity',)
list_display_links = ('location', 'category',)
list_editable = ('quantity',)
list_filter = (
('location', admin.RelatedOnlyFieldListFilter),
CategoryFilter,
)
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):
# Interdiction de supprimer le stock d’équipements s’il n’est pas vide
return obj and obj.quantity == 0
admin.site.register(Category, CategoryAdmin)
admin.site.register(Location, LocationAdmin)
admin.site.register(Equipment, EquipmentAdmin)