Browse Source

Fix create_super_user

Fabs 10 years ago
parent
commit
e31a0ebf74

+ 2 - 9
coin/members/admin.py

@@ -5,13 +5,6 @@ from django import forms
 from coin.members.membershipfee_filter import MembershipFeeFilter
 from coin.members.membershipfee_filter import MembershipFeeFilter
 import autocomplete_light
 import autocomplete_light
 
 
-# class LdapUserAdmin(admin.ModelAdmin):
-#    exclude = ['dn']
-#    list_display = ['uid','first_name', 'last_name']
-#    search_fields = ['first_name', 'last_name']
-    #TODO : Déplacer dans LdapUser model (pre_save ?)
-    #def save_model(self, request, obj, form, change):
-
 
 
 class CryptoKeyInline(admin.StackedInline):
 class CryptoKeyInline(admin.StackedInline):
     model = CryptoKey
     model = CryptoKey
@@ -40,7 +33,7 @@ class MemberAdmin(admin.ModelAdmin):
                 'address',
                 'address',
                 ('postal_code', 'city', 'country'),
                 ('postal_code', 'city', 'country'),
                 ('entry_date', 'resign_date'),
                 ('entry_date', 'resign_date'),
-                'ldap_cn'
+                'login'
              )
              )
 
 
     radio_fields = {"type": admin.HORIZONTAL}
     radio_fields = {"type": admin.HORIZONTAL}
@@ -51,7 +44,7 @@ class MemberAdmin(admin.ModelAdmin):
     
     
     def get_readonly_fields(self, request, obj=None):
     def get_readonly_fields(self, request, obj=None):
         if obj:
         if obj:
-            return ['ldap_cn',]
+            return ['login',]
         else:
         else:
             return []
             return []
 
 

+ 117 - 0
coin/members/migrations/0010_auto__del_field_member_user__add_field_member_password__add_field_memb.py

@@ -0,0 +1,117 @@
+# -*- coding: utf-8 -*-
+from south.utils import datetime_utils as 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 'Member.user'
+        db.delete_column(u'members_member', 'user_id')
+
+        # Adding field 'Member.password'
+        db.add_column(u'members_member', 'password',
+                      self.gf('django.db.models.fields.CharField')(default=None, max_length=128),
+                      keep_default=False)
+
+        # Adding field 'Member.last_login'
+        db.add_column(u'members_member', 'last_login',
+                      self.gf('django.db.models.fields.DateTimeField')(default=datetime.datetime.now),
+                      keep_default=False)
+
+
+        # Changing field 'Member.city'
+        db.alter_column(u'members_member', 'city', self.gf('django.db.models.fields.CharField')(max_length=200, null=True))
+
+        # Changing field 'Member.country'
+        db.alter_column(u'members_member', 'country', self.gf('django.db.models.fields.CharField')(max_length=200, null=True))
+
+        # Changing field 'Member.address'
+        db.alter_column(u'members_member', 'address', self.gf('django.db.models.fields.TextField')(null=True))
+        # Adding unique constraint on 'Member', fields ['ldap_cn']
+        db.create_unique(u'members_member', ['ldap_cn'])
+
+
+    def backwards(self, orm):
+        # Removing unique constraint on 'Member', fields ['ldap_cn']
+        db.delete_unique(u'members_member', ['ldap_cn'])
+
+        # Adding field 'Member.user'
+        db.add_column(u'members_member', 'user',
+                      self.gf('django.db.models.fields.related.OneToOneField')(default=None, to=orm['auth.User'], unique=True, null=True, on_delete=models.SET_NULL),
+                      keep_default=False)
+
+        # Deleting field 'Member.password'
+        db.delete_column(u'members_member', 'password')
+
+        # Deleting field 'Member.last_login'
+        db.delete_column(u'members_member', 'last_login')
+
+
+        # User chose to not deal with backwards NULL issues for 'Member.city'
+        raise RuntimeError("Cannot reverse this migration. 'Member.city' and its values cannot be restored.")
+        
+        # The following code is provided here to aid in writing a correct migration
+        # Changing field 'Member.city'
+        db.alter_column(u'members_member', 'city', self.gf('django.db.models.fields.CharField')(max_length=200))
+
+        # Changing field 'Member.country'
+        db.alter_column(u'members_member', 'country', self.gf('django.db.models.fields.CharField')(max_length=200))
+
+        # User chose to not deal with backwards NULL issues for 'Member.address'
+        raise RuntimeError("Cannot reverse this migration. 'Member.address' and its values cannot be restored.")
+        
+        # The following code is provided here to aid in writing a correct migration
+        # Changing field 'Member.address'
+        db.alter_column(u'members_member', 'address', self.gf('django.db.models.fields.TextField')())
+
+    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.ldapgroup': {
+            'Meta': {'object_name': 'LdapGroup', 'managed': 'False'},
+            'dn': ('django.db.models.fields.CharField', [], {'max_length': '200'})
+        },
+        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', [], {'null': 'True', 'blank': 'True'}),
+            'city': ('django.db.models.fields.CharField', [], {'max_length': '200', 'null': 'True', 'blank': 'True'}),
+            'country': ('django.db.models.fields.CharField', [], {'default': "'France'", 'max_length': '200', 'null': 'True', 'blank': 'True'}),
+            '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_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
+            'last_name': ('django.db.models.fields.CharField', [], {'max_length': '200'}),
+            'ldap_cn': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '200'}),
+            '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'}),
+            'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
+            '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(2015, 8, 24, 0, 0)'}),
+            u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'member': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'membership_fees'", 'to': u"orm['members.Member']"}),
+            'start_date': ('django.db.models.fields.DateField', [], {'default': 'datetime.date.today'})
+        }
+    }
+
+    complete_apps = ['members']

