Skip to content

Commit

Permalink
[FIX+IMP] sale_order_type: New computed writable + migration fixes
Browse files Browse the repository at this point in the history
* Switch onchange on the main field to computed writable fields
* Record rule is not up to v13
* Added migration script for record rule
* Proper payment term field name in invoice
* Realign tests
  • Loading branch information
pedrobaeza committed Apr 6, 2020
1 parent 4a69446 commit 8e40947
Show file tree
Hide file tree
Showing 9 changed files with 87 additions and 58 deletions.
10 changes: 5 additions & 5 deletions sale_order_type/README.rst
Expand Up @@ -14,13 +14,13 @@ Sale Order Type
: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/13.0-mig-sale_order_type/sale_order_type
:target: https://github.com/OCA/sale-workflow/tree/13.0/sale_order_type
: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-13-0-mig-sale_order_type/sale-workflow-13-0-mig-sale_order_type-sale_order_type
:target: https://translation.odoo-community.org/projects/sale-workflow-13-0/sale-workflow-13-0-sale_order_type
: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/13.0-mig-sale_order_type
:target: https://runbot.odoo-community.org/runbot/167/13.0
:alt: Try me on Runbot

|badge1| |badge2| |badge3| |badge4| |badge5|
Expand Down Expand Up @@ -62,7 +62,7 @@ Bug Tracker
Bugs are tracked on `GitHub Issues <https://github.com/OCA/sale-workflow/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 <https://github.com/OCA/sale-workflow/issues/new?body=module:%20sale_order_type%0Aversion:%2013.0-mig-sale_order_type%0A%0A**Steps%20to%20reproduce**%0A-%20...%0A%0A**Current%20behavior**%0A%0A**Expected%20behavior**>`_.
`feedback <https://github.com/OCA/sale-workflow/issues/new?body=module:%20sale_order_type%0Aversion:%2013.0%0A%0A**Steps%20to%20reproduce**%0A-%20...%0A%0A**Current%20behavior**%0A%0A**Expected%20behavior**>`_.

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

Expand Down Expand Up @@ -129,6 +129,6 @@ 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 <https://github.com/OCA/sale-workflow/tree/13.0-mig-sale_order_type/sale_order_type>`_ project on GitHub.
This module is part of the `OCA/sale-workflow <https://github.com/OCA/sale-workflow/tree/13.0/sale_order_type>`_ project on GitHub.

You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.
2 changes: 1 addition & 1 deletion sale_order_type/__manifest__.py
@@ -1,6 +1,6 @@
# Copyright 2015 Carlos Sánchez Cifuentes <csanchez@grupovermon.com>
# Copyright 2015-2016 Oihane Crucelaegui <oihane@avanzosc.com>
# Copyright 2015-2018 Pedro M. Baeza <pedro.baeza@tecnativa.com>
# Copyright 2015-2020 Tecnativa - Pedro M. Baeza
# Copyright 2016 Lorenzo Battistini
# Copyright 2016 Carlos Dauden <carlos.dauden@tecnativa.com>
# Copyright 2018 David Vidal <david.vidal@tecnativa.com>
Expand Down
7 changes: 7 additions & 0 deletions sale_order_type/migrations/13.0.1.0.0/noupdate_changes.xml
@@ -0,0 +1,7 @@
<odoo>
<record id="sale_order_type_comp_rule" model="ir.rule">
<field
name="domain_force"
>['|',('company_id','=',False),('company_id','in',company_ids)]</field>
</record>
</odoo>
11 changes: 11 additions & 0 deletions sale_order_type/migrations/13.0.1.0.0/post-migration.py
@@ -0,0 +1,11 @@
# Copyright 2020 Tecnativa - Pedro M. Baeza
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).

from openupgradelib import openupgrade # pylint: disable=W7936


@openupgrade.migrate()
def migrate(env, version):
openupgrade.load_data(
env.cr, "sale_order_type", "migrations/13.0.1.0.0/noupdate_changes.xml"
)
38 changes: 24 additions & 14 deletions sale_order_type/models/account_move.py
@@ -1,31 +1,41 @@
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
# Copyright 2020 Tecnativa - Pedro M. Baeza

