From bcf9e08e9ec2c06af429774fd5a72d757962b4ca Mon Sep 17 00:00:00 2001 From: Mahamadasif Ansari Date: Fri, 17 Nov 2023 12:06:55 +0530 Subject: [PATCH] [FIX] lunch: prevent list index out of range error MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently, an error occurs when the user tries to add an order with toppings. This is because before 17.0, [1] got values like `[6, False (1, 2)]`, where we found the `values['topping_ids_1'][0][2] (ids (1,2))`.  But after 17.0, [1] got values like `[[4, 1], [4, 2]]`. As a result, it cannot be found in the `[0][2]` index at [1]. This commit fixes the above issue by using 'convert_to_cach()', which returns the ids from [[4, 1], [4, 2]]. Apart from that, this commit also improves the code by adding a loop to get topping IDs for each topping. [1]-https://github.com/odoo/odoo/blob/039407cf2954ce6298aa8af7aff251a1cefdc39b/addons/lunch/models/lunch_order.py#L99 sentry-4627940064 closes odoo/odoo#142701 Signed-off-by: Sofie Gvaladze (sgv) --- addons/lunch/models/lunch_order.py | 31 ++++++++++++++++-------------- 1 file changed, 17 insertions(+), 14 deletions(-) diff --git a/addons/lunch/models/lunch_order.py b/addons/lunch/models/lunch_order.py index aba2946efa3..c142b983ba0 100644 --- a/addons/lunch/models/lunch_order.py +++ b/addons/lunch/models/lunch_order.py @@ -82,25 +82,28 @@ class LunchOrder(models.Model): self._cr.execute("""CREATE INDEX IF NOT EXISTS lunch_order_user_product_date ON %s (user_id, product_id, date)""" % self._table) + def _get_topping_ids(self, field, values): + return list(self._fields[field].convert_to_cache(values, self)) + def _extract_toppings(self, values): """ If called in api.multi then it will pop topping_ids_1,2,3 from values """ - topping_1_values = values.get('topping_ids_1', False) - topping_2_values = values.get('topping_ids_2', False) - topping_3_values = values.get('topping_ids_3', False) - if self.ids: - # TODO This is not taking into account all the toppings for each individual order, this is usually not a problem - # since in the interface you usually don't update more than one order at a time but this is a bug nonetheless - topping_1 = values.pop('topping_ids_1')[0][2] if topping_1_values else self[:1].topping_ids_1.ids - topping_2 = values.pop('topping_ids_2')[0][2] if topping_2_values else self[:1].topping_ids_2.ids - topping_3 = values.pop('topping_ids_3')[0][2] if topping_3_values else self[:1].topping_ids_3.ids - else: - topping_1 = values['topping_ids_1'][0][2] if topping_1_values else [] - topping_2 = values['topping_ids_2'][0][2] if topping_2_values else [] - topping_3 = values['topping_ids_3'][0][2] if topping_3_values else [] + topping_ids = [] - return topping_1 + topping_2 + topping_3 + for i in range(1, 4): + topping_field = f'topping_ids_{i}' + topping_values = values.get(topping_field, False) + + if self.ids: + # TODO This is not taking into account all the toppings for each individual order, this is usually not a problem + # since in the interface you usually don't update more than one order at a time but this is a bug nonetheless + topping_ids += self._get_topping_ids(topping_field, values.pop(topping_field)) \ + if topping_values else self[:1][topping_field].ids + else: + topping_ids += self._get_topping_ids(topping_field, topping_values) if topping_values else [] + + return topping_ids @api.constrains('topping_ids_1', 'topping_ids_2', 'topping_ids_3') def _check_topping_quantity(self):