+ 116 - 0
coin/members/migrations/0011_auto__add_field_member_is_superuser.py

@@ -0,0 +1,116 @@
+# -*- coding: utf-8 -*-
+from south.utils import datetime_utils as datetime
+from south.db import db
+from south.v2 import SchemaMigration
+from django.db import models
+
+
+class Migration(SchemaMigration):
+
+    def forwards(self, orm):
+        # Adding field 'Member.is_superuser'
+        db.add_column(u'members_member', 'is_superuser',
+                      self.gf('django.db.models.fields.BooleanField')(default=False),
+                      keep_default=False)
+
+        # Adding M2M table for field groups on 'Member'
+        m2m_table_name = db.shorten_name(u'members_member_groups')
+        db.create_table(m2m_table_name, (
+            ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)),
+            ('member', models.ForeignKey(orm[u'members.member'], null=False)),
+            ('group', models.ForeignKey(orm[u'auth.group'], null=False))
+        ))
+        db.create_unique(m2m_table_name, ['member_id', 'group_id'])
+
+        # Adding M2M table for field user_permissions on 'Member'
+        m2m_table_name = db.shorten_name(u'members_member_user_permissions')
+        db.create_table(m2m_table_name, (
+            ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)),
+            ('member', models.ForeignKey(orm[u'members.member'], null=False)),
+            ('permission', models.ForeignKey(orm[u'auth.permission'], null=False))
+        ))
+        db.create_unique(m2m_table_name, ['member_id', 'permission_id'])
+
+
+    def backwards(self, orm):
+        # Deleting field 'Member.is_superuser'
+        db.delete_column(u'members_member', 'is_superuser')
+
+        # Removing M2M table for field groups on 'Member'
+        db.delete_table(db.shorten_name(u'members_member_groups'))
+
+        # Removing M2M table for field user_permissions on 'Member'
+        db.delete_table(db.shorten_name(u'members_member_user_permissions'))
+
+
+    models = {
+        u'auth.group': {
+            'Meta': {'object_name': 'Group'},
+            u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}),
+            'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'})
+        },
+        u'auth.permission': {
+            'Meta': {'ordering': "(u'content_type__app_label', u'content_type__model', u'codename')", 'unique_together': "((u'content_type', u'codename'),)", 'object_name': 'Permission'},
+            'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
+            'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['contenttypes.ContentType']"}),
+            u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'max_length': '50'})
+        },
+        u'contenttypes.contenttype': {
+            'Meta': {'ordering': "('name',)", 'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"},
+            'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
+            u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
+            'name': ('django.db.models.fields.CharField', [], {'max_length': '100'})
+        },
+        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.ldapgroup': {
+            'Meta': {'object_name': 'LdapGroup', 'managed': 'False'},
+            'dn': ('django.db.models.fields.CharField', [], {'max_length': '200'})
+        },
+        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', [], {'null': 'True', 'blank': 'True'}),
+            'city': ('django.db.models.fields.CharField', [], {'max_length': '200', 'null': 'True', 'blank': 'True'}),
+            'country': ('django.db.models.fields.CharField', [], {'default': "'France'", 'max_length': '200', 'null': 'True', 'blank': 'True'}),
+            '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'}),
+            'groups': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'related_name': "u'user_set'", 'blank': 'True', 'to': u"orm['auth.Group']"}),
+            'home_phone_number': ('django.db.models.fields.CharField', [], {'max_length': '25', 'blank': 'True'}),
+            u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+            'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
+            'last_name': ('django.db.models.fields.CharField', [], {'max_length': '200'}),
+            'ldap_cn': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '200'}),
+            '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'}),
+            'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
+            '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'}),
+            'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'related_name': "u'user_set'", 'blank': 'True', 'to': u"orm['auth.Permission']"})
+        },
+        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(2015, 8, 24, 0, 0)'}),
+            u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'member': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'membership_fees'", 'to': u"orm['members.Member']"}),
+            'start_date': ('django.db.models.fields.DateField', [], {'default': 'datetime.date.today'})
+        }
+    }
+
+    complete_apps = ['members']

+ 104 - 0
coin/members/migrations/0012_auto__del_field_member_ldap_cn__add_field_member_login.py

