From 252c0b739211c41184c7f4442004fb204b38d011 Mon Sep 17 00:00:00 2001
From: Alexandre Fayolle <alexandre.fayolle@camptocamp.com>
Date: Mon, 27 Apr 2020 06:51:31 +0000
Subject: [PATCH] [FIX] crash when a mode appears twice in view_mode

If an action has for instance twice "tree" in view_mode, you get a crash
when displaying the action.

This patch adds a python constraint on the model which will prevent such
change.

closes odoo/odoo#50189

Opw: #2241415
Signed-off-by: Nicolas Martinelli (nim) <nim@odoo.com>
---
 odoo/addons/base/i18n/base.pot        | 12 ++++++++++++
 odoo/addons/base/models/ir_actions.py |  9 +++++++++
 2 files changed, 21 insertions(+)

diff --git a/odoo/addons/base/i18n/base.pot b/odoo/addons/base/i18n/base.pot
index d170af6ea4d7..dbe6081f23b0 100644
--- a/odoo/addons/base/i18n/base.pot
+++ b/odoo/addons/base/i18n/base.pot
@@ -16525,6 +16525,12 @@ msgstr ""
 msgid "No of Views"
 msgstr ""
 
+#. module: base
+#: code:addons/base/models/ir_actions.py:0
+#, python-format
+msgid "No spaces allowed in view_mode: %r"
+msgstr ""
+
 #. module: base
 #: model:ir.model.fields,field_description:base.field_ir_model_data__noupdate
 msgid "Non Updatable"
@@ -22209,6 +22215,12 @@ msgstr ""
 msgid "The model this field belongs to"
 msgstr ""
 
+#. module: base
+#: code:addons/base/models/ir_actions.py:0
+#, python-format
+msgid "The modes in view_mode must not be duplicated: %s"
+msgstr ""
+
 #. module: base
 #: model:ir.model.constraint,message:base.constraint_res_country_name_uniq
 msgid "The name of the country must be unique !"
diff --git a/odoo/addons/base/models/ir_actions.py b/odoo/addons/base/models/ir_actions.py
index 5d207e805917..fb0fa446b5dc 100644
--- a/odoo/addons/base/models/ir_actions.py
+++ b/odoo/addons/base/models/ir_actions.py
@@ -173,6 +173,15 @@ class IrActionsActWindow(models.Model):
                     act.views.append((act.view_id.id, act.view_id.type))
                 act.views.extend([(False, mode) for mode in missing_modes])
 
+    @api.constrains('view_mode')
+    def _check_view_mode(self):
+        for rec in self:
+            modes = rec.view_mode.split(',')
+            if len(modes) != len(set(modes)):
+                raise ValidationError(_('The modes in view_mode must not be duplicated: %s') % modes)
+            if ' ' in modes:
+                raise ValidationError(_('No spaces allowed in view_mode: %r') % modes)
+
     @api.depends('res_model', 'search_view_id')
     def _compute_search_view(self):
         for act in self:
-- 
GitLab