admin.py 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136
  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 djadhere.utils import get_active_filter
  8. from banking.models import Payment
  9. from banking.admin import PaymentInline
  10. from .models import Service, ServiceType, IPResource, ResourceAllocation
  11. ### Filters
  12. class ResourceInUseFilter(admin.SimpleListFilter):
  13. title = 'disponibilité'
  14. parameter_name = 'available'
  15. def lookups(self, request, model_admin):
  16. return (
  17. (1, 'Disponible'),
  18. (0, 'Non disponible'),
  19. )
  20. def queryset(self, request, queryset):
  21. now = timezone.now()
  22. active_filter = get_active_filter('allocation')
  23. if self.value() == '0': # non disponible
  24. return queryset.filter(active_filter)
  25. if self.value() == '1': # disponible
  26. return queryset.exclude(active_filter)
  27. class AllocationStatusFilter(admin.SimpleListFilter):
  28. title = 'statut'
  29. parameter_name = 'status'
  30. def lookups(self, request, model_admin):
  31. return (
  32. (1, 'En cours'),
  33. (0, 'Terminée'),
  34. )
  35. def queryset(self, request, queryset):
  36. now = timezone.now()
  37. active_filter = get_active_filter()
  38. if self.value() == '0': # inactif
  39. return queryset.exclude(active_filter)
  40. if self.value() == '1': # actif
  41. return queryset.filter(active_filter)
  42. class ServiceTypeFilter(admin.SimpleListFilter):
  43. title = 'type de service'
  44. parameter_name = 'type'
  45. def lookups(self, request, model_admin):
  46. return ServiceType.objects.values_list('pk', 'name')
  47. def queryset(self, request, queryset):
  48. if self.value():
  49. return queryset.filter(service_type__pk=self.value())
  50. ### Helpers
  51. def get_foreignkey_link_func(field):
  52. def foreignkey_link(self, instance):
  53. obj = getattr(instance, field)
  54. url = reverse('admin:%s_%s_change' % (obj._meta.app_label,
  55. obj._meta.model_name),
  56. args=(obj.id,))
  57. return format_html(u'<a href="{}">{}</a>', url, str(obj))
  58. return foreignkey_link
  59. ### Inlines
  60. class AllocationInline(admin.TabularInline):
  61. model = ResourceAllocation
  62. extra = 0
  63. fields = ('id', 'service', 'resource', 'start', 'end')
  64. raw_id_fields = ('service', 'resource',)
  65. verbose_name_plural = 'Allocations'
  66. ### Actions
  67. def ends_resource(resource, request, queryset):
  68. now = timezone.now()
  69. queryset.exclude(start__lte=now, end__isnull=False).update(end=now)
  70. ends_resource.short_description = 'Terminer les allocations sélectionnées'
  71. ### ModelAdmin
  72. class ServiceAdmin(admin.ModelAdmin):
  73. list_display = ('id', 'adhesion', 'service_type', 'label', 'active')
  74. list_filter = ('active', ServiceTypeFilter,)
  75. inlines = (PaymentInline, AllocationInline,)
  76. search_fields = ('id', 'service_type__name', 'label')
  77. raw_id_fields = ('adhesion',)
  78. class IPResourceAdmin(admin.ModelAdmin):
  79. list_display = ('__str__', 'in_use_display')
  80. list_filter = (ResourceInUseFilter,)
  81. fields =('ip', 'mask',)
  82. search_fields = ('ip',)
  83. inlines = (AllocationInline,)
  84. def in_use_display(self, obj):
  85. return not obj.in_use
  86. in_use_display.short_description = 'Disponible'
  87. in_use_display.boolean = True
  88. class ResourceAllocationAdmin(admin.ModelAdmin):
  89. list_display = ('id', 'resource_link', 'service_link', 'start', 'end',)
  90. list_filter = (AllocationStatusFilter,)
  91. actions = (ends_resource,)
  92. raw_id_fields = ('service',)
  93. search_fields = ('resource__ip', 'service__id', 'service__service_type__name', 'service__label')
  94. resource_link = get_foreignkey_link_func('resource')
  95. resource_link.short_description = 'Ressource'
  96. service_link = get_foreignkey_link_func('service')
  97. service_link.short_description = 'Service'
  98. admin.site.register(ServiceType)
  99. admin.site.register(Service, ServiceAdmin)
  100. admin.site.register(IPResource, IPResourceAdmin)
  101. admin.site.register(ResourceAllocation, ResourceAllocationAdmin)