@@ -0,0 +1,104 @@
+# -*- coding: utf-8 -*-
+from south.utils import datetime_utils as 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 'Member.ldap_cn'
+        db.delete_column(u'members_member', 'ldap_cn')
+
+        # Adding field 'Member.login'
+        db.add_column(u'members_member', 'login',
+                      self.gf('django.db.models.fields.CharField')(default=None, unique=True, max_length=200),
+                      keep_default=False)
+
+
+    def backwards(self, orm):
+
+        # User chose to not deal with backwards NULL issues for 'Member.ldap_cn'
+        raise RuntimeError("Cannot reverse this migration. 'Member.ldap_cn' and its values cannot be restored.")
+        
+        # The following code is provided here to aid in writing a correct migration        # Adding field 'Member.ldap_cn'
+        db.add_column(u'members_member', 'ldap_cn',
+                      self.gf('django.db.models.fields.CharField')(max_length=200, unique=True),
+                      keep_default=False)
+
+        # Deleting field 'Member.login'
+        db.delete_column(u'members_member', 'login')
+
+
+    models = {
+        u'auth.group': {
+            'Meta': {'object_name': 'Group'},
+            u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}),
+            'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'})
+        },
+        u'auth.permission': {
+            'Meta': {'ordering': "(u'content_type__app_label', u'content_type__model', u'codename')", 'unique_together': "((u'content_type', u'codename'),)", 'object_name': 'Permission'},
+            'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
+            'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['contenttypes.ContentType']"}),
+            u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'max_length': '50'})
+        },
+        u'contenttypes.contenttype': {
+            'Meta': {'ordering': "('name',)", 'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"},
+            'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
+            u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
+            'name': ('django.db.models.fields.CharField', [], {'max_length': '100'})
+        },
+        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.ldapgroup': {
+            'Meta': {'object_name': 'LdapGroup', 'managed': 'False'},
+            'dn': ('django.db.models.fields.CharField', [], {'max_length': '200'})
+        },
+        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', [], {'null': 'True', 'blank': 'True'}),
+            'city': ('django.db.models.fields.CharField', [], {'max_length': '200', 'null': 'True', 'blank': 'True'}),
+            'country': ('django.db.models.fields.CharField', [], {'default': "'France'", 'max_length': '200', 'null': 'True', 'blank': 'True'}),
+            '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'}),
+            'groups': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'related_name': "u'user_set'", 'blank': 'True', 'to': u"orm['auth.Group']"}),
+            'home_phone_number': ('django.db.models.fields.CharField', [], {'max_length': '25', 'blank': 'True'}),
+            u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+            'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
+            'last_name': ('django.db.models.fields.CharField', [], {'max_length': '200'}),
+            'login': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '200'}),
+            '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'}),
+            'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
+            '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'}),
+            'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'related_name': "u'user_set'", 'blank': 'True', 'to': u"orm['auth.Permission']"})
+        },
+        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(2015, 8, 24, 0, 0)'}),
+            u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'member': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'membership_fees'", 'to': u"orm['members.Member']"}),
+            'start_date': ('django.db.models.fields.DateField', [], {'default': 'datetime.date.today'})
+        }
+    }
+
+    complete_apps = ['members']

+ 102 - 0
coin/members/migrations/0013_auto__add_field_member_is_active__add_field_member_is_admin.py

@@ -0,0 +1,102 @@
+# -*- coding: utf-8 -*-
+from south.utils import datetime_utils as datetime
+from south.db import db
+from south.v2 import SchemaMigration
+from django.db import models
+
+
+class Migration(SchemaMigration):
+
+    def forwards(self, orm):
+        # Adding field 'Member.is_active'
+        db.add_column(u'members_member', 'is_active',
+                      self.gf('django.db.models.fields.BooleanField')(default=True),
+                      keep_default=False)
+
+        # Adding field 'Member.is_admin'
+        db.add_column(u'members_member', 'is_admin',
+                      self.gf('django.db.models.fields.BooleanField')(default=False),
+                      keep_default=False)
+
+
+    def backwards(self, orm):
+        # Deleting field 'Member.is_active'
+        db.delete_column(u'members_member', 'is_active')
+
+        # Deleting field 'Member.is_admin'
+        db.delete_column(u'members_member', 'is_admin')
+
+
+    models = {
+        u'auth.group': {
+            'Meta': {'object_name': 'Group'},
+            u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}),
+            'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'})
+        },
+        u'auth.permission': {
+            'Meta': {'ordering': "(u'content_type__app_label', u'content_type__model', u'codename')", 'unique_together': "((u'content_type', u'codename'),)", 'object_name': 'Permission'},
+            'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
+            'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['contenttypes.ContentType']"}),
+            u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'max_length': '50'})
+        },
+        u'contenttypes.contenttype': {
+            'Meta': {'ordering': "('name',)", 'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"},
+            'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
+            u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
+            'name': ('django.db.models.fields.CharField', [], {'max_length': '100'})
+        },
+        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.ldapgroup': {
+            'Meta': {'object_name': 'LdapGroup', 'managed': 'False'},
+            'dn': ('django.db.models.fields.CharField', [], {'max_length': '200'})
+        },
+        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', [], {'null': 'True', 'blank': 'True'}),
+            'city': ('django.db.models.fields.CharField', [], {'max_length': '200', 'null': 'True', 'blank': 'True'}),
+            'country': ('django.db.models.fields.CharField', [], {'default': "'France'", 'max_length': '200', 'null': 'True', 'blank': 'True'}),
+            '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'}),
+            'groups': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'related_name': "u'user_set'", 'blank': 'True', 'to': u"orm['auth.Group']"}),
+            'home_phone_number': ('django.db.models.fields.CharField', [], {'max_length': '25', 'blank': 'True'}),
+            u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
+            'is_admin': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+            'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+            'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
+            'last_name': ('django.db.models.fields.CharField', [], {'max_length': '200'}),
+            'login': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '200'}),
+            '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'}),
+            'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
+            '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'}),
+            'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'related_name': "u'user_set'", 'blank': 'True', 'to': u"orm['auth.Permission']"})
+        },
+        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(2015, 8, 24, 0, 0)'}),
+            u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'member': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'membership_fees'", 'to': u"orm['members.Member']"}),
+            'start_date': ('django.db.models.fields.DateField', [], {'default': 'datetime.date.today'})
+        }
+    }
+
+    complete_apps = ['members']

+ 100 - 0
coin/members/migrations/0014_auto__del_field_member_is_active__del_field_member_is_admin.py

