En effet, python n'aime pas que les objets multables soient utilisé dans des sets
ou comme clef de dictionnaire, du coup, on va essayer de ne pas le contrarier.
De toute façon, c'est logique vu que la valeur du hash change si on édite l'objet.
Pour ça on est obligé (si on utilise pyparsing) de générer la liste de tous les charactère unicode.
Daniel fait remarquer que ça n'est pas joli d'instancier une chaine de 63Ko quand on veux parser quelque chose.
On ne le fait tout de même que de façon paresseuse la première fois que l'on a besoin de parser quelquechose
(dans filter2, filter3 est juste un proof of concept).
Pour faire du human_to_ldap, on peut utiliser directement la fonction de filter.py qui n'est pas impacté
par le problème, mais pour ressucite, on a pour le moment pas le choix puisqu'on utilise la fonction
human_to_list qui n'est fournie que dans les modules filter2 et filter3.
À noter que __getattr__ n'est appelé que si l'attribut n'existe pas déjà.
Ça permet d'utiliser l'objet Attr comme sa valeur pour la plupart des opération
de lecture simple.
J'ai fait exprès de ne pas surcharger __setattr__, parce que sinon, on ne sait
plus trop ce qui va être affecté. J'estime que les écriture doivent être traités au
cas par cas comme pour blacklist ou pour article.
Au lieu d'être obligé de faire à chaque fois obj[attr] = obj[attr] + [val]
on peut faire directement obj[attr].append(val).
Si on affecte obj[attr] à une variable (l=obj[attr])
et que l'on modifie la variable (l.append(val)), a la fois la variable et obj[attr] sont modifié
et maintenue à jour.
Attention toutefois :
l1 = obj[attr]
l2 = obj[attr]
l1 == l2 <=> True
l1.append(val)
l1 == obj[attr] <=> True
l1 == l2 <=> False
l2 == obj[attr] <=> False
et l2.append(val) lèvera une exception.
possibilité de fournir une valeur du bon type python à un attribut
test booléen sur s'attribut propagée à sa valeur.
Le teste d'égalité sur un attribut peut se faire avec la sérialisation de
l'attribut ou le type python qui le représente.
Le teste d'égalité sur les cransLdapObjet se fait sur le dn et ses attributs.
De plus, on peut aussi le testé avec un chaine de caractère :
"host=freebox.crans.org" == MachineCrans(...) renvoie True ssi
MachineCrans(...) a l'attribut host, qu'il est globalement unique et vaut
freebox.crans.org
vala vala
Ça permet d'utiliser des fonctions générique sur les machines lc_ldap
pour s'occuper aussi du multicast. Notamment dans /usr/scripts/gestion/gen_confs/bind2.py
où cela nous permet de générer gratuirement la zone tv.crans.org et son reverse.
This reverts commit a79e0a4113.
Il vaut mieux laisser les imports en tête de fichier dans la mesure du
possible. De plus, cette erreur est plus confortable, car l'apprenti sait
dès le départ qu'il y a un problème. Enfin, ce bout de code try_import
peut servir pour d'autres imports posant des problèmes. On prend cependant
note que try_import pour annuaires_pg n'est pas utile.
* On ne peut pas utiliser mailExt, car on souhaite que cet attribut ne
soit pas en conflit avec les autres attributs de mails (oui, on accepte
la redondance)
On retire la fonction import_secrets. Elle ne semble pas être utilisée
ailleurs.
Normalement, "/usr/scripts" est dans le PYTHONPATH, si ce n'est pas le cas,
l'import va planter. En cas d'erreur, on essaie (temporairement) un second
import en rajoutant d'abord ce path, tout en crachant un truc sur stderr
(histoire de trouver les méchants scripts qui n'ont pas le path de base).
Cette méthode a l'air de moins planter pour trouver le nom de l'utilisateur,
par exemple depuis un initscript qui a nettoyé drastiquement l'environnement.
En réalité je me demande s'il ne vaudrait pas mieux utiliser uniquement
celle-là… À méditer.
Comme expliqué dans le compte rendu de l'internounou du 28 Novembre 2013.
Tout le monde peut importer annuaire_pg, sinon, vu qu'il est également importer
par attributs.py, ça fait longtemps que ça ne marcherait plus.
* Du coup, les apprentis n'ont plus le droit d'utiliser lc_ldap.
* C'est mal.
* Donc, je kludge, mais ça reste crade.
* Il faudra améliorer ça, et arrêter de faire des imports sauvages
nécessitant des droits sans s'être un peu assuré qu'ils ne seront
pas faits si on les a pas.
* Il faudrait donc globaliser la fonction try_import et l'améliorer.
en même temps, on met une fonction pour lister les adherents.
Je ne suis pas trop satisfait de ces fonctions de listing, mais je ne vois pas
vraiement comment faire autrement.