1
0

models.py 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157
  1. # -*- coding: utf-8 -*-
  2. import ldapdb.models
  3. import pprint
  4. import os
  5. import base64
  6. import hashlib
  7. from django.db import models
  8. from ldapdb.models.fields import CharField, IntegerField, ListField
  9. from django.db.models.signals import post_save, pre_save
  10. from django.dispatch import receiver
  11. from south.modelsinspector import add_ignored_fields
  12. import datetime
  13. from django.core import exceptions
  14. import logging
  15. logger = logging.getLogger('fabs')
  16. class LdapUser(ldapdb.models.Model):
  17. # TODO: déplacer ligne suivante dans settings.py
  18. base_dn = "ou=users,o=ILLYSE,l=Villeurbanne,st=RHA,c=FR"
  19. object_classes = ['inetOrgPerson', 'organizationalPerson', 'person', 'top']
  20. uid = CharField(db_column='uid', unique=True, max_length=255)
  21. nick_name = CharField(db_column='cn', unique=True, primary_key=True,
  22. max_length=255)
  23. first_name = CharField(db_column='givenName', max_length=255)
  24. last_name = CharField(db_column='sn', max_length=255)
  25. display_name = CharField(db_column='displayName', max_length=255,
  26. blank=True)
  27. password = CharField(db_column='userPassword', max_length=255)
  28. def __unicode__(self):
  29. return self.display_name
  30. class Meta:
  31. managed = False #Indique à South de ne pas gérer le model LdapUser
  32. #Indique à South de ne pas gérer le model LdapUser
  33. add_ignored_fields(["^ldapdb\.models\.fields"])
  34. #~ 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é
  35. @receiver(pre_save, sender=LdapUser)
  36. def change_password(sender, instance, **kwargs):
  37. #~ Si le mot de passe est définit et n'est pas déjà chiffré, alors ça le chiffre
  38. if instance.password and not instance.password.startswith('{SSHA}'):
  39. salt = os.urandom(8).encode('hex')
  40. instance.password = '{SSHA}' + base64.b64encode(hashlib.sha1(instance.password + salt).digest() + salt)
  41. class Member(models.Model):
  42. MEMBER_TYPE_CHOICES = (
  43. ('personne_physique', 'Personne physique'),
  44. ('personne_morale', 'Personne morale'),
  45. )
  46. MEMBER_STATUS_CHOICES = (
  47. ('adherent', 'Adhérent'),
  48. ('non_adherent', 'Non adhérent'),
  49. ('demande_adhesion', "Demande d'adhésion"),
  50. )
  51. status = models.CharField(max_length=50, choices=MEMBER_STATUS_CHOICES,
  52. default='non_adherent')
  53. type = models.CharField(max_length=20, choices=MEMBER_TYPE_CHOICES,
  54. default='personne_physique')
  55. first_name = models.CharField(max_length=200)
  56. last_name = models.CharField(max_length=200)
  57. ldap_cn = models.CharField(max_length=200, blank=True)
  58. organization_name = models.CharField(max_length=200, blank=True,
  59. help_text='Nom de l\'organisme pour une personne morale')
  60. email = models.EmailField(max_length=254)
  61. home_phone_number = models.CharField(max_length=25, blank=True)
  62. mobile_phone_number = models.CharField(max_length=25, blank=True)
  63. address = models.TextField()
  64. postal_code = models.CharField(max_length=15)
  65. city = models.CharField(max_length=200)
  66. country = models.CharField(max_length=200)
  67. entry_date = models.DateField(null=False, blank=False,
  68. default=datetime.date.today,
  69. help_text='date de première adhésion')
  70. resign_date = models.DateField(null=True, blank=True,
  71. help_text='date de départ de l\'association')
  72. def __unicode__(self):
  73. name = self.first_name+' '+self.last_name;
  74. if (self.organization_name):
  75. name += ' (%s)' % self.organization_name
  76. return name
  77. # Renvoi la date de fin de la dernière cotisation du membre
  78. def end_date_of_membership(self):
  79. try:
  80. return self.membership_fees.order_by('-end_date')[0].end_date
  81. except:
  82. return None
  83. def change_password(self,new_password):
  84. #~ logger.debug('Member change password %s' % new_password)
  85. ldap_user = LdapUser.objects.get(pk=self.ldap_cn)
  86. ldap_user.password = new_password
  87. ldap_user.save()
  88. class CryptoKey(models.Model):
  89. KEY_TYPE_CHOICES = (('RSA', 'RSA'), ('GPG', 'GPG'))
  90. type = models.CharField(max_length=3, choices=KEY_TYPE_CHOICES)
  91. key = models.TextField()
  92. member = models.ForeignKey('Member')
  93. def __unicode__(self):
  94. return u'Clé %s de %s' % (self.type, self.member)
  95. class MembershipFee(models.Model):
  96. member = models.ForeignKey('Member', related_name='membership_fees');
  97. amount = models.IntegerField(null=False, default='20', help_text='en €');
  98. start_date = models.DateField(null=False, blank=False, default=datetime.date.today, help_text='date de début de cotisation');
  99. end_date = models.DateField(null=False, blank=False, default=datetime.date.today() + datetime.timedelta(365), help_text='fin de validité de cotisation');
  100. def __unicode__(self):
  101. return (u'%s - %s - %i€' % (self.member, self.start_date, self.amount));
  102. @receiver(post_save, sender=Member)
  103. def sync_ldap(sender, instance, created, **kwargs):
  104. """
  105. Update LDAP data when a member is saved
  106. """
  107. if not created:
  108. # try:
  109. ldap_user = LdapUser.objects.get(pk=instance.ldap_cn)
  110. # except exceptions.ObjectDoesNotExist:
  111. # created = True
  112. if created:
  113. ldap_user = LdapUser()
  114. ldap_user.pk = instance.ldap_cn
  115. ldap_user.uid = instance.ldap_cn
  116. ldap_user.nick_name = instance.ldap_cn
  117. ldap_user.last_name = instance.last_name
  118. ldap_user.first_name = instance.first_name
  119. # ldap_user.password = instance.password
  120. ldap_user.save()
  121. #==============================================================================
  122. # @receiver(pre_save, sender = LdapUser)
  123. # def ssha_password(sender, **kwargs):
  124. # if not kwargs['instance'].password.startswith('{SSHA}'):
  125. # salt = os.urandom(8).encode('hex')
  126. # kwargs['instance'].password = '{SSHA}' + base64.b64encode(
  127. # hashlib.sha1(obj.password + salt).digest() + salt)
  128. #==============================================================================