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)