@@ -0,0 +1,100 @@
+# -*- coding: utf-8 -*-
+from south.utils import datetime_utils as 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 'Member.is_active'
+        db.delete_column(u'members_member', 'is_active')
+
+        # Deleting field 'Member.is_admin'
+        db.delete_column(u'members_member', 'is_admin')
+
+
+    def backwards(self, orm):
+        # Adding field 'Member.is_active'
+        db.add_column(u'members_member', 'is_active',
+                      self.gf('django.db.models.fields.BooleanField')(default=True),
+                      keep_default=False)
+
+        # Adding field 'Member.is_admin'
+        db.add_column(u'members_member', 'is_admin',
+                      self.gf('django.db.models.fields.BooleanField')(default=False),
+                      keep_default=False)
+
+
+    models = {
+        u'auth.group': {
+            'Meta': {'object_name': 'Group'},
+            u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}),
+            'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'})
+        },
+        u'auth.permission': {
+            'Meta': {'ordering': "(u'content_type__app_label', u'content_type__model', u'codename')", 'unique_together': "((u'content_type', u'codename'),)", 'object_name': 'Permission'},
+            'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
+            'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['contenttypes.ContentType']"}),
+            u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'max_length': '50'})
+        },
+        u'contenttypes.contenttype': {
+            'Meta': {'ordering': "('name',)", 'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"},
+            'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
+            u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
+            'name': ('django.db.models.fields.CharField', [], {'max_length': '100'})
+        },
+        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.ldapgroup': {
+            'Meta': {'object_name': 'LdapGroup', 'managed': 'False'},
+            'dn': ('django.db.models.fields.CharField', [], {'max_length': '200'})
+        },
+        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', [], {'null': 'True', 'blank': 'True'}),
+            'city': ('django.db.models.fields.CharField', [], {'max_length': '200', 'null': 'True', 'blank': 'True'}),
+            'country': ('django.db.models.fields.CharField', [], {'default': "'France'", 'max_length': '200', 'null': 'True', 'blank': 'True'}),
+            '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'}),
+            'groups': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'related_name': "u'user_set'", 'blank': 'True', 'to': u"orm['auth.Group']"}),
+            'home_phone_number': ('django.db.models.fields.CharField', [], {'max_length': '25', 'blank': 'True'}),
+            u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+            'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
+            'last_name': ('django.db.models.fields.CharField', [], {'max_length': '200'}),
+            'login': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '200'}),
+            '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'}),
+            'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
+            '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'}),
+            'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'related_name': "u'user_set'", 'blank': 'True', 'to': u"orm['auth.Permission']"})
+        },
+        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(2015, 8, 24, 0, 0)'}),
+            u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'member': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'membership_fees'", 'to': u"orm['members.Member']"}),
+            'start_date': ('django.db.models.fields.DateField', [], {'default': 'datetime.date.today'})
+        }
+    }
+
+    complete_apps = ['members']

+ 93 - 0
coin/members/migrations/0015_auto__add_field_member_is_active.py

@@ -0,0 +1,93 @@
+# -*- coding: utf-8 -*-
+from south.utils import datetime_utils as datetime
+from south.db import db
+from south.v2 import SchemaMigration
+from django.db import models
+
+
+class Migration(SchemaMigration):
+
+    def forwards(self, orm):
+        # Adding field 'Member.is_active'
+        db.add_column(u'members_member', 'is_active',
+                      self.gf('django.db.models.fields.BooleanField')(default=True),
+                      keep_default=False)
+
+
+    def backwards(self, orm):
+        # Deleting field 'Member.is_active'
+        db.delete_column(u'members_member', 'is_active')
+
+
+    models = {
+        u'auth.group': {
+            'Meta': {'object_name': 'Group'},
+            u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}),
+            'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'})
+        },
+        u'auth.permission': {
+            'Meta': {'ordering': "(u'content_type__app_label', u'content_type__model', u'codename')", 'unique_together': "((u'content_type', u'codename'),)", 'object_name': 'Permission'},
+            'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
+            'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['contenttypes.ContentType']"}),
+            u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'max_length': '50'})
+        },
+        u'contenttypes.contenttype': {
+            'Meta': {'ordering': "('name',)", 'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"},
+            'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
+            u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
+            'name': ('django.db.models.fields.CharField', [], {'max_length': '100'})
+        },
+        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.ldapgroup': {
+            'Meta': {'object_name': 'LdapGroup', 'managed': 'False'},
+            'dn': ('django.db.models.fields.CharField', [], {'max_length': '200'})
+        },
+        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', [], {'null': 'True', 'blank': 'True'}),
+            'city': ('django.db.models.fields.CharField', [], {'max_length': '200', 'null': 'True', 'blank': 'True'}),
+            'country': ('django.db.models.fields.CharField', [], {'default': "'France'", 'max_length': '200', 'null': 'True', 'blank': 'True'}),
+            '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'}),
+            'groups': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'related_name': "u'user_set'", 'blank': 'True', 'to': u"orm['auth.Group']"}),
+            'home_phone_number': ('django.db.models.fields.CharField', [], {'max_length': '25', 'blank': 'True'}),
+            u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
+            'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+            'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
+            'last_name': ('django.db.models.fields.CharField', [], {'max_length': '200'}),
+            'login': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '200'}),
+            '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'}),
+            'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
+            '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'}),
+            'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'related_name': "u'user_set'", 'blank': 'True', 'to': u"orm['auth.Permission']"})
+        },
+        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(2015, 8, 24, 0, 0)'}),
+            u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'member': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'membership_fees'", 'to': u"orm['members.Member']"}),
+            'start_date': ('django.db.models.fields.DateField', [], {'default': 'datetime.date.today'})
+        }
+    }
+
+    complete_apps = ['members']

+ 94 - 0
coin/members/migrations/0016_auto__add_field_member_is_admin.py

