models.py 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. from django.db import models
  2. from django.contrib.auth.models import User
  3. from django.contrib.contenttypes.fields import GenericForeignKey, GenericRelation
  4. from django.contrib.contenttypes.models import ContentType
  5. from banking.models import Payment
  6. class Adherent(models.Model):
  7. limit = models.Q(app_label='auth', model='user') \
  8. | models.Q(app_label='adhesions', model='corporation')
  9. id = models.AutoField(verbose_name='Numéro d’adhérent', primary_key=True, editable=True)
  10. adherent_type = models.ForeignKey(ContentType, on_delete=models.CASCADE,
  11. limit_choices_to=limit, verbose_name='Type d’adhérent')
  12. adherent_id = models.PositiveIntegerField(verbose_name='ID')
  13. adherent = GenericForeignKey('adherent_type', 'adherent_id')
  14. contribution = GenericRelation(Payment,
  15. content_type_field='reason_type',
  16. object_id_field='reason_id',
  17. related_query_name='adherent')
  18. class Meta:
  19. verbose_name = 'adhérent'
  20. unique_together = ("adherent_type", "adherent_id")
  21. @property
  22. def type(self):
  23. if self.adherent_type.app_label == 'auth' and self.adherent_type.model == 'user':
  24. return 'Personne physique'
  25. else:
  26. return 'Personne morale'
  27. def __str__(self):
  28. if self.adherent_type.app_label == 'auth' and self.adherent_type.model == 'user':
  29. return str(self.adherent.profile)
  30. else:
  31. return str(self.adherent)
  32. class AdhesionMixin:
  33. @property
  34. def adhesion(self):
  35. try:
  36. return self.adhesions.get()
  37. except Adherent.DoesNotExist:
  38. return None
  39. class Profile(AdhesionMixin, models.Model):
  40. user = models.OneToOneField(User, related_name='profile', verbose_name='Utilisateur')
  41. phone_number = models.CharField(max_length=16, blank=True, default='',
  42. verbose_name='Numéro de téléphone')
  43. address = models.TextField(blank=True, default='', verbose_name='Adresse')
  44. class Meta:
  45. verbose_name = 'profil'
  46. @property
  47. def adherent(self):
  48. ctype = ContentType.objects.get_for_model(User)
  49. try:
  50. adherent = Adherent.objects.get(adherent_type=ctype, adherent_id=self.user.pk)
  51. except Adherent.DoesNotExist:
  52. return None
  53. else:
  54. return adherent
  55. def __str__(self):
  56. return self.user.get_full_name() or self.user.username
  57. class Corporation(AdhesionMixin, models.Model):
  58. social_reason = models.CharField(max_length=256, verbose_name='Raison sociale')
  59. description = models.TextField(blank=True, default='')
  60. address = models.TextField(blank=True, default='', verbose_name='Adresse')
  61. members = models.ManyToManyField(User, blank=True, verbose_name='Membres')
  62. class Meta:
  63. verbose_name = 'personne morale'
  64. verbose_name_plural = 'personnes morales'
  65. @property
  66. def adherent(self):
  67. ctype = ContentType.objects.get_for_model(self)
  68. try:
  69. adherent = Adherent.objects.get(adherent_type=ctype, adherent_id=self.pk)
  70. except Adherent.DoesNotExist:
  71. return None
  72. else:
  73. return adherent
  74. def __str__(self):
  75. return self.social_reason