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/
pgptTdLfrqFua.pgp
Description: PGP signature
