admin.py 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155
  1. from django.contrib import admin
  2. from django.contrib.contenttypes.admin import GenericTabularInline
  3. from django.contrib.contenttypes.models import ContentType
  4. from django.db.models import Q
  5. from django.core.urlresolvers import reverse
  6. from services.models import ServiceType
  7. from .models import Payment
  8. class PaymentMixin:
  9. def get_fields(self, request, obj=None):
  10. fields = ('amount', 'period', 'payment_method', 'start', 'end')
  11. if request.user.has_perm('banking.validate_payment'):
  12. fields += ('validated',)
  13. return fields
  14. def get_queryset(self, request):
  15. qs = super().get_queryset(request)
  16. if request.user.has_perm('banking.validate_payment'):
  17. return qs
  18. # Show only adherent contribution and payment related to a service for which the user is in managment group.
  19. user_ctype = ContentType.objects.get(app_label='adhesions', model='adherent')
  20. return qs.filter(Q(reason_type=user_ctype) | Q(service__service_type__group__in=request.user.groups.all()))
  21. class PaymentInline(PaymentMixin, GenericTabularInline):
  22. model = Payment
  23. ct_field = 'reason_type'
  24. ct_fk_field = 'reason_id'
  25. extra = 1
  26. class ValidatedPaymentInline(PaymentInline):
  27. extra = 0
  28. verbose_name_plural = 'Paiements validés'
  29. def get_readonly_fields(self, request, obj=None):
  30. if request.user.has_perm('banking.validate_payment'):
  31. return ()
  32. else:
  33. return self.get_fields(request, obj)
  34. def has_add_permission(self, request):
  35. return False
  36. def has_delete_permission(self, request, obj=None):
  37. return request.user.has_perm('banking.validate_payment')
  38. def get_queryset(self, request):
  39. return super().get_queryset(request).filter(validated=True)
  40. class PendingOrNewPaymentInline(PaymentInline):
  41. verbose_name_plural = 'Paiements en attente de validation et nouveaux paiements'
  42. def get_queryset(self, request):
  43. return super().get_queryset(request).filter(validated=False)
  44. class PaymentTypeFilter(admin.SimpleListFilter):
  45. title = 'type de paiement'
  46. parameter_name = 'type'
  47. def lookups(self, request, model_admin):
  48. choices = [
  49. ('membership', 'Cotisation'),
  50. ('service', 'Service'),
  51. ]
  52. service_types = ServiceType.objects.all()
  53. if not (request.user.is_superuser or request.user.has_perm('banking.validate_payment')):
  54. service_types = service_types.filter(group__in=request.user.groups.all())
  55. for stype in service_types:
  56. choices.append((stype.pk, 'Service (%s)' % stype.name))
  57. return choices
  58. def queryset(self, request, queryset):
  59. if self.value() == 'membership':
  60. return queryset.filter(reason_type__app_label='adhesions',
  61. reason_type__model='adherent')
  62. if self.value() == 'service':
  63. return queryset.filter(reason_type__app_label='services',
  64. reason_type__model='service')
  65. try:
  66. service_type = ServiceType.objects.get(pk=int(self.value()))
  67. except (ValueError, TypeError, ServiceType.DoesNotExist,):
  68. return queryset
  69. else:
  70. return queryset.filter(service__service_type=service_type)
  71. def validate_payment(payment, request, queryset):
  72. queryset.update(validated=True)
  73. class PaymentAdmin(PaymentMixin, admin.ModelAdmin):
  74. list_display_links = None
  75. list_filter = (PaymentTypeFilter, 'payment_method', 'validated',)
  76. def get_list_display(self, request):
  77. list_display = ()
  78. if request.user.has_perm('auth.change_user'):
  79. list_display += ('adherent_link',)
  80. else:
  81. list_display += ('get_adherent',)
  82. list_display += ('payment_type_verbose', 'amount',
  83. 'period', 'payment_method', 'validated',)
  84. if request.user.has_perm('banking.validate_payment'):
  85. list_display += ('change',)
  86. else:
  87. list_display += ('change_pending',)
  88. return list_display
  89. def adherent_link(self, obj):
  90. adherent = obj.get_adherent()
  91. url = reverse('admin:adhesions_adherent_change', args=[adherent.pk])
  92. return '<a href="%s">%s</a>' % (url, adherent)
  93. adherent_link.short_description = 'Adhérent'
  94. adherent_link.allow_tags = True
  95. def change(self, obj):
  96. url = reverse('admin:banking_payment_change', args=[obj.pk])
  97. return '<a href="%s" class="changelink">Modifier</a>' % url
  98. change.short_description = ''
  99. change.allow_tags = True
  100. def change_pending(self, obj):
  101. if obj.validated:
  102. return '-'
  103. else:
  104. return self.change(obj)
  105. change_pending.short_description = ''
  106. change_pending.allow_tags = True
  107. def get_actions(self, request):
  108. actions = super().get_actions(request)
  109. if request.user.has_perm('banking.validate_payment'):
  110. actions['validate'] = (validate_payment, 'validate', 'Valider les paiements sélectionnés')
  111. return actions
  112. def has_add_permission(self, request):
  113. return False
  114. def has_change_permission(self, request, obj=None):
  115. if obj and not request.user.has_perm('banking.validate_payment'):
  116. return not obj.validated
  117. return True
  118. def has_delete_permission(self, request, obj=None):
  119. if obj and not request.user.has_perm('banking.validate_payment'):
  120. return not obj.validated
  121. return False
  122. admin.site.register(Payment, PaymentAdmin)