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.
À 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
* 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)
* Quand on modifie un attribut qui devrait en modifier d'autres, on peut
invoquer check_changes pour voir ce qui devrait être changé, puis
validate_changes pour rendre ces changements effectifs. Il ne reste plus
qu'à appeler save pour enregistrer le tout.
* Correction de petits problèmes sur les locks : quand save réussissait,
ils n'étaient pas virés.
* En cas d'erreur au create ou au save, on supprime les locks malgré tout
* Les fonctions new* modifiaient directement le dico qu'on leur passait en
argument, on fait désormais une copie de celui-ci, de façon à ce que test.py
n'instancie pas toujours le même objet en croyant instancier des objets
différents à chaque fois
* Cela permet de trouver une typo dans services.py
* crans_utils a été un peu corrigé.
* Malheureusement lc_ldap._create_entity et objet.create sont un peu
sales, mais j'ai pas trouvé mieux.
* L'historique contient désormais les secondes.
* Maintenant, on va pouvoir identifier formellement les machines v6-only et les autres, sans perdre
la possibilité de passer de l'une à l'autre rapidement (avec les changements qui vont bien)