from odoo import api, fields, models


class AccountMove(models.Model):
_inherit = "account.move"

def _get_order_type(self):
return self.env["sale.order.type"].search([], limit=1)

sale_type_id = fields.Many2one(
comodel_name="sale.order.type", string="Sale Type", default=_get_order_type
comodel_name="sale.order.type",
string="Sale Type",
compute="_compute_sale_type_id",
readonly=False,
store=True,
)

@api.onchange("partner_id", "company_id")
def _onchange_partner_id(self):
res = super(AccountMove, self)._onchange_partner_id()
sale_type = (
self.partner_id.sale_type or self.partner_id.commercial_partner_id.sale_type
)
if sale_type:
self.sale_type_id = sale_type
return res
@api.depends("partner_id", "company_id")
def _compute_sale_type_id(self):
for record in self:
if not record.partner_id:
record.sale_type_id = self.env["sale.order.type"].search([], limit=1)
else:
sale_type = (
record.partner_id.with_context(
force_company=record.company_id.id
).sale_type
or self.partner_id.commercial_partner_id.with_context(
force_company=record.company_id.id
).sale_type
)
if sale_type:
record.sale_type_id = sale_type

@api.onchange("sale_type_id")
def onchange_sale_type_id(self):
# TODO: To be changed to computed stored readonly=False if possible in v14?
if self.sale_type_id.payment_term_id:
self.payment_term = self.sale_type_id.payment_term_id.id
self.invoice_payment_term_id = self.sale_type_id.payment_term_id.id
if self.sale_type_id.journal_id:
self.journal_id = self.sale_type_id.journal_id.id
35 changes: 23 additions & 12 deletions sale_order_type/models/sale.py
@@ -1,29 +1,40 @@
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
# Copyright 2020 Tecnativa - Pedro M. Baeza

from odoo import api, fields, models


class SaleOrder(models.Model):
_inherit = "sale.order"

def _get_order_type(self):
return self.env["sale.order.type"].search([], limit=1)

type_id = fields.Many2one(
comodel_name="sale.order.type", string="Type", default=_get_order_type
comodel_name="sale.order.type",
string="Type",
compute="_compute_sale_type_id",
readonly=False,
store=True,
)

@api.onchange("partner_id")
def onchange_partner_id(self):
super(SaleOrder, self).onchange_partner_id()
sale_type = (
self.partner_id.sale_type or self.partner_id.commercial_partner_id.sale_type
)
if sale_type:
self.type_id = sale_type
@api.depends("partner_id", "company_id")
def _compute_sale_type_id(self):
for record in self:
if not record.partner_id:
record.sale_type_id = self.env["sale.order.type"].search([], limit=1)
else:
sale_type = (
record.partner_id.with_context(
force_company=record.company_id.id
).sale_type
or self.partner_id.commercial_partner_id.with_context(
force_company=record.company_id.id
).sale_type
)
if sale_type:
record.type_id = sale_type