@@ -0,0 +1,94 @@
+# -*- coding: utf-8 -*-
+from south.utils import datetime_utils as datetime
+from south.db import db
+from south.v2 import SchemaMigration
+from django.db import models
+
+
+class Migration(SchemaMigration):
+
+    def forwards(self, orm):
+        # Adding field 'Member.is_admin'
+        db.add_column(u'members_member', 'is_admin',
+                      self.gf('django.db.models.fields.BooleanField')(default=False),
+                      keep_default=False)
+
+
+    def backwards(self, orm):
+        # Deleting field 'Member.is_admin'
+        db.delete_column(u'members_member', 'is_admin')
+
+
+    models = {
+        u'auth.group': {
+            'Meta': {'object_name': 'Group'},
+            u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}),
+            'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'})
+        },
+        u'auth.permission': {
+            'Meta': {'ordering': "(u'content_type__app_label', u'content_type__model', u'codename')", 'unique_together': "((u'content_type', u'codename'),)", 'object_name': 'Permission'},
+            'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
+            'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['contenttypes.ContentType']"}),
+            u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'max_length': '50'})
+        },
+        u'contenttypes.contenttype': {
+            'Meta': {'ordering': "('name',)", 'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"},
+            'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
+            u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
+            'name': ('django.db.models.fields.CharField', [], {'max_length': '100'})
+        },
+        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.ldapgroup': {
+            'Meta': {'object_name': 'LdapGroup', 'managed': 'False'},
+            'dn': ('django.db.models.fields.CharField', [], {'max_length': '200'})
+        },
+        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', [], {'null': 'True', 'blank': 'True'}),
+            'city': ('django.db.models.fields.CharField', [], {'max_length': '200', 'null': 'True', 'blank': 'True'}),
+            'country': ('django.db.models.fields.CharField', [], {'default': "'France'", 'max_length': '200', 'null': 'True', 'blank': 'True'}),
+            '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'}),
+            'groups': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'related_name': "u'user_set'", 'blank': 'True', 'to': u"orm['auth.Group']"}),
+            'home_phone_number': ('django.db.models.fields.CharField', [], {'max_length': '25', 'blank': 'True'}),
+            u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
+            'is_admin': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+            'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+            'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
+            'last_name': ('django.db.models.fields.CharField', [], {'max_length': '200'}),
+            'login': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '200'}),
+            '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'}),
+            'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
+            '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': "'not_member'", 'max_length': '50'}),
+            'type': ('django.db.models.fields.CharField', [], {'default': "'natural_person'", 'max_length': '20'}),
+            'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'related_name': "u'user_set'", 'blank': 'True', 'to': u"orm['auth.Permission']"})
+        },
+        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(2015, 8, 24, 0, 0)'}),
+            u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'member': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'membership_fees'", 'to': u"orm['members.Member']"}),
+            'start_date': ('django.db.models.fields.DateField', [], {'default': 'datetime.date.today'})
+        }
+    }
+
+    complete_apps = ['members']

+ 102 - 0
coin/members/migrations/0017_auto__del_field_member_is_admin__add_field_member_is_staff.py

@@ -0,0 +1,102 @@
+# -*- coding: utf-8 -*-
+from south.utils import datetime_utils as 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 'Member.is_admin'
+        db.delete_column(u'members_member', 'is_admin')
+
+        # Adding field 'Member.is_staff'
+        db.add_column(u'members_member', 'is_staff',
+                      self.gf('django.db.models.fields.BooleanField')(default=False),
+                      keep_default=False)
+
+
+    def backwards(self, orm):
+        # Adding field 'Member.is_admin'
+        db.add_column(u'members_member', 'is_admin',
+                      self.gf('django.db.models.fields.BooleanField')(default=False),
+                      keep_default=False)
+
+        # Deleting field 'Member.is_staff'
+        db.delete_column(u'members_member', 'is_staff')
+
+
+    models = {
+        u'auth.group': {
+            'Meta': {'object_name': 'Group'},
+            u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}),
+            'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'})
+        },
+        u'auth.permission': {
+            'Meta': {'ordering': "(u'content_type__app_label', u'content_type__model', u'codename')", 'unique_together': "((u'content_type', u'codename'),)", 'object_name': 'Permission'},
+            'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
+            'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['contenttypes.ContentType']"}),
+            u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'max_length': '50'})
+        },
+        u'contenttypes.contenttype': {
+            'Meta': {'ordering': "('name',)", 'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"},
+            'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
+            u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
+            'name': ('django.db.models.fields.CharField', [], {'max_length': '100'})
+        },
+        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.ldapgroup': {
+            'Meta': {'object_name': 'LdapGroup', 'managed': 'False'},
+            'dn': ('django.db.models.fields.CharField', [], {'max_length': '200'})
+        },
+        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', [], {'null': 'True', 'blank': 'True'}),
+            'city': ('django.db.models.fields.CharField', [], {'max_length': '200', 'null': 'True', 'blank': 'True'}),
+            'country': ('django.db.models.fields.CharField', [], {'default': "'France'", 'max_length': '200', 'null': 'True', 'blank': 'True'}),
+            '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'}),
+            'groups': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'related_name': "u'user_set'", 'blank': 'True', 'to': u"orm['auth.Group']"}),
+            'home_phone_number': ('django.db.models.fields.CharField', [], {'max_length': '25', 'blank': 'True'}),
+            u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
+            'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+            'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+            'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
+            'last_name': ('django.db.models.fields.CharField', [], {'max_length': '200'}),
+            'login': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '200'}),
+            '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'}),
+            'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
+            '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': "'pending'", 'max_length': '50'}),
+            'type': ('django.db.models.fields.CharField', [], {'default': "'natural_person'", 'max_length': '20'}),
+            'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'related_name': "u'user_set'", 'blank': 'True', 'to': u"orm['auth.Permission']"})
+        },
+        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(2015, 8, 27, 0, 0)'}),
+            u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'member': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'membership_fees'", 'to': u"orm['members.Member']"}),
+            'start_date': ('django.db.models.fields.DateField', [], {'default': 'datetime.date.today'})
+        }
+    }
+
+    complete_apps = ['members']

