|
@@ -15,6 +15,7 @@ import logging
|
|
|
|
|
|
logger = logging.getLogger('fabs')
|
|
|
|
|
|
+
|
|
|
class LdapUser(ldapdb.models.Model):
|
|
|
# TODO: déplacer ligne suivante dans settings.py
|
|
|
base_dn = "ou=users,o=ILLYSE,l=Villeurbanne,st=RHA,c=FR"
|
|
@@ -33,23 +34,27 @@ class LdapUser(ldapdb.models.Model):
|
|
|
return self.display_name
|
|
|
|
|
|
class Meta:
|
|
|
- managed = False #Indique à South de ne pas gérer le model LdapUser
|
|
|
+ managed = False # Indique à South de ne pas gérer le model LdapUser
|
|
|
|
|
|
#Indique à South de ne pas gérer le model LdapUser
|
|
|
add_ignored_fields(["^ldapdb\.models\.fields"])
|
|
|
|
|
|
-#~ Lors de la sauvegarde d'un utilisateur Ldap, cette fonction est exécutée avant la sauvegare pour chiffrer le mot de passe s'il est définit et s'il n'est pas déjà chiffré
|
|
|
+
|
|
|
+# Lors de la sauvegarde d'un utilisateur Ldap, cette fonction est exécutée
|
|
|
+# avant la sauvegare pour chiffrer le mot de passe s'il est définit
|
|
|
+# et s'il n'est pas déjà chiffré
|
|
|
@receiver(pre_save, sender=LdapUser)
|
|
|
def change_password(sender, instance, **kwargs):
|
|
|
- #~ Si le mot de passe est définit et n'est pas déjà chiffré, alors ça le chiffre
|
|
|
+ # Si le mot de passe est définit et n'est pas déjà chiffré,
|
|
|
+ # alors ça le chiffre
|
|
|
if instance.password and not instance.password.startswith('{SSHA}'):
|
|
|
salt = os.urandom(8).encode('hex')
|
|
|
- instance.password = '{SSHA}' + base64.b64encode(hashlib.sha1(instance.password + salt).digest() + salt)
|
|
|
+ digest = hashlib.sha1(instance.password + salt).digest()
|
|
|
+ instance.password = '{SSHA}' + base64.b64encode(digest + salt)
|
|
|
|
|
|
|
|
|
class Member(models.Model):
|
|
|
|
|
|
-
|
|
|
MEMBER_TYPE_CHOICES = (
|
|
|
('personne_physique', 'Personne physique'),
|
|
|
('personne_morale', 'Personne morale'),
|
|
@@ -67,8 +72,8 @@ class Member(models.Model):
|
|
|
first_name = models.CharField(max_length=200)
|
|
|
last_name = models.CharField(max_length=200)
|
|
|
ldap_cn = models.CharField(max_length=200, blank=True)
|
|
|
- organization_name = models.CharField(max_length=200, blank=True,
|
|
|
- help_text='Nom de l\'organisme pour une personne morale')
|
|
|
+ organization_name = models.CharField(max_length=200, blank=True,
|
|
|
+ help_text='Nom de l\'organisme pour une personne morale')
|
|
|
email = models.EmailField(max_length=254)
|
|
|
home_phone_number = models.CharField(max_length=25, blank=True)
|
|
|
mobile_phone_number = models.CharField(max_length=25, blank=True)
|
|
@@ -76,32 +81,33 @@ 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,
|
|
|
+ entry_date = models.DateField(null=False,
|
|
|
+ blank=False,
|
|
|
default=datetime.date.today,
|
|
|
help_text='date de première adhésion')
|
|
|
- resign_date = models.DateField(null=True, blank=True,
|
|
|
- help_text='date de départ de l\'association')
|
|
|
+ resign_date = models.DateField(null=True, blank=True,
|
|
|
+ help_text='date de départ de l\'association')
|
|
|
|
|
|
def __unicode__(self):
|
|
|
- name = self.first_name+' '+self.last_name;
|
|
|
- if (self.organization_name):
|
|
|
+ name = self.first_name + ' ' + self.last_name
|
|
|
+ if (self.organization_name):
|
|
|
name += ' (%s)' % self.organization_name
|
|
|
return name
|
|
|
|
|
|
-
|
|
|
# Renvoi la date de fin de la dernière cotisation du membre
|
|
|
def end_date_of_membership(self):
|
|
|
try:
|
|
|
return self.membership_fees.order_by('-end_date')[0].end_date
|
|
|
except:
|
|
|
return None
|
|
|
-
|
|
|
- def change_password(self,new_password):
|
|
|
+
|
|
|
+ def change_password(self, new_password):
|
|
|
#~ logger.debug('Member change password %s' % new_password)
|
|
|
ldap_user = LdapUser.objects.get(pk=self.ldap_cn)
|
|
|
ldap_user.password = new_password
|
|
|
ldap_user.save()
|
|
|
|
|
|
+
|
|
|
class CryptoKey(models.Model):
|
|
|
|
|
|
KEY_TYPE_CHOICES = (('RSA', 'RSA'), ('GPG', 'GPG'))
|
|
@@ -113,14 +119,23 @@ class CryptoKey(models.Model):
|
|
|
def __unicode__(self):
|
|
|
return u'Clé %s de %s' % (self.type, self.member)
|
|
|
|
|
|
+
|
|
|
class MembershipFee(models.Model):
|
|
|
- member = models.ForeignKey('Member', related_name='membership_fees');
|
|
|
- amount = models.IntegerField(null=False, default='20', help_text='en €');
|
|
|
- start_date = models.DateField(null=False, blank=False, default=datetime.date.today, help_text='date de début de cotisation');
|
|
|
- end_date = models.DateField(null=False, blank=False, default=datetime.date.today() + datetime.timedelta(365), help_text='fin de validité de cotisation');
|
|
|
+ member = models.ForeignKey('Member', related_name='membership_fees')
|
|
|
+ amount = models.IntegerField(null=False, default='20', help_text='en €')
|
|
|
+ start_date = models.DateField(
|
|
|
+ null=False,
|
|
|
+ blank=False,
|
|
|
+ default=datetime.date.today,
|
|
|
+ help_text='date de début de cotisation')
|
|
|
+ end_date = models.DateField(
|
|
|
+ null=False,
|
|
|
+ blank=False,
|
|
|
+ default=datetime.date.today() + datetime.timedelta(365),
|
|
|
+ help_text='fin de validité de cotisation')
|
|
|
|
|
|
def __unicode__(self):
|
|
|
- return (u'%s - %s - %i€' % (self.member, self.start_date, self.amount));
|
|
|
+ return (u'%s - %s - %i€' % (self.member, self.start_date, self.amount))
|
|
|
|
|
|
|
|
|
@receiver(post_save, sender=Member)
|