admin.py 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  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 services.models import ServiceType
  6. from .models import Payment
  7. class PaymentMixin:
  8. def get_fields(self, request, obj=None):
  9. fields = ('amount', 'period', 'payment_method', 'date',)
  10. if request.user.is_superuser or request.user.has_perm('banking.validate_payment'):
  11. fields += ('validated',)
  12. return fields
  13. def get_queryset(self, request):
  14. qs = super().get_queryset(request)
  15. if request.user.is_superuser or request.user.has_perm('banking.validate_payment'):
  16. return qs
  17. # Show only adherent contribution and payment related to a service for which the user is in managment group.
  18. user_ctype = ContentType.objects.get(app_label='adhesions', model='adherent')
  19. return qs.filter(Q(reason_type=user_ctype) | Q(service__service_type__group__in=request.user.groups.all()))
  20. class PaymentInlineMixin(PaymentMixin, GenericTabularInline):
  21. model = Payment
  22. ct_field = 'reason_type'
  23. ct_fk_field = 'reason_id'
  24. class ValidatedPaymentInline(PaymentInlineMixin):
  25. extra = 0
  26. verbose_name_plural = 'Paiements validés'
  27. def get_readonly_fields(self, request, obj=None):
  28. return self.get_fields(request, obj)
  29. def has_add_permission(self, request):
  30. return False
  31. def has_delete_permission(self, request, obj=None):
  32. return request.user.has_perm('banking.validate_payment')
  33. def get_queryset(self, request):
  34. return super().get_queryset(request).filter(validated=True)
  35. class PendingOrNewPaymentInline(PaymentInlineMixin):
  36. extra = 1
  37. verbose_name_plural = 'Paiements en attente de validation et nouveaux paiements'
  38. def get_queryset(self, request):
  39. return super().get_queryset(request).filter(validated=False)
  40. class PaymentTypeFilter(admin.SimpleListFilter):
  41. title = 'type de paiement'
  42. parameter_name = 'type'
  43. def lookups(self, request, model_admin):
  44. choices = [
  45. ('membership', 'Cotisation'),
  46. ('service', 'Service'),
  47. ]
  48. service_types = ServiceType.objects.all()
  49. if not request.user.is_superuser:
  50. service_types = service_types.filter(group__in=request.user.groups.all())
  51. for stype in service_types:
  52. choices.append((stype.pk, 'Service (%s)' % stype.name))
  53. return choices
  54. def queryset(self, request, queryset):
  55. if self.value() == 'membership':
  56. return queryset.filter(reason_type__app_label='adhesions',
  57. reason_type__model='adherent')
  58. if self.value() == 'service':
  59. return queryset.filter(reason_type__app_label='services',
  60. reason_type__model='service')
  61. try:
  62. service_type = ServiceType.objects.get(pk=int(self.value()))
  63. except (ValueError, TypeError, ServiceType.DoesNotExist,):
  64. return queryset
  65. else:
  66. return queryset.filter(service__service_type=service_type)
  67. class PaymentAdmin(PaymentMixin, admin.ModelAdmin):
  68. list_display = ('get_adherent', 'payment_type_verbose', 'amount',
  69. 'period', 'payment_method', 'validated',)
  70. list_filter = (PaymentTypeFilter, 'payment_method', 'validated',)
  71. def has_change_permission(self, request, obj=None):
  72. if obj and not request.user.is_superuser:
  73. return not obj.validated
  74. return True
  75. def has_add_permission(self, request):
  76. return False
  77. admin.site.register(Payment, PaymentAdmin)