From 4685c8fb1f8090322fc6bfff397de8a989fb07ad Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?C=C3=A9dric=20Pigeon?= Date: Mon, 18 Jul 2016 16:46:03 +0200 Subject: [PATCH 01/51] add module to add a selection of products to a sale order --- sale_product_multi_add/README.rst | 65 ++++++++++++++ sale_product_multi_add/__init__.py | 1 + sale_product_multi_add/__openerp__.py | 19 +++++ sale_product_multi_add/tests/__init__.py | 2 + sale_product_multi_add/tests/test_sale.py | 43 ++++++++++ sale_product_multi_add/views/sale_view.xml | 22 +++++ sale_product_multi_add/wizard/__init__.py | 1 + .../wizard/sale_import_products.py | 85 +++++++++++++++++++ .../wizard/sale_import_products_view.xml | 49 +++++++++++ 9 files changed, 287 insertions(+) create mode 100644 sale_product_multi_add/README.rst create mode 100644 sale_product_multi_add/__init__.py create mode 100644 sale_product_multi_add/__openerp__.py create mode 100644 sale_product_multi_add/tests/__init__.py create mode 100644 sale_product_multi_add/tests/test_sale.py create mode 100644 sale_product_multi_add/views/sale_view.xml create mode 100644 sale_product_multi_add/wizard/__init__.py create mode 100644 sale_product_multi_add/wizard/sale_import_products.py create mode 100644 sale_product_multi_add/wizard/sale_import_products_view.xml diff --git a/sale_product_multi_add/README.rst b/sale_product_multi_add/README.rst new file mode 100644 index 00000000000..d55557c97a2 --- /dev/null +++ b/sale_product_multi_add/README.rst @@ -0,0 +1,65 @@ +.. image:: https://img.shields.io/badge/licence-AGPL--3-blue.svg + :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html + :alt: License: AGPL-3 + +============== +Sale Product Multi Add +============== + +This module extends the functionality of sale module +and allow you to import multiple products into your current sale order. + +Usage +===== + +This module add a button on sale order to import several products on your current sale order. +A wizard opens and allows the user to search and select products. + +.. image:: https://odoo-community.org/website/image/ir.attachment/5784_f2813bd/datas + :alt: Try me on Runbot + :target: https://runbot.odoo-community.org/runbot/{sale-workflow}/{8.0} + +.. repo_id is available in https://github.com/OCA/maintainer-tools/blob/master/tools/repos_with_ids.txt +.. branch is "8.0" for example + +Known issues / Roadmap +====================== + +* ... + +Bug Tracker +=========== + +Bugs are tracked on `GitHub Issues +`_. In case of trouble, please +check there if your issue has already been reported. If you spotted it first, +help us smashing it by providing a detailed and welcomed feedback. + +Credits +======= + +Images +------ + +* Odoo Community Association: `Icon `_. + +Contributors +------------ + +* Denis Roussel +* Cédric Pigeon + +Maintainer +---------- + +.. image:: https://odoo-community.org/logo.png + :alt: Odoo Community Association + :target: https://odoo-community.org + +This module is maintained by the OCA. + +OCA, or the Odoo Community Association, is a nonprofit organization whose +mission is to support the collaborative development of Odoo features and +promote its widespread use. + +To contribute to this module, please visit https://odoo-community.org. diff --git a/sale_product_multi_add/__init__.py b/sale_product_multi_add/__init__.py new file mode 100644 index 00000000000..40272379f72 --- /dev/null +++ b/sale_product_multi_add/__init__.py @@ -0,0 +1 @@ +from . import wizard diff --git a/sale_product_multi_add/__openerp__.py b/sale_product_multi_add/__openerp__.py new file mode 100644 index 00000000000..c86b598fe26 --- /dev/null +++ b/sale_product_multi_add/__openerp__.py @@ -0,0 +1,19 @@ +# -*- coding: utf-8 -*- +# © 2016 Cédric Pigeon, ACSONE SA/NV () +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). +{ + 'name': "Sale Product Multi Add", + 'summary': """ + Sale Product Multi Add """, + 'author': 'ACSONE SA/NV, Odoo Community Association (OCA)', + 'website': "http://acsone.eu", + 'category': 'Sale Management', + 'version': '8.0.1.0.0', + 'license': 'AGPL-3', + 'depends': [ + 'sale', + ], + 'data': ['wizard/sale_import_products_view.xml', + 'views/sale_view.xml', + ] +} diff --git a/sale_product_multi_add/tests/__init__.py b/sale_product_multi_add/tests/__init__.py new file mode 100644 index 00000000000..52bca004461 --- /dev/null +++ b/sale_product_multi_add/tests/__init__.py @@ -0,0 +1,2 @@ +# -*- coding: utf-8 -*- +from . import test_sale diff --git a/sale_product_multi_add/tests/test_sale.py b/sale_product_multi_add/tests/test_sale.py new file mode 100644 index 00000000000..0ca5363781e --- /dev/null +++ b/sale_product_multi_add/tests/test_sale.py @@ -0,0 +1,43 @@ +# -*- coding: utf-8 -*- +# © 2016 Cédric Pigeon, Acsone SA/NV (http://www.acsone.eu) +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). +import openerp.tests.common as common + + +class TestSale(common.TransactionCase): + + def setUp(self): + common.TransactionCase.setUp(self) + + self.product_35 = self.env.ref("product.product_product_35") + self.product_36 = self.env.ref("product.product_product_36") + + def test_import_product(self): + """ Create SO + Import products + Check products are presents + """ + + so = self.env["sale.order"].create( + {"partner_id": self.env.ref("base.res_partner_2").id, + }) + + wiz_obj = self.env['sale.import.products'] + wizard = wiz_obj.with_context(active_id=so.id, + active_model='sale.order') + + products = [(6, 0, [self.product_35.id, self.product_36.id])] + + wizard_id = wizard.create({'products': products}) + wizard_id.create_items() + wizard_id.items[0].quantity = 4 + wizard_id.items[1].quantity = 6 + wizard_id.select_products() + + self.assertEqual(len(so.order_line), 2) + + for line in so.order_line: + if line.product_id.id == self.product_35.id: + self.assertEqual(line.product_uom_qty, 4) + else: + self.assertEqual(line.product_uom_qty, 6) diff --git a/sale_product_multi_add/views/sale_view.xml b/sale_product_multi_add/views/sale_view.xml new file mode 100644 index 00000000000..93373dd1384 --- /dev/null +++ b/sale_product_multi_add/views/sale_view.xml @@ -0,0 +1,22 @@ + + + + + sale.order.mass.import.form + sale.order + + + +
+
+
+ + + {'always_reload':true} + +
+
+
+
\ No newline at end of file diff --git a/sale_product_multi_add/wizard/__init__.py b/sale_product_multi_add/wizard/__init__.py new file mode 100644 index 00000000000..dfb0a3ec9d7 --- /dev/null +++ b/sale_product_multi_add/wizard/__init__.py @@ -0,0 +1 @@ +from . import sale_import_products diff --git a/sale_product_multi_add/wizard/sale_import_products.py b/sale_product_multi_add/wizard/sale_import_products.py new file mode 100644 index 00000000000..6031afb6c0e --- /dev/null +++ b/sale_product_multi_add/wizard/sale_import_products.py @@ -0,0 +1,85 @@ +# -*- coding: utf-8 -*- +# © 2016 Cédric Pigeon, ACSONE SA/NV () +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). + +from openerp import models, fields, api +import openerp.addons.decimal_precision as dp + + +class SaleImportProducts(models.TransientModel): + _name = 'sale.import.products' + _description = 'Sale Import Products' + + products = fields.Many2many(comodel_name='product.product', + string="Products") + items = fields.One2many(comodel_name='sale.import.products.items', + inverse_name='wizard_id') + + @api.multi + def create_items(self): + for wizard in self: + for product in wizard.products: + self.env['sale.import.products.items'].create( + {'wizard_id': wizard.id, + 'product_id': product.id}) + view = self.env.ref('sale_product_multi_add.' + 'view_import_product_to_sale2') + return { + 'type': 'ir.actions.act_window', + 'res_model': self._name, + 'view_type': 'form', + 'view_mode': 'form', + 'views': [(view.id, 'form')], + 'target': 'new', + 'res_id': wizard.id, + 'context': self.env.context} + + @api.model + def _get_line_values(self, sale, item): + onchange_f = self.env['sale.order.line']._model.product_id_change + + vals = onchange_f(self.env.cr, self.env.uid, [], + sale.pricelist_id.id, + item.product_id.id, qty=item.quantity, + uom=item.product_id.uom_po_id.id, + partner_id=sale.partner_id.id, + date_order=sale.date_order, + fiscal_position=sale.fiscal_position.id, + context=self.env.context) + if 'value' in vals: + taxes = vals['value']['tax_id'] + vals['value'].update({'order_id': sale.id, + 'product_id': item.product_id.id, + 'product_uom_qty': item.quantity, + 'tax_id': [(6, 0, taxes)]}) + vals = vals['value'] + return vals + + @api.multi + def select_products(self): + so_obj = self.env['sale.order'] + for wizard in self: + sale = so_obj.browse(self.env.context.get('active_id', False)) + + if sale: + for item in wizard.items: + vals = self._get_line_values(sale, item) + if vals: + self.env['sale.order.line'].create(vals) + + return {'type': 'ir.actions.act_window_close', } + + +class SaleImportProductsItem(models.TransientModel): + _name = 'sale.import.products.items' + + wizard_id = fields.Many2one(string="Wizard", + comodel_name='sale.import.products') + product_id = fields.Many2one(string='Product', + comodel_name='product.product', + required=True) + quantity = fields.Float(string='Quantity', + digits_compute=dp.get_precision( + 'Product Unit of Measure'), + default=1.0, + required=True) diff --git a/sale_product_multi_add/wizard/sale_import_products_view.xml b/sale_product_multi_add/wizard/sale_import_products_view.xml new file mode 100644 index 00000000000..e9823eec445 --- /dev/null +++ b/sale_product_multi_add/wizard/sale_import_products_view.xml @@ -0,0 +1,49 @@ + + + + + + import.products.to.sale.form + sale.import.products + +
+ +
+
+ +
+
+ + + import.products.to.sale.form2 + sale.import.products + +
+ + + + + + +
+
+
+
+
+ + + Import Products + ir.actions.act_window + sale.import.products + form + + new + +
+
From db5ab910e0c62d8036ecfdddbc316c2ccf1156d3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?C=C3=A9dric=20Pigeon?= Date: Fri, 12 May 2017 15:13:12 +0200 Subject: [PATCH 02/51] [10.0][MIG] port sale_product_multi_add to 10.0 --- sale_product_multi_add/README.rst | 13 ++--- sale_product_multi_add/__init__.py | 3 +- .../{__openerp__.py => __manifest__.py} | 11 +++-- sale_product_multi_add/tests/test_sale.py | 15 +++--- sale_product_multi_add/views/sale_view.xml | 34 ++++++------- .../wizard/sale_import_products_view.xml | 49 ------------------- .../{wizard => wizards}/__init__.py | 0 .../sale_import_products.py | 41 ++++++---------- .../wizards/sale_import_products_view.xml | 48 ++++++++++++++++++ 9 files changed, 95 insertions(+), 119 deletions(-) rename sale_product_multi_add/{__openerp__.py => __manifest__.py} (66%) delete mode 100644 sale_product_multi_add/wizard/sale_import_products_view.xml rename sale_product_multi_add/{wizard => wizards}/__init__.py (100%) rename sale_product_multi_add/{wizard => wizards}/sale_import_products.py (59%) create mode 100644 sale_product_multi_add/wizards/sale_import_products_view.xml diff --git a/sale_product_multi_add/README.rst b/sale_product_multi_add/README.rst index d55557c97a2..1c7c9fa0bdf 100644 --- a/sale_product_multi_add/README.rst +++ b/sale_product_multi_add/README.rst @@ -2,9 +2,9 @@ :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html :alt: License: AGPL-3 -============== +====================== Sale Product Multi Add -============== +====================== This module extends the functionality of sale module and allow you to import multiple products into your current sale order. @@ -17,15 +17,8 @@ A wizard opens and allows the user to search and select products. .. image:: https://odoo-community.org/website/image/ir.attachment/5784_f2813bd/datas :alt: Try me on Runbot - :target: https://runbot.odoo-community.org/runbot/{sale-workflow}/{8.0} - -.. repo_id is available in https://github.com/OCA/maintainer-tools/blob/master/tools/repos_with_ids.txt -.. branch is "8.0" for example - -Known issues / Roadmap -====================== + :target: https://runbot.odoo-community.org/runbot/{sale-workflow}/10.0 -* ... Bug Tracker =========== diff --git a/sale_product_multi_add/__init__.py b/sale_product_multi_add/__init__.py index 40272379f72..943cefd96db 100644 --- a/sale_product_multi_add/__init__.py +++ b/sale_product_multi_add/__init__.py @@ -1 +1,2 @@ -from . import wizard +# -*- coding: utf-8 -*- +from . import wizards diff --git a/sale_product_multi_add/__openerp__.py b/sale_product_multi_add/__manifest__.py similarity index 66% rename from sale_product_multi_add/__openerp__.py rename to sale_product_multi_add/__manifest__.py index c86b598fe26..a3bba209c80 100644 --- a/sale_product_multi_add/__openerp__.py +++ b/sale_product_multi_add/__manifest__.py @@ -1,5 +1,5 @@ # -*- coding: utf-8 -*- -# © 2016 Cédric Pigeon, ACSONE SA/NV () +# Copyright 2016 Cédric Pigeon, ACSONE SA/NV () # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). { 'name': "Sale Product Multi Add", @@ -8,12 +8,13 @@ 'author': 'ACSONE SA/NV, Odoo Community Association (OCA)', 'website': "http://acsone.eu", 'category': 'Sale Management', - 'version': '8.0.1.0.0', + 'version': '10.0.1.0.0', 'license': 'AGPL-3', 'depends': [ 'sale', ], - 'data': ['wizard/sale_import_products_view.xml', - 'views/sale_view.xml', - ] + 'data': [ + 'wizards/sale_import_products_view.xml', + 'views/sale_view.xml', + ], } diff --git a/sale_product_multi_add/tests/test_sale.py b/sale_product_multi_add/tests/test_sale.py index 0ca5363781e..1d24896b8ca 100644 --- a/sale_product_multi_add/tests/test_sale.py +++ b/sale_product_multi_add/tests/test_sale.py @@ -1,16 +1,16 @@ # -*- coding: utf-8 -*- # © 2016 Cédric Pigeon, Acsone SA/NV (http://www.acsone.eu) # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). -import openerp.tests.common as common +import odoo.tests.common as common class TestSale(common.TransactionCase): def setUp(self): - common.TransactionCase.setUp(self) + super(TestSale, self).setUp() - self.product_35 = self.env.ref("product.product_product_35") - self.product_36 = self.env.ref("product.product_product_36") + self.product_9 = self.env.ref("product.product_product_9") + self.product_11 = self.env.ref("product.product_product_11") def test_import_product(self): """ Create SO @@ -19,14 +19,13 @@ def test_import_product(self): """ so = self.env["sale.order"].create( - {"partner_id": self.env.ref("base.res_partner_2").id, - }) + {"partner_id": self.env.ref("base.res_partner_2").id}) wiz_obj = self.env['sale.import.products'] wizard = wiz_obj.with_context(active_id=so.id, active_model='sale.order') - products = [(6, 0, [self.product_35.id, self.product_36.id])] + products = [(6, 0, [self.product_9.id, self.product_11.id])] wizard_id = wizard.create({'products': products}) wizard_id.create_items() @@ -37,7 +36,7 @@ def test_import_product(self): self.assertEqual(len(so.order_line), 2) for line in so.order_line: - if line.product_id.id == self.product_35.id: + if line.product_id.id == self.product_9.id: self.assertEqual(line.product_uom_qty, 4) else: self.assertEqual(line.product_uom_qty, 6) diff --git a/sale_product_multi_add/views/sale_view.xml b/sale_product_multi_add/views/sale_view.xml index 93373dd1384..92292077565 100644 --- a/sale_product_multi_add/views/sale_view.xml +++ b/sale_product_multi_add/views/sale_view.xml @@ -1,22 +1,18 @@ - - - - sale.order.mass.import.form - sale.order - - - -
-
-
+ + + sale.order.mass.import.form + sale.order + + +
+
- - {'always_reload':true} - + + {'always_reload':true} -
-
-
\ No newline at end of file + + + diff --git a/sale_product_multi_add/wizard/sale_import_products_view.xml b/sale_product_multi_add/wizard/sale_import_products_view.xml deleted file mode 100644 index e9823eec445..00000000000 --- a/sale_product_multi_add/wizard/sale_import_products_view.xml +++ /dev/null @@ -1,49 +0,0 @@ - - - - - - import.products.to.sale.form - sale.import.products - -
- -
-
- -
-
- - - import.products.to.sale.form2 - sale.import.products - -
- - - - - - -
-
-
-
-
- - - Import Products - ir.actions.act_window - sale.import.products - form - - new - -
-
diff --git a/sale_product_multi_add/wizard/__init__.py b/sale_product_multi_add/wizards/__init__.py similarity index 100% rename from sale_product_multi_add/wizard/__init__.py rename to sale_product_multi_add/wizards/__init__.py diff --git a/sale_product_multi_add/wizard/sale_import_products.py b/sale_product_multi_add/wizards/sale_import_products.py similarity index 59% rename from sale_product_multi_add/wizard/sale_import_products.py rename to sale_product_multi_add/wizards/sale_import_products.py index 6031afb6c0e..4e3b0bd9f7f 100644 --- a/sale_product_multi_add/wizard/sale_import_products.py +++ b/sale_product_multi_add/wizards/sale_import_products.py @@ -1,17 +1,16 @@ # -*- coding: utf-8 -*- -# © 2016 Cédric Pigeon, ACSONE SA/NV () +# Copyright 2016 Cédric Pigeon, ACSONE SA/NV () # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). -from openerp import models, fields, api -import openerp.addons.decimal_precision as dp +from odoo import models, fields, api +import odoo.addons.decimal_precision as dp class SaleImportProducts(models.TransientModel): _name = 'sale.import.products' _description = 'Sale Import Products' - products = fields.Many2many(comodel_name='product.product', - string="Products") + products = fields.Many2many(comodel_name='product.product') items = fields.One2many(comodel_name='sale.import.products.items', inverse_name='wizard_id') @@ -31,29 +30,19 @@ def create_items(self): 'view_mode': 'form', 'views': [(view.id, 'form')], 'target': 'new', - 'res_id': wizard.id, + 'res_id': self.id, 'context': self.env.context} @api.model def _get_line_values(self, sale, item): - onchange_f = self.env['sale.order.line']._model.product_id_change - - vals = onchange_f(self.env.cr, self.env.uid, [], - sale.pricelist_id.id, - item.product_id.id, qty=item.quantity, - uom=item.product_id.uom_po_id.id, - partner_id=sale.partner_id.id, - date_order=sale.date_order, - fiscal_position=sale.fiscal_position.id, - context=self.env.context) - if 'value' in vals: - taxes = vals['value']['tax_id'] - vals['value'].update({'order_id': sale.id, - 'product_id': item.product_id.id, - 'product_uom_qty': item.quantity, - 'tax_id': [(6, 0, taxes)]}) - vals = vals['value'] - return vals + return { + 'order_id': sale.id, + 'name': item.product_id.name, + 'product_id': item.product_id.id, + 'product_uom_qty': item.quantity, + 'product_uom': item.product_id.uom_id.id, + 'price_unit': item.product_id.list_price + } @api.multi def select_products(self): @@ -78,8 +67,6 @@ class SaleImportProductsItem(models.TransientModel): product_id = fields.Many2one(string='Product', comodel_name='product.product', required=True) - quantity = fields.Float(string='Quantity', - digits_compute=dp.get_precision( - 'Product Unit of Measure'), + quantity = fields.Float(digits=dp.get_precision('Product Unit of Measure'), default=1.0, required=True) diff --git a/sale_product_multi_add/wizards/sale_import_products_view.xml b/sale_product_multi_add/wizards/sale_import_products_view.xml new file mode 100644 index 00000000000..67b46469bec --- /dev/null +++ b/sale_product_multi_add/wizards/sale_import_products_view.xml @@ -0,0 +1,48 @@ + + + + + import.products.to.sale.form + sale.import.products + +
+ +
+
+ +
+
+ + + import.products.to.sale.form2 + sale.import.products + +
+ + + + + + +
+
+
+
+
+ + + Import Products + ir.actions.act_window + sale.import.products + form + + new + + +
From 89a4e912542bd085d9d56304b58b65e8cc061b27 Mon Sep 17 00:00:00 2001 From: oca-travis Date: Wed, 20 Jun 2018 14:57:42 +0000 Subject: [PATCH 03/51] [UPD] Update sale_product_multi_add.pot --- .../i18n/sale_product_multi_add.pot | 122 ++++++++++++++++++ 1 file changed, 122 insertions(+) create mode 100644 sale_product_multi_add/i18n/sale_product_multi_add.pot diff --git a/sale_product_multi_add/i18n/sale_product_multi_add.pot b/sale_product_multi_add/i18n/sale_product_multi_add.pot new file mode 100644 index 00000000000..230917ec4bb --- /dev/null +++ b/sale_product_multi_add/i18n/sale_product_multi_add.pot @@ -0,0 +1,122 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * sale_product_multi_add +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 10.0\n" +"Report-Msgid-Bugs-To: \n" +"Last-Translator: <>\n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: \n" + +#. module: sale_product_multi_add +#: model:ir.ui.view,arch_db:sale_product_multi_add.view_import_product_to_sale +#: model:ir.ui.view,arch_db:sale_product_multi_add.view_import_product_to_sale2 +msgid "Cancel" +msgstr "" + +#. module: sale_product_multi_add +#: model:ir.model.fields,field_description:sale_product_multi_add.field_sale_import_products_create_uid +#: model:ir.model.fields,field_description:sale_product_multi_add.field_sale_import_products_items_create_uid +msgid "Created by" +msgstr "" + +#. module: sale_product_multi_add +#: model:ir.model.fields,field_description:sale_product_multi_add.field_sale_import_products_create_date +#: model:ir.model.fields,field_description:sale_product_multi_add.field_sale_import_products_items_create_date +msgid "Created on" +msgstr "" + +#. module: sale_product_multi_add +#: model:ir.model.fields,field_description:sale_product_multi_add.field_sale_import_products_display_name +#: model:ir.model.fields,field_description:sale_product_multi_add.field_sale_import_products_items_display_name +msgid "Display Name" +msgstr "" + +#. module: sale_product_multi_add +#: model:ir.model.fields,field_description:sale_product_multi_add.field_sale_import_products_id +#: model:ir.model.fields,field_description:sale_product_multi_add.field_sale_import_products_items_id +msgid "ID" +msgstr "" + +#. module: sale_product_multi_add +#: model:ir.actions.act_window,name:sale_product_multi_add.action_import_product_to_sale +msgid "Import Products" +msgstr "" + +#. module: sale_product_multi_add +#: model:ir.model.fields,field_description:sale_product_multi_add.field_sale_import_products_items +msgid "Items" +msgstr "" + +#. module: sale_product_multi_add +#: model:ir.model.fields,field_description:sale_product_multi_add.field_sale_import_products___last_update +#: model:ir.model.fields,field_description:sale_product_multi_add.field_sale_import_products_items___last_update +msgid "Last Modified on" +msgstr "" + +#. module: sale_product_multi_add +#: model:ir.model.fields,field_description:sale_product_multi_add.field_sale_import_products_items_write_uid +#: model:ir.model.fields,field_description:sale_product_multi_add.field_sale_import_products_write_uid +msgid "Last Updated by" +msgstr "" + +#. module: sale_product_multi_add +#: model:ir.model.fields,field_description:sale_product_multi_add.field_sale_import_products_items_write_date +#: model:ir.model.fields,field_description:sale_product_multi_add.field_sale_import_products_write_date +msgid "Last Updated on" +msgstr "" + +#. module: sale_product_multi_add +#: model:ir.model.fields,field_description:sale_product_multi_add.field_sale_import_products_items_product_id +msgid "Product" +msgstr "" + +#. module: sale_product_multi_add +#: model:ir.model.fields,field_description:sale_product_multi_add.field_sale_import_products_products +#: model:ir.ui.view,arch_db:sale_product_multi_add.sale_order_mass_import_form +#: model:ir.ui.view,arch_db:sale_product_multi_add.view_import_product_to_sale +#: model:ir.ui.view,arch_db:sale_product_multi_add.view_import_product_to_sale2 +msgid "Products" +msgstr "" + +#. module: sale_product_multi_add +#: model:ir.model.fields,field_description:sale_product_multi_add.field_sale_import_products_items_quantity +msgid "Quantity" +msgstr "" + +#. module: sale_product_multi_add +#: model:ir.model,name:sale_product_multi_add.model_sale_import_products +msgid "Sale Import Products" +msgstr "" + +#. module: sale_product_multi_add +#: model:ir.ui.view,arch_db:sale_product_multi_add.view_import_product_to_sale2 +msgid "Select" +msgstr "" + +#. module: sale_product_multi_add +#: model:ir.ui.view,arch_db:sale_product_multi_add.view_import_product_to_sale +msgid "Set quantities" +msgstr "" + +#. module: sale_product_multi_add +#: model:ir.model.fields,field_description:sale_product_multi_add.field_sale_import_products_items_wizard_id +msgid "Wizard" +msgstr "" + +#. module: sale_product_multi_add +#: model:ir.ui.view,arch_db:sale_product_multi_add.view_import_product_to_sale +#: model:ir.ui.view,arch_db:sale_product_multi_add.view_import_product_to_sale2 +msgid "or" +msgstr "" + +#. module: sale_product_multi_add +#: model:ir.model,name:sale_product_multi_add.model_sale_import_products_items +msgid "sale.import.products.items" +msgstr "" + From 36ce705357e9e7bacc6ea3247ab5361b39994ad1 Mon Sep 17 00:00:00 2001 From: OCA-git-bot Date: Wed, 3 Apr 2019 03:19:34 +0000 Subject: [PATCH 04/51] [ADD] icon.png --- .../static/description/icon.png | Bin 0 -> 9455 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 sale_product_multi_add/static/description/icon.png diff --git a/sale_product_multi_add/static/description/icon.png b/sale_product_multi_add/static/description/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..3a0328b516c4980e8e44cdb63fd945757ddd132d GIT binary patch literal 9455 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 z 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 Xviia!U7SGha1wx#SCgwmn*{w2TRX*I literal 0 HcmV?d00001 From 8ff2c3d7367ea9bbac64db444e8322ebc59d2628 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adri=C3=A0=20Gil=20Sorribes?= Date: Wed, 3 Jul 2019 15:25:39 +0200 Subject: [PATCH 05/51] [11.0][MIG] sale_product_multi_add --- sale_product_multi_add/README.rst | 68 ++- sale_product_multi_add/__init__.py | 1 - sale_product_multi_add/__manifest__.py | 3 +- .../readme/CONTRIBUTORS.rst | 2 + sale_product_multi_add/readme/DESCRIPTION.rst | 2 + sale_product_multi_add/readme/USAGE.rst | 5 + .../static/description/index.html | 428 ++++++++++++++++++ .../description/sale_product_multi_add.png | Bin 0 -> 46761 bytes sale_product_multi_add/tests/__init__.py | 1 - sale_product_multi_add/tests/test_sale.py | 1 - sale_product_multi_add/views/sale_view.xml | 10 +- .../wizards/sale_import_products.py | 3 +- 12 files changed, 491 insertions(+), 33 deletions(-) create mode 100644 sale_product_multi_add/readme/CONTRIBUTORS.rst create mode 100644 sale_product_multi_add/readme/DESCRIPTION.rst create mode 100644 sale_product_multi_add/readme/USAGE.rst create mode 100644 sale_product_multi_add/static/description/index.html create mode 100644 sale_product_multi_add/static/description/sale_product_multi_add.png diff --git a/sale_product_multi_add/README.rst b/sale_product_multi_add/README.rst index 1c7c9fa0bdf..cfee7a078af 100644 --- a/sale_product_multi_add/README.rst +++ b/sale_product_multi_add/README.rst @@ -1,58 +1,84 @@ -.. image:: https://img.shields.io/badge/licence-AGPL--3-blue.svg - :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html - :alt: License: AGPL-3 - ====================== Sale Product Multi Add ====================== +.. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! This file is generated by oca-gen-addon-readme !! + !! changes will be overwritten. !! + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +.. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png + :target: https://odoo-community.org/page/development-status + :alt: Beta +.. |badge2| image:: https://img.shields.io/badge/licence-AGPL--3-blue.png + :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html + :alt: License: AGPL-3 +.. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fsale--workflow-lightgray.png?logo=github + :target: https://github.com/OCA/sale-workflow/tree/11.0/sale_product_multi_add + :alt: OCA/sale-workflow +.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png + :target: https://translation.odoo-community.org/projects/sale-workflow-11-0/sale-workflow-11-0-sale_product_multi_add + :alt: Translate me on Weblate +.. |badge5| image:: https://img.shields.io/badge/runbot-Try%20me-875A7B.png + :target: https://runbot.odoo-community.org/runbot/167/11.0 + :alt: Try me on Runbot + +|badge1| |badge2| |badge3| |badge4| |badge5| + This module extends the functionality of sale module and allow you to import multiple products into your current sale order. +**Table of contents** + +.. contents:: + :local: + Usage ===== This module add a button on sale order to import several products on your current sale order. A wizard opens and allows the user to search and select products. -.. image:: https://odoo-community.org/website/image/ir.attachment/5784_f2813bd/datas - :alt: Try me on Runbot - :target: https://runbot.odoo-community.org/runbot/{sale-workflow}/10.0 - +.. image:: https://raw.githubusercontent.com/sale_product_multi_add/static/src/description/sale_product_multi_add.png + :alt: Sale Product Multi Add Bug Tracker =========== -Bugs are tracked on `GitHub Issues -`_. In case of trouble, please -check there if your issue has already been reported. If you spotted it first, -help us smashing it by providing a detailed and welcomed feedback. +Bugs are tracked on `GitHub Issues `_. +In case of trouble, please check there if your issue has already been reported. +If you spotted it first, help us smashing it by providing a detailed and welcomed +`feedback `_. + +Do not contact contributors directly about support or help with technical issues. Credits ======= -Images ------- +Authors +~~~~~~~ -* Odoo Community Association: `Icon `_. +* ACSONE SA/NV Contributors ------------- +~~~~~~~~~~~~ * Denis Roussel * Cédric Pigeon -Maintainer ----------- +Maintainers +~~~~~~~~~~~ + +This module is maintained by the OCA. .. image:: https://odoo-community.org/logo.png :alt: Odoo Community Association :target: https://odoo-community.org -This module is maintained by the OCA. - OCA, or the Odoo Community Association, is a nonprofit organization whose mission is to support the collaborative development of Odoo features and promote its widespread use. -To contribute to this module, please visit https://odoo-community.org. +This module is part of the `OCA/sale-workflow `_ project on GitHub. + +You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute. diff --git a/sale_product_multi_add/__init__.py b/sale_product_multi_add/__init__.py index 943cefd96db..5cb1c49143f 100644 --- a/sale_product_multi_add/__init__.py +++ b/sale_product_multi_add/__init__.py @@ -1,2 +1 @@ -# -*- coding: utf-8 -*- from . import wizards diff --git a/sale_product_multi_add/__manifest__.py b/sale_product_multi_add/__manifest__.py index a3bba209c80..73dca838f5b 100644 --- a/sale_product_multi_add/__manifest__.py +++ b/sale_product_multi_add/__manifest__.py @@ -1,4 +1,3 @@ -# -*- coding: utf-8 -*- # Copyright 2016 Cédric Pigeon, ACSONE SA/NV () # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). { @@ -8,7 +7,7 @@ 'author': 'ACSONE SA/NV, Odoo Community Association (OCA)', 'website': "http://acsone.eu", 'category': 'Sale Management', - 'version': '10.0.1.0.0', + 'version': '11.0.1.0.0', 'license': 'AGPL-3', 'depends': [ 'sale', diff --git a/sale_product_multi_add/readme/CONTRIBUTORS.rst b/sale_product_multi_add/readme/CONTRIBUTORS.rst new file mode 100644 index 00000000000..3e696282f39 --- /dev/null +++ b/sale_product_multi_add/readme/CONTRIBUTORS.rst @@ -0,0 +1,2 @@ +* Denis Roussel +* Cédric Pigeon diff --git a/sale_product_multi_add/readme/DESCRIPTION.rst b/sale_product_multi_add/readme/DESCRIPTION.rst new file mode 100644 index 00000000000..ea2e65e7a5b --- /dev/null +++ b/sale_product_multi_add/readme/DESCRIPTION.rst @@ -0,0 +1,2 @@ +This module extends the functionality of sale module +and allow you to import multiple products into your current sale order. diff --git a/sale_product_multi_add/readme/USAGE.rst b/sale_product_multi_add/readme/USAGE.rst new file mode 100644 index 00000000000..caff263cb79 --- /dev/null +++ b/sale_product_multi_add/readme/USAGE.rst @@ -0,0 +1,5 @@ +This module add a button on sale order to import several products on your current sale order. +A wizard opens and allows the user to search and select products. + +.. image:: /sale_product_multi_add/static/src/description/sale_product_multi_add.png + :alt: Sale Product Multi Add diff --git a/sale_product_multi_add/static/description/index.html b/sale_product_multi_add/static/description/index.html new file mode 100644 index 00000000000..798aba8d2a0 --- /dev/null +++ b/sale_product_multi_add/static/description/index.html @@ -0,0 +1,428 @@ + + + + + + +Sale Product Multi Add + + + +
+

