admin.py 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140
  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', 'date',)
  11. if request.user.is_superuser or 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.is_superuser or 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 PaymentInlineMixin(PaymentMixin, GenericTabularInline):
  22. model = Payment
  23. ct_field = 'reason_type'
  24. ct_fk_field = 'reason_id'
  25. class ValidatedPaymentInline(PaymentInlineMixin):
  26. extra = 0
  27. verbose_name_plural = 'Paiements validés'
  28. def get_readonly_fields(self, request, obj=None):
  29. return self.get_fields(request, obj)
  30. def has_add_permission(self, request):
  31. return False
  32. def has_delete_permission(self, request, obj=None):
  33. return request.user.has_perm('banking.validate_payment')
  34. def get_queryset(self, request):
  35. return super().get_queryset(request).filter(validated=True)
  36. class PendingOrNewPaymentInline(PaymentInlineMixin):
  37. extra = 1
  38. verbose_name_plural = 'Paiements en attente de validation et nouveaux paiements'
  39. def get_queryset(self, request):
  40. return super().get_queryset(request).filter(validated=False)
  41. class PaymentTypeFilter(admin.SimpleListFilter):
  42. title = 'type de paiement'
  43. parameter_name = 'type'
  44. def lookups(self, request, model_admin):
  45. choices = [
  46. ('membership', 'Cotisation'),
  47. ('service', 'Service'),
  48. ]
  49. service_types = ServiceType.objects.all()
  50. if not (request.user.is_superuser or request.user.has_perm('banking.validate_payment')):
  51. service_types = service_types.filter(group__in=request.user.groups.all())
  52. for stype in service_types:
  53. choices.append((stype.pk, 'Service (%s)' % stype.name))
  54. return choices
  55. def queryset(self, request, queryset):
  56. if self.value() == 'membership':
  57. return queryset.filter(reason_type__app_label='adhesions',
  58. reason_type__model='adherent')
  59. if self.value() == 'service':
  60. return queryset.filter(reason_type__app_label='services',
  61. reason_type__model='service')
  62. try:
  63. service_type = ServiceType.objects.get(pk=int(self.value()))
  64. except (ValueError, TypeError, ServiceType.DoesNotExist,):
  65. return queryset
  66. else:
  67. return queryset.filter(service__service_type=service_type)
  68. def validate_payment(payment, request, queryset):
  69. queryset.update(validated=True)
  70. class PaymentAdmin(PaymentMixin, admin.ModelAdmin):
  71. list_display_links = None
  72. list_filter = (PaymentTypeFilter, 'payment_method', 'validated',)
  73. def get_list_display(self, request):
  74. list_display = ('get_adherent', 'payment_type_verbose', 'amount',
  75. 'period', 'payment_method', 'validated',)
  76. if request.user.has_perm('banking.validate_payment'):
  77. list_display += ('change',)
  78. else:
  79. list_display += ('change_pending',)
  80. return list_display
  81. def change(self, obj):
  82. url = reverse('admin:banking_payment_change', args=[obj.pk])
  83. return '<a href="%s" class="changelink">Modifier</a>' % url
  84. change.short_description = ''
  85. change.allow_tags = True
  86. def change_pending(self, obj):
  87. if obj.validated:
  88. return '-'
  89. else:
  90. return self.change(obj)
  91. change_pending.short_description = ''
  92. change_pending.allow_tags = True
  93. def get_actions(self, request):
  94. actions = super().get_actions(request)
  95. if request.user.has_perm('banking.validate_payment'):
  96. actions['validate'] = (validate_payment, 'validate', 'Valider les paiements sélectionnés')
  97. return actions
  98. def has_add_permission(self, request):
  99. return False
  100. def has_change_permission(self, request, obj=None):
  101. if obj and not request.user.has_perm('banking.validate_payment'):
  102. return not obj.validated
  103. return True
  104. def has_delete_permission(self, request, obj=None):
  105. if obj and not request.user.has_perm('banking.validate_payment'):
  106. return not obj.validated
  107. return False
  108. admin.site.register(Payment, PaymentAdmin)