On 05/07/10 08:25 +0200, Korbinian Preisler wrote:
> Am Sonntag, den 04.07.2010, 19:56 +0200 schrieb Cédric Krier:
> > On 04/07/10 18:24 +0200, Cédric Krier wrote:
> > > On 04/07/10 10:21 +0200, Cédric Krier wrote:
> > > > On 23/06/10 08:35 +0200, Cédric Krier wrote:
> > > > > Hi,
> > > > > 
> > > > > I will start the developpement of the contextualisation of cursor, 
> > > > > user and
> > > > > context inside a threading locale [1].
> > > > > I would like to use the with statement (available in Python 2.6 by 
> > > > > default and
> > > > > 2.5 (with "from __future__ import with_statement")) for this kind of 
> > > > > purpose:
> > > > > 
> > > > > 
> > > > >     from trytond import transaction
> > > > >     with transaction.set('user', 0):
> > > > >         ...
> > > > > 
> > > > > The 'user' will be restored at exit of the with statement.
> > > > > 
> > > > 
> > > > I'm starting this implementation and I'm facing an issue with "context".
> > > > I would like also to put context in the transaction but there is some
> > > > problems:
> > > > 
> > > > - the context has been most of the time put as last keyword (except for 
> > > > some
> > > >   methods like search). So it is complicated to find it in the args 
> > > > list.
> > > >   But we can change those methods and put the context as first argument 
> > > > for
> > > >   external calls (this will change the API).
> > > > 
> > > > - if we remove the context from the methods then the signature of each 
> > > > method
> > > >   will be different between external call and internal. It is already 
> > > > the case
> > > >   with cursor and user but one goal of this change is to fix it.
> > > > 
> > > > 
> > > > So is there someone knows an other framework that has the same 
> > > > context-like
> > > > behavior and how they solve it?
> > > > 
> > > > Or perhaps the solution will be to drop the context for a better 
> > > > solution as
> > > > I always found it is not an elegant one.
> > > > 
> > > 
> > > I think I found a solution.
> > > The context parameter is only an issue for method callable by rpc. So I
> > > propose to create a decorator on these methods that will put the context
> > > dictionnary from parameter and put it in the transaction.
> > > So methods will look like this:
> > > 
> > >     from trytond.protocols import rpc
> > > 
> > >     @rpc(True)
> > >     def read(self, fields_names=None, context=None):
> > >         ...
> > > 
> > > 
> > > rpc will look:
> > > 
> > >     def rpc(commit=False):
> > >         def __call__(self, function):
> > >             arg_names = inspect.getargspec(function)[0]
> > >             i = arg_names.index('context')
> > >             def call(*args, **kwargs):
> > >                 context = None
> > >                 if len(args) >= i and args[i]:
> > >                     context = args[i]
> > >                 elif 'context' in kwargs:
> > >                     context = kwargs['context']
> > >                 transaction.set_context(context)
> > >                 return function(*args, **kwargs)
> > > 
> > > 
> > > And more we will be able to construct _rpc by introspection.
> > 
> > I found some disavantage with this method:
> > 
> > - decorator will not work well with the Tryton extention mechanism (it will
> >   require to re-apply it on each extended method)
> > 
> > - it will not allow the change a non-rpc method into a one because non-rpc
> >   method will not have context then rpc decorator will not work
> > 
> > So finally, I think it is simplier to force to have context as last argument
> > of each rpc call and then remove context from every methods.
> > 
> Hi,
> 
> there are already some places where context is used. 
> This is one example:
> http://hg.tryton.org/hgwebdir.cgi/modules/sale/file/7c034ebad23f/sale.py#l973
> Other examples are some of the default values.

This is a temporal fix in waiting a better solution.


> We also use context in some of our custom modules to pass important
> contextual data in some cases.

This is a practice that must be avoided as much as possible.

> How will this be possible if you remove
> context from every methods? I think this is a important feature and we
> will need it.

It will be in transaction.

-- 
Cédric Krier

B2CK SPRL
Rue de Rotterdam, 4
4000 Liège
Belgium
Tel: +32 472 54 46 59
Email/Jabber: [email protected]
Website: http://www.b2ck.com/

Attachment: pgptTdLfrqFua.pgp
Description: PGP signature

Reply via email to