Browse Source

amélioration gestion adhérents

Élie Bouttier 8 years ago
parent
commit
038e4748dc
5 changed files with 98 additions and 29 deletions
  1. 25 1
      adhesions/admin.py
  2. 1 1
      adhesions/apps.py
  3. 26 0
      adhesions/migrations/0002_auto_20161230_1814.py
  4. 45 27
      adhesions/models.py
  5. 1 0
      services/apps.py

+ 25 - 1
adhesions/admin.py

@@ -1,10 +1,26 @@
 from django.contrib import admin
+from django.contrib.contenttypes.admin import GenericStackedInline
+from django.contrib.auth.models import User
 
 from .models import Profile, Corporation, Adherent
 
 
+class AdherentInline(GenericStackedInline):
+    model = Adherent
+    ct_field = 'adherent_type'
+    ct_fk_field = 'adherent_id'
+    extra = 0
+
+    def get_max_num(self, request, obj=None, **kwargs):
+        if obj is None or obj.adhesion is None:
+            return 1
+        else:
+            return 0
+
+
 class ProfileAdmin(admin.ModelAdmin):
     list_display = ('user', 'phone_number',)
+    inlines = (AdherentInline,)
 
 
 class AdherentTypeFilter(admin.SimpleListFilter):
@@ -29,12 +45,20 @@ class AdherentTypeFilter(admin.SimpleListFilter):
 class AdherentAdmin(admin.ModelAdmin):
     list_display = ('id', 'adherent_name', 'type',)
     list_filter = (AdherentTypeFilter,)
+    fields = ('id', 'contribution',)
 
     def adherent_name(self, obj):
         return str(obj)
     adherent_name.short_description = 'Nom ou raison sociale'
 
+    def has_add_permission(self, request):
+        return False
+
+
+class CorporationAdmin(admin.ModelAdmin):
+    inlines = (AdherentInline,)
+
 
 admin.site.register(Profile, ProfileAdmin)
-admin.site.register(Corporation)
+admin.site.register(Corporation, CorporationAdmin)
 admin.site.register(Adherent, AdherentAdmin)

+ 1 - 1
adhesions/apps.py

@@ -3,7 +3,7 @@ from django.apps import AppConfig
 
 class AdhesionsConfig(AppConfig):
     name = 'adhesions'
-    verbose_name = 'adhésions'
+    verbose_name = 'Adhésions'
 
     def ready(self):
         import adhesions.signals

+ 26 - 0
adhesions/migrations/0002_auto_20161230_1814.py

@@ -0,0 +1,26 @@
+# -*- coding: utf-8 -*-
+# Generated by Django 1.10.3 on 2016-12-30 17:14
+from __future__ import unicode_literals
+
+from django.db import migrations, models
+import django.db.models.deletion
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('contenttypes', '0002_remove_content_type_name'),
+        ('adhesions', '0001_initial'),
+    ]
+
+    operations = [
+        migrations.AlterField(
+            model_name='adherent',
+            name='contribution',
+            field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='adherent', to='banking.Payment', verbose_name='Cotisation'),
+        ),
+        migrations.AlterUniqueTogether(
+            name='adherent',
+            unique_together=set([('adherent_type', 'adherent_id')]),
+        ),
+    ]

+ 45 - 27
adhesions/models.py

@@ -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)

+ 1 - 0
services/apps.py

@@ -3,3 +3,4 @@ from django.apps import AppConfig
 
 class ServicesConfig(AppConfig):
     name = 'services'
+    verbose_name = 'Services'