← Back to team overview

openerp-community-reviewer team mailing list archive

[Merge] lp:~0k.io/web-addons/7.0_web_m2o_enhanced_proposal into lp:web-addons

 

Nicolas JEUDY has proposed merging lp:~0k.io/web-addons/7.0_web_m2o_enhanced_proposal into lp:web-addons.

Requested reviews:
  Web-Addons Core Editors (webaddons-core-editors)

For more details, see:
https://code.launchpad.net/~0k.io/web-addons/7.0_web_m2o_enhanced_proposal/+merge/195518

Hello,

Here is our module to enable usability option one man2one and many2manytags fields/widget.

To know how to use it, and complete function added to it, there is a complete readme.

thanks,


-- 
https://code.launchpad.net/~0k.io/web-addons/7.0_web_m2o_enhanced_proposal/+merge/195518
Your team Web-Addons Core Editors is requested to review the proposed merge of lp:~0k.io/web-addons/7.0_web_m2o_enhanced_proposal into lp:web-addons.
=== added directory 'web_m2o_enhanced'
=== added file 'web_m2o_enhanced/README.rst'
--- web_m2o_enhanced/README.rst	1970-01-01 00:00:00 +0000
+++ web_m2o_enhanced/README.rst	2013-11-17 19:53:30 +0000
@@ -0,0 +1,63 @@
+==================================
+Add new options for many2one field
+==================================
+
+
+Description
+-----------
+
+This modules modifies "many2one" form fields so as to add some new display
+control options.
+
+**New: support many2manytags widget ! **
+
+Options provided includes possibility to remove "Create..." and/or "Create and
+Edit..." entries from many2one drop down. You can also change default number of
+proposition appearing in the drop-down. Or prevent the dialog box poping in
+case of validation error.
+
+If not specified, the module will avoid proposing any of the create options
+if the current user have no permission rights to create the related object.
+
+
+Requirements
+------------
+
+Was tested on openerp v7.0
+
+
+New option
+----------
+
+``create`` *boolean* (Default: depends if user have create rights)
+
+  Whether to display the "Create..." entry in dropdown panel.
+
+``create_edit`` *boolean* (Default: depends if user have create rights)
+
+  Whether to display "Create and Edit..." entry in dropdown panel
+
+``m2o_dialog`` *boolean* (Default: depends if user have create rights)
+
+  Whether to display the many2one dialog in case of validation error.
+
+``limit`` *int* (Default: openerp default value is ``7``)
+
+  Number of displayed record in drop-down panel
+
+
+Example
+-------
+
+Your XML form view definition could contain::
+
+    ...
+    <field name="partner_id" options="{'limit': 10, 'create': false, 'create_edit': false}"/>
+    ...
+
+Note
+----
+
+Double check that you have no inherited view that remote ``options`` you set on a field ! 
+If nothing work, add a debugger in the first ligne of ``get_search_result method`` and enable debug mode in OpenERP. When you write something in a many2one field, javascript debugger should pause. If not verify your installation.
+

=== added file 'web_m2o_enhanced/__init__.py'
=== added file 'web_m2o_enhanced/__openerp__.py'
--- web_m2o_enhanced/__openerp__.py	1970-01-01 00:00:00 +0000
+++ web_m2o_enhanced/__openerp__.py	2013-11-17 19:53:30 +0000
@@ -0,0 +1,46 @@
+# -*- coding: utf-8 -*-
+
+{
+    "name": 'web_m2o_enhanced',
+    "version": "0.1",
+    "description":
+"""
+=====================================================
+Add new options for many2one and many2manytags field:
+=====================================================
+
+- create: true/false -> disable "create" entry in dropdown panel
+- create_edit: true/false -> disable "create and edit" entry in dropdown panel
+- limit: 10 (int) -> change number of selected record return in dropdown panel
+- m2o_dialog: true/false -> disable quick create M20Dialog triggered on error.
+
+Example:
+--------
+
+<field name="partner_id" options="{'limit': 10, 'create': false, 'create_edit': false}"/>
+
+Note:
+-----
+
+if one of those options are not set, many2one field use default many2one field options.
+
+Thanks to:
+----------
+
+- Nicolas JEUDY <njeudy@xxxxxxxxxxxxxxx>
+- Valentin LAB <valentin.lab@xxxxxxxxxxx>
+
+""",
+    "depends": [
+        'base',
+	'web',
+    ],
+    "js": [
+        'static/src/js/form.js',
+    ],
+    "author": "Tuxservices",
+    "installable" : True,
+    "active" : False,
+}
+
+

