Mohamed M. Hagag
Mohamed M. Hagag

Reputation: 147

Odoo 11+ How to override function args and all calls to it without overriding every call

I want to override the uom._compute_price() and compute_quantity() in odoo to add product as an argument.

the problem is that these functions are called in many other functions in many other modules like stock, account, sale, purchase.

So I have to override each calling function which is about 140 occurrences .

Is there a better way to implement this without modifying the 140 calls ?

for ex. in the overridden functions, can I get the original caller object and its attributes ?

Upvotes: 2

Views: 301

Answers (2)

Yajo
Yajo

Reputation: 6448

Changing an upstream method arguments is not recommended, and you are discovering the why.

However, your calls to it can add a key in the context, and the overridden method can react to it. Example:

def _compute_price(self, original_args):
    if self.env.context.get("product_id"):
        # Do your stuff here
    return super()._compute_price(original_args)

Then, from other parts of your module, call the method with that context key:

uom.with_context(product_id=product.id)._compute_price(original_args)

Another option would be to add the context key in the overriden method itself, if you want it to be present under every call:

def _compute_price(self, original_args):
    # Get the product somehow here
    return super(type(self), self.with_context(product_id=product.id))._compute_price(original_args)

However, keep in mind that only addons that are aware of this context and react to it actually need it. The 1st approach should be the most accurate for most cases.

Upvotes: 1

Charif DZ
Charif DZ

Reputation: 14751

If there is a way to get the product from self or any other object, you can make product_id a keyword only argument and check it's not None, else you set it your self from an object.

      def _compute_price(self, same_arguments,*,product_id=None)
          if product_id is None:
                product_id = # get the id from something

          # your code here

If you can't get the product_id from anywhere I hope you find and solution for that or you have to edit all calls.

Upvotes: 1

Related Questions