admin.py 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. from django.contrib import admin
  2. from .models import Equipment, Category, Location
  3. class CategoryFilter(admin.SimpleListFilter):
  4. title = 'Catégorie'
  5. parameter_name = 'category'
  6. def lookups(self, request, model_admin):
  7. return Category.objects.values_list('pk', 'name')
  8. def queryset(self, request, queryset):
  9. try:
  10. category = Category.objects.get(pk=int(self.value()))
  11. except (TypeError, ValueError, Category.DoesNotExist):
  12. pass
  13. else:
  14. categories = category.get_descendants(include_self=True)
  15. queryset = queryset.filter(category__in=categories)
  16. return queryset
  17. class CategoryAdmin(admin.ModelAdmin):
  18. list_display = ('__str__', 'parent',)
  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', 'quantity',)
  39. list_filter = (
  40. ('location', admin.RelatedOnlyFieldListFilter),
  41. CategoryFilter,
  42. )
  43. def get_actions(self, request):
  44. actions = super().get_actions(request)
  45. if 'delete_selected' in actions:
  46. del actions['delete_selected']
  47. return actions
  48. def has_delete_permission(self, request, obj=None):
  49. # Interdiction de supprimer le stock d’équipements s’il n’est pas vide
  50. return obj and obj.quantity == 0
  51. admin.site.register(Category, CategoryAdmin)
  52. admin.site.register(Location, LocationAdmin)
  53. admin.site.register(Equipment, EquipmentAdmin)