admin.py 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210
  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 = (
  93. ResourceInUseFilter,
  94. ('prefixes', admin.RelatedOnlyFieldListFilter),
  95. )
  96. fields = ('ip',)
  97. readonly_fields = ('ip',)
  98. search_fields = ('ip',)
  99. inlines = (AllocationInline,)
  100. def in_use_display(self, obj):
  101. return not obj.in_use
  102. in_use_display.short_description = 'Disponible'
  103. in_use_display.boolean = True
  104. def get_actions(self, request):
  105. actions = super().get_actions(request)
  106. if 'delete_selected' in actions:
  107. del actions['delete_selected']
  108. return actions
  109. def has_add_permission(self, request, obj=None):
  110. return False
  111. def has_delete_permission(self, request, obj=None):
  112. return False
  113. class RouteAdmin(admin.ModelAdmin):
  114. fields = ('name',)
  115. readonly_fields = ('name',)
  116. def has_add_permission(self, request, obj=None):
  117. return False
  118. def get_actions(self, request):
  119. actions = super().get_actions(request)
  120. if 'delete_selected' in actions:
  121. del actions['delete_selected']
  122. return actions
  123. def has_delete_permission(self, request, obj=None):
  124. return False
  125. class ResourceAllocationAdmin(admin.ModelAdmin):
  126. list_display = ('id', 'resource_link', 'service_link', 'start', 'end',)
  127. list_filter = (AllocationStatusFilter,)
  128. actions = (ends_resource,)
  129. raw_id_fields = ('resource', 'service',)
  130. search_fields = ('resource__ip', 'service__id', 'service__service_type__name', 'service__label')
  131. resource_link = get_foreignkey_link_func('resource')
  132. resource_link.short_description = 'Ressource'
  133. service_link = get_foreignkey_link_func('service')
  134. service_link.short_description = 'Service'
  135. def get_actions(self, request):
  136. actions = super().get_actions(request)
  137. if 'delete_selected' in actions:
  138. del actions['delete_selected']
  139. return actions
  140. def has_delete_permission(self, request, obj=None):
  141. return False
  142. class ServiceTypeAdmin(admin.ModelAdmin):
  143. fields = ('name',)
  144. readonly_fields = ('name',)
  145. def get_actions(self, request):
  146. actions = super().get_actions(request)
  147. if 'delete_selected' in actions:
  148. del actions['delete_selected']
  149. return actions
  150. def has_add_permission(self, request, obj=None):
  151. return False
  152. def has_delete_permission(self, request, obj=None):
  153. return False
  154. admin.site.register(ServiceType, ServiceTypeAdmin)
  155. admin.site.register(Service, ServiceAdmin)
  156. admin.site.register(IPResource, IPResourceAdmin)
  157. admin.site.register(Route, RouteAdmin)
  158. admin.site.register(ResourceAllocation, ResourceAllocationAdmin)