admin.py 3.0 KB

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