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
### Inlines
class PaymentInline(GenericTabularInline):
model = Payment
ct_field = 'reason_type'
ct_fk_field = 'reason_id'
extra = 0
#max_num = 0
fields = ('amount', 'period', 'payment_method', 'start', 'end',)
#readonly_fields = ('amount', 'period', 'payment_method', 'start',)
verbose_name_plural = 'Contributions'
#def get_queryset(self, request):
# # Paiement récurrent en cours (sans date de fin)
# return super().get_queryset(request).filter(period__gt=0, end__isnull=True)
#def has_delete_permission(self, request, obj=None):
# return False
#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)
### Filters
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='adhesion')
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)
#### Actions
#
#def validate_payment(payment, request, queryset):
# queryset.update(validated=True)
### ModelAdmin
class PaymentAdmin(admin.ModelAdmin):
list_display = ('id', 'type_verbose', 'get_adhesion', 'amount', 'period', 'start_display', 'end_display',)
# #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', 'get_adherent', 'amount',
# 'period', 'payment_method', 'start_display', 'end_display', 'validated_display',)
# #if request.user.has_perm('banking.validate_payment'):
# # list_display += ('change',)
# #else:
# # list_display += ('change_pending',)
# return list_display
#
def start_display(self, obj):
return obj.start
start_display.short_description = 'Début'
def end_display(self, obj):
return obj.end
end_display.short_description = 'Fin'
#
# def validated_display(self, obj):
# return obj.validated
# validated_display.short_description = 'Validé'
# validated_display.boolean = True
#
# #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)