admin.py 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. # -*- coding: utf-8 -*-
  2. from django import forms
  3. from django.contrib import admin
  4. from coin.filtering_queryset import LimitedAdminInlineMixin
  5. from coin.billing.models import Invoice, InvoiceDetail, Payment
  6. from coin.offers.models import OfferSubscription
  7. import autocomplete_light
  8. class InvoiceDetailInline(LimitedAdminInlineMixin, admin.StackedInline):
  9. model = InvoiceDetail
  10. extra = 0
  11. fields = (('label', 'amount', 'quantity', 'tax'),
  12. ('offersubscription','period_from', 'period_to'))
  13. def get_filters(self, obj):
  14. """
  15. Le champ "Abonnement" est filtré afin de n'afficher que les abonnements
  16. du membre choisi dans la facture. Si pas de membre alors renvoi
  17. une liste vide
  18. """
  19. if obj and obj.member:
  20. return (('offersubscription', {'member':obj.member}),)
  21. else:
  22. return (('offersubscription', None),)
  23. def get_readonly_fields(self, request, obj=None):
  24. if not obj or not obj.member:
  25. return self.readonly_fields + ('offersubscription',)
  26. return self.readonly_fields
  27. class PaymentInline(admin.StackedInline):
  28. model = Payment
  29. extra = 0
  30. fields = (('date', 'payment_mean', 'amount'),)
  31. class InvoiceAdmin(admin.ModelAdmin):
  32. list_display = ('number', 'date', 'status', 'amount', 'member')
  33. list_display_links = ('number', 'date')
  34. inlines = [InvoiceDetailInline, PaymentInline]
  35. fields = (('number', 'date', 'status'),
  36. ('date_due'),
  37. ('member'),
  38. ('amount','amount_paid'))
  39. readonly_fields = ('amount','amount_paid')
  40. form = autocomplete_light.modelform_factory(Invoice)
  41. def get_formsets(self, request, obj=None):
  42. """
  43. Lorsque l'on est en création d'objet (obj=None) alors ne renvoi pas les
  44. formsets des inlines.
  45. Cela permet de ne pas afficher les champs détails de facture et paiement
  46. tant que la facture n'a pas été enregistré.
  47. Cette subtilité permet de s'assurer que le select "Abonnement" de
  48. InvoiceDetail est bien filtré avec le member de la facture
  49. """
  50. if obj:
  51. for _ in super(InvoiceAdmin, self).get_formsets(request, obj):
  52. yield _
  53. else:
  54. pass
  55. admin.site.register(Invoice, InvoiceAdmin)