[Résolu] Accès carnets d'adresses SOAP Python

Chers développeurs,
souffrez qu’un modeste admin système, qui utilise Python par prédilection, empiète un peu sur vos plate-bandes. J’accède via l’API aux domaines, aux utilisateurs et aux agendas (pour des fonctions simples, mais ça renvoie ce que je veux, c’est le principal), par contre je patine pour accéder aux carnets d’adresse et aux contacts. Un petit coup de main serait grandement apprécié !

Ne me renvoyez pas à la doc de l’API, je l’ai parcouru en long en large et en travers, ça ne m’a pas aidé. Les exemples sur github non plus. Le fait que je ne parle pas le java dans le texte limite un peu la compréhension des ficelles du bidule.
Tiens d’ailleurs à destination des rédacteurs de la doc : quelques exemples dans les références de l’API serait un gros plus. Un énorme même, si c’est proposé sous différents langages :wink:

UP ? Personne n’a d’exemple en python, afin que je comprenne au moins la logique ?

Il y a des exemple python dans notre git.

Pas sûr qu’il y ait des exemples sur les contacts en particulier… Que souhaiteriez-vous faire ?

:frowning:
Un premier exemple serait d’avoir un script de “nettoyage” de carnet d’adresse, soit totalement pendant des tests, soit sur filtre. Un second, de dédoublonner plusieurs carnets perso pour créer un carnet “commun”. Un troisième, de lier un petit outil interne de gestion d’interventions en Django, avec la base de contact pour intégrer le demandeur d’une intervention d’après une liste déroulante. Bref, il y a un tas d’application, mais il faut comprendre comment ça marche ! Et pour l’instant, je n’ai pas réussi à extraire la moindre information concernant les contacts…

Vous devez pouvoir trouver pas mal d’informations dans ce plugin par exemple.

Nous allons ajouter des cas d’utilisation des contacts via SOAP dans nos exemple.

Ah merci, en épluchant ce code j’ai effectivement trouvé une ou deux pistes. Le test ci-dessous :

#!/usr/bin/python
# Before running this you need to:
# sudo apt-get install python-suds
from suds import WebFault
from suds.client import Client
from datetime import datetime,timedelta
#import sys

url = 'https://bluemind.domain.fr/soap/proxy?wsdl'
DOM = 'domain.fr'
login = 'myuser@' + DOM
password = 'mypassword'

print "Connexion au serveur BlueMind..."
try:
  c = Client(url, cache=None)
  token = c.service.login(login, password, 'changeUserPassword')
  dq = c.factory.create('domainQuery')
  dq.excludeGlobal = True
  dq.name = DOM
  domains = c.service.findDomains(token, dq)
  for domain in domains:
    print("Domaine: %s" % domain.name)

    print("Carnets d'adresses :")
    clientContactChanges = c.factory.create('clientContactChanges')
    clientChange = c.factory.create('clientChange')
    clientContactChanges.updated = [clientChange]
    syncScope = c.factory.create('syncScope')
    syncScope.onlyMyContacts = False
    datetime_value = datetime.now().strftime('%Y-%m-%d %H:%M:%S')
    contactChanges = c.service.doContactSync(token, clientContactChanges, syncScope, datetime_value)
    for contact in contactChanges.updated:
       print("id=%s, folderId=%s, %s" % (contact.id, contact.folderId, contact.displayName))

  c.service.logout(token)

except Exception, e:
  print e

liste bien les contacts, y compris des carnets partagés. Y a-t-il un moyen de faire la même chose sans doContactSync, en lisant la base directement ?

Lire directement la base est fortement déconseillé, en faisant cela vous aurez les données brute et ce sera à vous d’appliquer toutes les règles métier permettant de les consolider ou de les rendre accessibles.
Je ne pense pas que ce soit une bonne idée, d’autant que vous aller lier votre code à une version de BlueMind - la structure de la BD pouvant évoluer à chaque version.

Pour conserver le support, il ne faut jamais y écrire directement mais passer par les API.