openerp-community-reviewer team mailing list archive
-
openerp-community-reviewer team
-
Mailing list archive
-
Message #01453
[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
-
[Merge] lp:~0k.io/web-addons/7.0_web_m2o_enhanced_proposal into lp:web-addons
From: noreply, 2013-12-02
-
Re: [Merge] lp:~0k.io/web-addons/7.0_web_m2o_enhanced_proposal into lp:web-addons
From: Holger Brunn (Therp), 2013-12-02
-
Re: [Merge] lp:~0k.io/web-addons/7.0_web_m2o_enhanced_proposal into lp:web-addons
From: Stefan Rijnhart (Therp), 2013-11-30
-
Re: [Merge] lp:~0k.io/web-addons/7.0_web_m2o_enhanced_proposal into lp:web-addons
From: Nicolas JEUDY, 2013-11-30
-
Re: [Merge] lp:~0k.io/web-addons/7.0_web_m2o_enhanced_proposal into lp:web-addons
From: Stefan Rijnhart (Therp), 2013-11-30
-
Re: [Merge] lp:~0k.io/web-addons/7.0_web_m2o_enhanced_proposal into lp:web-addons
From: Nicolas JEUDY, 2013-11-29
-
Re: [Merge] lp:~0k.io/web-addons/7.0_web_m2o_enhanced_proposal into lp:web-addons
From: Stefan Rijnhart (Therp), 2013-11-19
-
Re: [Merge] lp:~0k.io/web-addons/7.0_web_m2o_enhanced_proposal into lp:web-addons
From: Maxime Chambreuil (http://www.savoirfairelinux.com), 2013-11-19
-
Re: [Merge] lp:~0k.io/web-addons/7.0_web_m2o_enhanced_proposal into lp:web-addons
From: Nicolas JEUDY, 2013-11-18
-
Re: [Merge] lp:~0k.io/web-addons/7.0_web_m2o_enhanced_proposal into lp:web-addons
From: Maxime Chambreuil (http://www.savoirfairelinux.com), 2013-11-17