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 django.core.urlresolvers import reverse from services.models import ServiceType from .models import Payment class PaymentMixin: def get_fields(self, request, obj=None): fields = ('amount', 'period', 'payment_method', 'date',) if request.user.has_perm('banking.validate_payment'): fields += ('validated',) return fields def get_queryset(self, request): qs = super().get_queryset(request) if 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 PaymentInline(PaymentMixin, GenericTabularInline): model = Payment ct_field = 'reason_type' ct_fk_field = 'reason_id' extra = 1 class ValidatedPaymentInline(PaymentInline): extra = 0 verbose_name_plural = 'Paiements validés' def get_readonly_fields(self, request, obj=None): if request.user.has_perm('banking.validate_payment'): return () else: 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(PaymentInline): 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 PaymentTypeFilter(admin.SimpleListFilter): title = 'type de paiement' parameter_name = 'type' def lookups(self, request, model_admin): choices = [ ('membership', 'Cotisation'), ('service', 'Service'), ] service_types = ServiceType.objects.all() if not (request.user.is_superuser or request.user.has_perm('banking.validate_payment')): service_types = service_types.filter(group__in=request.user.groups.all()) for stype in service_types: choices.append((stype.pk, 'Service (%s)' % stype.name)) return choices def queryset(self, request, queryset): if self.value() == 'membership': return queryset.filter(reason_type__app_label='adhesions', reason_type__model='adherent') if self.value() == 'service': return queryset.filter(reason_type__app_label='services', reason_type__model='service') try: service_type = ServiceType.objects.get(pk=int(self.value())) except (ValueError, TypeError, ServiceType.DoesNotExist,): return queryset else: return queryset.filter(service__service_type=service_type) def validate_payment(payment, request, queryset): queryset.update(validated=True) class PaymentAdmin(PaymentMixin, admin.ModelAdmin): list_display_links = None list_filter = (PaymentTypeFilter, 'payment_method', 'validated',) def get_list_display(self, request): list_display = () if request.user.has_perm('auth.change_user'): list_display += ('adherent_link',) else: list_display += ('get_adherent',) list_display += ('payment_type_verbose', 'amount', 'period', 'payment_method', 'validated',) if request.user.has_perm('banking.validate_payment'): list_display += ('change',) else: list_display += ('change_pending',) return list_display def adherent_link(self, obj): adherent = obj.get_adherent() url = reverse('admin:adhesions_adherent_change', args=[adherent.pk]) return '%s' % (url, adherent) adherent_link.short_description = 'Adhérent' adherent_link.allow_tags = True def change(self, obj): url = reverse('admin:banking_payment_change', args=[obj.pk]) return 'Modifier' % url change.short_description = '' change.allow_tags = True def change_pending(self, obj): if obj.validated: return '-' else: return self.change(obj) change_pending.short_description = '' change_pending.allow_tags = True def get_actions(self, request): actions = super().get_actions(request) if request.user.has_perm('banking.validate_payment'): actions['validate'] = (validate_payment, 'validate', 'Valider les paiements sélectionnés') return actions def has_add_permission(self, request): return False def has_change_permission(self, request, obj=None): if obj and not request.user.has_perm('banking.validate_payment'): return not obj.validated return True def has_delete_permission(self, request, obj=None): if obj and not request.user.has_perm('banking.validate_payment'): return not obj.validated return False admin.site.register(Payment, PaymentAdmin)