Sale Product Multi Add

+ + +

Beta License: AGPL-3 OCA/sale-workflow Translate me on Weblate Try me on Runbot

+

This module extends the functionality of sale module +and allow you to import multiple products into your current sale order.

+

Table of contents

+ +
+

Usage

+

This module add a button on sale order to import several products on your current sale order. +A wizard opens and allows the user to search and select products.

+Sale Product Multi Add +
+
+

Bug Tracker

+

Bugs are tracked on GitHub Issues. +In case of trouble, please check there if your issue has already been reported. +If you spotted it first, help us smashing it by providing a detailed and welcomed +feedback.

+

Do not contact contributors directly about support or help with technical issues.

+
+
+

Credits

+
+

Authors

+
    +
  • ACSONE SA/NV
  • +
+
+
+

Contributors

+ +
+
+

Maintainers

+

This module is maintained by the OCA.

+Odoo Community Association +

OCA, or the Odoo Community Association, is a nonprofit organization whose +mission is to support the collaborative development of Odoo features and +promote its widespread use.

+

This module is part of the OCA/sale-workflow project on GitHub.

+

You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.

+
+
+
+ + diff --git a/sale_product_multi_add/static/description/sale_product_multi_add.png b/sale_product_multi_add/static/description/sale_product_multi_add.png new file mode 100644 index 0000000000000000000000000000000000000000..cb29986cd3cee75757354421d13ea642f806dac0 GIT binary patch literal 46761 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 literal 0 HcmV?d00001 diff --git a/sale_product_multi_add/tests/__init__.py b/sale_product_multi_add/tests/__init__.py index 52bca004461..67709762e39 100644 --- a/sale_product_multi_add/tests/__init__.py +++ b/sale_product_multi_add/tests/__init__.py @@ -1,2 +1 @@ -# -*- coding: utf-8 -*- from . import test_sale diff --git a/sale_product_multi_add/tests/test_sale.py b/sale_product_multi_add/tests/test_sale.py index 1d24896b8ca..deba773692d 100644 --- a/sale_product_multi_add/tests/test_sale.py +++ b/sale_product_multi_add/tests/test_sale.py @@ -1,4 +1,3 @@ -# -*- coding: utf-8 -*- # © 2016 Cédric Pigeon, Acsone SA/NV (http://www.acsone.eu) # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). import odoo.tests.common as common diff --git a/sale_product_multi_add/views/sale_view.xml b/sale_product_multi_add/views/sale_view.xml index 92292077565..72a8511be52 100644 --- a/sale_product_multi_add/views/sale_view.xml +++ b/sale_product_multi_add/views/sale_view.xml @@ -5,11 +5,11 @@ sale.order -
-
- + +