admin.py 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212
  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. show_change_link = True
  65. def get_max_num(self, request, obj=None, **kwargs):
  66. existing = obj.allocations.count() if obj else 0
  67. # pour simplifier la validation, on ajoute qu’une allocation à la fois
  68. return existing + 1
  69. def has_delete_permission(self, request, obj=None):
  70. return False
  71. ### Actions
  72. def ends_resource(resource, request, queryset):
  73. now = timezone.now()
  74. queryset.exclude(start__lte=now, end__isnull=False).update(end=now)
  75. ends_resource.short_description = 'Terminer les allocations sélectionnées'
  76. ### ModelAdmin
  77. class ServiceAdmin(admin.ModelAdmin):
  78. list_display = ('id', 'adhesion_link', 'service_type', 'label', 'active')
  79. list_filter = ('active', ServiceTypeFilter,)
  80. inlines = (AllocationInline,)
  81. search_fields = ('id', 'service_type__name', 'label')
  82. raw_id_fields = ('adhesion',)
  83. adhesion_link = get_foreignkey_link_func('adhesion')
  84. adhesion_link.short_description = 'Numéro d’adhésion'
  85. def get_actions(self, request):
  86. actions = super().get_actions(request)
  87. if 'delete_selected' in actions:
  88. del actions['delete_selected']
  89. return actions
  90. def has_delete_permission(self, request, obj=None):
  91. return False
  92. class IPResourceAdmin(admin.ModelAdmin):
  93. list_display = ('__str__', 'in_use_display')
  94. list_filter = (ResourceInUseFilter,)
  95. fields = ('ip',)
  96. readonly_fields = ('ip',)
  97. search_fields = ('ip',)
  98. inlines = (AllocationInline,)
  99. def in_use_display(self, obj):
  100. return not obj.in_use
  101. in_use_display.short_description = 'Disponible'
  102. in_use_display.boolean = True
  103. def get_actions(self, request):
  104. actions = super().get_actions(request)
  105. if 'delete_selected' in actions:
  106. del actions['delete_selected']
  107. return actions
  108. def has_add_permission(self, request, obj=None):
  109. return False
  110. def has_delete_permission(self, request, obj=None):
  111. return False
  112. class RouteAdmin(admin.ModelAdmin):
  113. fields = ('name',)
  114. readonly_fields = ('name',)
  115. def has_add_permission(self, request, obj=None):
  116. return False
  117. def get_actions(self, request):
  118. actions = super().get_actions(request)
  119. if 'delete_selected' in actions:
  120. del actions['delete_selected']
  121. return actions
  122. def has_delete_permission(self, request, obj=None):
  123. return False
  124. class ResourceAllocationAdmin(admin.ModelAdmin):
  125. list_display = ('id', 'resource_link', 'service_link', 'start', 'end',)
  126. list_filter = (AllocationStatusFilter,)
  127. actions = (ends_resource,)
  128. raw_id_fields = ('resource', 'service',)
  129. search_fields = ('resource__ip', 'service__id', 'service__service_type__name', 'service__label')
  130. resource_link = get_foreignkey_link_func('resource')
  131. resource_link.short_description = 'Ressource'
  132. service_link = get_foreignkey_link_func('service')
  133. service_link.short_description = 'Service'
  134. def get_actions(self, request):
  135. actions = super().get_actions(request)
  136. if 'delete_selected' in actions:
  137. del actions['delete_selected']
  138. return actions
  139. def has_delete_permission(self, request, obj=None):
  140. return False
  141. class ServiceTypeAdmin(admin.ModelAdmin):
  142. fields = ('name',)
  143. readonly_fields = ('name',)
  144. def get_actions(self, request):
  145. actions = super().get_actions(request)
  146. if 'delete_selected' in actions:
  147. del actions['delete_selected']
  148. return actions
  149. def has_add_permission(self, request, obj=None):
  150. return False
  151. def has_delete_permission(self, request, obj=None):
  152. return False
  153. admin.site.register(ServiceType, ServiceTypeAdmin)
  154. admin.site.register(Service, ServiceAdmin)
  155. admin.site.register(IPResource, IPResourceAdmin)
  156. admin.site.register(Route, RouteAdmin)
  157. admin.site.register(ResourceAllocation, ResourceAllocationAdmin)