@@ -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+
3038patch ( 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, {
152160patch ( 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