admin.py 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. from django.contrib import admin
  2. from mptt.admin import MPTTModelAdmin
  3. from .models import Equipment, Category, Location
  4. class CategoryFilter(admin.SimpleListFilter):
  5. title = 'Catégorie'
  6. parameter_name = 'category'
  7. def lookups(self, request, model_admin):
  8. return [ (c.pk, '    ' * c.get_level() + c.name) for c in Category.objects.all() ]
  9. def queryset(self, request, queryset):
  10. try:
  11. category = Category.objects.get(pk=int(self.value()))
  12. except (TypeError, ValueError, Category.DoesNotExist):
  13. pass
  14. else:
  15. categories = category.get_descendants(include_self=True)
  16. queryset = queryset.filter(category__in=categories)
  17. return queryset
  18. class CategoryAdmin(MPTTModelAdmin):
  19. def get_actions(self, request):
  20. actions = super().get_actions(request)
  21. if 'delete_selected' in actions:
  22. del actions['delete_selected']
  23. return actions
  24. def has_delete_permission(self, request, obj=None):
  25. # Interdiction de supprimer la catégorie si elle contient des équipements
  26. return obj and not Equipment.objects.filter(category__in=obj.get_descendants(include_self=True)).exists()
  27. class LocationAdmin(admin.ModelAdmin):
  28. def get_actions(self, request):
  29. actions = super().get_actions(request)
  30. if 'delete_selected' in actions:
  31. del actions['delete_selected']
  32. return actions
  33. def has_delete_permission(self, request, obj=None):
  34. # Interdiction de supprimer l’emplacement si il contient des équipements
  35. return obj and not obj.equipment_set.exists()
  36. class EquipmentAdmin(admin.ModelAdmin):
  37. list_display = ('location', 'category', 'quantity',)
  38. list_display_links = ('location', 'category',)
  39. list_editable = ('quantity',)
  40. list_filter = (
  41. ('location', admin.RelatedOnlyFieldListFilter),
  42. CategoryFilter,
  43. )
  44. def get_actions(self, request):
  45. actions = super().get_actions(request)
  46. if 'delete_selected' in actions:
  47. del actions['delete_selected']
  48. return actions
  49. def has_delete_permission(self, request, obj=None):
  50. # Interdiction de supprimer le stock d’équipements s’il n’est pas vide
  51. return obj and obj.quantity == 0
  52. admin.site.register(Category, CategoryAdmin)
  53. admin.site.register(Location, LocationAdmin)
  54. admin.site.register(Equipment, EquipmentAdmin)