Browse Source

Improve django admin forms for members.
Add filter to filter members where there membership fee late.
Add actions to bulk set members / non members.

Fabs 11 years ago
parent
commit
51817ed389

+ 35 - 3
coin/members/admin.py

@@ -2,9 +2,11 @@
 from django.contrib import admin
 from coin.members.models import Member, CryptoKey, LdapUser, MembershipFee
 from django import forms
+from coin.members.membershipfee_filter import DecadeBornListFilter
 import pprint
 
 
+
 # class LdapUserAdmin(admin.ModelAdmin):
 #    exclude = ['dn']
 #    list_display = ['uid','first_name', 'last_name']
@@ -14,9 +16,16 @@ import pprint
     #def save_model(self, request, obj, form, change):
         
 
+
+
 class CryptoKeyInline(admin.StackedInline):
     model = CryptoKey
     extra = 0
+    
+class MembershipFeeInline(admin.TabularInline):
+    model = MembershipFee
+    extra = 0
+    fields = ('start_date','end_date','amount')
 
 class MemberAdminForm(forms.ModelForm):
     # password = forms.CharField(widget=forms.PasswordInput(), required=False)
@@ -30,15 +39,38 @@ class MemberAdminForm(forms.ModelForm):
         model = Member
 
 class MemberAdmin(admin.ModelAdmin):
-    list_display = ('id', 'first_name', 'last_name','email')
+    list_display = ('id', 'status', 'first_name', 'last_name','email')
     list_display_links = ('id', 'first_name', 'last_name')
+    list_filter = ('status',DecadeBornListFilter)
     search_fields = ['first_name','last_name','email']
+    actions = ['set_as_member', 'set_as_non_member']
+    
+    fields =    ('status', 
+                'type', 
+                ('first_name', 'last_name', 'organization_name'), 
+                ('email', 'home_phone_number','mobile_phone_number'), 
+                'address', 
+                ('postal_code', 'city', 'country'), 
+                ('entry_date','resign_date'))
+    radio_fields = {"type": admin.HORIZONTAL}
+    
+    save_on_top = True
     
     form = MemberAdminForm
-    inlines = [CryptoKeyInline]
+    inlines = [CryptoKeyInline, MembershipFeeInline]
+    
+    def set_as_member(self, request, queryset):
+        rows_updated = queryset.update(status='adherent')
+        self.message_user(request, "%i membre(s) définis comme adhérent(s)." % rows_updated)
+    set_as_member.short_description = "Définir comme adhérent"
+
+    def set_as_non_member(self, request, queryset):
+        rows_updated = queryset.update(status='non_adherent')
+        self.message_user(request, "%i membre(s) définis comme non adhérent(s)." % rows_updated)
+    set_as_non_member.short_description = "Définir comme non adhérent"
 
 class MembershipFeeAdmin(admin.ModelAdmin):
-    list_display = ('member', 'date', 'amount')
+    list_display = ('member', 'end_date', 'amount')
     
 
 admin.site.register(Member, MemberAdmin)

+ 41 - 0
coin/members/membershipfee_filter.py

@@ -0,0 +1,41 @@
+from django.contrib.admin import SimpleListFilter
+import datetime
+
+class DecadeBornListFilter(SimpleListFilter):
+    # Human-readable title which will be displayed in the
+    # right admin sidebar just above the filter options.
+    title = 'Cotisations'
+
+    # Parameter for the filter that will be used in the URL query.
+    parameter_name = 'fee'
+
+    def lookups(self, request, model_admin):
+        """
+        Returns a list of tuples. The first element in each
+        tuple is the coded value for the option that will
+        appear in the URL query. The second element is the
+        human-readable name for the option that will appear
+        in the right sidebar.
+        """
+        return (
+            ('ok', 'Ajour de cotisation'),
+            ('retard', 'En retard'),
+        )
+
+    def queryset(self, request, queryset):
+        """
+        Returns the filtered queryset based on the value
+        provided in the query string and retrievable via
+        `self.value()`.
+        """
+        # Compare the requested value (either '80s' or '90s')
+        # to decide how to filter the queryset.
+        if self.value() == 'ok':
+            return queryset.filter(membershipfee__start_date__lte=datetime.date.today,
+                                     membershipfee__end_date__gte=datetime.date.today)
+        if self.value() == 'retard':
+            return queryset.exclude(membershipfee__start_date__lte=datetime.date.today,
+                                     membershipfee__end_date__gte=datetime.date.today)
+        #if self.value() == '90s':
+            #return queryset.filter(birthday__gte=date(1990, 1, 1),
+                                    #birthday__lte=date(1999, 12, 31))

+ 79 - 0
coin/members/migrations/0007_auto__del_field_membershipfee_date__add_field_membershipfee_start_date.py

