from django.contrib import admin from django.contrib.contenttypes.admin import GenericTabularInline from django.contrib.contenttypes.models import ContentType from django.db.models import Q from services.models import Service from .models import Payment class PaymentMixin: def get_fields(self, request, obj=None): fields = ('amount', 'period', 'payment_method', 'date',) if request.user.is_superuser or request.user.has_perm('banking.validate_payment'): fields += ('validated',) return fields def get_queryset(self, request): qs = super().get_queryset(request) if request.user.is_superuser or request.user.has_perm('banking.validate_payment'): return qs # Show only adherent contribution and payment related to a service for which the user is in managment group. user_ctype = ContentType.objects.get(app_label='adhesions', model='adherent') return qs.filter(Q(reason_type=user_ctype) | Q(service__service_type__group__in=request.user.groups.all())) class PaymentInlineMixin(PaymentMixin, GenericTabularInline): model = Payment ct_field = 'reason_type' ct_fk_field = 'reason_id' class ValidatedPaymentInline(PaymentInlineMixin): extra = 0 verbose_name_plural = 'Paiements validés' def get_readonly_fields(self, request, obj=None): return self.get_fields(request, obj) def has_add_permission(self, request): return False def has_delete_permission(self, request, obj=None): return request.user.has_perm('banking.validate_payment') def get_queryset(self, request): return super().get_queryset(request).filter(validated=True) class PendingOrNewPaymentInline(PaymentInlineMixin): extra = 1 verbose_name_plural = 'Paiements en attente de validation et nouveaux paiements' def get_queryset(self, request): return super().get_queryset(request).filter(validated=False) class PaymentAdmin(PaymentMixin, admin.ModelAdmin): list_display = ('reason_verbose', 'amount', 'period', 'payment_method', 'validated',) list_filter = ('payment_method', 'validated',) def has_change_permission(self, request, obj=None): if obj and not request.user.is_superuser: return not obj.validated return True def has_add_permission(self, request): return False admin.site.register(Payment, PaymentAdmin)