admin.py 6.3 KB

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