models.py 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128
  1. from django.db import models
  2. from django.urls import reverse
  3. from django.contrib.auth.models import User as AuthUser
  4. from django.contrib.contenttypes.fields import GenericForeignKey, GenericRelation
  5. from django.contrib.contenttypes.models import ContentType
  6. from django.core.urlresolvers import reverse
  7. from django.utils.html import format_html
  8. from djadhere.utils import get_active_filter
  9. from banking.models import Payment
  10. # Terminologie : une « adhésion » désgine une instance de ce modèle
  11. # tandis qu’un « adhérent » désigne un user ou une corporation.
  12. class Adhesion(models.Model):
  13. limit = models.Q(app_label='auth', model='user') \
  14. | models.Q(app_label='adhesions', model='corporation')
  15. id = models.AutoField(verbose_name='Numéro d’adhérent', primary_key=True, editable=True)
  16. adherent_type = models.ForeignKey(ContentType, on_delete=models.CASCADE,
  17. limit_choices_to=limit, verbose_name='Type d’adhérent')
  18. adherent_id = models.PositiveIntegerField(verbose_name='ID')
  19. adherent = GenericForeignKey('adherent_type', 'adherent_id')
  20. contributions = GenericRelation(Payment,
  21. content_type_field='reason_type',
  22. object_id_field='reason_id',
  23. related_query_name='adhesion')
  24. created = models.DateTimeField(null=True, blank=True, auto_now_add=True)
  25. notes = models.TextField(blank=True, default='')
  26. active = models.NullBooleanField(default=None, verbose_name='Adhésion en cours')
  27. class Meta:
  28. verbose_name = 'adhésion'
  29. unique_together = ("adherent_type", "adherent_id")
  30. ordering = ('id',)
  31. @property
  32. def contribution(self):
  33. try:
  34. return self.contributions.exclude(period=0).filter(get_active_filter()).get()
  35. except Payment.DoesNotExist:
  36. return None
  37. # MultipleObjectsReturned non catché volontairement, le filtrage par la méthode clean est censé
  38. # empêcher cette possibilité, si cette exception est levé on veut recevoir un mail avec l’erreur !
  39. def is_physical(self):
  40. return self.adherent_type.app_label == 'auth' and self.adherent_type.model == 'user'
  41. def is_moral(self):
  42. return self.adherent_type.app_label == 'adhesions' and self.adherent_type.model == 'corporation'
  43. @property
  44. def type(self):
  45. if self.is_physical():
  46. return 'Personne physique'
  47. else:
  48. return 'Personne morale'
  49. def get_adherent_name(self):
  50. if self.is_physical():
  51. return str(self.adherent.profile)
  52. else:
  53. return str(self.adherent)
  54. get_adherent_name.short_description = 'Nom ou raison sociale'
  55. def get_adherent_link(self):
  56. url = reverse('admin:adhesions_%s_change' % self.adherent._meta.model_name, args=(self.adherent.id,))
  57. return format_html(u'<a href="{}">{}</a>', url, self.get_adherent_name())
  58. get_adherent_link.short_description = 'Nom ou raison sociale'
  59. def get_adhesion_link(self):
  60. url = reverse('admin:adhesions_adhesion_change', args=(self.id,))
  61. return format_html(u'<a href="{}">ADT{}</a>', url, str(self.id))
  62. get_adhesion_link.short_description = 'Numéro d’adhérent'
  63. def __str__(self):
  64. return 'ADT%d' % self.id
  65. if self.id is None:
  66. return '?'
  67. else:
  68. return 'ADT%d (%s)' % (self.id, self.get_adherent_name())
  69. class User(AuthUser):
  70. class Meta:
  71. proxy = True
  72. verbose_name = 'personne physique'
  73. verbose_name_plural = 'personnes physiques'
  74. def get_model_perms(self, request):
  75. return {}
  76. @property
  77. def adhesion(self): # user adhesion
  78. return self.profile.adhesion
  79. @property
  80. def adhesions(self): # user and corporations (for which the user is a member) adhesions
  81. return self.profile.adhesions
  82. def __str__(self):
  83. return self.get_full_name() or self.username
  84. class Corporation(models.Model):
  85. social_reason = models.CharField(max_length=256, verbose_name='Raison sociale', unique=True)
  86. description = models.TextField(blank=True, default='')
  87. members = models.ManyToManyField(User, blank=True, verbose_name='Membres',
  88. related_name='corporations', related_query_name='corporation')
  89. email = models.EmailField(verbose_name='Adresse e-mail', blank=True)
  90. phone_number = models.CharField(max_length=16, blank=True, default='',
  91. verbose_name='Numéro de téléphone')
  92. address = models.TextField(blank=True, default='', verbose_name='Adresse')
  93. notes = models.TextField(blank=True, default='')
  94. @property
  95. def adhesion(self):
  96. ctype = ContentType.objects.get_for_model(self)
  97. try:
  98. return Adhesion.objects.get(adherent_type=ctype, adherent_id=self.pk)
  99. except Adhesion.DoesNotExist:
  100. return None
  101. class Meta:
  102. verbose_name = 'personne morale'
  103. verbose_name_plural = 'personnes morales'
  104. def __str__(self):
  105. return self.social_reason