models.py 3.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  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 djadhere.utils import get_active_filter
  6. from banking.models import Payment
  7. class Adherent(models.Model):
  8. limit = models.Q(app_label='auth', model='user') \
  9. | models.Q(app_label='adhesions', model='corporation')
  10. id = models.AutoField(verbose_name='Numéro d’adhérent', primary_key=True, editable=True)
  11. adherent_type = models.ForeignKey(ContentType, on_delete=models.CASCADE,
  12. limit_choices_to=limit, verbose_name='Type d’adhérent')
  13. adherent_id = models.PositiveIntegerField(verbose_name='ID')
  14. adherent = GenericForeignKey('adherent_type', 'adherent_id')
  15. contributions = GenericRelation(Payment,
  16. content_type_field='reason_type',
  17. object_id_field='reason_id',
  18. related_query_name='adherent')
  19. created = models.DateTimeField(null=True, blank=True, auto_now_add=True)
  20. class Meta:
  21. verbose_name = 'adhérent'
  22. unique_together = ("adherent_type", "adherent_id")
  23. @property
  24. def contribution(self):
  25. try:
  26. return self.contributions.filter(get_active_filter()).get()
  27. except Payment.DoesNotExist:
  28. return None
  29. # MultipleObjectsReturned non catché volontairement, le filtrage par la méthode clean est censé
  30. # empêcher cette possibilité, si cette exception est levé on veut recevoir un mail avec l’erreur !
  31. @property
  32. def type(self):
  33. if self.adherent_type.app_label == 'auth' and self.adherent_type.model == 'user':
  34. return 'Personne physique'
  35. else:
  36. return 'Personne morale'
  37. def get_name(self):
  38. if self.adherent_type.app_label == 'auth' and self.adherent_type.model == 'user':
  39. return str(self.adherent.profile)
  40. else:
  41. return str(self.adherent)
  42. get_name.short_description = 'Nom ou raison sociale'
  43. def __str__(self):
  44. if self.id:
  45. return 'Adhérent #%d' % self.id
  46. else:
  47. return 'Adhérent #?'
  48. class Corporation(models.Model):
  49. social_reason = models.CharField(max_length=256, verbose_name='Raison sociale', unique=True)
  50. description = models.TextField(blank=True, default='')
  51. address = models.TextField(blank=True, default='', verbose_name='Adresse')
  52. members = models.ManyToManyField(User, blank=True, verbose_name='Membres')
  53. @property
  54. def adhesion(self):
  55. ctype = ContentType.objects.get_for_model(self)
  56. try:
  57. return Adherent.objects.get(adherent_type=ctype, adherent_id=self.pk)
  58. except Adherent.DoesNotExist:
  59. return None
  60. class Meta:
  61. verbose_name = 'personne morale'
  62. verbose_name_plural = 'personnes morales'
  63. def __str__(self):
  64. return self.social_reason