Browse Source

validation des paiements (perm. validate_payment)

Élie Bouttier 8 years ago
parent
commit
8e4656853c
5 changed files with 81 additions and 15 deletions
  1. 2 2
      adhesions/admin.py
  2. 49 11
      banking/admin.py
  3. 24 0
      banking/migrations/0004_payment_validation.py
  4. 4 0
      banking/models.py
  5. 2 2
      services/admin.py

+ 2 - 2
adhesions/admin.py

@@ -4,7 +4,7 @@ from django.contrib.auth.models import User
 
 from .forms import AdherentForm
 from .models import Profile, Corporation, Adherent
-from banking.admin import PaymentInline
+from banking.admin import ValidatedPaymentInline, PendingOrNewPaymentInline
 
 
 class ProfileInline(admin.StackedInline):
@@ -48,7 +48,7 @@ class AdherentTypeFilter(admin.SimpleListFilter):
 class AdherentAdmin(admin.ModelAdmin):
     list_display = ('id', 'adherent_name', 'type',)
     list_filter = (AdherentTypeFilter,)
-    inlines = (PaymentInline,)
+    inlines = (ValidatedPaymentInline, PendingOrNewPaymentInline,)
     fields = ('id',)
     readonly_fields = ('id',)
 

+ 49 - 11
banking/admin.py

@@ -1,29 +1,67 @@
 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 PaymentInline(GenericTabularInline):
+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'
-    extra = 1
 
 
-class PaymentAdmin(admin.ModelAdmin):
-    list_display = ('reason_verbose', 'amount', 'period', 'payment_method',)
-    list_filter = ('payment_method',)
-    fields = ('amount', 'period', 'payment_method',)
+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):
-        qs = super().get_queryset(request)
-        if request.user.is_superuser:
-            return qs
-        # Show only payment related to a service for which the user is in managment group.
-        return qs.filter(service__service_type__group__in=request.user.groups.all())
+        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

+ 24 - 0
banking/migrations/0004_payment_validation.py

@@ -0,0 +1,24 @@
+# -*- coding: utf-8 -*-
+# Generated by Django 1.10.3 on 2017-01-02 15:48
+from __future__ import unicode_literals
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('banking', '0003_payment_reason'),
+    ]
+
+    operations = [
+        migrations.AlterModelOptions(
+            name='payment',
+            options={'permissions': (('validate_payment', 'Peut valider les paiements'),), 'verbose_name': 'paiement'},
+        ),
+        migrations.AddField(
+            model_name='payment',
+            name='validated',
+            field=models.BooleanField(default=False, verbose_name='Paiement validé'),
+        ),
+    ]

+ 4 - 0
banking/models.py

@@ -23,9 +23,13 @@ class Payment(models.Model):
     payment_method = models.IntegerField(choices=PAYMENT_CHOICES,
                                          verbose_name='Méthode de paiement')
     date = models.DateField(verbose_name='Date de paiement ou de début de paiement')
+    validated = models.BooleanField(default=False, verbose_name='Paiement validé')
 
     class Meta:
         verbose_name = 'paiement'
+        permissions = (
+            ('validate_payment', 'Peut valider les paiements'),
+        )
 
     def reason_verbose(self):
         if self.reason_type.app_label == 'adhesions':

+ 2 - 2
services/admin.py

@@ -3,7 +3,7 @@ from django.db.models import Q
 from django.utils import timezone
 
 from .models import Service, ServiceType, IPResource
-from banking.admin import PaymentInline
+from banking.admin import ValidatedPaymentInline, PendingOrNewPaymentInline
 
 
 class ServiceTypeFilter(admin.SimpleListFilter):
@@ -45,7 +45,7 @@ class ServiceStatusFilter(admin.SimpleListFilter):
 class ServiceAdmin(admin.ModelAdmin):
     list_display = ('id', 'adherent', 'service_type', 'start', 'end', 'status')
     list_filter = (ServiceStatusFilter, ServiceTypeFilter,)
-    inlines = (PaymentInline,)
+    inlines = (ValidatedPaymentInline, PendingOrNewPaymentInline,)
 
     def status(self, obj):
         return obj.is_ongoing