CMDBuild Forum

Webservice CMDBUild con python

Salve a tutti.

Ho un problema con il webservice di cmdbuild:sto cercandi di utilizzarlo con un framework python (suds) il quale

riconosce prontamente il wsdl, riesce ad interagire col webservice per caricare informazioni ma non riesce ad interpretare l'xml che torna dal webservice

.

Il problema è già noto?Saluti.

 

Ciao, quando abbiamo sviluppato il nostro modulo plonecmdbuild (http://plone.org/products/tecnoteca-plonecmdbuild) abbiamo utilizzato la libreria ZSI e l’abbiamo patchata per gestire i messaggi multipart/related che arrivano da Apache CXF.

Una volta patchata la ZSI è stato necessario attivare l'interceptor di cxf scommentando la sezione "Fix for non-standard webservice clients":
https://bitbucket.org/tecnoteca/cmdbuild/src/d5412e1be113/cmdbuild/src/main/resources/org/cmdbuild/soapws.xml
Questo però era con la ZSI-2.1-a1.
Se vuoi magari puoi dare un'occhiata al prodotto tecnoteca-plonecmdbuild, c'è sia la documentazione che il codice per connettersi ai webservice.
 
Ciao,
Marco

Caro Marco, grazie per il suggerimento.

In effeti cercando nel forum in inglese ho trovato un link alla patch che avete fatto alla

ZSI-2.1-a1 e la ho scaricata ed applicata.

Appeno provata a fondo lascero' un messaggio.

Ho preso la struttura usata per plone e con un po' di aggiustamenti sono riuscito a fare cio'

 

from CMDBuildWebservice import *

 

cws = CMDBuildWebservice()

cws.getMenuSchema()

cws.getCardList(name='prova')

 

ottenendo come risultato:

 

User admin: calling "getMenuSchema" with args () and kwargs {}

An error was discovered processing the <wsse:Security> header

None

User admin: calling "getCardList" with args () and kwargs {'name': 'prova'}

An error was discovered processing the <wsse:Security> header

None

 

Ovviamente ho messo le definizioni di user e pwd nel file WSProperties ed ho "potato" quanto afferente a plone in merito a sessione e quant'altro.

Sono un po' arenato adesso, potete darmi qualche suggerimento?

 

Saluti Francesco

Stai utilizzando la classe "SignatureHandler" presente nel prodotto plone per gestire l'autenticazione?

Previously Tecnoteca wrote:

Stai utilizzando la classe "SignatureHandler" presente nel prodotto plone per gestire l'autenticazione?

Avevo sbagliato!!

Adesso la uso per bene ed in effetti cambia un po'

mi da "AUTH_LOGIN_WRONG" ma uso user e password con cui entro.

Cosa posso avere sbagliato?

Saluti F.

 

Ciao, segui le istruzioni della sezione “configure cmdbuild” di questo documento:

https://svn.plone.org/svn/collective/tecnoteca.plonecmdbuild/trunk/docs/Tecnoteca%20Plone-CMDBuild-en.pdf
( nota: il file xml da modificare per attivare il fix della guida è "soapws.xml", non "application-context.xml" )

Adesso riesco ad entrare ed ad operare!! Il problema ora è eseguire query full text da webservice:

non riesco a capire come invocare il motore di query. In pratica riesco solo ad usare "EQUALS" in searchCards e "LIKE" ma solo con campi testo.

Nella primissima applicazione che sto sviluppando ho bisogno di cercare dei record per timestamp ma naturalmente "LIKE" non è per nulla adatta alle date ne' e' adatta "EQUALS" dato che ho bisogno di cercare da un timestamp in poi.

Come posso agire?

Saluti Francesco

Trovi un paio di esempi nel Workflow Manual (pag. 42) ma in realtà molto limitati.

Ti riporto sotto qualche esempio in più

con confronto fra CQL ed SQL

Fabio

 

----------------------------

 

Filtro semplice

 

Il filtro semplice permette di filtrare su un valore costante:

SQL:

SELECT

    *

FROM

    “NomeClasse”

WHERE

    “Attributo”=Valore

CQL:

from NomeClasse where Attributo=Valore

 

ESEMPIO:

Selezione della email del gruppo “NomeGruppo” nell'extended attribute manageEmail.

Nella definizione definizione dell'extended attribute si definisce il parametro ToAddresses nel seguente modo:

ToAddresses={cql:nomeQueryCQL.Email}

quindi è possibile definire la seguente query CQL:

nomeQueryCQL=”select Email from Role where Code='NomeGruppo'”

 

Filtro semplice con variabile lato server

 

Questa query permette di filtrare su una variabile lato server:

SQL:

SELECT

    *

FROM

    “NomeClasse”

WHERE

    “Attributo”=VariabileServer

CQL:

from NomeClasse where Attributo={server:NomeVariabile}

NOTE:

Per identificare la variabile NomeVariabile (in visualizzazione nella form) si utilizza la forma semplice:

{server:NomeVariabile}

Per attributi di tipo LookUp o Reference è necessario specificare tramite la notazione puntata se si vuole l'Id o la Description:

{server:NomeVariabile.Id}

{server:NomeVariabile.Description}

 

ESEMPIO:

Selezione della email dell'utente selezionato tramite l'attributo “Richiedente”, di tipo reference,  nell'extended attribute manageEmail. Nella definizione definizione dell'extended attribute si definisce il parametro ToAddresses nel seguente modo:

ToAddresses={cql:nomeQueryCQL.Email}

quindi è possibile definire la seguente query CQL:

nomeQueryCQL="select Email from Personale where Id={server:Richiedente.Id} and Status='A'"

 

Filtro semplice con variabile lato client

 

Questa query permette di filtrare su una variabile lato client, si fa notare che se il campo nella form non è valorizzato la query semplice con variabile lato client segnala un errore in quanto il valore della variabile lato client non è ancora definito. Per risolvere questo problema è necessario utilizzare i Metadati (v. filtri con metadati):

SQL:

SELECT

    *

FROM

    “NomeClasse”

WHERE

    “Attributo”=VariabileClient

CQL:

from NomeClasse where Attributo={client:NomeVariabile}

NOTE:

Per identificare la variabile NomeVariabile (in visualizzazione nella form) si utilizza la forma semplice:

{client:NomeVariabile}

Per attributi di tipo LookUp o Reference è necessario specificare tramite la notazione puntata se si vuole l'Id o la Description:

{client:NomeVariabile.Id}

{client:NomeVariabile.Description}

 

ESEMPIO:

L'esempio più comune è simile a quello della variabile lato server (sostituendo client a server)

 

1 Like

Putroppo non riesco a capire come usare queste sintassi per filtrare le cards dal webservice.

Ho capito come filtrare con il filtro base e la combinazione dei flitri, ma, se ho ben capito, posso usare solo like e equal come operatori. Se volessi filtrare l'ultima card inserita con certe caratteristiche  o tutte le card con data successiva ad una certa data, come potrei fare dall'interno del webservice.

Ripeto che il problema è usare il CQL dall'interno del webservice, se possibile.

Saluti Francesco

 

Previously Tecnoteca wrote :

Trovi un paio di esempi nel Workflow Manual (pag. 42) ma in realtà molto limitati.

Ti riporto sotto qualche esempio in più

con confronto fra CQL ed SQL

Fabio