On Dec 11, 2006, at 11:37 PM, Dennis Muhlestein wrote:
>
>
>>> -Dennis run_with_transaction is a generic function you can
>>> specialize to fit
>> your needs, for example:
>>
>> from turbogears.database import run_with_transaction, _use_sa
>>
>> @run_with_transaction.when("getattr(func, '_no_trans', False) and
>> _use_sa()")
>> def _no_trans_for_this_method(func, *args, **kw):
>> return func(*args, **kw)
>>
>> Now in any controller method you can set a _no_trans attribute to
>> True so this specialized version which doesn't start a session or
>> begins any transaction runs when run_with_transaction is called:
>>
>
> This is a nice approach to this problem. I learned how generic
> functions work and checked out how run_with_transaction is implemented
> using that concept.
>
> There is one issue though, when using the approach mentioned, my
> _no_trans_ method still isn't called. The _use_sa() function returns
> another the sa_rwt method because it evaluates to true before this
> rule
> is evaluated. I see an implementation for Ordered generic
> functions in
> the genericfunctions.py file but that method is not being used by
> run_with_transaction.
>
> If I could call:
>
> @run_with_transaction("getattr(func,"_no_trans",False) and
> _use_sa()",order=0)
>
> Then this would work I believe.
>
> Should TG be patched to handle this or am I missing something?
> Thanks
That should have worked (unless I'm missing something) because the
rule that I wrote in the example that checks for _use_sa() *and*
getattr(...) is more specific than _use_sa() by itself, however, for
some strange reason (at least strange to me) it seems it doesn't
work. Have you tried swapping the predicates?
"""_use_sa() and getattr(func,"_no_trans",False)"""
If that still doesn't make it, fortunately, as you've noticed, TG has
the infrastruture to handle the "order" argument to the
GenericFunction decorators. You'll need to patch
database.run_with_transaction so it looks like this:
from turbogears.genericfunctions import MultiorderGenericFunction
@generic(MultiorderGenericFunction)
def run_with_transaction(....)
You'll need to set the order to -1 so it runs before the default
which is 0.
If this solution works and all tests pass you could submit a ticket
with the patch so we can commit it.
However, TG 1.0 is in a feature-freeze standstill, so the dilema is:
is this a new feature or a bug fix? I'd consider it a "bug" because
the fact that "run_with_transaction" is a generic function suggests
that the kind of thing you're trying to do should be possible... I
have no problem in comitting it if it doesn't break anything. Opinions?
Alberto
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups
"TurboGears" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to [EMAIL PROTECTED]
For more options, visit this group at
http://groups.google.com/group/turbogears?hl=en
-~----------~----~----~----~------~----~------~--~---