admin.py 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203
  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. ### Helpers
  41. def get_foreignkey_link_func(field):
  42. def foreignkey_link(self, instance):
  43. obj = getattr(instance, field)
  44. url = reverse('admin:%s_%s_change' % (obj._meta.app_label,
  45. obj._meta.model_name),
  46. args=(obj.pk,))
  47. return format_html(u'<a href="{}">{}</a>', url, str(obj))
  48. return foreignkey_link
  49. ### Inlines
  50. class AllocationInline(admin.TabularInline):
  51. model = ResourceAllocation
  52. extra = 0
  53. fields = ('id', 'service', 'resource', 'route', 'start', 'end')
  54. raw_id_fields = ('service', 'resource',)
  55. verbose_name_plural = 'Allocations'
  56. show_change_link = True
  57. def get_max_num(self, request, obj=None, **kwargs):
  58. existing = obj.allocations.count() if obj else 0
  59. # pour simplifier la validation, on ajoute qu’une allocation à la fois
  60. return existing + 1
  61. def has_delete_permission(self, request, obj=None):
  62. return False
  63. ### Actions
  64. def ends_resource(resource, request, queryset):
  65. now = timezone.now()
  66. queryset.exclude(start__lte=now, end__isnull=False).update(end=now)
  67. ends_resource.short_description = 'Terminer les allocations sélectionnées'
  68. ### ModelAdmin
  69. class ServiceAdmin(admin.ModelAdmin):
  70. list_display = ('id', 'adhesion_link', 'service_type', 'label', 'active')
  71. list_filter = (
  72. 'active',
  73. ('service_type', admin.RelatedOnlyFieldListFilter),
  74. )
  75. inlines = (AllocationInline,)
  76. search_fields = ('id', 'service_type__name', 'label')
  77. raw_id_fields = ('adhesion',)
  78. adhesion_link = get_foreignkey_link_func('adhesion')
  79. adhesion_link.short_description = 'Numéro d’adhésion'
  80. def get_actions(self, request):
  81. actions = super().get_actions(request)
  82. if 'delete_selected' in actions:
  83. del actions['delete_selected']
  84. return actions
  85. def has_delete_permission(self, request, obj=None):
  86. return False
  87. class IPResourceAdmin(admin.ModelAdmin):
  88. list_display = ('__str__', 'in_use_display')
  89. list_filter = (ResourceInUseFilter,)
  90. fields = ('ip',)
  91. readonly_fields = ('ip',)
  92. search_fields = ('ip',)
  93. inlines = (AllocationInline,)
  94. def in_use_display(self, obj):
  95. return not obj.in_use
  96. in_use_display.short_description = 'Disponible'
  97. in_use_display.boolean = True
  98. def get_actions(self, request):
  99. actions = super().get_actions(request)
  100. if 'delete_selected' in actions:
  101. del actions['delete_selected']
  102. return actions
  103. def has_add_permission(self, request, obj=None):
  104. return False
  105. def has_delete_permission(self, request, obj=None):
  106. return False
  107. class RouteAdmin(admin.ModelAdmin):
  108. fields = ('name',)
  109. readonly_fields = ('name',)
  110. def has_add_permission(self, request, obj=None):
  111. return False
  112. def get_actions(self, request):
  113. actions = super().get_actions(request)
  114. if 'delete_selected' in actions:
  115. del actions['delete_selected']
  116. return actions
  117. def has_delete_permission(self, request, obj=None):
  118. return False
  119. class ResourceAllocationAdmin(admin.ModelAdmin):
  120. list_display = ('id', 'resource_link', 'service_link', 'start', 'end',)
  121. list_filter = (AllocationStatusFilter,)
  122. actions = (ends_resource,)
  123. raw_id_fields = ('resource', 'service',)
  124. search_fields = ('resource__ip', 'service__id', 'service__service_type__name', 'service__label')
  125. resource_link = get_foreignkey_link_func('resource')
  126. resource_link.short_description = 'Ressource'
  127. service_link = get_foreignkey_link_func('service')
  128. service_link.short_description = 'Service'
  129. def get_actions(self, request):
  130. actions = super().get_actions(request)
  131. if 'delete_selected' in actions:
  132. del actions['delete_selected']
  133. return actions
  134. def has_delete_permission(self, request, obj=None):
  135. return False
  136. class ServiceTypeAdmin(admin.ModelAdmin):
  137. fields = ('name',)
  138. readonly_fields = ('name',)
  139. def get_actions(self, request):
  140. actions = super().get_actions(request)
  141. if 'delete_selected' in actions:
  142. del actions['delete_selected']
  143. return actions
  144. def has_add_permission(self, request, obj=None):
  145. return False
  146. def has_delete_permission(self, request, obj=None):
  147. return False
  148. admin.site.register(ServiceType, ServiceTypeAdmin)
  149. admin.site.register(Service, ServiceAdmin)
  150. admin.site.register(IPResource, IPResourceAdmin)
  151. admin.site.register(Route, RouteAdmin)
  152. admin.site.register(ResourceAllocation, ResourceAllocationAdmin)