admin.py 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208
  1. from django.contrib import admin
  2. from django.db import models
  3. from django.forms import ModelForm
  4. from django.utils import timezone
  5. from django.core.urlresolvers import reverse
  6. from django.utils.html import format_html
  7. from .models import Service, ServiceType, IPResource, Route, ResourceAllocation
  8. from djadhere.utils import get_active_filter
  9. ### Filters
  10. class ResourceInUseFilter(admin.SimpleListFilter):
  11. title = 'disponibilité'
  12. parameter_name = 'available'
  13. def lookups(self, request, model_admin):
  14. return (
  15. (1, 'Disponible'),
  16. (0, 'Non disponible'),
  17. )
  18. def queryset(self, request, queryset):
  19. now = timezone.now()
  20. active_filter = get_active_filter('allocation')
  21. if self.value() == '0': # non disponible
  22. return queryset.filter(active_filter)
  23. if self.value() == '1': # disponible
  24. return queryset.exclude(active_filter)
  25. class AllocationStatusFilter(admin.SimpleListFilter):
  26. title = 'statut'
  27. parameter_name = 'status'
  28. def lookups(self, request, model_admin):
  29. return (
  30. (1, 'En cours'),
  31. (0, 'Terminée'),
  32. )
  33. def queryset(self, request, queryset):
  34. now = timezone.now()
  35. active_filter = get_active_filter()
  36. if self.value() == '0': # inactif
  37. return queryset.exclude(active_filter)
  38. if self.value() == '1': # actif
  39. return queryset.filter(active_filter)
  40. class ServiceTypeFilter(admin.SimpleListFilter):
  41. title = 'type de service'
  42. parameter_name = 'type'
  43. def lookups(self, request, model_admin):
  44. return ServiceType.objects.values_list('pk', 'name')
  45. def queryset(self, request, queryset):
  46. if self.value():
  47. return queryset.filter(service_type__pk=self.value())
  48. ### Helpers
  49. def get_foreignkey_link_func(field):
  50. def foreignkey_link(self, instance):
  51. obj = getattr(instance, field)
  52. url = reverse('admin:%s_%s_change' % (obj._meta.app_label,
  53. obj._meta.model_name),
  54. args=(obj.pk,))
  55. return format_html(u'<a href="{}">{}</a>', url, str(obj))
  56. return foreignkey_link
  57. ### Inlines
  58. class AllocationInline(admin.TabularInline):
  59. model = ResourceAllocation
  60. extra = 0
  61. fields = ('id', 'service', 'resource', 'route', 'start', 'end')
  62. raw_id_fields = ('service', 'resource',)
  63. verbose_name_plural = 'Allocations'
  64. def get_max_num(self, request, obj=None, **kwargs):
  65. existing = obj.allocations.count() if obj else 0
  66. # pour simplifier la validation, on ajoute qu’une allocation à la fois
  67. return existing + 1
  68. def has_delete_permission(self, request, obj=None):
  69. return False
  70. ### Actions
  71. def ends_resource(resource, request, queryset):
  72. now = timezone.now()
  73. queryset.exclude(start__lte=now, end__isnull=False).update(end=now)
  74. ends_resource.short_description = 'Terminer les allocations sélectionnées'
  75. ### ModelAdmin
  76. class ServiceAdmin(admin.ModelAdmin):
  77. list_display = ('id', 'adhesion', 'service_type', 'label', 'active')
  78. list_filter = ('active', ServiceTypeFilter,)
  79. inlines = (AllocationInline,)
  80. search_fields = ('id', 'service_type__name', 'label')
  81. raw_id_fields = ('adhesion',)
  82. def get_actions(self, request):
  83. actions = super().get_actions(request)
  84. if 'delete_selected' in actions:
  85. del actions['delete_selected']
  86. return actions
  87. def has_delete_permission(self, request, obj=None):
  88. return False
  89. class IPResourceAdmin(admin.ModelAdmin):
  90. list_display = ('__str__', 'in_use_display')
  91. list_filter = (ResourceInUseFilter,)
  92. fields = ('ip',)
  93. readonly_fields = ('ip',)
  94. search_fields = ('ip',)
  95. inlines = (AllocationInline,)
  96. def in_use_display(self, obj):
  97. return not obj.in_use
  98. in_use_display.short_description = 'Disponible'
  99. in_use_display.boolean = True
  100. def get_actions(self, request):
  101. actions = super().get_actions(request)
  102. if 'delete_selected' in actions:
  103. del actions['delete_selected']
  104. return actions
  105. def has_add_permission(self, request, obj=None):
  106. return False
  107. def has_delete_permission(self, request, obj=None):
  108. return False
  109. class RouteAdmin(admin.ModelAdmin):
  110. fields = ('name',)
  111. readonly_fields = ('name',)
  112. def has_add_permission(self, request, obj=None):
  113. return False
  114. def get_actions(self, request):
  115. actions = super().get_actions(request)
  116. if 'delete_selected' in actions:
  117. del actions['delete_selected']
  118. return actions
  119. def has_delete_permission(self, request, obj=None):
  120. return False
  121. class ResourceAllocationAdmin(admin.ModelAdmin):
  122. list_display = ('id', 'resource_link', 'service_link', 'start', 'end',)
  123. list_filter = (AllocationStatusFilter,)
  124. actions = (ends_resource,)
  125. raw_id_fields = ('resource', 'service',)
  126. search_fields = ('resource__ip', 'service__id', 'service__service_type__name', 'service__label')
  127. resource_link = get_foreignkey_link_func('resource')
  128. resource_link.short_description = 'Ressource'
  129. service_link = get_foreignkey_link_func('service')
  130. service_link.short_description = 'Service'
  131. def get_actions(self, request):
  132. actions = super().get_actions(request)
  133. if 'delete_selected' in actions:
  134. del actions['delete_selected']
  135. return actions
  136. def has_delete_permission(self, request, obj=None):
  137. return False
  138. class ServiceTypeAdmin(admin.ModelAdmin):
  139. fields = ('name',)
  140. readonly_fields = ('name',)
  141. def get_actions(self, request):
  142. actions = super().get_actions(request)
  143. if 'delete_selected' in actions:
  144. del actions['delete_selected']
  145. return actions
  146. def has_add_permission(self, request, obj=None):
  147. return False
  148. def has_delete_permission(self, request, obj=None):
  149. return False
  150. admin.site.register(ServiceType, ServiceTypeAdmin)
  151. admin.site.register(Service, ServiceAdmin)
  152. admin.site.register(IPResource, IPResourceAdmin)
  153. admin.site.register(Route, RouteAdmin)
  154. admin.site.register(ResourceAllocation, ResourceAllocationAdmin)