models.py 3.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  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.IntegerField(verbose_name='Numéro d’adhérent', primary_key=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 = models.ForeignKey(Payment, on_delete=models.CASCADE,
  15. null=True, blank=True, related_name='adherent',
  16. verbose_name='Cotisation')
  17. class Meta:
  18. verbose_name = 'adhérent'
  19. unique_together = ("adherent_type", "adherent_id")
  20. @property
  21. def type(self):
  22. if self.adherent_type.app_label == 'auth' and self.adherent_type.model == 'user':
  23. return 'Personne physique'
  24. else:
  25. return 'Personne morale'
  26. def __str__(self):
  27. if self.adherent_type.app_label == 'auth' and self.adherent_type.model == 'user':
  28. return str(self.adherent.profile)
  29. else:
  30. return str(self.adherent)
  31. class AdhesionMixin:
  32. @property
  33. def adhesion(self):
  34. try:
  35. return self.adhesions.get()
  36. except Adherent.DoesNotExist:
  37. return None
  38. class Profile(AdhesionMixin, models.Model):
  39. user = models.OneToOneField(User, related_name='profile', verbose_name='Utilisateur')
  40. phone_number = models.CharField(max_length=16, blank=True, default='',
  41. verbose_name='Numéro de téléphone')
  42. address = models.TextField(blank=True, default='', verbose_name='Adresse')
  43. adhesions = GenericRelation(Adherent, content_type_field='adherent_type',
  44. object_id_field='adherent_id', related_query_name='users')
  45. class Meta:
  46. verbose_name = 'profil'
  47. def __str__(self):
  48. return self.user.get_full_name() or self.user.username
  49. class Corporation(AdhesionMixin, models.Model):
  50. social_reason = models.CharField(max_length=256, verbose_name='Raison sociale')
  51. description = models.TextField(blank=True, default='')
  52. address = models.TextField(blank=True, default='', verbose_name='Adresse')
  53. members = models.ManyToManyField(User, blank=True, verbose_name='Membres')
  54. adhesions = GenericRelation(Adherent,
  55. content_type_field='adherent_type',
  56. object_id_field='adherent_id',
  57. related_query_name='corporations')
  58. class Meta:
  59. verbose_name = 'personne morale'
  60. verbose_name_plural = 'personnes morales'
  61. def __str__(self):
  62. return self.social_reason