+ 137 - 62
coin/members/models.py

@@ -7,6 +7,7 @@ from django.db import models
 from django.db.models import Q
 from django.db.models import Q
 from django.db.models.signals import pre_save
 from django.db.models.signals import pre_save
 from django.dispatch import receiver
 from django.dispatch import receiver
+from django.contrib.auth.models import AbstractBaseUser, PermissionsMixin, BaseUserManager
 from ldapdb.models.fields import CharField, IntegerField, ListField
 from ldapdb.models.fields import CharField, IntegerField, ListField
 from south.modelsinspector import add_ignored_fields
 from south.modelsinspector import add_ignored_fields
 from coin.offers.models import OfferSubscription
 from coin.offers.models import OfferSubscription
@@ -15,33 +16,79 @@ from coin import utils
 from django.contrib.auth.signals import user_logged_in
 from django.contrib.auth.signals import user_logged_in
 from django.conf import settings
 from django.conf import settings
 
 
+class CoinUserManager(BaseUserManager):
+    def create_user(self, login, first_name, last_name, email, password=None):
+        """
+        """
+        if not login:
+            raise ValueError('Users must have a login')
+        if not email:
+            raise ValueError('Users must have an email address')
+        if not first_name:
+            raise ValueError('Users must have a first name')
+        if not last_name:
+            raise ValueError('Users must have a last name')
+        
+        user = self.model(
+            login=login,
+            email=self.normalize_email(email),
+            first_name=first_name,
+            last_name=last_name,
+        )
+
+        user.set_password(password, ldap=False)
+        user.save(using=self._db)
+        user.set_ldap_password(password)
+        return user
+
+    def create_superuser(self, login, first_name, last_name, email, password):
+        """
+        Creates and saves a superuser
+        """
+        user = self.create_user(
+            login=login,
+            email=email,
+            first_name=first_name,
+            last_name=last_name,
+            password=password
+        )
+        user.status = 'member'
+        user.is_superuser = True
+        user.is_staff = True
+        user.save(using=self._db)
+        return user
+
 
 
-class Member(CoinLdapSyncMixin, models.Model):
+class Member(CoinLdapSyncMixin, AbstractBaseUser, PermissionsMixin):
+
+    USERNAME_FIELD = 'login'
+    REQUIRED_FIELDS = ['first_name', 'last_name', 'email', ]
 
 
     MEMBER_TYPE_CHOICES = (
     MEMBER_TYPE_CHOICES = (
-        ('personne_physique', 'Personne physique'),
-        ('personne_morale', 'Personne morale'),
+        ('natural_person', 'Personne physique'),
+        ('legal_entity', 'Personne morale'),
     )
     )
     MEMBER_STATUS_CHOICES = (
     MEMBER_STATUS_CHOICES = (
-        ('adherent', 'Adhérent'),
-        ('non_adherent', 'Non adhérent'),
-        ('demande_adhesion', "Demande d'adhésion"),
+        ('member', 'Adhérent'),
+        ('not_member', 'Non adhérent'),
+        ('pending', "Demande d'adhésion"),
     )
     )
 
 
-    user = models.OneToOneField(settings.AUTH_USER_MODEL,
-                                null=True,
-                                default=None,
-                                verbose_name='Utilisateur Django',
-                                on_delete=models.SET_NULL)
+    objects = CoinUserManager()
+    is_active = models.BooleanField(default=True)
+    is_staff = models.BooleanField(default=False)
+
     status = models.CharField(max_length=50, choices=MEMBER_STATUS_CHOICES,
     status = models.CharField(max_length=50, choices=MEMBER_STATUS_CHOICES,
-                              default='non_adherent')
+                              default='pending')
     type = models.CharField(max_length=20, choices=MEMBER_TYPE_CHOICES,
     type = models.CharField(max_length=20, choices=MEMBER_TYPE_CHOICES,
-                            default='personne_physique')
+                            default='natural_person')
     first_name = models.CharField(max_length=200, verbose_name=u'Prénom')
     first_name = models.CharField(max_length=200, verbose_name=u'Prénom')
     last_name = models.CharField(max_length=200, verbose_name=u'Nom')
     last_name = models.CharField(max_length=200, verbose_name=u'Nom')
-    ldap_cn = models.CharField(max_length=200, blank=True,
-                               help_text='Clé avec le LDAP. Laisser vide pour '
-                               'la générer automatiquement')
+    login = models.CharField(max_length=200, unique=True, null=True,
+                               blank=True,
+                               verbose_name='login',
+                               help_text='Login. Clé avec le LDAP. Laisser vide pour '
+                               'le générer automatiquement')
     organization_name = models.CharField(max_length=200, blank=True,
     organization_name = models.CharField(max_length=200, blank=True,
                                          verbose_name='Nom de l\'organisme',
                                          verbose_name='Nom de l\'organisme',
                                          help_text='Pour une personne morale')
                                          help_text='Pour une personne morale')
@@ -52,12 +99,12 @@ class Member(CoinLdapSyncMixin, models.Model):
                                            verbose_name=u'Téléphone mobile')
                                            verbose_name=u'Téléphone mobile')
     # TODO: use a django module that provides an address model? (would
     # TODO: use a django module that provides an address model? (would
     # support more countries and address types)
     # support more countries and address types)
