123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157 |
- # -*- coding: utf-8 -*-
- import ldapdb.models
- import pprint
- import os
- import base64
- import hashlib
- from django.db import models
- 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
- import datetime
- from django.core import exceptions
- 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"
- object_classes = ['inetOrgPerson', 'organizationalPerson', 'person', 'top']
- uid = CharField(db_column='uid', unique=True, max_length=255)
- nick_name = CharField(db_column='cn', unique=True, primary_key=True,
- max_length=255)
- first_name = CharField(db_column='givenName', max_length=255)
- last_name = CharField(db_column='sn', max_length=255)
- display_name = CharField(db_column='displayName', max_length=255,
- blank=True)
- password = CharField(db_column='userPassword', max_length=255)
- def __unicode__(self):
- return self.display_name
- class Meta:
- 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é
- @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
- 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)
- class Member(models.Model):
- MEMBER_TYPE_CHOICES = (
- ('personne_physique', 'Personne physique'),
- ('personne_morale', 'Personne morale'),
- )
- MEMBER_STATUS_CHOICES = (
- ('adherent', 'Adhérent'),
- ('non_adherent', 'Non adhérent'),
- ('demande_adhesion', "Demande d'adhésion"),
- )
- status = models.CharField(max_length=50, choices=MEMBER_STATUS_CHOICES,
- default='non_adherent')
- type = models.CharField(max_length=20, choices=MEMBER_TYPE_CHOICES,
- default='personne_physique')
- 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')
- 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)
- address = models.TextField()
- 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=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')
- def __unicode__(self):
- 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):
- #~ 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'))
- type = models.CharField(max_length=3, choices=KEY_TYPE_CHOICES)
- key = models.TextField()
- member = models.ForeignKey('Member')
- 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');
- def __unicode__(self):
- return (u'%s - %s - %i€' % (self.member, self.start_date, self.amount));
- @receiver(post_save, sender=Member)
- def sync_ldap(sender, instance, created, **kwargs):
- """
- Update LDAP data when a member is saved
- """
- if not created:
- # 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
- ldap_user.uid = instance.ldap_cn
- ldap_user.nick_name = instance.ldap_cn
- ldap_user.last_name = instance.last_name
- ldap_user.first_name = instance.first_name
- # ldap_user.password = instance.password
- ldap_user.save()
- #==============================================================================
- # @receiver(pre_save, sender = LdapUser)
- # def ssha_password(sender, **kwargs):
- # if not kwargs['instance'].password.startswith('{SSHA}'):
- # salt = os.urandom(8).encode('hex')
- # kwargs['instance'].password = '{SSHA}' + base64.b64encode(
- # hashlib.sha1(obj.password + salt).digest() + salt)
- #==============================================================================
|