@api.onchange("type_id")
def onchange_type_id(self):
# TODO: To be changed to computed stored readonly=False if possible in v14?
vals = {}
for order in self:
vals = {}
Expand Down
2 changes: 1 addition & 1 deletion sale_order_type/security/security.xml
Expand Up @@ -4,7 +4,7 @@
<field name="model_id" ref="sale_order_type.model_sale_order_type" />
<field
name="domain_force"
>['|',('company_id','=',False),('company_id','child_of',[user.company_id.id])]</field>
>['|',('company_id','=',False),('company_id','in',company_ids)]</field>
<field name="perm_read" eval="1" />
<field name="perm_create" eval="1" />
<field name="perm_write" eval="1" />
Expand Down
6 changes: 3 additions & 3 deletions sale_order_type/static/description/index.html
Expand Up @@ -367,7 +367,7 @@ <h1 class="title">Sale Order Type</h1>
!! This file is generated by oca-gen-addon-readme !!
!! changes will be overwritten. !!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->
<p><a class="reference external" href="https://odoo-community.org/page/development-status"><img alt="Beta" src="https://img.shields.io/badge/maturity-Beta-yellow.png" /></a> <a class="reference external" href="http://www.gnu.org/licenses/agpl-3.0-standalone.html"><img alt="License: AGPL-3" src="https://img.shields.io/badge/licence-AGPL--3-blue.png" /></a> <a class="reference external" href="https://github.com/OCA/sale-workflow/tree/13.0-mig-sale_order_type/sale_order_type"><img alt="OCA/sale-workflow" src="https://img.shields.io/badge/github-OCA%2Fsale--workflow-lightgray.png?logo=github" /></a> <a class="reference external" href="https://translation.odoo-community.org/projects/sale-workflow-13-0-mig-sale_order_type/sale-workflow-13-0-mig-sale_order_type-sale_order_type"><img alt="Translate me on Weblate" src="https://img.shields.io/badge/weblate-Translate%20me-F47D42.png" /></a> <a class="reference external" href="https://runbot.odoo-community.org/runbot/167/13.0-mig-sale_order_type"><img alt="Try me on Runbot" src="https://img.shields.io/badge/runbot-Try%20me-875A7B.png" /></a></p>
<p><a class="reference external" href="https://odoo-community.org/page/development-status"><img alt="Beta" src="https://img.shields.io/badge/maturity-Beta-yellow.png" /></a> <a class="reference external" href="http://www.gnu.org/licenses/agpl-3.0-standalone.html"><img alt="License: AGPL-3" src="https://img.shields.io/badge/licence-AGPL--3-blue.png" /></a> <a class="reference external" href="https://github.com/OCA/sale-workflow/tree/13.0/sale_order_type"><img alt="OCA/sale-workflow" src="https://img.shields.io/badge/github-OCA%2Fsale--workflow-lightgray.png?logo=github" /></a> <a class="reference external" href="https://translation.odoo-community.org/projects/sale-workflow-13-0/sale-workflow-13-0-sale_order_type"><img alt="Translate me on Weblate" src="https://img.shields.io/badge/weblate-Translate%20me-F47D42.png" /></a> <a class="reference external" href="https://runbot.odoo-community.org/runbot/167/13.0"><img alt="Try me on Runbot" src="https://img.shields.io/badge/runbot-Try%20me-875A7B.png" /></a></p>
<p>This module adds a typology for the sales orders. In each different type, you
can define, invoicing and refunding journal, a warehouse, a sequence,
the shipping policy, the invoicing policy, a payment term, a pricelist
Expand Down Expand Up @@ -411,7 +411,7 @@ <h1><a class="toc-backref" href="#id3">Bug Tracker</a></h1>
<p>Bugs are tracked on <a class="reference external" href="https://github.com/OCA/sale-workflow/issues">GitHub Issues</a>.
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
<a class="reference external" href="https://github.com/OCA/sale-workflow/issues/new?body=module:%20sale_order_type%0Aversion:%2013.0-mig-sale_order_type%0A%0A**Steps%20to%20reproduce**%0A-%20...%0A%0A**Current%20behavior**%0A%0A**Expected%20behavior**">feedback</a>.</p>
<a class="reference external" href="https://github.com/OCA/sale-workflow/issues/new?body=module:%20sale_order_type%0Aversion:%2013.0%0A%0A**Steps%20to%20reproduce**%0A-%20...%0A%0A**Current%20behavior**%0A%0A**Expected%20behavior**">feedback</a>.</p>
<p>Do not contact contributors directly about support or help with technical issues.</p>
</div>
<div class="section" id="credits">
Expand Down Expand Up @@ -471,7 +471,7 @@ <h2><a class="toc-backref" href="#id7">Maintainers</a></h2>
<p>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.</p>
<p>This module is part of the <a class="reference external" href="https://github.com/OCA/sale-workflow/tree/13.0-mig-sale_order_type/sale_order_type">OCA/sale-workflow</a> project on GitHub.</p>
<p>This module is part of the <a class="reference external" href="https://github.com/OCA/sale-workflow/tree/13.0/sale_order_type">OCA/sale-workflow</a> project on GitHub.</p>
<p>You are welcome to contribute. To learn how please visit <a class="reference external" href="https://odoo-community.org/page/Contribute">https://odoo-community.org/page/Contribute</a>.</p>
</div>
</div>
Expand Down
34 changes: 12 additions & 22 deletions sale_order_type/tests/test_sale_order_type.py
@@ -1,5 +1,6 @@
# Copyright 2015 Oihane Crucelaegui - AvanzOSC
# Copyright 2017 Pierre Faniel - Niboo SPRL (<https://www.niboo.be/>)
# Copyright 2020 Tecnativa - Pedro M. Baeza
# License AGPL-3 - See http://www.gnu.org/licenses/agpl-3.0.html

