from django.db import models from django.contrib.auth.models import User from django.contrib.contenttypes.fields import GenericForeignKey, GenericRelation from django.contrib.contenttypes.models import ContentType from banking.models import Payment class Adherent(models.Model): limit = models.Q(app_label='auth', model='user') \ | models.Q(app_label='adhesions', model='corporation') id = models.AutoField(verbose_name='Numéro d’adhérent', primary_key=True, editable=True) adherent_type = models.ForeignKey(ContentType, on_delete=models.CASCADE, limit_choices_to=limit, verbose_name='Type d’adhérent') adherent_id = models.PositiveIntegerField(verbose_name='ID') adherent = GenericForeignKey('adherent_type', 'adherent_id') contribution = GenericRelation(Payment, content_type_field='reason_type', object_id_field='reason_id', related_query_name='adherent') class Meta: verbose_name = 'adhérent' unique_together = ("adherent_type", "adherent_id") @property def type(self): if self.adherent_type.app_label == 'auth' and self.adherent_type.model == 'user': return 'Personne physique' else: return 'Personne morale' def get_name(self): if self.adherent_type.app_label == 'auth' and self.adherent_type.model == 'user': return str(self.adherent.profile) else: return str(self.adherent) get_name.short_description = 'Nom ou raison sociale' def __str__(self): if self.id: return 'Adhérent #%d' % self.id else: return 'Adhérent #?' class Corporation(models.Model): social_reason = models.CharField(max_length=256, verbose_name='Raison sociale', unique=True) description = models.TextField(blank=True, default='') address = models.TextField(blank=True, default='', verbose_name='Adresse') members = models.ManyToManyField(User, blank=True, verbose_name='Membres') @property def adhesion(self): ctype = ContentType.objects.get_for_model(self) try: return Adherent.objects.get(adherent_type=ctype, adherent_id=self.pk) except Adherent.DoesNotExist: return None class Meta: verbose_name = 'personne morale' verbose_name_plural = 'personnes morales' def __str__(self): return self.social_reason