admin.py 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  1. from django.contrib import admin
  2. from django.core.urlresolvers import reverse
  3. from django.utils.safestring import mark_safe
  4. from .models import (
  5. Document, Cost, Good, CostUse, GoodUse, Service, ServiceUse)
  6. @admin.register(Document)
  7. class DocumentAdmin(admin.ModelAdmin):
  8. list_display = ('name', 'date', 'type')
  9. actions = ['copy']
  10. def copy(self, request, queryset):
  11. for i in queryset.all():
  12. new = i.copy()
  13. edit_url = reverse('admin:costs_document_change', args=(new.pk,))
  14. self.message_user(
  15. request, mark_safe(
  16. "{} copié, pensez à <a href=\"{}\">L'éditer</a>".format(
  17. new, edit_url)))
  18. copy.short_description = 'Copier'
  19. class AbstractUseInline(admin.TabularInline):
  20. """ An inline with some knowledge of the currently edited Document
  21. """
  22. def formfield_for_foreignkey(self, db_field, request, **kwargs):
  23. if db_field.name == "resource" and getattr(request, 'document', None):
  24. kwargs["queryset"] = db_field.related_model.objects.filter(
  25. document=request.document)
  26. return super().formfield_for_foreignkey(
  27. db_field, request, **kwargs)
  28. class GoodUseInline(AbstractUseInline):
  29. model = GoodUse
  30. extra = 1
  31. class CostUseInline(AbstractUseInline):
  32. model = CostUse
  33. extra = 1
  34. class ServiceUseInline(AbstractUseInline):
  35. model = ServiceUse
  36. extra = 1
  37. fk_name = 'service'
  38. class DirectDocumentFilter(admin.SimpleListFilter):
  39. title = 'Document'
  40. parameter_name = 'document'
  41. def queryset(self, request, queryset):
  42. document = self.value()
  43. if not document:
  44. return queryset
  45. else:
  46. return queryset.filter(document=document)
  47. def lookups(self, request, model_admin):
  48. for i in Document.objects.all():
  49. yield i.pk, str(i)
  50. @admin.register(Cost)
  51. class CostAdmin(admin.ModelAdmin):
  52. list_display = ('__str__', 'price', 'document')
  53. list_filter = [DirectDocumentFilter]
  54. @admin.register(Good)
  55. class GoodAdmin(admin.ModelAdmin):
  56. list_display = (
  57. '__str__', 'price', 'document',
  58. 'provisioning_duration', 'monthly_provision')
  59. list_filter = [DirectDocumentFilter]
  60. @admin.register(Service)
  61. class ServiceAdmin(admin.ModelAdmin):
  62. list_display = (
  63. 'name', 'subscriptions_count', 'document',
  64. 'monthly_unit_cost', 'new_subscriber_cost')
  65. inlines = (CostUseInline, GoodUseInline, ServiceUseInline)
  66. list_filter = [DirectDocumentFilter]
  67. def get_form(self, request, obj=None, **kwargs):
  68. if obj:
  69. # anotate the request with some context
  70. request.document = obj.document
  71. return super().get_form(request, obj, **kwargs)
  72. def monthly_unit_cost(self, obj):
  73. return '{:.2f}€'.format(obj.get_prices()['unit_recurring_price'])
  74. def new_subscriber_cost(self, obj):
  75. return '{:.2f}€'.format(obj.get_prices()['total_goods_value_share'])
  76. fieldsets = (
  77. (None, {
  78. 'fields': (
  79. ('name', 'document'), 'description', 'subscriptions_count'),
  80. }),
  81. ('Ré-utilisabilité', {
  82. 'fields': ('reusable',)
  83. })
  84. )