From 44a4f795d0462cd557403260300f8ede70586a13 Mon Sep 17 00:00:00 2001 From: Alexis de Lattre Date: Wed, 2 Dec 2020 15:12:41 +0100 Subject: [PATCH] [MIG] sale_usability to v14 (with up-ports from v10) --- sale_usability/__init__.py | 5 +- sale_usability/__manifest__.py | 15 +-- sale_usability/i18n/fr.po | 49 ---------- .../i18n/sale_usability_extension.pot | 48 ---------- sale_usability/models/__init__.py | 4 + .../account_move.py} | 15 ++- sale_usability/models/product_template.py | 14 +++ .../{partner.py => models/res_partner.py} | 7 +- sale_usability/models/sale_order.py | 96 +++++++++++++++++++ sale_usability/product.py | 14 --- sale_usability/sale.py | 65 ------------- .../account_move.xml} | 17 ++-- sale_usability/views/product_category.xml | 16 ++++ .../product_pricelist_item.xml} | 4 +- .../{sale_view.xml => views/sale_order.xml} | 17 +--- .../sale_report.xml} | 13 ++- 16 files changed, 177 insertions(+), 222 deletions(-) delete mode 100644 sale_usability/i18n/fr.po delete mode 100644 sale_usability/i18n/sale_usability_extension.pot create mode 100644 sale_usability/models/__init__.py rename sale_usability/{account_invoice.py => models/account_move.py} (89%) create mode 100644 sale_usability/models/product_template.py rename sale_usability/{partner.py => models/res_partner.py} (51%) create mode 100644 sale_usability/models/sale_order.py delete mode 100644 sale_usability/product.py delete mode 100644 sale_usability/sale.py rename sale_usability/{account_invoice_view.xml => views/account_move.xml} (68%) create mode 100644 sale_usability/views/product_category.xml rename sale_usability/{product_view.xml => views/product_pricelist_item.xml} (89%) rename sale_usability/{sale_view.xml => views/sale_order.xml} (84%) rename sale_usability/{sale_report_view.xml => views/sale_report.xml} (75%) diff --git a/sale_usability/__init__.py b/sale_usability/__init__.py index 3e570f4..0650744 100644 --- a/sale_usability/__init__.py +++ b/sale_usability/__init__.py @@ -1,4 +1 @@ -from . import sale -from . import account_invoice -from . import product -from . import partner +from . import models diff --git a/sale_usability/__manifest__.py b/sale_usability/__manifest__.py index 7bd148f..7518a6b 100644 --- a/sale_usability/__manifest__.py +++ b/sale_usability/__manifest__.py @@ -1,10 +1,10 @@ -# Copyright 2014-2019 Akretion (http://www.akretion.com) +# Copyright 2014-2020 Akretion (http://www.akretion.com) # @author Alexis de Lattre # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). { 'name': 'Sale Usability', - 'version': '12.0.1.0.0', + 'version': '14.0.1.0.0', 'category': 'Sales', 'license': 'AGPL-3', 'summary': 'Usability improvements on sale module', @@ -15,10 +15,11 @@ 'base_view_inheritance_extension', ], 'data': [ - 'sale_view.xml', - 'sale_report_view.xml', - 'product_view.xml', - 'account_invoice_view.xml', + 'views/sale_order.xml', + 'views/product_category.xml', + 'views/sale_report.xml', + 'views/product_pricelist_item.xml', + 'views/account_move.xml', ], - 'installable': False, + 'installable': True, } diff --git a/sale_usability/i18n/fr.po b/sale_usability/i18n/fr.po deleted file mode 100644 index 3e46c68..0000000 --- a/sale_usability/i18n/fr.po +++ /dev/null @@ -1,49 +0,0 @@ -# Translation of Odoo Server. -# This file contains the translation of the following modules: -# * sale_usability_extension -# -msgid "" -msgstr "" -"Project-Id-Version: Odoo Server 8.0\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-07-13 11:01+0000\n" -"PO-Revision-Date: 2016-07-13 13:03+0200\n" -"Last-Translator: <>\n" -"Language-Team: \n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: \n" -"Language: fr\n" -"X-Generator: Poedit 1.8.7.1\n" - -#. module: sale_usability_extension -#: model:ir.model,name:sale_usability_extension.model_account_invoice_line -msgid "Invoice Line" -msgstr "Lignes de facture" - -#. module: sale_usability_extension -#: view:sale.order:sale_usability_extension.view_order_form -msgid "Invoices" -msgstr "Factures" - -#. module: sale_usability_extension -#: field:account.invoice.line,sale_line_ids:0 -msgid "Sale Order Lines" -msgstr "Lignes de Vente" - -#. module: sale_usability_extension -#: model:ir.model,name:sale_usability_extension.model_sale_order -msgid "Sales Order" -msgstr "Bon de commande" - -#. module: sale_usability_extension -#: view:sale.order:sale_usability_extension.view_order_tree -#: view:sale.order:sale_usability_extension.view_quotation_tree -msgid "Total Untaxed" -msgstr "Total HT" - -#. module: sale_usability_extension -#: view:sale.order:sale_usability_extension.view_order_form -msgid "selection" -msgstr "selection" diff --git a/sale_usability/i18n/sale_usability_extension.pot b/sale_usability/i18n/sale_usability_extension.pot deleted file mode 100644 index cbada37..0000000 --- a/sale_usability/i18n/sale_usability_extension.pot +++ /dev/null @@ -1,48 +0,0 @@ -# Translation of Odoo Server. -# This file contains the translation of the following modules: -# * sale_usability_extension -# -msgid "" -msgstr "" -"Project-Id-Version: Odoo Server 8.0\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-07-13 11:01+0000\n" -"PO-Revision-Date: 2016-07-13 11:01+0000\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_usability_extension -#: model:ir.model,name:sale_usability_extension.model_account_invoice_line -msgid "Invoice Line" -msgstr "" - -#. module: sale_usability_extension -#: view:sale.order:sale_usability_extension.view_order_form -msgid "Invoices" -msgstr "" - -#. module: sale_usability_extension -#: field:account.invoice.line,sale_line_ids:0 -msgid "Sale Order Lines" -msgstr "" - -#. module: sale_usability_extension -#: model:ir.model,name:sale_usability_extension.model_sale_order -msgid "Sales Order" -msgstr "" - -#. module: sale_usability_extension -#: view:sale.order:sale_usability_extension.view_order_tree -#: view:sale.order:sale_usability_extension.view_quotation_tree -msgid "Total Untaxed" -msgstr "" - -#. module: sale_usability_extension -#: view:sale.order:sale_usability_extension.view_order_form -msgid "selection" -msgstr "" - diff --git a/sale_usability/models/__init__.py b/sale_usability/models/__init__.py new file mode 100644 index 0000000..192863a --- /dev/null +++ b/sale_usability/models/__init__.py @@ -0,0 +1,4 @@ +from . import sale_order +from . import account_move +from . import product_template +from . import res_partner diff --git a/sale_usability/account_invoice.py b/sale_usability/models/account_move.py similarity index 89% rename from sale_usability/account_invoice.py rename to sale_usability/models/account_move.py index a419fe5..762cfef 100644 --- a/sale_usability/account_invoice.py +++ b/sale_usability/models/account_move.py @@ -6,20 +6,19 @@ from odoo import api, fields, models from collections import OrderedDict -class AccountInvoice(models.Model): - _inherit = 'account.invoice' +class AccountMove(models.Model): + _inherit = 'account.move' # sale_ids is kind of the symetric field of invoice_ids on sale.order sale_ids = fields.Many2many( - 'sale.order', string='Sale Orders', compute="_compute_sale_ids", - readonly=True, copy=False) + 'sale.order', string='Sale Orders', compute="_compute_sale_ids") sale_count = fields.Integer( - string='Sale Order Count', compute='_compute_sale_ids', readonly=True) + string='Sale Order Count', compute='_compute_sale_ids') @api.depends('invoice_line_ids.sale_line_ids') def _compute_sale_ids(self): for invoice in self: - if invoice.type == 'out_invoice': + if invoice.move_type == 'out_invoice': sales = invoice.invoice_line_ids.mapped('sale_line_ids').\ mapped('order_id') invoice.sale_ids = sales.ids @@ -51,8 +50,8 @@ class AccountInvoice(models.Model): # {categ(1): {'lines': [l1, l2], 'subtotal': 23.32}} soo = self.env['sale.order'] for line in self.invoice_line_ids: - order = line.sale_line_ids and line.sale_line_ids[0].order_id\ - or soo + order = not line.display_type and line.sale_line_ids and\ + line.sale_line_ids[0].order_id or soo if order in res1: res1[order]['lines'].append(line) res1[order]['subtotal'] += line.price_subtotal diff --git a/sale_usability/models/product_template.py b/sale_usability/models/product_template.py new file mode 100644 index 0000000..6627df1 --- /dev/null +++ b/sale_usability/models/product_template.py @@ -0,0 +1,14 @@ +# Copyright 2017-2019 Akretion France +# @author: Alexis de Lattre +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from odoo import fields, models + + +class ProductTemplate(models.Model): + _inherit = 'product.template' + + service_type = fields.Selection(tracking=True) + expense_policy = fields.Selection(tracking=True) + invoice_policy = fields.Selection(tracking=True) + sale_line_warn = fields.Selection(tracking=True) diff --git a/sale_usability/partner.py b/sale_usability/models/res_partner.py similarity index 51% rename from sale_usability/partner.py rename to sale_usability/models/res_partner.py index 13905c3..efc7b7d 100644 --- a/sale_usability/partner.py +++ b/sale_usability/models/res_partner.py @@ -1,12 +1,11 @@ -# -*- coding: utf-8 -*- -# Copyright 2017-2019 Akretion France (https://akretion.com/) +# Copyright 2017-2020 Akretion France (https://akretion.com/) # @author: Alexis de Lattre # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). -from odoo import models, fields +from odoo import fields, models class ResPartner(models.Model): _inherit = 'res.partner' - sale_warn = fields.Selection(track_visibility='onchange') + sale_warn = fields.Selection(tracking=True) diff --git a/sale_usability/models/sale_order.py b/sale_usability/models/sale_order.py new file mode 100644 index 0000000..b108a1e --- /dev/null +++ b/sale_usability/models/sale_order.py @@ -0,0 +1,96 @@ +# Copyright (C) 2015-2020 Akretion France (http://www.akretion.com) +# @author Alexis de Lattre +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from odoo import api, fields, models, _ +from odoo.tools import float_is_zero, float_compare +from odoo.tools.misc import formatLang + + +class SaleOrder(models.Model): + _inherit = 'sale.order' + + date_order = fields.Datetime(tracking=True) + client_order_ref = fields.Char(tracking=True) + # for partner_id, the 'sale' module sets track_visibility='always' + amount_tax = fields.Monetary(tracking=True) + partner_shipping_id = fields.Many2one(tracking=True) + partner_invoice_id = fields.Many2one(tracking=True) + pricelist_id = fields.Many2one(tracking=True) + payment_term_id = fields.Many2one(tracking=True) + fiscal_position_id = fields.Many2one(tracking=True) + # for reports + has_discount = fields.Boolean(compute='_compute_has_discount') + + @api.depends('order_line.discount') + def _compute_has_discount(self): + prec = self.env['decimal.precision'].precision_get('Discount') + for order in self: + has_discount = False + for line in order.order_line: + if not line.display_type and not float_is_zero( + line.discount, precision_digits=prec): + has_discount = True + break + order.has_discount = has_discount + + # for report + def py3o_lines_layout(self): + self.ensure_one() + res = [] + has_sections = False + subtotal = 0.0 + for line in self.order_line: + if line.display_type == 'line_section': + # insert line + if has_sections: + res.append({'subtotal': subtotal}) + subtotal = 0.0 # reset counter + has_sections = True + else: + if not line.display_type: + subtotal += line.price_subtotal + res.append({'line': line}) + if has_sections: # insert last subtotal line + res.append({'subtotal': subtotal}) + # res: + # [ + # {'line': sale_order_line(1) with display_type=='line_section'}, + # {'line': sale_order_line(2) without display_type}, + # {'line': sale_order_line(3) without display_type}, + # {'line': sale_order_line(4) with display_type=='line_note'}, + # {'subtotal': 8932.23}, + # ] + return res + + +class SaleOrderLine(models.Model): + _inherit = 'sale.order.line' + + @api.onchange('product_uom', 'product_uom_qty') + def product_uom_change(self): + # When the user has manually set a custom price + # he is often upset when Odoo changes it when he changes the qty + # So we add a warning in which we recall the old price. + res = {} + old_price = self.price_unit + super().product_uom_change() + new_price = self.price_unit + prec = self.env['decimal.precision'].precision_get('Product Price') + if float_compare(old_price, new_price, precision_digits=prec): + pricelist = self.order_id.pricelist_id + res['warning'] = { + 'title': _('Price updated'), + 'message': _( + "Due to the update of the ordered quantity on line '%s', " + "the price has been updated according to pricelist %s.\n" + "Old price: %s\n" + "New price: %s") % ( + self.name, + pricelist.display_name, + formatLang( + self.env, old_price, currency_obj=pricelist.currency_id), + formatLang( + self.env, new_price, currency_obj=pricelist.currency_id)) + } + return res diff --git a/sale_usability/product.py b/sale_usability/product.py deleted file mode 100644 index 0d1795b..0000000 --- a/sale_usability/product.py +++ /dev/null @@ -1,14 +0,0 @@ -# Copyright 2017-2019 Akretion France -# @author: Alexis de Lattre -# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). - -from odoo import models, fields - - -class ProductTemplate(models.Model): - _inherit = 'product.template' - - service_type = fields.Selection(track_visibility='onchange') - expense_policy = fields.Selection(track_visibility='onchange') - invoice_policy = fields.Selection(track_visibility='onchange') - sale_line_warn = fields.Selection(track_visibility='onchange') diff --git a/sale_usability/sale.py b/sale_usability/sale.py deleted file mode 100644 index f94f8f2..0000000 --- a/sale_usability/sale.py +++ /dev/null @@ -1,65 +0,0 @@ -# Copyright (C) 2015-2019 Akretion France (http://www.akretion.com) -# @author Alexis de Lattre -# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). - -from odoo import models, fields, api -from odoo.tools import float_is_zero - - -class SaleOrder(models.Model): - _inherit = 'sale.order' - - date_order = fields.Datetime(track_visibility='onchange') - confirmation_date = fields.Datetime(track_visibility='onchange') - client_order_ref = fields.Char(track_visibility='onchange') - # for partner_id, the 'sale' module sets track_visibility='always' - partner_id = fields.Many2one(track_visibility='onchange') - amount_tax = fields.Monetary(track_visibility='onchange') - partner_shipping_id = fields.Many2one(track_visibility='onchange') - partner_invoice_id = fields.Many2one(track_visibility='onchange') - pricelist_id = fields.Many2one(track_visibility='onchange') - payment_term_id = fields.Many2one(track_visibility='onchange') - fiscal_position_id = fields.Many2one(track_visibility='onchange') - # for reports - has_discount = fields.Boolean( - compute='_compute_has_discount', readonly=True) - - @api.depends('order_line.discount') - def _compute_has_discount(self): - prec = self.env['decimal.precision'].precision_get('Discount') - for order in self: - has_discount = False - for line in order.order_line: - if not float_is_zero(line.discount, precision_digits=prec): - has_discount = True - break - order.has_discount = has_discount - - # for report - def py3o_lines_layout(self): - self.ensure_one() - res = [] - has_sections = False - subtotal = 0.0 - for line in self.order_line: - if line.display_type == 'line_section': - # insert line - if has_sections: - res.append({'subtotal': subtotal}) - subtotal = 0.0 # reset counter - has_sections = True - else: - if not line.display_type: - subtotal += line.price_subtotal - res.append({'line': line}) - if has_sections: # insert last subtotal line - res.append({'subtotal': subtotal}) - # res: - # [ - # {'line': sale_order_line(1) with display_type=='line_section'}, - # {'line': sale_order_line(2) without display_type}, - # {'line': sale_order_line(3) without display_type}, - # {'line': sale_order_line(4) with display_type=='line_note'}, - # {'subtotal': 8932.23}, - # ] - return res diff --git a/sale_usability/account_invoice_view.xml b/sale_usability/views/account_move.xml similarity index 68% rename from sale_usability/account_invoice_view.xml rename to sale_usability/views/account_move.xml index 843d6e5..001ad30 100644 --- a/sale_usability/account_invoice_view.xml +++ b/sale_usability/views/account_move.xml @@ -1,13 +1,13 @@ - + - - sale_usability.invoice.line.form - account.invoice.line - + + sale_usability.account.move.form + account.move + - - + + diff --git a/sale_usability/views/product_category.xml b/sale_usability/views/product_category.xml new file mode 100644 index 0000000..3af86f0 --- /dev/null +++ b/sale_usability/views/product_category.xml @@ -0,0 +1,16 @@ + + + + + + + + + diff --git a/sale_usability/product_view.xml b/sale_usability/views/product_pricelist_item.xml similarity index 89% rename from sale_usability/product_view.xml rename to sale_usability/views/product_pricelist_item.xml index 4c5a122..1df3ab4 100644 --- a/sale_usability/product_view.xml +++ b/sale_usability/views/product_pricelist_item.xml @@ -1,6 +1,6 @@ @@ -20,7 +20,7 @@ because the parent menu entry is in the sale module --> diff --git a/sale_usability/sale_view.xml b/sale_usability/views/sale_order.xml similarity index 84% rename from sale_usability/sale_view.xml rename to sale_usability/views/sale_order.xml index 2b4bcb4..3a13d2e 100644 --- a/sale_usability/sale_view.xml +++ b/sale_usability/views/sale_order.xml @@ -23,7 +23,7 @@ - + @@ -34,8 +34,8 @@ sale.order - - + + show @@ -45,8 +45,8 @@ sale.order - - + + show 0 @@ -60,7 +60,6 @@ - @@ -111,10 +110,4 @@ https://github.com/odoo/odoo/commit/c1e5ab9b1331c3cb7dc2232bf78952bdb40ad939 --> - - - diff --git a/sale_usability/sale_report_view.xml b/sale_usability/views/sale_report.xml similarity index 75% rename from sale_usability/sale_report_view.xml rename to sale_usability/views/sale_report.xml index b622f71..5c43aff 100644 --- a/sale_usability/sale_report_view.xml +++ b/sale_usability/views/sale_report.xml @@ -1,6 +1,6 @@ @@ -43,4 +43,15 @@ + + usability.sale.report.search + sale.report + + + + + + + +