Skip to content
Snippets Groups Projects
Commit a4e36623 authored by qsm-odoo's avatar qsm-odoo
Browse files

[FIX] website: prevent crash when missing field dependency in forms


Steps to reproduce:
- Add a form.
- Setup a conditional visibility on one field, using the "contains" or
  "does not contain" operator.
- Save.
- Open the HTML editor and voluntarily break the form by changing the
  "data-visibility-dependency" attribute to a random text (non existing
  field used as a dependency).
- Save => Crash on page load.

One customer apparently reached that case of receiving a `null` value
(actually possible when retrieving a form data which is an unchecked
checkbox for example) but combined with an operator which really
requires the received value to be a string... but not sure how this is
possible. In any case, it should not make the form crash: it's just a
problematic *visibility* dependency, it should not prevent using the
form. For now, let's prevent this case to crash and add an error in the
console so we may investigate the issue if it ever shows up in a test.

opw-3243345

closes odoo/odoo#125914

X-original-commit: 27144695
Signed-off-by: default avatarGuillaume Dieleman (gdi) <gdi@odoo.com>
parent f8c45330
Branches
Tags
No related merge requests found
......@@ -587,10 +587,32 @@ odoo.define('website.s_website_form', function (require) {
* @returns {boolean}
*/
_compareTo(comparator, value = '', comparable, between) {
const valueWasNull = (value === null);
if (valueWasNull) {
// TODO One customer apparently reached that case of receiving
// a `null` value (actually possible when retrieving a form
// data which is an unchecked checkbox for example) but combined
// with an operator which really requires the received value to
// be a string... but not sure how this is possible. In any
// case, it should not make the form crash: it's just a
// problematic *visibility* dependency, it should not prevent
// using the form. So if the caller sends a `null` value, treat
// it as an empty string. For now, let's also add an error in
// the console so we may investigate the issue if it ever shows
// up in a test (grep: COMPARE_TO_INVALID_OPERATOR)
value = '';
}
switch (comparator) {
case 'contains':
if (valueWasNull) { // grep: COMPARE_TO_INVALID_OPERATOR
console.error("This field value is null but also uses an invalid operator");
}
return value.includes(comparable);
case '!contains':
if (valueWasNull) { // grep: COMPARE_TO_INVALID_OPERATOR
console.error("This field value is null but also uses an invalid operator");
}
return !value.includes(comparable);
case 'equal':
case 'selected':
......@@ -616,6 +638,9 @@ odoo.define('website.s_website_form', function (require) {
return value.name === '';
}
// Date & Date Time comparison requires formatting the value
if (valueWasNull) { // grep: COMPARE_TO_INVALID_OPERATOR
console.error("This field value is null but also uses an invalid operator");
}
if (value.includes(':')) {
const datetimeFormat = time.getLangDatetimeFormat();
value = moment(value, datetimeFormat)._d.getTime() / 1000;
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment