admin.py 3.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. from django.contrib import admin
  2. from django.db.models import Q
  3. from django.utils import timezone
  4. from .models import Service, ServiceType, IPResource, ResourceAllocation
  5. from banking.admin import PaymentInline, ValidatedPaymentInline, PendingOrNewPaymentInline
  6. class AllocationInline(admin.TabularInline):
  7. model = ResourceAllocation
  8. extra = 1
  9. can_delete = False
  10. class ServiceTypeFilter(admin.SimpleListFilter):
  11. title = 'type de service'
  12. parameter_name = 'type'
  13. def lookups(self, request, model_admin):
  14. service_types = ServiceType.objects.all()
  15. if not request.user.is_superuser:
  16. service_types = service_types.filter(group=request.user.groups.all())
  17. return service_types.values_list('pk', 'name')
  18. def queryset(self, request, queryset):
  19. if self.value():
  20. return queryset.filter(service_type__pk=self.value())
  21. class ServiceAdmin(admin.ModelAdmin):
  22. list_display = ('id', 'adherent', 'service_type', 'label', 'active')
  23. list_filter = ('active', ServiceTypeFilter,)
  24. def get_form(self, request, obj=None, **kwargs):
  25. # get_inlines does not exists :-(
  26. if request.user.has_perm('banking.validate_payment'):
  27. self.inlines = (PaymentInline,)
  28. else:
  29. self.inlines = (ValidatedPaymentInline, PendingOrNewPaymentInline,)
  30. self.inlines = self.inlines + (AllocationInline,)
  31. return super().get_form(request, obj, **kwargs)
  32. def get_queryset(self, request):
  33. qs = super().get_queryset(request)
  34. if request.user.is_superuser:
  35. return qs
  36. return qs.filter(service_type__group__in=request.user.groups.all())
  37. def get_readonly_fields(self, request, obj=None):
  38. fields = super().get_readonly_fields(request, obj)
  39. if not request.user.is_superuser:
  40. return fields + ('service_type', 'ip_resources',)
  41. return fields
  42. class InUseFilter(admin.SimpleListFilter):
  43. title = 'disponibilité'
  44. parameter_name = 'available'
  45. def lookups(self, request, model_admin):
  46. return (
  47. (1, 'Disponible'),
  48. (0, 'Non disponible'),
  49. )
  50. def queryset(self, request, queryset):
  51. # On utilise le même filtre que get_active_filter(), mais préfixé par « allocation__ » …
  52. # Ce billet donne une technique avec une classe PrefixedQ pour éviter cette duplication de code :
  53. # https://hackerluddite.wordpress.com/2012/07/07/making-django-orm-more-dry-with-prefixes-and-qs/
  54. now = timezone.now()
  55. if self.value() == '0': # non disponible
  56. return queryset.filter(Q(allocation__start__lte=now) & (Q(allocation__end__isnull=True) | Q(allocation__end__gte=now)))
  57. if self.value() == '1': # disponible
  58. return queryset.exclude(Q(allocation__start__lte=now) & (Q(allocation__end__isnull=True) | Q(allocation__end__gte=now)))
  59. class IPResourceAdmin(admin.ModelAdmin):
  60. list_display = ('__str__', 'in_use_view')
  61. list_filter = (InUseFilter,)
  62. inlines = (AllocationInline,)
  63. def in_use_view(self, obj):
  64. return not obj.in_use
  65. in_use_view.short_description = 'Disponible'
  66. in_use_view.boolean = True
  67. admin.site.register(ServiceType)
  68. admin.site.register(Service, ServiceAdmin)
  69. admin.site.register(IPResource, IPResourceAdmin)
  70. admin.site.register(ResourceAllocation)