Hi Yannick,

These are limitations of the framework, not bugs, and are closely
related to the way Python functions are declared and passed as
parameters. So to answer your questions:

1) Yes this is normal, the store trigger is not currently overridable,
and this looks OK because you'd be breaking the OO encapsulation. There
is usually no sense in doing that unless you're also redefining the
implementing function, in which case you'll have to redefine the field
anyway.

2 & 3) When defining a fields.function instance, the implementing function is 
passed as a copy of the function object, at the time it is constructed. The 
same is true for the store trigger functions.  Therefore trying to override 
them will have no effect on the field, you have to redefine them completely.
Secondly, when you reference a method (as in 
account_analytic_line.account_analytic_line._get_account_line) and attach it to 
another object, you're silently unbinding/rebinding them (tricky Python methods 
mechanism) and you will probably never get the expected result.

Both of these use cases are not supported at the moment, and therefore I'll 
mark this bug as wishlist.
Feel free to suggest a clean framework API improvement to support them in the 
future.

As a hint, one way around these limitations would be to define the 
fields.function with a wrapper function that really calls the model's method, 
allowing to override it normally, and chain it properly with super() calls.
Even better, fields.function's constructor could play smart tricks with the 
function object it receives as parameters and store only their name, so that it 
can call the original methods on the object properly. Still, a mechanism for 
inheriting cleanly the store trigger rules would be needed.

** Changed in: openobject-server
   Importance: Undecided => Wishlist

** Changed in: openobject-server
       Status: New => Confirmed

** Changed in: openobject-server
     Assignee: (unassigned) => OpenERP's Framework R&D (openerp-dev-framework)

-- 
You received this bug notification because you are a member of C2C
OERPScenario, which is subscribed to OpenERP Project Group.
https://bugs.launchpad.net/bugs/893079

Title:
  [6.1] impossible to call super in ids getter method of store from
  function field : wrong self type

Status in OpenERP Server:
  Confirmed

Bug description:
  Hello,

  I found that it is impossible to override a method used in a stored
  function field.

  For exemple, I try to extend account.analytic.line depending on 
/analytic_multicurrency/account_analytic_line.py .
  This for the following fields :

   _columns = {
            'aa_currency_id': fields.function(_get_account_currency, 
method=True, type='many2one', relation='res.currency', string='Account 
currency',
                    store={
                        'account.analytic.account': (_get_account_line, 
['currency_id','company_id'], 50),
                        'account.analytic.line': (lambda self,cr,uid,ids,c={}: 
ids, ['amount','unit_amount','product_uom_id'],10),
                    },
                    help="The related analytic account currency."),
            'aa_amount_currency': fields.function(_amount_currency, 
method=True, digits=(16, int(config['price_accuracy'])), string='Amount 
currency',
                    store={
                        'account.analytic.account': (_get_account_line, 
['currency_id','company_id'], 50),
                        'account.analytic.line': (lambda self,cr,uid,ids,c={}: 
ids, ['amount','unit_amount','product_uom_id'],10),
                    },
                    help="The amount expressed in the related analytic account 
currency."),
            'company_id': fields.related('general_account_id', 'company_id', 
type='many2one', relation='res.company', string='Company', store=True, 
readonly=True),
      }

  
  Now, here are the problems :
  1) To extend the triggers on multi, by adding one new object to check, I have 
to rewrite the whole store dict
  2) I will have to redefine _get_account_line or any trigger method as it 
seems out of scope for store triggering.
  3) I can't use 'super' in rewritten method. -> no override is possible

  No inheritance is possible because the 'self' which is given by the
  trigger is an instance of the triggering object calling a method of
  the triggered object.

  
  I also tried to define the function that way :

  from analytic_multicurrency import account_analytic_line
  _get_account_line = 
account_analytic_line.account_analytic_line._get_account_line

  Still the error on store load is

   TypeError: unbound method _get_account_line() must be called with
  account_analytic_line instance as first argument (got
  account.analytic.account instance instead)

  
  The only way I found is to rewrite the whole getter method in my new class. 
That's a bit dirty.


  My running python : Python 2.6.5 (r265:79063, Apr 16 2010, 13:09:56)

  
  Yannick

To manage notifications about this bug go to:
https://bugs.launchpad.net/openobject-server/+bug/893079/+subscriptions

_______________________________________________
Mailing list: https://launchpad.net/~c2c-oerpscenario
Post to     : [email protected]
Unsubscribe : https://launchpad.net/~c2c-oerpscenario
More help   : https://help.launchpad.net/ListHelp

Reply via email to