diff --git a/addons/point_of_sale/models/pos_order.py b/addons/point_of_sale/models/pos_order.py index ba771928d96..e58476a4584 100644 --- a/addons/point_of_sale/models/pos_order.py +++ b/addons/point_of_sale/models/pos_order.py @@ -3,7 +3,7 @@ import logging from datetime import datetime from markupsafe import Markup -from functools import partial +from functools import partial, lru_cache from itertools import groupby from collections import defaultdict @@ -418,8 +418,18 @@ class PosOrder(models.Model): @api.depends('date_order', 'company_id', 'currency_id', 'company_id.currency_id') def _compute_currency_rate(self): + @lru_cache + def get_rate(from_currency, to_currency, company, date): + return self.env['res.currency']._get_conversion_rate( + from_currency=from_currency, + to_currency=to_currency, + company=company, + date=date, + ) for order in self: - order.currency_rate = self.env['res.currency']._get_conversion_rate(order.company_id.currency_id, order.currency_id, order.company_id, order.date_order) + # date_order is a datetime, but the rates are looked up on a date basis, + # therefor converting the date_order to a date helps with sharing entries in the lru_cache + order.currency_rate = get_rate(order.company_id.currency_id, order.currency_id, order.company_id, order.date_order.date()) @api.depends('lines.is_total_cost_computed') def _compute_is_total_cost_computed(self): diff --git a/addons/pos_sale/models/pos_order.py b/addons/pos_sale/models/pos_order.py index 534ccc869a3..a8b02052461 100644 --- a/addons/pos_sale/models/pos_order.py +++ b/addons/pos_sale/models/pos_order.py @@ -1,5 +1,6 @@ # -*- coding: utf-8 -*- # Part of Odoo. See LICENSE file for full copyright and licensing details. +from functools import lru_cache from odoo import api, fields, models, _ from odoo.tools import float_compare, float_is_zero @@ -24,9 +25,19 @@ class PosOrder(models.Model): @api.depends('date_order', 'company_id') def _compute_currency_rate(self): + @lru_cache + def get_rate(from_currency, to_currency, company, date): + return self.env['res.currency']._get_conversion_rate( + from_currency=from_currency, + to_currency=to_currency, + company=company, + date=date, + ) for order in self: date_order = order.date_order or fields.Datetime.now() - order.currency_rate = self.env['res.currency']._get_conversion_rate(order.company_id.currency_id, order.currency_id, order.company_id, date_order) + # date_order is a datetime, but the rates are looked up on a date basis, + # therefor converting the date_order to a date helps with sharing entries in the lru_cache + order.currency_rate = get_rate(order.company_id.currency_id, order.currency_id, order.company_id, date_order.date()) def _prepare_invoice_vals(self): invoice_vals = super(PosOrder, self)._prepare_invoice_vals()