123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155 |
- 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', 'start', 'end')
- 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 '<a href="%s">%s</a>' % (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 '<a href="%s" class="changelink">Modifier</a>' % 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)
|