-    address = models.TextField(verbose_name=u'Adresse')
-    postal_code = models.CharField(max_length=15,
+    address = models.TextField(verbose_name=u'Adresse', blank=True, null=True)
+    postal_code = models.CharField(max_length=15, blank=True, null=True,
                                    verbose_name=u'Code postal')
                                    verbose_name=u'Code postal')
-    city = models.CharField(max_length=200,
+    city = models.CharField(max_length=200, blank=True, null=True,
                             verbose_name=u'Commune')
                             verbose_name=u'Commune')
-    country = models.CharField(max_length=200,
+    country = models.CharField(max_length=200, blank=True, null=True,
                                default='France',
                                default='France',
                                verbose_name=u'Pays')
                                verbose_name=u'Pays')
     entry_date = models.DateField(null=False,
     entry_date = models.DateField(null=False,
@@ -70,12 +117,19 @@ class Member(CoinLdapSyncMixin, models.Model):
                                    verbose_name='Date de départ de '
                                    verbose_name='Date de départ de '
                                    'l\'association')
                                    'l\'association')
 
 
+
     def __unicode__(self):
     def __unicode__(self):
         name = self.first_name + ' ' + self.last_name
         name = self.first_name + ' ' + self.last_name
         if self.organization_name:
         if self.organization_name:
             name += ' (%s)' % self.organization_name
             name += ' (%s)' % self.organization_name
         return name
         return name
 
 
+    def get_full_name(self):
+        return '%s %s' % (self.first_name, self.last_name)
+
+    def get_short_name(self):
+        return '%s' % self.login
+
     # Renvoie la date de fin de la dernière cotisation du membre
     # Renvoie la date de fin de la dernière cotisation du membre
     def end_date_of_membership(self):
     def end_date_of_membership(self):
         try:
         try:
@@ -94,11 +148,22 @@ class Member(CoinLdapSyncMixin, models.Model):
         else:
         else:
             return False
             return False
 
 
-    def change_password(self, new_password):
-        ldap_user = LdapUser.objects.get(pk=self.ldap_cn)
+    def set_password(self, new_password, ldap=True, *args, **kwargs):
+        """
+        Override set_password in order to change password in ldap too
+        """
+        super(Member, self).set_password(new_password, *args, **kwargs)
+        if ldap:
+            self.set_ldap_password(new_password)
+
+    def set_ldap_password(self, new_password):
+        """
+        Change password in LDAP
+        """
+        ldap_user = LdapUser.objects.get(pk=self.login)
         ldap_user.password = new_password
         ldap_user.password = new_password
         ldap_user.save()
         ldap_user.save()
-
+        
     def get_active_subscriptions(self, date=datetime.date.today()):
     def get_active_subscriptions(self, date=datetime.date.today()):
         """
         """
         Return list of OfferSubscription which are active today
         Return list of OfferSubscription which are active today
@@ -108,9 +173,9 @@ class Member(CoinLdapSyncMixin, models.Model):
             Q(subscription_date__lte=date),
             Q(subscription_date__lte=date),
             Q(resign_date__isnull=True) | Q(resign_date__gte=date))
             Q(resign_date__isnull=True) | Q(resign_date__gte=date))
 
 
-    def get_automatic_ldap_cn(self):
+    def get_automatic_login(self):
         """
         """
-        Calcul le login / ldap_cn automatiquement en fonction
+        Calcul le login / ldap cn automatiquement en fonction
         du nom et du prénom
         du nom et du prénom
         """
         """
         # Première lettre de chaque partie du prénom
         # Première lettre de chaque partie du prénom
@@ -118,35 +183,35 @@ class Member(CoinLdapSyncMixin, models.Model):
             [c[0] for c in self.first_name.split('-')]
             [c[0] for c in self.first_name.split('-')]
         )
         )
         # Concaténer avec nom de famille
         # Concaténer avec nom de famille
-        ldap_cn = ('%s%s' % (first_name_letters, self.last_name))
+        login = ('%s%s' % (first_name_letters, self.last_name))
         # Remplacer ou enlever les caractères non ascii
         # Remplacer ou enlever les caractères non ascii
-        ldap_cn = unicodedata.normalize('NFD', ldap_cn)\
+        login = unicodedata.normalize('NFD', login)\
             .encode('ascii', 'ignore')
             .encode('ascii', 'ignore')
         # Enlever ponctuation et espace
         # Enlever ponctuation et espace
-        ldap_cn = ldap_cn.translate(None, string.punctuation + ' ')
+        login = login.translate(None, string.punctuation + ' ')
         # En minuscule
         # En minuscule
-        ldap_cn = ldap_cn.lower()
+        login = login.lower()
 
 
-        return ldap_cn
+        return login
 
 
     def sync_to_ldap(self, creation):
     def sync_to_ldap(self, creation):
         """
         """
         Update LDAP data when a member is saved
         Update LDAP data when a member is saved
         """
         """
 
 
-        assert self.ldap_cn, ('Can\'t sync with LDAP because missing ldap_cn '
+        assert self.login, ('Can\'t sync with LDAP because missing login '
                               'value for the Member : %s' % self)
                               'value for the Member : %s' % self)
 
 
         if not creation:
         if not creation:
-                ldap_user = LdapUser.objects.get(pk=self.ldap_cn)
+            ldap_user = LdapUser.objects.get(pk=self.login)
 
 
         if creation:
         if creation:
             max_uid_number = LdapUser.objects.order_by('-uidNumber')[0].uidNumber
             max_uid_number = LdapUser.objects.order_by('-uidNumber')[0].uidNumber
 
 
             ldap_user = LdapUser()
             ldap_user = LdapUser()