@@ -0,0 +1,79 @@
+# -*- coding: utf-8 -*-
+import datetime
+from south.db import db
+from south.v2 import SchemaMigration
+from django.db import models
+
+
+class Migration(SchemaMigration):
+
+    def forwards(self, orm):
+        # Deleting field 'MembershipFee.date'
+        db.delete_column(u'members_membershipfee', 'date')
+
+        # Adding field 'MembershipFee.start_date'
+        db.add_column(u'members_membershipfee', 'start_date',
+                      self.gf('django.db.models.fields.DateField')(default=datetime.date.today),
+                      keep_default=False)
+
+        # Adding field 'MembershipFee.end_date'
+        db.add_column(u'members_membershipfee', 'end_date',
+                      self.gf('django.db.models.fields.DateField')(default=datetime.datetime(2014, 11, 9, 0, 0)),
+                      keep_default=False)
+
+
+    def backwards(self, orm):
+        # Adding field 'MembershipFee.date'
+        db.add_column(u'members_membershipfee', 'date',
+                      self.gf('django.db.models.fields.DateField')(default='2011-07-04'),
+                      keep_default=False)
+
+        # Deleting field 'MembershipFee.start_date'
+        db.delete_column(u'members_membershipfee', 'start_date')
+
+        # Deleting field 'MembershipFee.end_date'
+        db.delete_column(u'members_membershipfee', 'end_date')
+
+
+    models = {
+        u'members.cryptokey': {
+            'Meta': {'object_name': 'CryptoKey'},
+            u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'key': ('django.db.models.fields.TextField', [], {}),
+            'member': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['members.Member']"}),
+            'type': ('django.db.models.fields.CharField', [], {'max_length': '3'})
+        },
+        u'members.ldapuser': {
+            'Meta': {'object_name': 'LdapUser', 'managed': 'False'},
+            'dn': ('django.db.models.fields.CharField', [], {'max_length': '200'})
+        },
+        u'members.member': {
+            'Meta': {'object_name': 'Member'},
+            'address': ('django.db.models.fields.TextField', [], {}),
+            'city': ('django.db.models.fields.CharField', [], {'max_length': '200'}),
+            'country': ('django.db.models.fields.CharField', [], {'max_length': '200'}),
+            'email': ('django.db.models.fields.EmailField', [], {'max_length': '254'}),
+            'entry_date': ('django.db.models.fields.DateField', [], {'default': 'datetime.date.today'}),
+            'first_name': ('django.db.models.fields.CharField', [], {'max_length': '200'}),
+            'home_phone_number': ('django.db.models.fields.CharField', [], {'max_length': '25', 'blank': 'True'}),
+            u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'last_name': ('django.db.models.fields.CharField', [], {'max_length': '200'}),
+            'ldap_cn': ('django.db.models.fields.CharField', [], {'max_length': '200', 'blank': 'True'}),
+            'mobile_phone_number': ('django.db.models.fields.CharField', [], {'max_length': '25', 'blank': 'True'}),
+            'organization_name': ('django.db.models.fields.CharField', [], {'max_length': '200', 'blank': 'True'}),
+            'postal_code': ('django.db.models.fields.CharField', [], {'max_length': '15'}),
+            'resign_date': ('django.db.models.fields.DateField', [], {'null': 'True', 'blank': 'True'}),
+            'status': ('django.db.models.fields.CharField', [], {'default': "'non_adherent'", 'max_length': '50'}),
+            'type': ('django.db.models.fields.CharField', [], {'default': "'personne_physique'", 'max_length': '20'})
+        },
+        u'members.membershipfee': {
+            'Meta': {'object_name': 'MembershipFee'},
+            'amount': ('django.db.models.fields.IntegerField', [], {'default': "'20'"}),
+            'end_date': ('django.db.models.fields.DateField', [], {'default': 'datetime.datetime(2014, 11, 9, 0, 0)'}),
+            u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'member': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['members.Member']"}),
+            'start_date': ('django.db.models.fields.DateField', [], {'default': 'datetime.date.today'})
+        }
+    }
+
+    complete_apps = ['members']

+ 11 - 5
coin/members/models.py

@@ -6,7 +6,9 @@ from ldapdb.models.fields import CharField, IntegerField, ListField
 from django.db.models.signals import post_save, pre_save
 from django.dispatch import receiver
 from south.modelsinspector import add_ignored_fields
-from datetime import date
+import datetime
+from django.core import exceptions
+
 
 class LdapUser(ldapdb.models.Model):
     base_dn = "ou=users,o=ILLYSE,l=Villeurbanne,st=RHA,c=FR" #TODO déplacer dans settings.py
@@ -45,7 +47,7 @@ class Member(models.Model):
     postal_code = models.CharField(max_length=15);  
     city = models.CharField(max_length=200);
     country = models.CharField(max_length=200);
-    entry_date = models.DateField(null=False, blank=False, default=date.today);
+    entry_date = models.DateField(null=False, blank=False, default=datetime.date.today);
     resign_date = models.DateField(null=True, blank=True);
         
     def __unicode__(self):
@@ -66,15 +68,19 @@ class CryptoKey(models.Model):
 class MembershipFee(models.Model):
     member = models.ForeignKey('Member');
     amount = models.IntegerField(null=False, default='20');
-    date = models.DateField(null=False, blank=False, default=date.today);
-
+    start_date = models.DateField(null=False, blank=False, default=datetime.date.today);
+    end_date = models.DateField(null=False, blank=False, default=datetime.date.today() + datetime.timedelta(365));
 
 #~ Lors de la sauvegarde d'un membre, cette fonction est exécutée pour mettre à jour les données dans le LDAP
 @receiver(post_save, sender=Member)
 def sync_ldap(sender, instance, created, **kwargs):
 
     if not created:
-        ldap_user = LdapUser.objects.get(pk=instance.ldap_cn)
+       # try:
+            ldap_user = LdapUser.objects.get(pk=instance.ldap_cn)
+       # except exceptions.ObjectDoesNotExist:
+       #     created = True
+            
     if created:
         ldap_user = LdapUser()
         ldap_user.pk = instance.ldap_cn