from django.db import models from django.contrib.contenttypes.fields import GenericForeignKey from django.contrib.contenttypes.models import ContentType from django.core.validators import MaxValueValidator class Payment(models.Model): TRANSFERT = 0 WITHDRAWAL = 1 PAYMENT_CHOICES = ( (TRANSFERT, 'Virement'), (WITHDRAWAL, 'Prélèvement'), ) limit = models.Q(app_label='adhesions', model='Adherent') \ | models.Q(app_label='services', model='Service') reason_type = models.ForeignKey(ContentType, on_delete=models.CASCADE, limit_choices_to=limit) reason_id = models.PositiveIntegerField() reason = GenericForeignKey('reason_type', 'reason_id') amount = models.DecimalField(max_digits=9, decimal_places=2, verbose_name='Montant') period = models.PositiveIntegerField(validators=[MaxValueValidator(12)], verbose_name='Période (mois)') 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') class Meta: verbose_name = 'paiement' def reason_verbose(self): if self.reason_type.app_label == 'adhesions': return 'Cotisation de %s' % self.reason if self.reason_type.app_label == 'services': return 'Service %s' % self.reason reason_verbose.short_description = 'Paiement' def __str__(self): s = str(self.amount) + '€' if self.period: if self.period == 1: s += '/mois' elif self.period == 12: s += '/an' else: s += '/%d mois' % self.period if self.payment_method == self.TRANSFERT: s += ' (virement)' elif self.payment_method == self.WITHDRAWAL: s += ' (prélèvement)' return s