import odoo.tests.common as common
Expand Down Expand Up @@ -29,7 +30,9 @@ def setUp(self):
self.warehouse = self.env["stock.warehouse"].create(
{"name": "Warehouse Test", "code": "WT"}
)
self.product = self.env.ref("product.product_product_4")
self.product = self.env["product.product"].create(
{"type": "service", "invoice_policy": "order", "name": "Test product"}
)
self.immediate_payment = self.env.ref("account.account_payment_term_immediate")
self.sale_pricelist = self.env.ref("product.list0")
self.free_carrier = self.env.ref("account.incoterm_FCA")
Expand All @@ -56,49 +59,36 @@ def get_sale_order_vals(self):
}
return {"partner_id": self.partner.id, "order_line": [(0, 0, sale_line_dict)]}

def test_sale_order_confirm(self):
def test_sale_order_flow(self):
sale_type = self.sale_type
order_vals = self.get_sale_order_vals()
order = self.sale_order_model.create(order_vals)
order.onchange_partner_id()
order = self.sale_order_model.create(self.get_sale_order_vals())
self.assertEqual(order.type_id, sale_type)
order.onchange_type_id()
self.assertEqual(order.warehouse_id, sale_type.warehouse_id)
self.assertEqual(order.picking_policy, sale_type.picking_policy)
self.assertEqual(order.payment_term_id, sale_type.payment_term_id)
self.assertEqual(order.pricelist_id, sale_type.pricelist_id)
self.assertEqual(order.incoterm, sale_type.incoterm_id)

order.action_confirm()
invoice = order._create_invoices()
self.assertEqual(invoice.sale_type_id, sale_type)
self.assertEqual(invoice.journal_id, sale_type.journal_id)

def test_sale_order_onchange_partner(self):
def test_sale_order_change_partner(self):
order = self.sale_order_model.new({"partner_id": self.partner.id})
order.onchange_partner_id()
self.assertEqual(order.type_id, self.sale_type)
order = self.sale_order_model.new({"partner_id": self.partner_child_1.id})
order.onchange_partner_id()
self.assertEqual(order.type_id, self.sale_type)

def test_invoice_onchange_type(self):
sale_type = self.sale_type
invoice = self.invoice_model.new({"sale_type_id": sale_type.id})
invoice.onchange_sale_type_id()
self.assertEqual(invoice.payment_term, sale_type.payment_term_id.id)
self.assertEqual(invoice.invoice_payment_term_id, sale_type.payment_term_id)
self.assertEqual(invoice.journal_id, sale_type.journal_id)

def test_invoice_onchange_partner(self):
def test_invoice_change_partner(self):
invoice = self.invoice_model.new({"partner_id": self.partner.id})
invoice._onchange_partner_id()
self.assertEqual(invoice.sale_type_id, self.sale_type)
invoice = self.invoice_model.new({"partner_id": self.partner_child_1.id})
invoice._onchange_partner_id()
self.assertEqual(invoice.sale_type_id, self.sale_type)

def test_prepare_invoice(self):
sale_type = self.sale_type
order_vals = self.get_sale_order_vals()
order_vals["type_id"] = sale_type.id
order = self.sale_order_model.create(order_vals)
invoice_vals = order._prepare_invoice()
self.assertEqual(invoice_vals["sale_type_id"], sale_type.id)
self.assertEqual(invoice_vals["journal_id"], sale_type.journal_id.id)

0 comments on commit 8e40947

Please sign in to comment.