admin.py 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  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
  5. from banking.admin import PaymentInline
  6. class ServiceTypeFilter(admin.SimpleListFilter):
  7. title = 'type de service'
  8. parameter_name = 'type'
  9. def lookups(self, request, model_admin):
  10. service_types = ServiceType.objects.all()
  11. if not request.user.is_superuser:
  12. service_types = service_types.filter(group=request.user.groups.all())
  13. return service_types.values_list('pk', 'name')
  14. def queryset(self, request, queryset):
  15. if self.value():
  16. return queryset.filter(service_type__pk=self.value())
  17. class ServiceStatusFilter(admin.SimpleListFilter):
  18. title = 'statut'
  19. parameter_name = 'status'
  20. def lookups(self, request, model_admin):
  21. return (
  22. ('forthcoming', 'Non commencé'),
  23. ('ongoing', 'En cours'),
  24. ('finished', 'Terminé'),
  25. )
  26. def queryset(self, request, queryset):
  27. # Designed with a Karnaugh map, should be correct...
  28. now = timezone.now()
  29. if self.value() == 'forthcoming':
  30. return queryset.filter(Q(start__isnull=True, end__isnull=True) \
  31. | Q(start__gt=now))
  32. if self.value() == 'ongoing':
  33. return queryset.filter(Q(start__lte=now, end__isnull=True) \
  34. | Q(start__lte=now, end__gt=now) \
  35. | Q(start__isnull=True, end__gt=now))
  36. if self.value() == 'finished':
  37. return queryset.filter(end__lte=now)
  38. class ServiceAdmin(admin.ModelAdmin):
  39. list_display = ('id', 'adherent', 'service_type', 'start', 'end', 'status')
  40. list_filter = (ServiceStatusFilter, ServiceTypeFilter,)
  41. inlines = (PaymentInline,)
  42. def status(self, obj):
  43. return obj.is_ongoing
  44. status.short_description = 'En cours'
  45. status.boolean = True
  46. def get_queryset(self, request):
  47. qs = super().get_queryset(request)
  48. if request.user.is_superuser:
  49. return qs
  50. return qs.filter(service_type__group__in=request.user.groups.all())
  51. def get_readonly_fields(self, request, obj=None):
  52. fields = super().get_readonly_fields(request, obj)
  53. if not request.user.is_superuser:
  54. return fields + ('service_type', 'ip_resources',)
  55. return fields
  56. class InUseFilter(admin.SimpleListFilter):
  57. title = 'disponibilité'
  58. parameter_name = 'available'
  59. def lookups(self, request, model_admin):
  60. return (
  61. (1, 'Disponible'),
  62. (0, 'Non disponible'),
  63. )
  64. def queryset(self, request, queryset):
  65. now = timezone.now()
  66. in_use_filter = (Q(service__start__isnull=True) | Q(service__start__lte=now)) \
  67. & (Q(service__end__isnull=True) | Q(service__end__gt=now)) \
  68. & (Q(service__start__isnull=True) | Q(service__end__isnull=True))
  69. if self.value() == '0':
  70. return queryset.filter(in_use_filter)
  71. if self.value() == '1':
  72. return queryset.exclude(in_use_filter)
  73. class IPResourceAdmin(admin.ModelAdmin):
  74. list_display = ('__str__', 'in_use_view')
  75. list_filter = (InUseFilter,)
  76. def in_use_view(self, obj):
  77. return not obj.in_use
  78. in_use_view.short_description = 'Disponible'
  79. in_use_view.boolean = True
  80. admin.site.register(Service, ServiceAdmin)
  81. admin.site.register(ServiceType)
  82. admin.site.register(IPResource, IPResourceAdmin)