From 3b87df079e74f9b84d984596a67d6a325a29dbb0 Mon Sep 17 00:00:00 2001 From: "vta vta@openerp.com" <> Date: Mon, 5 Nov 2012 14:02:32 +0100 Subject: [PATCH 01/11] [ADD] Added new widget, Many2OneButton, to view_form.js and view_list.js. bzr revid: vta@openerp.com-20121105130232-rpde2k1ihbquznmg --- addons/web/static/src/js/view_form.js | 50 +++++++++++++++++++++++++++ addons/web/static/src/js/view_list.js | 11 ++++++ addons/web/static/src/xml/base.xml | 7 ++++ 3 files changed, 68 insertions(+) diff --git a/addons/web/static/src/js/view_form.js b/addons/web/static/src/js/view_form.js index 9dd6e34c161..f50f9297072 100644 --- a/addons/web/static/src/js/view_form.js +++ b/addons/web/static/src/js/view_form.js @@ -3148,6 +3148,54 @@ instance.web.form.FieldMany2One = instance.web.form.AbstractField.extend(instanc }, }); +instance.web.form.Many2OneButton = instance.web.form.AbstractField.extend({ + template: 'Many2OneButton', + init: function(field_manager, node) { + this._super.apply(this, arguments); + }, + start: function() { + this._super.apply(this, arguments); + this.set_button(); + }, + set_button: function() { + var self = this; + if (this.$button) { + this.$button.remove(); + } + this.string = this.get('value') ? _t('Edit') : _t('Create'); + this.node.attrs.icon = this.get('value') ? '/web/static/src/img/icons/gtk-yes.png' : '/web/static/src/img/icons/gtk-no.png'; + this.$button = $(QWeb.render('WidgetButton', {'widget': this})); + this.$el.append(this.$button); + this.$button.on('click', self.on_click); + }, + on_click: function(ev) { + var self = this; + ev.stopPropagation(); + var popup = new instance.web.form.FormOpenPopup(this); + popup.show_element( + this.field.relation, + this.get('value'), + this.build_context(), + {title: this.string + ' ' +_t("Voucher: ")} + ); + popup.on('create_completed write_completed', self, function(r){ + self.set_value(r); + }); + }, + set_value: function(value_) { + var self = this; + if (value_ instanceof Array) { + value_ = value_[0]; + } + value_ = value_ || false; + this.set('value', value_); + this.set_button(); + if (this.is_started) { + this.render_value(); + } + }, +}); + /* # Values: (0, 0, { fields }) create # (1, ID, { fields }) update @@ -4332,6 +4380,7 @@ instance.web.form.AbstractFormPopup = instance.web.Widget.extend({ this.dataset.create_function = function(data, sup) { var fct = self.options.create_function || sup; return fct.call(this, data).then(function(r) { + self.trigger('create_completed'); self.created_elements.push(r); }); }; @@ -5130,6 +5179,7 @@ instance.web.form.widgets = new instance.web.Registry({ 'datetime' : 'instance.web.form.FieldDatetime', 'selection' : 'instance.web.form.FieldSelection', 'many2one' : 'instance.web.form.FieldMany2One', + 'many2onebutton' : 'instance.web.form.Many2OneButton', 'many2many' : 'instance.web.form.FieldMany2Many', 'many2many_tags' : 'instance.web.form.FieldMany2ManyTags', 'many2many_kanban' : 'instance.web.form.FieldMany2ManyKanban', diff --git a/addons/web/static/src/js/view_list.js b/addons/web/static/src/js/view_list.js index fd74fd8922b..216ad7ded6c 100644 --- a/addons/web/static/src/js/view_list.js +++ b/addons/web/static/src/js/view_list.js @@ -2010,6 +2010,7 @@ instance.web.list.columns = new instance.web.Registry({ 'field.progressbar': 'instance.web.list.ProgressBar', 'field.handle': 'instance.web.list.Handle', 'button': 'instance.web.list.Button', + 'field.many2onebutton': 'instance.web.list.Many2OneButton', }); instance.web.list.columns.for_ = function (id, field, node) { var description = _.extend({tag: node.tag}, field, node.attrs); @@ -2197,5 +2198,15 @@ instance.web.list.Handle = instance.web.list.Column.extend({ return '
'; } }); +instance.web.list.Many2OneButton = instance.web.list.Column.extend({ + _format: function (row_data, options) { + if (row_data.voucher_id.value) { + this.icon = '/web/static/src/img/icons/gtk-yes.png'; + } else { + this.icon = '/web/static/src/img/icons/gtk-no.png'; + } + return QWeb.render('Many2OneButton.cell', {'widget': this}); + }, +}); }; // vim:et fdc=0 fdl=0 foldnestmax=3 fdm=syntax: diff --git a/addons/web/static/src/xml/base.xml b/addons/web/static/src/xml/base.xml index 275d31a9fde..fe64c1c0efa 100644 --- a/addons/web/static/src/xml/base.xml +++ b/addons/web/static/src/xml/base.xml @@ -1029,6 +1029,13 @@ + + + + + +
From 492379e6c4155108c226d973a3268d0d5a7c8994 Mon Sep 17 00:00:00 2001 From: "vta vta@openerp.com" <> Date: Mon, 5 Nov 2012 15:54:31 +0100 Subject: [PATCH 02/11] [FIX] Added parameters to trigger. bzr revid: vta@openerp.com-20121105145431-qk01mspfvldusa13 --- addons/web/static/src/js/view_form.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/addons/web/static/src/js/view_form.js b/addons/web/static/src/js/view_form.js index f50f9297072..0b9b5d99b9e 100644 --- a/addons/web/static/src/js/view_form.js +++ b/addons/web/static/src/js/view_form.js @@ -4380,14 +4380,14 @@ instance.web.form.AbstractFormPopup = instance.web.Widget.extend({ this.dataset.create_function = function(data, sup) { var fct = self.options.create_function || sup; return fct.call(this, data).then(function(r) { - self.trigger('create_completed'); + self.trigger('create_completed', r); self.created_elements.push(r); }); }; this.dataset.write_function = function(id, data, options, sup) { var fct = self.options.write_function || sup; - return fct.call(this, id, data, options).then(function() { - self.trigger('write_completed'); + return fct.call(this, id, data, options).then(function(r) { + self.trigger('write_completed', r); }); }; this.dataset.parent_view = this.options.parent_view; From 83a264ff2b5d62fd25bba9873fdd08c0b5bf8df3 Mon Sep 17 00:00:00 2001 From: "vta vta@openerp.com" <> Date: Tue, 6 Nov 2012 11:33:20 +0100 Subject: [PATCH 03/11] [FIX] Fixed list view widget as per xmo review. bzr revid: vta@openerp.com-20121106103320-zyon6mzsy9jaafj0 --- addons/web/static/src/js/view_form.js | 4 ---- addons/web/static/src/js/view_list.js | 6 +----- addons/web/static/src/xml/base.xml | 2 +- 3 files changed, 2 insertions(+), 10 deletions(-) diff --git a/addons/web/static/src/js/view_form.js b/addons/web/static/src/js/view_form.js index 0b9b5d99b9e..9a8f734d2da 100644 --- a/addons/web/static/src/js/view_form.js +++ b/addons/web/static/src/js/view_form.js @@ -3170,7 +3170,6 @@ instance.web.form.Many2OneButton = instance.web.form.AbstractField.extend({ }, on_click: function(ev) { var self = this; - ev.stopPropagation(); var popup = new instance.web.form.FormOpenPopup(this); popup.show_element( this.field.relation, @@ -3190,9 +3189,6 @@ instance.web.form.Many2OneButton = instance.web.form.AbstractField.extend({ value_ = value_ || false; this.set('value', value_); this.set_button(); - if (this.is_started) { - this.render_value(); - } }, }); diff --git a/addons/web/static/src/js/view_list.js b/addons/web/static/src/js/view_list.js index 216ad7ded6c..871d2bc856f 100644 --- a/addons/web/static/src/js/view_list.js +++ b/addons/web/static/src/js/view_list.js @@ -2200,11 +2200,7 @@ instance.web.list.Handle = instance.web.list.Column.extend({ }); instance.web.list.Many2OneButton = instance.web.list.Column.extend({ _format: function (row_data, options) { - if (row_data.voucher_id.value) { - this.icon = '/web/static/src/img/icons/gtk-yes.png'; - } else { - this.icon = '/web/static/src/img/icons/gtk-no.png'; - } + this.has_value = !!row_data[this.id].value; return QWeb.render('Many2OneButton.cell', {'widget': this}); }, }); diff --git a/addons/web/static/src/xml/base.xml b/addons/web/static/src/xml/base.xml index fe64c1c0efa..b3c09b0359b 100644 --- a/addons/web/static/src/xml/base.xml +++ b/addons/web/static/src/xml/base.xml @@ -1034,7 +1034,7 @@ + >
From c2753639215fb7e52098b918fc8f9d9d7481203f Mon Sep 17 00:00:00 2001 From: "vta vta@openerp.com" <> Date: Tue, 6 Nov 2012 16:41:41 +0100 Subject: [PATCH 04/11] [FIX] Text conflicts. bzr revid: vta@openerp.com-20121106154141-03nnje0th7cjtlqf --- addons/web/static/src/js/view_form.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/web/static/src/js/view_form.js b/addons/web/static/src/js/view_form.js index 9a8f734d2da..9d68ef3516f 100644 --- a/addons/web/static/src/js/view_form.js +++ b/addons/web/static/src/js/view_form.js @@ -3177,7 +3177,7 @@ instance.web.form.Many2OneButton = instance.web.form.AbstractField.extend({ this.build_context(), {title: this.string + ' ' +_t("Voucher: ")} ); - popup.on('create_completed write_completed', self, function(r){ + popup.on('create_completed write_completed', self, function(r) { self.set_value(r); }); }, From efd48ffbefd0a2a2303e0acdbed8f29520d1b537 Mon Sep 17 00:00:00 2001 From: Antonin Bourguignon Date: Tue, 6 Nov 2012 18:51:42 +0100 Subject: [PATCH 05/11] [WIP] fix the duplicate partner creation when converting a lead to opportunity lp bug: https://launchpad.net/bugs/1065751 fixed bzr revid: abo@openerp.com-20121106175142-eoozcwd8xz5412mk --- addons/crm/crm_lead.py | 2 +- addons/crm/wizard/crm_lead_to_opportunity.py | 14 +++++++++++--- 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/addons/crm/crm_lead.py b/addons/crm/crm_lead.py index 5ab68860874..2751405f454 100644 --- a/addons/crm/crm_lead.py +++ b/addons/crm/crm_lead.py @@ -610,9 +610,9 @@ class crm_lead(base_stage, format_address, osv.osv): } def convert_opportunity(self, cr, uid, ids, partner_id, user_ids=False, section_id=False, context=None): - partner = self.pool.get('res.partner') customer = False if partner_id: + partner = self.pool.get('res.partner') customer = partner.browse(cr, uid, partner_id, context=context) for lead in self.browse(cr, uid, ids, context=context): if lead.state in ('done', 'cancel'): diff --git a/addons/crm/wizard/crm_lead_to_opportunity.py b/addons/crm/wizard/crm_lead_to_opportunity.py index 2473a83206c..4a0467ccb2a 100644 --- a/addons/crm/wizard/crm_lead_to_opportunity.py +++ b/addons/crm/wizard/crm_lead_to_opportunity.py @@ -105,6 +105,7 @@ class crm_lead2opportunity_partner(osv.osv_memory): context = {} lead = self.pool.get('crm.lead') res = False + # FIXME: automatically creating a partner ? partner_ids_map = self._create_partner(cr, uid, ids, context=context) lead_ids = vals.get('lead_ids', []) team_id = vals.get('section_id', False) @@ -175,12 +176,19 @@ class crm_lead2opportunity_mass_convert(osv.osv_memory): return res def _convert_opportunity(self, cr, uid, ids, vals, context=None): + """ + When "massively" (more than one at a time) converting leads to + opportunities, check the salesteam_id and salesmen_ids and update + the values before calling super. + """ + if context is None: + context = {} data = self.browse(cr, uid, ids, context=context)[0] salesteam_id = data.section_id and data.section_id.id or False - salesman = [] + salesmen_ids = [] if data.user_ids: - salesman = [x.id for x in data.user_ids] - vals.update({'user_ids': salesman, 'section_id': salesteam_id}) + salesmen_ids = [x.id for x in data.user_ids] + vals.update({'user_ids': salesmen_ids, 'section_id': salesteam_id}) return super(crm_lead2opportunity_mass_convert, self)._convert_opportunity(cr, uid, ids, vals, context=context) def mass_convert(self, cr, uid, ids, context=None): From 83405dba45143d521ecffccc4d44493dd0de84c6 Mon Sep 17 00:00:00 2001 From: "vta vta@openerp.com" <> Date: Wed, 7 Nov 2012 09:17:38 +0100 Subject: [PATCH 06/11] [IMP] Make the popup accessible. bzr revid: vta@openerp.com-20121107081738-kortakwtjj7s9k80 --- addons/web/static/src/js/view_form.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/addons/web/static/src/js/view_form.js b/addons/web/static/src/js/view_form.js index 9d68ef3516f..20024c076f5 100644 --- a/addons/web/static/src/js/view_form.js +++ b/addons/web/static/src/js/view_form.js @@ -3170,14 +3170,14 @@ instance.web.form.Many2OneButton = instance.web.form.AbstractField.extend({ }, on_click: function(ev) { var self = this; - var popup = new instance.web.form.FormOpenPopup(this); - popup.show_element( + this.popup = new instance.web.form.FormOpenPopup(this); + this.popup.show_element( this.field.relation, this.get('value'), this.build_context(), {title: this.string + ' ' +_t("Voucher: ")} ); - popup.on('create_completed write_completed', self, function(r) { + this.popup.on('create_completed write_completed', self, function(r) { self.set_value(r); }); }, From 4b0d99d6c861b171d84d816bafffb35ada699a82 Mon Sep 17 00:00:00 2001 From: "vta vta@openerp.com" <> Date: Wed, 7 Nov 2012 11:34:26 +0100 Subject: [PATCH 07/11] [IMP] Now the Many2OneButton accepts an option (label) containing a dict to set the string displayed in the button ({'create':String, 'edit':String}). If no label, the string is empty. bzr revid: vta@openerp.com-20121107103426-u6dfd1vcfu8fwap3 --- addons/web/static/src/js/view_form.js | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/addons/web/static/src/js/view_form.js b/addons/web/static/src/js/view_form.js index 20024c076f5..1b5ca8de730 100644 --- a/addons/web/static/src/js/view_form.js +++ b/addons/web/static/src/js/view_form.js @@ -3162,7 +3162,12 @@ instance.web.form.Many2OneButton = instance.web.form.AbstractField.extend({ if (this.$button) { this.$button.remove(); } - this.string = this.get('value') ? _t('Edit') : _t('Create'); + var options =py.eval(this.node.attrs.options); + if (options.label) { + this.string = this.get('value') ? _t(options.label.edit) : _t(options.label.create); + } else { + this.string = ''; + } this.node.attrs.icon = this.get('value') ? '/web/static/src/img/icons/gtk-yes.png' : '/web/static/src/img/icons/gtk-no.png'; this.$button = $(QWeb.render('WidgetButton', {'widget': this})); this.$el.append(this.$button); From 064003797eb9f1cbd428d3ed416515a655708fc7 Mon Sep 17 00:00:00 2001 From: "vta vta@openerp.com" <> Date: Wed, 7 Nov 2012 11:49:33 +0100 Subject: [PATCH 08/11] [FIX] Issue with py.eval if no options passed. bzr revid: vta@openerp.com-20121107104933-a60t27t1hjyu368f --- addons/web/static/src/js/view_form.js | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/addons/web/static/src/js/view_form.js b/addons/web/static/src/js/view_form.js index 1b5ca8de730..da53113f9a2 100644 --- a/addons/web/static/src/js/view_form.js +++ b/addons/web/static/src/js/view_form.js @@ -3162,7 +3162,10 @@ instance.web.form.Many2OneButton = instance.web.form.AbstractField.extend({ if (this.$button) { this.$button.remove(); } - var options =py.eval(this.node.attrs.options); + var options = {}; + try { + options = py.eval(this.node.attrs.options); + } catch (e) {} if (options.label) { this.string = this.get('value') ? _t(options.label.edit) : _t(options.label.create); } else { From 48bf8e72da86c960a2099b505c3944999d311efd Mon Sep 17 00:00:00 2001 From: Antonin Bourguignon Date: Wed, 7 Nov 2012 17:11:42 +0100 Subject: [PATCH 09/11] [IMP] minor imp of code style bzr revid: abo@openerp.com-20121107161142-c5iqr501mxbghy82 --- addons/crm/crm_lead.py | 3 ++- addons/crm/wizard/crm_lead_to_opportunity.py | 1 - addons/crm/wizard/crm_lead_to_partner.py | 19 ++++++++----------- 3 files changed, 10 insertions(+), 13 deletions(-) diff --git a/addons/crm/crm_lead.py b/addons/crm/crm_lead.py index 2751405f454..89598cb1909 100644 --- a/addons/crm/crm_lead.py +++ b/addons/crm/crm_lead.py @@ -676,7 +676,7 @@ class crm_lead(base_stage, format_address, osv.osv): def convert_partner(self, cr, uid, ids, action='create', partner_id=False, context=None): """ - This function convert partner based on action. + Convert partner based on action. if action is 'create', create new partner with contact and assign lead to new partner_id. otherwise assign lead to specified partner_id """ @@ -684,6 +684,7 @@ class crm_lead(base_stage, format_address, osv.osv): context = {} partner_ids = {} force_partner_id = partner_id + import pudb; pudb.set_trace(); for lead in self.browse(cr, uid, ids, context=context): if action == 'create': if not partner_id: diff --git a/addons/crm/wizard/crm_lead_to_opportunity.py b/addons/crm/wizard/crm_lead_to_opportunity.py index 4a0467ccb2a..ea96e1d16f1 100644 --- a/addons/crm/wizard/crm_lead_to_opportunity.py +++ b/addons/crm/wizard/crm_lead_to_opportunity.py @@ -105,7 +105,6 @@ class crm_lead2opportunity_partner(osv.osv_memory): context = {} lead = self.pool.get('crm.lead') res = False - # FIXME: automatically creating a partner ? partner_ids_map = self._create_partner(cr, uid, ids, context=context) lead_ids = vals.get('lead_ids', []) team_id = vals.get('section_id', False) diff --git a/addons/crm/wizard/crm_lead_to_partner.py b/addons/crm/wizard/crm_lead_to_partner.py index c201f484989..c48990f5866 100644 --- a/addons/crm/wizard/crm_lead_to_partner.py +++ b/addons/crm/wizard/crm_lead_to_partner.py @@ -35,7 +35,7 @@ class crm_lead2partner(osv.osv_memory): } def view_init(self, cr, uid, fields, context=None): """ - This function checks for precondition before wizard executes + Check for precondition before wizard executes. """ if context is None: context = {} @@ -69,22 +69,19 @@ class crm_lead2partner(osv.osv_memory): return partner_id def default_get(self, cr, uid, fields, context=None): - """ - This function gets default values - """ - res = super(crm_lead2partner, self).default_get(cr, uid, fields, context=context) + res = super(crm_lead2partner, self).default_get(cr, uid, fields, context=context) partner_id = self._select_partner(cr, uid, context=context) if 'partner_id' in fields: res.update({'partner_id': partner_id}) if 'action' in fields: res.update({'action': partner_id and 'exist' or 'create'}) - + return res def open_create_partner(self, cr, uid, ids, context=None): """ - This function Opens form of create partner. + Open form of create partner. """ view_obj = self.pool.get('ir.ui.view') view_id = view_obj.search(cr, uid, [('model', '=', self._name), \ @@ -101,21 +98,21 @@ class crm_lead2partner(osv.osv_memory): def _create_partner(self, cr, uid, ids, context=None): """ - This function Creates partner based on action. + Create partner based on action. """ if context is None: context = {} lead = self.pool.get('crm.lead') - lead_ids = context and context.get('active_ids') or [] + lead_ids = context.get('active_ids', []) data = self.browse(cr, uid, ids, context=context)[0] partner_id = data.partner_id and data.partner_id.id or False return lead.convert_partner(cr, uid, lead_ids, data.action, partner_id, context=context) def make_partner(self, cr, uid, ids, context=None): """ - This function Makes partner based on action. + Make a partner based on action. + Only called from form view, so only meant to convert one lead at a time. """ - # Only called from Form view, so only meant to convert one Lead. lead_id = context and context.get('active_id') or False partner_ids_map = self._create_partner(cr, uid, ids, context=context) return self.pool.get('res.partner').redirect_partner_form(cr, uid, partner_ids_map.get(lead_id, False), context=context) From ab8b6fae11ad614daa769d9448942811c1c35b82 Mon Sep 17 00:00:00 2001 From: Antonin Bourguignon Date: Wed, 7 Nov 2012 17:30:37 +0100 Subject: [PATCH 10/11] [FIX] the double partner creation in lead2opportunity (introduced in revno 7251.1.122 revid:odo@openerp.com-20120823200629-1m1eym62l7aabzgl) lp bug: https://launchpad.net/bugs/1065751 fixed bzr revid: abo@openerp.com-20121107163037-bmywme6nnhlxaaic --- addons/crm/crm_lead.py | 3 --- 1 file changed, 3 deletions(-) diff --git a/addons/crm/crm_lead.py b/addons/crm/crm_lead.py index 89598cb1909..64ba9476701 100644 --- a/addons/crm/crm_lead.py +++ b/addons/crm/crm_lead.py @@ -683,13 +683,10 @@ class crm_lead(base_stage, format_address, osv.osv): if context is None: context = {} partner_ids = {} - force_partner_id = partner_id - import pudb; pudb.set_trace(); for lead in self.browse(cr, uid, ids, context=context): if action == 'create': if not partner_id: partner_id = self._create_lead_partner(cr, uid, lead, context) - partner_id = force_partner_id or self._create_lead_partner(cr, uid, lead, context=context) self._lead_set_partner(cr, uid, lead, partner_id, context=context) partner_ids[lead.id] = partner_id return partner_ids From b5b3cbf4e4fd966d6793076a1ac6cc2e795dde9c Mon Sep 17 00:00:00 2001 From: Fabien Pinckaers Date: Wed, 7 Nov 2012 18:33:49 +0100 Subject: [PATCH 11/11] [FIX] typo bzr revid: fp@tinyerp.com-20121107173349-02vp0acqgdcnmi83 --- openerp/addons/base/res/res_users_view.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openerp/addons/base/res/res_users_view.xml b/openerp/addons/base/res/res_users_view.xml index 78579fc66df..cfab4b7d341 100644 --- a/openerp/addons/base/res/res_users_view.xml +++ b/openerp/addons/base/res/res_users_view.xml @@ -202,6 +202,7 @@ () +