admin.py 2.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  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 = 'status du service'
  19. parameter_name = 'status'
  20. def lookups(self, request, model_admin):
  21. return (
  22. ('ongoing', 'En cours'),
  23. ('finished', 'Terminé'),
  24. )
  25. def queryset(self, request, queryset):
  26. if self.value() == 'ongoing':
  27. return queryset.filter(end__isnull=True)
  28. if self.value() == 'finished':
  29. return queryset.filter(end__isnull=False)
  30. class ServiceAdmin(admin.ModelAdmin):
  31. list_display = ('id', 'adherent', 'service_type', 'start', 'end_view',)
  32. list_filter = (ServiceStatusFilter, ServiceTypeFilter,)
  33. inlines = (PaymentInline,)
  34. def end_view(self, obj):
  35. return obj.end
  36. end_view.short_description = 'Fin du service'
  37. end_view.empty_value_display = 'Service en cours'
  38. def get_queryset(self, request):
  39. qs = super().get_queryset(request)
  40. if request.user.is_superuser:
  41. return qs
  42. return qs.filter(service_type__group__in=request.user.groups.all())
  43. def get_readonly_fields(self, request, obj=None):
  44. fields = super().get_readonly_fields(request, obj)
  45. if not request.user.is_superuser:
  46. return fields + ('service_type', 'ip_resources',)
  47. return fields
  48. class InUseFilter(admin.SimpleListFilter):
  49. title = 'disponibilité'
  50. parameter_name = 'available'
  51. def lookups(self, request, model_admin):
  52. return (
  53. (1, 'Disponible'),
  54. (0, 'Non disponible'),
  55. )
  56. def queryset(self, request, queryset):
  57. in_use_filter = Q(service__start__gte=timezone.now()) \
  58. | Q(service__end__isnull=True)
  59. if self.value() == '0':
  60. return queryset.filter(in_use_filter)
  61. if self.value() == '1':
  62. return queryset.exclude(in_use_filter)
  63. class IPResourceAdmin(admin.ModelAdmin):
  64. list_display = ('__str__', 'in_use_view')
  65. list_filter = (InUseFilter,)
  66. def in_use_view(self, obj):
  67. return not obj.in_use
  68. in_use_view.short_description = 'Disponible'
  69. in_use_view.boolean = True
  70. admin.site.register(Service, ServiceAdmin)
  71. admin.site.register(ServiceType)
  72. admin.site.register(IPResource, IPResourceAdmin)