Projet

Général

Profil

FrEduVecteur.py

version corrigée du fichier d'attribut externe pour fédération Télé Services -> Seshat) - Bruno Boiget, 04/07/2014 16:41

Télécharger (4,11 ko)

 
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