From dc3fbb17fa8c80509d002903c5debc7e1cd7a277 Mon Sep 17 00:00:00 2001 From: Ravi Gadhia Date: Thu, 29 May 2014 16:18:53 +0530 Subject: [PATCH] [IMP] ir_ui_view, view_form: add information about the user being able to create and write on many2one and many2many records in a form view. Indeed before this commit users had always the possibility to create or edit records leading to a crash if no access rights were granted. Now the option is not displayed if the user has no rights to do it. Tests have been added for this feature. --- addons/web/static/src/js/view_form.js | 21 ++++++----- openerp/addons/base/ir/ir_ui_view.py | 4 +++ openerp/addons/base/rng/view.rng | 2 ++ openerp/addons/base/tests/test_acl.py | 52 +++++++++++++++++++++++++-- 4 files changed, 67 insertions(+), 12 deletions(-) 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 @@ + +