[#3195] Réparé la génération des choix de fuseaux horaires
[auf_savoirs_en_partage_django.git] / auf_savoirs_en_partage / chercheurs / utils.py
1 # -*- coding: utf-8 -*-
2
3 import base64
4 import hashlib
5 import os
6 import re
7
8 from django.utils.encoding import smart_str
9 from django.contrib.auth.models import User
10
11 from django_exportateur.exportateur import exportateur
12
13
14 def get_django_user_for_email(email):
15 """Retourne un utilisateur Django avec le courriel donné.
16
17 S'il y a déjà un utilisateur avec ce courriel, on s'assure qu'il est activé.
18
19 Sinon, on crée un nouvel utilisateur."""
20 candidates = User.objects.filter(email=email)
21 if candidates.count() > 0:
22 user = candidates[0]
23 if not user.is_active:
24 user.is_active = True
25 user.save()
26 else:
27 username = email.split('@')[0]
28 username = re.sub('\W', '_', username)[:30]
29 i = 1
30 while User.objects.filter(username=username).count() > 0:
31 suffix = '_' + str(i)
32 username = username[:30-len(suffix)] + suffix
33 i += 1
34 # XXX: possible race condition here...
35 user = User.objects.create_user(username, email)
36 user.save()
37 return user
38
39 def export(queryset, type):
40 from chercheurs.models import These
41
42 if queryset.count() == 0:
43 return None
44 obj = queryset[0]
45 headers = ['Nom', 'Prénom', 'Genre', 'Courriel', 'Téléphone', 'Adresse postale',
46 'Statut', 'Diplôme', 'Établissement', 'Pays', 'Domaines de recherche',
47 'Thèse', 'Directeur', 'Discipline', 'Thèmes de recherche', 'Équipe de recherche', 'Mots-clés',
48 'Site web', 'Blog', 'Réseau social',
49 'Membre instance AUF', "Sollicité par l'OIF", 'Membre société francophone',
50 'Membre instance réseau institutionnel AUF', 'Expertises', 'Solliciter pour expertises',
51 'Publications']
52 data = []
53 for c in queryset:
54 row = []
55 row.append(c.nom)
56 row.append(c.prenom)
57 row.append(c.get_genre_display())
58 row.append(c.courriel)
59 row.append(c.telephone)
60 row.append(c.adresse_postale)
61 row.append(c.get_statut_display())
62 row.append(c.diplome)
63 row.append(c.nom_etablissement)
64 row.append(c.pays)
65 row.append(', '.join(g.nom for g in c.groupes.all()))
66 try:
67 t = c.these
68 row.append('%s, %s, %s, %s pages.' % (t.titre, t.etablissement, t.annee, t.nb_pages))
69 row.append(t.directeur)
70 except These.DoesNotExist:
71 row.append('')
72 row.append('')
73 row.append(c.discipline.nom if c.discipline else '')
74 row.append(c.theme_recherche)
75 row.append(c.equipe_recherche)
76 row.append(c.mots_cles)
77 row.append(c.url_site_web)
78 row.append(c.url_blog)
79 row.append(c.url_reseau_social)
80 if c.membre_instance_auf:
81 row.append(', '.join([c.membre_instance_auf_nom, c.membre_instance_auf_fonction, c.membre_instance_auf_dates]))
82 else:
83 row.append('')
84 if c.expert_oif:
85 row.append(', '.join([c.expert_oif_details, c.expert_oif_dates]))
86 else:
87 row.append('')
88 if c.membre_association_francophone:
89 row.append(c.membre_association_francophone_details)
90 else:
91 row.append('')
92 if c.membre_reseau_institutionnel:
93 row.append(', '.join([c.membre_reseau_institutionnel_nom, c.membre_reseau_institutionnel_fonction, c.membre_reseau_institutionnel_dates]))
94 else:
95 row.append('')
96 row.append('; '.join(', '.join([e.nom, e.date, e.organisme_demandeur]) for e in c.expertises.all()))
97 if c.expertises_auf is None:
98 row.append('')
99 else:
100 row.append('Oui' if c.expertises_auf else 'Non')
101 row.append('; '.join(p.publication_affichage if p.publication_affichage else
102 '%s, %s, %s, %s, %s, %s, %s pages.' %
103 (p.auteurs, p.titre, p.revue, p.annee, p.editeur, p.lieu_edition, p.nb_pages)
104 for p in c.publications.all()))
105 data.append([smart_str(x) if x else '' for x in row])
106 return exportateur(headers, data, type, filename='chercheurs.%s' % type)
107
108 def create_ldap_hash(password):
109 salt = os.urandom(4)
110 raw_hash = hashlib.sha1(password.encode('utf-8') + salt).digest()
111 ldap_hash = '{SSHA}' + base64.b64encode(raw_hash + salt)
112
113 return ldap_hash
114
115 def check_ldap_hash(ldap_hash, password):
116 hash_salt = base64.b64decode(ldap_hash[6:])
117 hash = hash_salt[:-4]
118 salt = hash_salt[-4:]
119 test = hashlib.sha1(password.encode('utf-8') + salt).digest()
120 return test == hash