Hello everyone,
I have several custom modules that I need to install, which extend models like sale.order.line and account.move.line. These models contain a large number of records.
In my custom modules, I have fields with compute and store=True, and I suspect this might be causing a memory error during installation. I would like to understand the best approach to successfully install these modules without running into performance or memory issues.
Here’s an example of one of the modules:
class SaleOrderLine(models.Model):
_inherit = 'sale.order.line'
currency_id2 = fields.Many2one(related='order_id.currency_id2', depends=['order_id.currency_id2'], store=True,
string='Secondary Currency')
price_subtotal_rate = fields.Monetary(string='Subtotal', currency_field='currency_id2',
compute='_compute_amount_rate_line', store=True)
price_unit_rate = fields.Monetary(string='Unit Price', currency_field='currency_id2',
compute='_compute_amount_rate_line', store=True)
@api.depends('order_id.rate', 'currency_id2', 'price_unit', 'price_subtotal')
def _compute_amount_rate_line(self):
_logger.info("Entering the method")
for line in self:
if line.order_id.company_id.currency_id2 == line.order_id.currency_id:
line.update({
'price_unit_rate': line.price_unit * line.order_id.rate,
'price_subtotal_rate': line.price_subtotal * line.order_id.rate,
})
if line.order_id.company_id.currency_id == line.order_id.currency_id:
if line.order_id.rate:
line.update({
'price_unit_rate': line.price_unit / line.order_id.rate,
'price_subtotal_rate': line.price_subtotal / line.order_id.rate
})
_logger.info("Exiting the method")
I would appreciate any advice on optimizing the installation process, especially regarding computed stored fields that may cause performance issues.
Thank you!
Here is an example of the error:
RPC_ERROR
Odoo Server Error
Traceback (most recent call last):
File , line 899, in get
return field_cache[record._ids[0]]
KeyError: 533602
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File , line 1083, in _get_
value = env.cache.get(record, self)
File , line 902, in get
raise CacheMiss(record, field)
odoo.exceptions.CacheMiss: 'sale.order.line(533602,).order_id'
The above exception was the direct cause of the following exception:
Traceback (most recent call last):
File , line 242, in _dispatch
result = request.dispatch()
File , line 702, in dispatch
result = self._call_function(**self.params)
File , line 368, in _call_function
return checked_call(self.db, *args, **kwargs)
File , line 94, in wrapper
return f(dbname, *args, **kwargs)
File , line 357, in checked_call
result = self.endpoint(*a, **kw)
File , line 925, in _call_
return self.method(*args, **kw)
File , line 546, in response_wrap
response = f(*args, **kw)
File , line 1328, in call_button
action = self._call_kw(model, method, args, kwargs)
File , line 1316, in _call_kw
return call_kw(request.env[model], method, args, kwargs)
File , line 471, in call_kw
result = _call_kw_multi(method, model, args, kwargs)
File , line 456, in _call_kw_multi
result = method(recs, *args, **kwargs)
File , line 2, in button_immediate_install
File , line 72, in check_and_log
return method(self, *args, **kwargs)
File , line 470, in button_immediate_install
return self._button_immediate_function(self.env.registry[self._name].button_install)
File , line 587, in _button_immediate_function
registry = modules.registry.Registry.new(self._cr.dbname, update_module=True)
File , line 87, in new
odoo.modules.load_modules(registry, force_demo, status, update_module)
File , line 474, in load_modules
processed_modules += load_marked_modules(cr, graph,
File , line 363, in load_marked_modules
loaded, processed = load_module_graph(
File , line 199, in load_module_graph
registry.init_models(cr, model_names, {'module': package.name}, new_install)
File , line 445, in init_models
env['base'].flush()
File , line 5692, in flush
self.recompute()
File , line 6165, in recompute
process(field)
File , line 6149, in process
field.recompute(recs)
File , line 1273, in recompute
self.compute_value(recs)
File , line 1295, in compute_value
records._compute_field_value(self)
File , line 4277, in _compute_field_value
fields.determine(field.compute, self)
File , line 88, in determine
return needle(*args)
File , line 79, in _compute_amount_rate_line
if line.order_id.company_id.currency_id2 == line.order_id.currency_id:
File , line 2620, in _get_
return super()._get_(records, owner)
File , line 1109, in _get_
recs._fetch_field(self)
File , line 3277, in _fetch_field
fnames = [
File , line 3285, in <listcomp>
if not (f.compute and self.env.records_to_compute(f))
File , line 756, in records_to_compute
return self[field.model_name].browse(ids)
File , line 5211, in browse
ids = tuple(ids)
Exception
The above exception was the direct cause of the following exception:
Traceback (most recent call last):
File , line 658, in _handle_exception
return super(JsonRequest, self)._handle_exception(exception)
File , line 301, in _handle_exception
raise exception.with_traceback(None) from new_cause
MemoryError