models.py 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. from django.db import models
  2. from django.urls import reverse
  3. from django.contrib.auth.models import User
  4. from django.contrib.contenttypes.fields import GenericForeignKey, GenericRelation
  5. from django.contrib.contenttypes.models import ContentType
  6. from djadhere.utils import get_active_filter
  7. from banking.models import Payment
  8. # Terminologie : une « adhésion » désgine une instance de ce modèle
  9. # tandis qu’un « adhérent » désigne un user ou une corporation.
  10. class Adhesion(models.Model):
  11. limit = models.Q(app_label='auth', model='user') \
  12. | models.Q(app_label='adhesions', model='corporation')
  13. id = models.AutoField(verbose_name='Numéro d’adhérent', primary_key=True, editable=True)
  14. adherent_type = models.ForeignKey(ContentType, on_delete=models.CASCADE,
  15. limit_choices_to=limit, verbose_name='Type d’adhérent')
  16. adherent_id = models.PositiveIntegerField(verbose_name='ID')
  17. adherent = GenericForeignKey('adherent_type', 'adherent_id')
  18. contributions = GenericRelation(Payment,
  19. content_type_field='reason_type',
  20. object_id_field='reason_id',
  21. related_query_name='adhesion')
  22. created = models.DateTimeField(null=True, blank=True, auto_now_add=True)
  23. class Meta:
  24. verbose_name = 'adhérent'
  25. unique_together = ("adherent_type", "adherent_id")
  26. @property
  27. def contribution(self):
  28. try:
  29. return self.contributions.exclude(period=0).filter(get_active_filter()).get()
  30. except Payment.DoesNotExist:
  31. return None
  32. # MultipleObjectsReturned non catché volontairement, le filtrage par la méthode clean est censé
  33. # empêcher cette possibilité, si cette exception est levé on veut recevoir un mail avec l’erreur !
  34. def is_physical(self):
  35. return self.adherent_type.app_label == 'auth' and self.adherent_type.model == 'user'
  36. def is_moral(self):
  37. return self.adherent_type.app_label == 'adhesions' and self.adherent_type.model == 'corporation'
  38. @property
  39. def type(self):
  40. if self.is_physical():
  41. return 'Personne physique'
  42. else:
  43. return 'Personne morale'
  44. def get_adherent_name(self):
  45. if self.is_physical():
  46. return str(self.adherent.profile)
  47. else:
  48. return str(self.adherent)
  49. get_adherent_name.short_description = 'Nom ou raison sociale'
  50. def get_adherent_detail_url(self):
  51. if self.is_physical():
  52. return reverse('user-detail', kwargs={'pk': self.adherent.pk})
  53. else:
  54. return reverse('corporation-detail', kwargs={'pk': self.adherent.pk})
  55. def get_adherent_edit_url(self):
  56. if self.is_physical():
  57. return reverse('user-edit', kwargs={'pk': self.adherent.pk})
  58. else:
  59. return reverse('corporation-edit', kwargs={'pk': self.adherent.pk})
  60. def get_absolute_url(self):
  61. return reverse('adhesion-detail', kwargs={'pk': self.pk})
  62. def __str__(self):
  63. if self.id:
  64. return 'ADT%d (%s)' % (self.id, self.get_adherent_name())
  65. else:
  66. return '?'
  67. class Corporation(models.Model):
  68. social_reason = models.CharField(max_length=256, verbose_name='Raison sociale', unique=True)
  69. description = models.TextField(blank=True, default='')
  70. address = models.TextField(blank=True, default='', verbose_name='Adresse')
  71. members = models.ManyToManyField(User, blank=True, verbose_name='Membres',
  72. related_name='corporations', related_query_name='corporation')
  73. @property
  74. def adhesion(self):
  75. ctype = ContentType.objects.get_for_model(self)
  76. try:
  77. return Adhesion.objects.get(adherent_type=ctype, adherent_id=self.pk)
  78. except Adhesion.DoesNotExist:
  79. return None
  80. def get_absolute_url(self):
  81. return reverse('corporation-detail', kwargs={'pk': self.pk})
  82. class Meta:
  83. verbose_name = 'personne morale'
  84. verbose_name_plural = 'personnes morales'
  85. def __str__(self):
  86. return self.social_reason