diff --git a/addons/web/static/src/js/view_form.js b/addons/web/static/src/js/view_form.js
index 7284553a422..bdd1ecb6225 100644
--- a/addons/web/static/src/js/view_form.js
+++ b/addons/web/static/src/js/view_form.js
@@ -3336,6 +3336,8 @@ instance.web.form.CompletionFieldMixin = {
init: function() {
this.limit = 7;
this.orderer = new instance.web.DropMisordered();
+ this.can_create = this.node.attrs.can_create || true;
+ this.can_write = this.node.attrs.can_write || true;
},
/**
* Call this method to search using a string.
@@ -3382,7 +3384,7 @@ instance.web.form.CompletionFieldMixin = {
var raw_result = _(data.result).map(function(x) {return x[1];});
if (search_val.length > 0 && !_.include(raw_result, search_val) &&
! (self.options && (self.options.no_create || self.options.no_quick_create))) {
- values.push({
+ self.can_create && values.push({
label: _.str.sprintf(_t('Create "%s"'),
$('').text(search_val).html()),
action: function() {
@@ -3392,7 +3394,7 @@ instance.web.form.CompletionFieldMixin = {
});
}
// create...
- if (!(self.options && (self.options.no_create || self.options.no_create_edit))){
+ if (!(self.options && (self.options.no_create || self.options.no_create_edit)) && self.can_create){
values.push({
label: _t("Create and Edit..."),
action: function() {
@@ -3402,11 +3404,11 @@ instance.web.form.CompletionFieldMixin = {
});
}
else if (values.length == 0)
- values.push({
- label: _t("No results to show..."),
- action: function() {},
- classname: 'oe_m2o_dropdown_option'
- });
+ values.push({
+ label: _t("No results to show..."),
+ action: function() {},
+ classname: 'oe_m2o_dropdown_option'
+ });
return values;
});
@@ -3600,7 +3602,8 @@ instance.web.form.FieldMany2One = instance.web.form.AbstractField.extend(instanc
self.build_context(),
{
title: _t("Open: ") + self.string,
- view_id: view_id
+ view_id: view_id,
+ readonly: !self.can_write
}
);
pop.on('write_completed', self, function(){
@@ -3677,7 +3680,7 @@ instance.web.form.FieldMany2One = instance.web.form.AbstractField.extend(instanc
self.uned_def.reject();
self.ed_def = $.Deferred();
self.ed_def.done(function() {
- self.show_error_displayer();
+ self.can_create && self.show_error_displayer();
ignore_blur = false;
self.trigger('focused');
});
diff --git a/openerp/addons/base/ir/ir_ui_view.py b/openerp/addons/base/ir/ir_ui_view.py
index 11472a568bc..c9f2d84753f 100644
--- a/openerp/addons/base/ir/ir_ui_view.py
+++ b/openerp/addons/base/ir/ir_ui_view.py
@@ -722,6 +722,10 @@ class view(osv.osv):
'fields': xfields
}
attrs = {'views': views}
+ Relation = self.pool.get(field.comodel_name)
+ if Relation and field.type in ('many2one', 'many2many'):
+ node.set('can_create', 'true' if Relation.check_access_rights(cr, user, 'create', raise_exception=False) else 'false')
+ node.set('can_write', 'true' if Relation.check_access_rights(cr, user, 'write', raise_exception=False) else 'false')
fields[node.get('name')] = attrs
field = model_fields.get(node.get('name'))
diff --git a/openerp/addons/base/rng/view.rng b/openerp/addons/base/rng/view.rng
index 998631439dc..ec41227aea1 100644
--- a/openerp/addons/base/rng/view.rng
+++ b/openerp/addons/base/rng/view.rng
@@ -562,6 +562,8 @@
+
+