J’ai décidé de consacrer mon premier post à un petit développement que j’ai réalisé pour un projet. Ce projet est développé en Python et interagit avec un annuaire LDAP. J’utilise des tâches asynchrone pour effectuer les modifcations sur mes objets LDAP.

Il arrive souvent que deux tâches s’éxecutent en même temps pour modifier le même attribut du même objet et y ajouter/supprimer une valeur différente.

Le protocole LDAP permet de modifier un attribut de type “Multi-valué” de manière atomique. Par exemple, l’attribut member d’un groupe est “Multi-valué”, c’est à dire qu’il contient plusieurs valeurs.

Pour modifier un attribut de type “Multi-valué”, le protocole LDAP nous offre plusieurs possibilités dont :

  • ldap_mod_del: On fournit une liste de valeur que l’on veut supprimer
  • ldap_mod_add: On fournit une liste de valeur que l’on veut ajouter
  • ldap_mod_replace: On fournit l’ensemble de la nouvelle valeur et on écrase ce que contient le LDAP

Je ne peux donc pas utiliser la dernière possiblité car, je risque d’écraser ce qui a été ajouté/supprimé par la tâche qui s’est exécutée en même temps.

Je dois utiliser les deux premières et pour ce faire, savoir ce qui a été ajouté ou supprimé après la lecture sur l’annuaire. Comme j’ai utilisé un framework pour ce projet, je ne pouvais pas simplement créer deux listes contenant les valeurs ajoutées et supprimées. J’ai donc décidé de créer cette petite classe qui est une lise standard de python gardant la trace des ajouts et suppressions.

Cette classe est très simple à utiliser.

from awarelist import AwareList

# Initialisation d'une liste avec deux éléments
aw_list = AwareList(["Element1", "Element2"])

# Travail sur la liste
aw_list += ["New element"]
aw_list.append("New append")
aw_list.pop()
aw_list.remove("Element1")
aw_list.extend(["Extend 1", "Extend 2"])
aw_list.insert(2, "New Insert")
aw_list[0:1] = ["Element 1", "Element 2"]
del aw_list[2]

# Récupération des listes contenant les valeurs ajoutées et supprimées
aw_list.added
aw_list.removed

Vous trouverez ce projet à l’adresse suivante : AwareList


Guillaume Pannatier