models.py 4.6 KB

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