Commit | Line | Data |
---|---|---|
ae075d2c | 1 | # -*- coding: utf-8 -*- |
695930dd | 2 | |
ae075d2c PP |
3 | import base64 |
4 | import hashlib | |
5 | import os | |
695930dd | 6 | import re |
ae075d2c | 7 | |
66386d77 | 8 | from django.utils.encoding import smart_str |
695930dd EMS |
9 | from django.contrib.auth.models import User |
10 | ||
66386d77 PP |
11 | from django_exportateur.exportateur import exportateur |
12 | ||
13 | ||
695930dd EMS |
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 | |
66386d77 PP |
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) | |
544dec4f PP |
107 | |
108 | def create_ldap_hash(password): | |
ae075d2c | 109 | salt = os.urandom(4) |
544dec4f PP |
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 | |
ae075d2c PP |
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 |