=== added directory 'web_m2o_enhanced/static'
=== added directory 'web_m2o_enhanced/static/src'
=== added directory 'web_m2o_enhanced/static/src/js'
=== added file 'web_m2o_enhanced/static/src/js/form.js'
--- web_m2o_enhanced/static/src/js/form.js	1970-01-01 00:00:00 +0000
+++ web_m2o_enhanced/static/src/js/form.js	2013-11-17 19:53:30 +0000
@@ -0,0 +1,224 @@
+/*global openerp, _, $ */
+
+openerp.web_m2o_enhanced = function (instance) {
+
+    "use strict";
+
+    var QWeb = instance.web.qweb,
+        _t  = instance.web._t,
+        _lt = instance.web._lt;
+
+    instance.web.form.FieldMany2One = instance.web.form.FieldMany2One.extend({
+
+        show_error_displayer: function () {
+            if ((typeof this.options.m2o_dialog === 'undefined' && this.can_create) ||
+                this.options.m2o_dialog) {
+                new instance.web.form.M2ODialog(this).open();
+            }
+        },
+
+        get_search_result: function (search_val) {
+
+            var def = $.Deferred();
+            var self = this;
+            // add options limit used to change number of selections record
+            // returned.
+
+            if (typeof this.options.limit === 'number') {
+                this.limit = this.options.limit;
+            }
+
+            var dataset = new instance.web.DataSet(this, this.field.relation,
+                                                   self.build_context());
+            var blacklist = this.get_search_blacklist();
+            this.last_query = search_val;
+
+            var search_result = this.orderer.add(dataset.name_search(
+                search_val,
+                new instance.web.CompoundDomain(
+                    self.build_domain(), [["id", "not in", blacklist]]),
+                'ilike', this.limit + 1,
+                self.build_context()));
+
+            var create_rights;
+            if (typeof this.options.create === "undefined" ||
+                typeof this.options.create_edit === "undefined") {
+                create_rights = new instance.web.Model(this.field.relation).call(
+                    "check_access_rights", ["create", false]);
+            }
+
+            $.when(search_result, create_rights).then(function (_data, _can_create) {
+                var data = _data[0];
+
+                var can_create = _can_create ? _can_create[0] : null;
+
+                self.can_create = can_create;  // for ``.show_error_displayer()``
+                self.last_search = data;
+                // possible selections for the m2o
+                var values = _.map(data, function (x) {
+                    x[1] = x[1].split("\n")[0];
+                    return {
+                        label: _.str.escapeHTML(x[1]),
+                        value: x[1],
+                        name: x[1],
+                        id: x[0],
+                    };
+                });
+
+                // search more... if more results that max
+
+                if (values.length > self.limit) {
+                    values = values.slice(0, self.limit);
+                    values.push({
+                        label: _t("Search More..."),
+                        action: function () {
+                            dataset.name_search(
+                                search_val, self.build_domain(),
+                                'ilike', false).done(function (data) {
+                                    self._search_create_popup("search", data);
+                                });
+                        },
+                        classname: 'oe_m2o_dropdown_option'
+                    });
+                }
+
+                // quick create
+
+                var raw_result = _(data.result).map(function (x) {
+                    return x[1];
+                });
+
+                if ((typeof self.options.create === 'undefined' && can_create) ||
+                    self.options.create) {
+
+                    if (search_val.length > 0 &&
+                        !_.include(raw_result, search_val)) {
+
+                        values.push({
+                            label: _.str.sprintf(
+                                _t('Create "<strong>%s</strong>"'),
+                                $('<span />').text(search_val).html()),
+                            action: function () {
+                                self._quick_create(search_val);
+                            },
+                            classname: 'oe_m2o_dropdown_option'
+                        });
+                    }
+                }
+
+                // create...
+
+                if ((typeof self.options.create_edit === 'undefined' && can_create) ||
+                    self.options.create_edit) {
+
+                    values.push({
+                        label: _t("Create and Edit..."),
+                        action: function () {
+                            self._search_create_popup(
+                                "form", undefined,
+                                self._create_context(search_val));
+                        },
+                        classname: 'oe_m2o_dropdown_option'
+                    });
+                }
+
+                def.resolve(values);
+            });
+
+            return def;
+        }
+    });
+
+    instance.web.form.FieldMany2ManyTags = instance.web.form.FieldMany2ManyTags.extend({
+
+        show_error_displayer: function () {
+            if ((typeof this.options.m2o_dialog === 'undefined' && this.can_create) ||
+                this.options.m2o_dialog) {
+                new instance.web.form.M2ODialog(this).open();
+            }
+        },
+
+        /**
+        * Call this method to search using a string.
+        */
+
+        get_search_result: function(search_val) {
+            var self = this;
+
+            // add options limit used to change number of selections record
+            // returned.
+
+            if (typeof this.options.limit === 'number') {
+                this.limit = this.options.limit;
+            }
+
+            var dataset = new instance.web.DataSet(this, this.field.relation, self.build_context());
+            var blacklist = this.get_search_blacklist();
+            this.last_query = search_val;
+
+            return this.orderer.add(dataset.name_search(
+                    search_val, new instance.web.CompoundDomain(self.build_domain(), [["id", "not in", blacklist]]),
+                    'ilike', this.limit + 1, self.build_context())).then(function(data) {
+                self.last_search = data;
+                // possible selections for the m2o
+                var values = _.map(data, function(x) {
+                    x[1] = x[1].split("\n")[0];
+                    return {
+                        label: _.str.escapeHTML(x[1]),
+                        value: x[1],
+                        name: x[1],
+                        id: x[0],
+                    };
+                });
+
+                // search more... if more results that max
+                if (values.length > self.limit) {
+                    values = values.slice(0, self.limit);
+                    values.push({
+                        label: _t("Search More..."),
+                        action: function() {
+                            dataset.name_search(search_val, self.build_domain(), 'ilike', false).done(function(data) {
+                                self._search_create_popup("search", data);
+                            });
+                        },
+                        classname: 'oe_m2o_dropdown_option'
+                    });
+                }
+                // quick create
+
+                if ((typeof self.options.create === 'undefined' && can_create) ||
+                    self.options.create) {
+
+                    var raw_result = _(data.result).map(function(x) {return x[1];});
+                    if (search_val.length > 0 && !_.include(raw_result, search_val)) {
+                        values.push({
+                            label: _.str.sprintf(_t('Create "<strong>%s</strong>"'),
+                                $('<span />').text(search_val).html()),
+                            action: function() {
+                                self._quick_create(search_val);
+                            },
+                            classname: 'oe_m2o_dropdown_option'
+                        });
+                    }
+                }
+
+                // create...
+
+                if ((typeof self.options.create_edit === 'undefined' && can_create) ||
+                    self.options.create_edit) {
+
+                    values.push({
+                        label: _t("Create and Edit..."),
+                        action: function() {
+                            self._search_create_popup("form", undefined, self._create_context(search_val));
+                        },
+                        classname: 'oe_m2o_dropdown_option'
+                    });
+                }
+
+                return values;
+            })
+        },
+    });
+};
+


Follow ups