FrEduVecteur.py
1 |
# -*- coding: utf-8 -*-
|
---|---|
2 |
|
3 |
class ExtAttr(object): |
4 |
"""classe pour l'accès à un attribut stocké dans une source de données externe
|
5 |
"""
|
6 |
|
7 |
def __init__(self, attr_name): |
8 |
"""initialise le connecteur vers la source de données
|
9 |
attr_name est calculé automatiquement lors du chargement de ce module
|
10 |
"""
|
11 |
self.attr_name = attr_name
|
12 |
self.db_path = '/usr/share/sso/reverseTeleservice.db' |
13 |
|
14 |
def get_local_attrs(self, attr_values, attr_set): |
15 |
"""
|
16 |
retourne l'identifiant ENT d'un responsable ou élève en fonction
|
17 |
du vecteur de fédération FrEfuVecteur transmis par le guichet ATEN.
|
18 |
La correspondance est calculée en amont et stocké dans une base locale.
|
19 |
Renvoie également une liste des établissement communiqués dans le vecteur (il peut
|
20 |
être multivalué dans le cas d'un responsable).
|
21 |
@param attr_values: valeur envoyée par l'IDP pour l'attribut 'self.attr_name'
|
22 |
@param attr_set: jeu d'attribut utilisé. A mettre à jour par rapport aux attributs renvoyés après calcul
|
23 |
"""
|
24 |
import shelve |
25 |
from os.path import isfile |
26 |
import unicodedata |
27 |
|
28 |
def enleve_accents(val): |
29 |
if type(val) == str: |
30 |
val = unicode(val, 'UTF-8') |
31 |
val = ''.join((c for c in unicodedata.normalize('NFD', val) if unicodedata.category(c) != 'Mn')) |
32 |
return val.encode('UTF-8') |
33 |
|
34 |
# user_attrs: Dictionnaires d'attributs (nom/valeur) qui remplaceront
|
35 |
# l'attribut renvoyé par l'IDP correspondant à self.attr_name
|
36 |
#
|
37 |
user_attrs = {} |
38 |
if not isfile(self.db_path): |
39 |
return user_attrs
|
40 |
# recherche du dn de l'utilisateur
|
41 |
if attr_values:
|
42 |
liste_rne = [] |
43 |
db = shelve.open(self.db_path, 'r') |
44 |
# suppression de 'FrEduVecteur' dans le jeu d'attributs
|
45 |
# (il n'est pas utilisé par la suite pour retrouver l'utilisateur)
|
46 |
del(attr_set['user_attrs'][self.attr_name]) |
47 |
# traitement des valeurs envoyées dans le vecteur FrEduVecteur (un par élève pour les parents)
|
48 |
for clerecherche in attr_values: |
49 |
# suppression des éventuels accents dans le vecteur
|
50 |
clerecherche = enleve_accents(clerecherche) |
51 |
# calcul des attributs à renvoyer si le vecteur est trouvé
|
52 |
try:
|
53 |
typevect = clerecherche.split('|')[0] |
54 |
cleidstruct = clerecherche.split('|')[3] |
55 |
etabe = clerecherche.split('|')[4] |
56 |
except:
|
57 |
print('Mauvais format de données pour la clé de fédération %s : %s' % (self.attr_name, clerecherche.encode('utf-8'))) |
58 |
# si un vecteur est mal formé, on essaye quand même d'évaluer les autres
|
59 |
continue
|
60 |
# Pour les parents et élèves, on récupère ENTEleveStructRattachId dans le vecteur
|
61 |
if etabe not in liste_rne: |
62 |
liste_rne.append(etabe) |
63 |
if typevect in ("1", "2") and clerecherche in db: |
64 |
# dans le cas des parents, on renvoie 'ENTPersonJointure' (intid) qui est stocké dans la base
|
65 |
intid = db[clerecherche] |
66 |
if user_attrs.get('intid', intid) != intid: |
67 |
print "ATTENTION, ATTRIBUT INTID NON UNIQUE (%s : %s != %s)" % (clerecherche, user_attrs.get('intid', intid), intid) |
68 |
user_attrs['intid'] = [intid]
|
69 |
# ajout de intid au jeu d'attributs
|
70 |
attr_set['user_attrs']['intid']='intid' |
71 |
elif typevect in ("3", "4"): |
72 |
# cas d'un élève connecté depuis le guichet ATEN, la clé de recherche dans l'annuaire est ENTEleveStructRattachId
|
73 |
user_attrs['ENTEleveStructRattachId'] = cleidstruct
|
74 |
# ajout de ENTEleveStructRattachId au jeu d'attributs
|
75 |
attr_set['user_attrs']['ENTEleveStructRattachId'] = 'ENTEleveStructRattachId' |
76 |
db.close() |
77 |
|
78 |
user_attrs['ENTStructRattachId'] = liste_rne
|
79 |
return user_attrs
|