Custom field type vs XMLRPCDecoder - Tryton 3.4

31 views
Skip to first unread message

M. Murray

unread,
Dec 10, 2016, 12:46:09 PM12/10/16
to tryton
I have a Python module that creates two custom Tryton fields. When this module is imported, it calls  the XMLRPCDecoder.register method from trytond.protocols.xmlrpc to add a decoder method for my custom types. It also creates a marshalling function for xmlrpclib that puts the custom data into a struct so it can be sent over XMLRPC safely. 

When using one trytond instance as a client to another, the wire value of the custom type doesn't get translated back to the proper Python type like the decoder function would produce. That is, the decoder function is not called at all. 

When I use the python shell to script a client, I can receive properly translated data as long as I import the module before trying to make a request to the trytond server. If I send any data to the server with my custom type, the trytond server doesn't call the decoder method.

I know the module is imported and that the registration is still in place throughout the lifetime of the trytond process. I have verified this in my debugging attempts.

And, all of this worked fine in Tryton 3.2 and 3.4 prior to us upgrading to trytond 3.4.14. 

Admittedly, this is a fairly advanced usage of Tryton. So, I'll post some code that hopefully explains the problem better than I have done above.

# how does the custom type, a bitstring.BitArray object get translated to
# to some wire value before being sent over the wire and how it should get
# translated back

# produce the wire value put into xmlrpc struct
bitstr2wire = lambda o: {'__class__': 'bitstring', 'bin': o.bin}

# register the encoding function with xmlrpclib
xmlrpclib.Marshaller.dispatch[bitstring.BitArray] = \
        lambda self, value, write: self.dump_struct(bitstr2wire(value), write)

# produce the bitstring.BitArray object from the wire data
wire2bitstr = lambda dct: bitstring.BitArray(bin=dct['bin'])
# register the decoding function with Tryton's XMLRPC Decoder
XMLRPCDecoder.register('bitstring', wire2bitstr)


So, I'm asking if anyone knows of something that changed in trytond post 3.4.7 that may affect this or maybe a change in the core Python xmlrpclib that causes the trytond based XMLRPCDecoder function to not get called. 

 

M. Murray

unread,
Dec 16, 2016, 2:17:09 AM12/16/16
to tryton
I have given up on XMLRPC and that implementation. Instead I have attempted to re-implement the whole thing using JSON-RPC. And (probably as expected) it's faster too. A win I think.
Reply all
Reply to author
Forward
0 new messages