models.py 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. from django.db import models
  2. from django.contrib.contenttypes.fields import GenericForeignKey
  3. from django.contrib.contenttypes.models import ContentType
  4. from django.core.validators import MaxValueValidator
  5. from django.core.urlresolvers import reverse
  6. class Payment(models.Model):
  7. TRANSFERT = 0
  8. WITHDRAWAL = 1
  9. PAYMENT_CHOICES = (
  10. (TRANSFERT, 'Virement'),
  11. (WITHDRAWAL, 'Prélèvement'),
  12. )
  13. limit = models.Q(app_label='adhesions', model='Adherent') \
  14. | models.Q(app_label='services', model='Service')
  15. reason_type = models.ForeignKey(ContentType, on_delete=models.CASCADE,
  16. limit_choices_to=limit)
  17. reason_id = models.PositiveIntegerField()
  18. reason = GenericForeignKey('reason_type', 'reason_id')
  19. amount = models.DecimalField(max_digits=9, decimal_places=2, verbose_name='Montant')
  20. period = models.PositiveIntegerField(validators=[MaxValueValidator(12)],
  21. verbose_name='Période (mois)')
  22. payment_method = models.IntegerField(choices=PAYMENT_CHOICES,
  23. verbose_name='Méthode de paiement')
  24. date = models.DateField(verbose_name='Date de paiement ou de début de paiement')
  25. validated = models.BooleanField(default=False, verbose_name='Paiement validé')
  26. class Meta:
  27. verbose_name = 'paiement'
  28. permissions = (
  29. ('validate_payment', 'Peut valider les paiements'),
  30. )
  31. def payment_type_verbose(self):
  32. if self.reason_type.app_label == 'adhesions' \
  33. and self.reason_type.model == 'adherent':
  34. return 'Cotisation'
  35. if self.reason_type.app_label == 'services' \
  36. and self.reason_type.model == 'service':
  37. return 'Service (%s)' % self.reason.service_type
  38. payment_type_verbose.short_description = 'Type'
  39. # Note: 'adherent' is already used as the related_query_name
  40. # of the GenericRelation on Adherent
  41. def get_adherent(self):
  42. adherent = None
  43. if self.reason_type.app_label == 'adhesions' \
  44. and self.reason_type.model == 'adherent':
  45. adherent = self.reason
  46. if self.reason_type.app_label == 'services' \
  47. and self.reason_type.model == 'service':
  48. adherent = self.reason.adherent
  49. url = reverse('admin:adhesions_adherent_change', args=[adherent.pk])
  50. return '<a href="%s">%s</a>' % (url, adherent)
  51. get_adherent.short_description = 'Adhérent'
  52. get_adherent.allow_tags = True
  53. def __str__(self):
  54. s = str(self.amount) + '€'
  55. if self.period:
  56. if self.period == 1:
  57. s += '/mois'
  58. elif self.period == 12:
  59. s += '/an'
  60. else:
  61. s += '/%d mois' % self.period
  62. if self.payment_method == self.TRANSFERT:
  63. s += ' (virement)'
  64. elif self.payment_method == self.WITHDRAWAL:
  65. s += ' (prélèvement)'
  66. return s