|
@@ -1,17 +1,55 @@
|
|
|
from django.db import models
|
|
|
from django.contrib.auth.models import User
|
|
|
-from django.contrib.contenttypes.fields import GenericForeignKey
|
|
|
+from django.contrib.contenttypes.fields import GenericForeignKey, GenericRelation
|
|
|
from django.contrib.contenttypes.models import ContentType
|
|
|
|
|
|
|
|
|
from banking.models import Payment
|
|
|
|
|
|
|
|
|
-class Profile(models.Model):
|
|
|
+class Adherent(models.Model):
|
|
|
+ limit = models.Q(app_label='auth', model='user') \
|
|
|
+ | models.Q(app_label='adhesions', model='corporation')
|
|
|
+ id = models.IntegerField(verbose_name='Numéro d’adhérent', primary_key=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 = models.ForeignKey(Payment, on_delete=models.CASCADE,
|
|
|
+ null=True, blank=True, related_name='adherent',
|
|
|
+ verbose_name='Cotisation')
|
|
|
+
|
|
|
+ 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 __str__(self):
|
|
|
+ return str(self.adherent)
|
|
|
+
|
|
|
+
|
|
|
+class AdhesionMixin:
|
|
|
+ @property
|
|
|
+ def adhesion(self):
|
|
|
+ try:
|
|
|
+ return self.adhesions.get()
|
|
|
+ except Adherent.DoesNotExist:
|
|
|
+ return None
|
|
|
+
|
|
|
+
|
|
|
+class Profile(AdhesionMixin, models.Model):
|
|
|
user = models.OneToOneField(User, related_name='profile', verbose_name='Utilisateur')
|
|
|
phone_number = models.CharField(max_length=16, blank=True, default='',
|
|
|
verbose_name='Numéro de téléphone')
|
|
|
address = models.TextField(blank=True, default='', verbose_name='Adresse')
|
|
|
+ adhesions = GenericRelation(Adherent, content_type_field='adherent_type',
|
|
|
+ object_id_field='adherent_id', related_query_name='users')
|
|
|
|
|
|
class Meta:
|
|
|
verbose_name = 'profil'
|
|
@@ -20,11 +58,15 @@ class Profile(models.Model):
|
|
|
return 'Profil de %s' % self.user
|
|
|
|
|
|
|
|
|
-class Corporation(models.Model):
|
|
|
+class Corporation(AdhesionMixin, models.Model):
|
|
|
social_reason = models.CharField(max_length=256, verbose_name='Raison sociale')
|
|
|
description = models.TextField(blank=True, default='')
|
|
|
address = models.TextField(blank=True, default='', verbose_name='Adresse')
|
|
|
members = models.ManyToManyField(User, blank=True, verbose_name='Membres')
|
|
|
+ adhesions = GenericRelation(Adherent,
|
|
|
+ content_type_field='adherent_type',
|
|
|
+ object_id_field='adherent_id',
|
|
|
+ related_query_name='corporations')
|
|
|
|
|
|
class Meta:
|
|
|
verbose_name = 'personne morale'
|
|
@@ -32,27 +74,3 @@ class Corporation(models.Model):
|
|
|
|
|
|
def __str__(self):
|
|
|
return self.social_reason
|
|
|
-
|
|
|
-
|
|
|
-class Adherent(models.Model):
|
|
|
- limit = models.Q(app_label='auth', model='user') | models.Q(app_label='adhesions', model='corporation')
|
|
|
- id = models.IntegerField(verbose_name='Numéro d’adhérent', primary_key=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 = models.ForeignKey(Payment, on_delete=models.CASCADE,
|
|
|
- related_name='adherent', null=True, blank=True)
|
|
|
-
|
|
|
- class Meta:
|
|
|
- verbose_name = 'adhérent'
|
|
|
-
|
|
|
- @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 __str__(self):
|
|
|
- return str(self.adherent)
|