Skip to content

Commit fac52dd

Browse files
committed
[FIX] web_m2x_options: allow field-level overrides of the global create and create_edit options
Allow field-level overrides for Many2One and Many2Many fields, while always respecting security permissions. This provides more granular control over the "Create..." and "Create and Edit..." dropdown entries without compromising access control.
1 parent dbff15b commit fac52dd

File tree

1 file changed

+31
-22
lines changed

1 file changed

+31
-22
lines changed

web_m2x_options/static/src/components/form.esm.js

Lines changed: 31 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -27,41 +27,49 @@ function evaluateSystemParameterDefaultTrue(option) {
2727
return isOptionSet ? evaluateBooleanExpr(isOptionSet) : true;
2828
}
2929

30+
function evaluateHasCreatePermission(attrs) {
31+
return attrs.can_create ? evaluateBooleanExpr(attrs.can_create) : true;
32+
}
33+
34+
function evaluateFieldBooleanOption(option) {
35+
return typeof option === "boolean" ? option : evaluateBooleanExpr(option);
36+
}
37+
3038
patch(many2OneField, {
3139
m2o_options_props_create(props, attrs, options) {
3240
const canQuickCreate = evaluateSystemParameterDefaultTrue("create");
41+
const hasCreatePermission = evaluateHasCreatePermission(attrs);
3342
if (options.no_quick_create) {
3443
props.canQuickCreate = false;
3544
} else if ("no_quick_create" in options) {
36-
props.canQuickCreate = attrs.can_create
37-
? evaluateBooleanExpr(attrs.can_create)
38-
: true;
45+
props.canQuickCreate = hasCreatePermission;
46+
} else if ("create" in options) {
47+
// Field option set, but must respect can_create security attribute
48+
props.canQuickCreate = hasCreatePermission && evaluateFieldBooleanOption(options.create);
3949
} else if (!canQuickCreate && props.canQuickCreate) {
4050
props.canQuickCreate = false;
4151
} else if (canQuickCreate && !props.canQuickCreate) {
42-
props.canQuickCreate = attrs.can_create
43-
? evaluateBooleanExpr(attrs.can_create)
44-
: true;
52+
props.canQuickCreate = hasCreatePermission;
4553
}
4654
return props;
4755
},
4856

4957
m2o_options_props_create_edit(props, attrs, options) {
5058
const canCreateEdit = evaluateSystemParameterDefaultTrue("create_edit");
59+
const hasCreatePermission = evaluateHasCreatePermission(attrs);
5160
if (options.no_create_edit) {
5261
props.canCreateEdit = false;
5362
} else if ("no_create_edit" in options) {
5463
// Same condition set in web/views/fields/many2one/many2one_field
55-
props.canCreateEdit = attrs.can_create
56-
? evaluateBooleanExpr(attrs.can_create)
57-
: true;
64+
props.canCreateEdit = hasCreatePermission;
65+
} else if ("create_edit" in options) {
66+
// Field option set, but must respect can_create security attribute
67+
props.canCreateEdit = hasCreatePermission && evaluateFieldBooleanOption(options.create_edit);
5868
} else if (!canCreateEdit && props.canCreateEdit) {
5969
props.canCreateEdit = false;
6070
} else if (canCreateEdit && !props.canCreateEdit) {
6171
// Same condition set in web/views/fields/many2one/many2one_field
62-
props.canCreateEdit = attrs.can_create
63-
? evaluateBooleanExpr(attrs.can_create)
64-
: true;
72+
props.canCreateEdit = hasCreatePermission;
6573
}
6674
return props;
6775
},
@@ -152,35 +160,36 @@ patch(Many2OneField.prototype, {
152160
patch(many2ManyTagsField, {
153161
m2m_options_props_create(props, attrs, options) {
154162
const canQuickCreate = evaluateSystemParameterDefaultTrue("create");
163+
const hasCreatePermission = evaluateHasCreatePermission(attrs);
155164
// Create option already available for m2m fields
156165
if (!options.no_quick_create) {
157-
if (!canQuickCreate && props.canQuickCreate) {
166+
if ("create" in options) {
167+
// Field option set, but must respect can_create security attribute
168+
props.canQuickCreate = hasCreatePermission && evaluateFieldBooleanOption(options.create);
169+
} else if (!canQuickCreate && props.canQuickCreate) {
158170
props.canQuickCreate = false;
159171
} else if (canQuickCreate && !props.canQuickCreate) {
160-
props.canQuickCreate = attrs.can_create
161-
? evaluateBooleanExpr(attrs.can_create)
162-
: true;
172+
props.canQuickCreate = hasCreatePermission;
163173
}
164174
}
165175
return props;
166176
},
167177

168178
m2m_options_props_create_edit(props, attrs, options) {
169179
const canCreateEdit = evaluateSystemParameterDefaultTrue("create_edit");
180+
const hasCreatePermission = evaluateHasCreatePermission(attrs);
170181
if (options.no_create_edit) {
171182
props.canCreateEdit = false;
172183
} else if ("no_create_edit" in options) {
173184
// Same condition set in web/views/fields/many2one/many2one_field
174-
props.canCreateEdit = attrs.can_create
175-
? evaluateBooleanExpr(attrs.can_create)
176-
: true;
185+
props.canCreateEdit = hasCreatePermission;
186+
} else if ("create_edit" in options) {
187+
props.canCreateEdit = hasCreatePermission && evaluateFieldBooleanOption(options.create_edit);
177188
} else if (!canCreateEdit && props.canCreateEdit) {
178189
props.canCreateEdit = false;
179190
} else if (canCreateEdit && !props.canCreateEdit) {
180191
// Same condition set in web/views/fields/many2one/many2one_field
181-
props.canCreateEdit = attrs.can_create
182-
? evaluateBooleanExpr(attrs.can_create)
183-
: true;
192+
props.canCreateEdit = hasCreatePermission;
184193
}
185194
return props;
186195
},

0 commit comments

Comments
 (0)