-            ldap_user.pk = self.ldap_cn
-            ldap_user.uid = self.ldap_cn
-            ldap_user.nick_name = self.ldap_cn
+            ldap_user.pk = self.login
+            ldap_user.uid = self.login
+            ldap_user.nick_name = self.login
             ldap_user.uidNumber = max_uid_number + 1
             ldap_user.uidNumber = max_uid_number + 1
 
 
         ldap_user.last_name = self.last_name
         ldap_user.last_name = self.last_name
@@ -162,17 +227,27 @@ class Member(CoinLdapSyncMixin, models.Model):
         """
         """
         Delete member from the LDAP
         Delete member from the LDAP
         """
         """
-        assert self.ldap_cn, ('Can\'t delete from LDAP because missing '
-                              'ldap_cn value for the Member : %s' % self)
+        assert self.login, ('Can\'t delete from LDAP because missing '
+                              'login value for the Member : %s' % self)
 
 
         # Lorsqu'un membre est supprimé du SI, son utilisateur LDAP
         # Lorsqu'un membre est supprimé du SI, son utilisateur LDAP
         # correspondant est sorti du groupe "coin" afin qu'il n'ait plus
         # correspondant est sorti du groupe "coin" afin qu'il n'ait plus
         # accès au SI
         # accès au SI
         ldap_group = LdapGroup.objects.get(pk='coin')
         ldap_group = LdapGroup.objects.get(pk='coin')
-        if self.ldap_cn in ldap_group.members:
-            ldap_group.members.remove(self.ldap_cn)
+        if self.login in ldap_group.members:
+            ldap_group.members.remove(self.login)
             ldap_group.save()
             ldap_group.save()
 
 
+    def has_perm(self, perm, obj=None):
+        "Does the user have a specific permission?"
+        # Simplest possible answer: Yes, always
+        return True
+
+    def has_module_perms(self, app_label):
+        "Does the user have permissions to view the app `app_label`?"
+        # Simplest possible answer: Yes, always
+        return True
+
     class Meta:
     class Meta:
         verbose_name = 'membre'
         verbose_name = 'membre'
 
 
@@ -267,13 +342,13 @@ add_ignored_fields(["^ldapdb\.models\.fields"])
 
 
 
 
 @receiver(pre_save, sender=Member)
 @receiver(pre_save, sender=Member)
-def define_ldap_cn(sender, instance, **kwargs):
+def define_login(sender, instance, **kwargs):
     """
     """
-    Lors de la sauvegarde d'un membre. Si le champ ldap_cn n'est pas définit,
+    Lors de la sauvegarde d'un membre. Si le champ login n'est pas définit,
     le calcul automatiquement en fonction du nom et du prénom
     le calcul automatiquement en fonction du nom et du prénom
     """
     """
-    if not instance.ldap_cn and not instance.pk:
-        instance.ldap_cn = instance.get_automatic_ldap_cn()
+    if not instance.login and not instance.pk:
+        instance.login = instance.get_automatic_login()
 
 
 
 
 @receiver(pre_save, sender=LdapUser)
 @receiver(pre_save, sender=LdapUser)
@@ -297,25 +372,25 @@ def define_display_name(sender, instance, **kwargs):
                                            instance.last_name)
                                            instance.last_name)
 
 
 
 
-@receiver(user_logged_in)
-def define_member_user(sender, request, user, **kwargs):
-    """
-    Lorsqu'un utilisateur se connect avec succes, fait le lien entre le membre
-    et l'utilisateur en définissant le champ user du model membre ayant le
-    ldap_cn utilisé pour la connexion
-    """
-    try:
-        member = Member.objects.get(ldap_cn=user.username)
-        if not member.user:
-            member.user = user
-            member.save()
-        elif member.user.username != user.username:
-            raise Exception('Un membre avec cet ldap_cn existe en base de '
-                            'donnée mais l\'utilisateur auquel il est rattaché '
-                            'ne correspond pas.')
-    except Member.DoesNotExist:
-        if not user.is_superuser:
-            raise
+# @receiver(user_logged_in)
+# def define_member_user(sender, request, user, **kwargs):
+#     """
+#     Lorsqu'un utilisateur se connect avec succes, fait le lien entre le membre
+#     et l'utilisateur en définissant le champ user du model membre ayant le
+#     ldap_cn utilisé pour la connexion
+#     """
+#     try:
+#         member = Member.objects.get(ldap_cn=user.username)
+#         if not member.user:
+#             member.user = user
+#             member.save()
+#         elif member.user.username != user.username:
+#             raise Exception('Un membre avec cet ldap_cn existe en base de '
+#                             'donnée mais l\'utilisateur auquel il est rattaché '
+#                             'ne correspond pas.')
+#     except Member.DoesNotExist:
+#         if not user.is_superuser:
+#             raise
 
 
 
 
 #==============================================================================
 #==============================================================================

+ 3 - 1
coin/settings.py

@@ -205,8 +205,10 @@ TEMPLATE_CONTEXT_PROCESSORS = (
     "django.core.context_processors.request",
     "django.core.context_processors.request",
     "django.contrib.messages.context_processors.messages")
     "django.contrib.messages.context_processors.messages")
 
 
+AUTH_USER_MODEL = 'members.Member'
+
 AUTHENTICATION_BACKENDS = (
 AUTHENTICATION_BACKENDS = (
-    'django_auth_ldap.backend.LDAPBackend',
+    # 'django_auth_ldap.backend.LDAPBackend',
     'django.contrib.auth.backends.ModelBackend',
     'django.contrib.auth.backends.ModelBackend',
 )
 )