Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[16.0][IMP-FIX] delivery_auto_refresh - performance & compatibility & cleanup #799

Merged
merged 11 commits into from
Jun 14, 2024
Prev Previous commit
Next Next commit
delivery-carrier: postpone new dependency to 17.0
This commit can be reverted in the migration to 17.0
jbaudoux committed Apr 19, 2024
commit 583861910d17be105df705c50611c91783e522e8
4 changes: 3 additions & 1 deletion delivery_auto_refresh/__manifest__.py
Original file line number Diff line number Diff line change
@@ -11,6 +11,8 @@
"license": "AGPL-3",
"application": False,
"installable": True,
"depends": ["delivery", "sale_order_carrier_auto_assign"],
"depends": ["delivery"],
# Migration Note 17.0: Add dependency to sale_order_carrier_auto_assign
# "depends": ["delivery", "sale_order_carrier_auto_assign"],
"data": ["views/sale_order_views.xml", "views/res_config_settings_views.xml"],
}
Original file line number Diff line number Diff line change
@@ -8,7 +8,7 @@ def _migrate_setting_to_company(env):
if env["ir.config_parameter"].get_param(
"delivery_auto_refresh.set_default_carrier"
):
env["res.company"].search([]).carrier_auto_assign_on_create = True
env["res.company"].search([]).sale_auto_assign_carrier_on_create = True


def migrate(cr, version):
1 change: 1 addition & 0 deletions delivery_auto_refresh/models/__init__.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
from . import sale_order
from . import stock_picking
from . import res_company
from . import res_config_settings
14 changes: 14 additions & 0 deletions delivery_auto_refresh/models/res_company.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
# Copyright 2024 Jacques-Etienne Baudoux (BCIM) <je@bcim.be>
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).

from odoo import fields, models


class ResCompany(models.Model):
_inherit = "res.company"

# Migration Note 17.0: move this to module sale_order_carrier_auto_assign
sale_auto_assign_carrier_on_create = fields.Boolean(
"Set default shipping method automatically"
)
# End migration note
7 changes: 7 additions & 0 deletions delivery_auto_refresh/models/res_config_settings.py
Original file line number Diff line number Diff line change
@@ -7,6 +7,13 @@
class ResConfigSettings(models.TransientModel):
_inherit = "res.config.settings"

# Migration Note 17.0: move this to module sale_order_carrier_auto_assign
sale_auto_assign_carrier_on_create = fields.Boolean(
related="company_id.sale_auto_assign_carrier_on_create",
readonly=False,
)
# End migration note

auto_add_delivery_line = fields.Boolean(
"Refresh shipping cost line automatically",
config_parameter="delivery_auto_refresh.auto_add_delivery_line",
52 changes: 52 additions & 0 deletions delivery_auto_refresh/models/sale_order.py
Original file line number Diff line number Diff line change
@@ -24,6 +24,54 @@ def _compute_available_carrier_ids(self):

# End migration note

# Migration Note 17.0: move this section to module sale_order_carrier_auto_assign
def _set_delivery_carrier(self, set_delivery_line=True):
for order in self:
delivery_wiz_action = order.action_open_delivery_wizard()
delivery_wiz_context = delivery_wiz_action.get("context", {})
if not delivery_wiz_context.get("default_carrier_id"):
continue
delivery_wiz = (
self.env[delivery_wiz_action.get("res_model")]
.with_context(**delivery_wiz_context)
.new({})
)

# Do not override carrier
if order.carrier_id:
delivery_wiz.carrier_id = order.carrier_id

# If the carrier isn't allowed, we won't default to it
if (
delivery_wiz.carrier_id
not in delivery_wiz.available_carrier_ids._origin
):
continue

if not set_delivery_line or order.is_all_service:
# Only set the carrier
if order.carrier_id != delivery_wiz.carrier_id:
order.carrier_id = delivery_wiz.carrier_id
else:
delivery_wiz._get_shipment_rate()
delivery_wiz.button_confirm()

@api.onchange("partner_id", "partner_shipping_id")
def _add_delivery_carrier_on_partner_change(self):
partner = self.partner_shipping_id or self.partner_id
if not partner:
return
if self.company_id.sale_auto_assign_carrier_on_create:
self._set_delivery_carrier(set_delivery_line=False)

def _is_auto_set_carrier_on_create(self):
self.ensure_one()
if self.state not in ("draft", "sent"):
return False
return self.company_id.sale_auto_assign_carrier_on_create

# End migration note

def _get_param_auto_add_delivery_line(self):
# When we have the context 'website_id' it means that we are doing the order from
# e-commerce. So we don't want to add the delivery line automatically.
@@ -108,6 +156,10 @@ def create(self, vals_list):
.with_context(auto_refresh_delivery=False)
)
for order in orders:
# Migration Note 17.0: move this to module sale_order_carrier_auto_assign
if not order.carrier_id and order._is_auto_set_carrier_on_create():
order._set_delivery_carrier()
# End migration note
order._auto_refresh_delivery()
return orders

2 changes: 2 additions & 0 deletions delivery_auto_refresh/readme/CONFIGURE.rst
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
Go to *Settings > Sales > Shipping*:

* Enable "Set default shipping method automalically" if you want to add
automatically the carrier on the sales quotation creation.
* Enable "Refresh shipping cost line automatically" if you want to add automatically the
delivery line on save and refresh the cost. This will also set the shipping method.
* Enable "Refresh After Picking Automatically" if you want to refresh delivery
1 change: 1 addition & 0 deletions delivery_auto_refresh/tests/__init__.py
Original file line number Diff line number Diff line change
@@ -1 +1,2 @@
from . import test_delivery_auto_refresh
from . import test_sale_order_carrier_auto_assign
81 changes: 81 additions & 0 deletions delivery_auto_refresh/tests/test_sale_order_carrier_auto_assign.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,81 @@
# Copyright 2024 Jacques-Etienne Baudoux (BCIM) <je@bcim.be>
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl)

# MIGRATION NOTE for 17.0: Move this to module sale_order_carrier_auto_assign

from odoo.tests import Form, TransactionCase

from odoo.addons.base.tests.common import DISABLED_MAIL_CONTEXT


class TestSaleOrderCarrierAutoAssignCommon(TransactionCase):
@classmethod
def setUpClass(cls):
super().setUpClass()
cls.env = cls.env["base"].with_context(**DISABLED_MAIL_CONTEXT).env

cls.partner = cls.env.ref("base.res_partner_2")
cls.product_storable = cls.env.ref("product.product_product_9")
cls.delivery_local_delivery = cls.env.ref("delivery.delivery_local_delivery")
cls.delivery_local_delivery.fixed_price = 10


class TestSaleOrderCarrierAutoAssignOnCreate(TestSaleOrderCarrierAutoAssignCommon):
@classmethod
def setUpClass(cls):
super().setUpClass()
cls.settings = cls.env["res.config.settings"].create({})

def test_sale_order_carrier_auto_assign_onchange(self):
self.assertEqual(
self.partner.property_delivery_carrier_id, self.delivery_local_delivery
)
self.settings.sale_auto_assign_carrier_on_create = True
self.settings.set_values()
sale_order_form = Form(self.env["sale.order"])
sale_order_form.partner_id = self.partner
sale_order = sale_order_form.save()
self.assertEqual(sale_order.carrier_id, self.delivery_local_delivery)

def test_sale_order_carrier_auto_assign_create(self):
self.assertEqual(
self.partner.property_delivery_carrier_id, self.delivery_local_delivery
)
self.settings.sale_auto_assign_carrier_on_create = True
self.settings.set_values()
sale_order = self.env["sale.order"].create({"partner_id": self.partner.id})
self.assertEqual(sale_order.carrier_id, self.delivery_local_delivery)

def test_sale_order_carrier_auto_assign_disabled(self):
self.assertEqual(
self.partner.property_delivery_carrier_id, self.delivery_local_delivery
)
self.settings.sale_auto_assign_carrier_on_create = False
self.settings.set_values()
sale_order_form = Form(self.env["sale.order"])
sale_order_form.partner_id = self.partner
sale_order = sale_order_form.save()
self.assertFalse(sale_order.carrier_id)

def test_sale_order_carrier_auto_assign_no_carrier(self):
self.partner.property_delivery_carrier_id = False
self.settings.sale_auto_assign_carrier_on_create = True
self.settings.set_values()
sale_order_form = Form(self.env["sale.order"])
sale_order_form.partner_id = self.partner
sale_order = sale_order_form.save()
self.assertFalse(sale_order.carrier_id)

def test_sale_order_carrier_auto_assign_carrier_already_set(self):
self.assertEqual(
self.partner.property_delivery_carrier_id, self.delivery_local_delivery
)
self.settings.sale_auto_assign_carrier_on_create = True
carrier = self.env.ref("delivery.delivery_carrier")
sale_order = self.env["sale.order"].create(
{
"partner_id": self.partner.id,
"carrier_id": carrier.id,
}
)
self.assertEqual(sale_order.carrier_id, carrier)
18 changes: 18 additions & 0 deletions delivery_auto_refresh/views/res_config_settings_views.xml
Original file line number Diff line number Diff line change
@@ -4,12 +4,30 @@
<field name="name">res.config.settings.view.form.inherit.sale</field>
<field name="model">res.config.settings</field>
<field name="priority" eval="9" />
<field name="inherit_id" ref="sale.res_config_settings_view_form" />
<!-- Migration note 17.0: depend on sale_order_carrier_auto_assign
<field
name="inherit_id"
ref="sale_order_carrier_auto_assign.res_config_settings_view_form_sale"
/>
-->
<field name="arch" type="xml">
<xpath expr="//div[@name='shipping_setting_container']" position="inside">
<!-- Migration note 17.0: depend on sale_order_carrier_auto_assign
<xpath expr="//div[@id='carrier_auto_assign']" position="inside">
-->
<!-- Migration note 17.0: move this to module sale_order_carrier_auto_assign -->
<div class="o_setting_left_pane">
<field name="sale_auto_assign_carrier_on_create" />
</div>
<div class="o_setting_right_pane">
<label for="sale_auto_assign_carrier_on_create" />
<div class="text-muted">
On the sales quotation, add the shipping method on creation.
</div>
</div>
<!-- End Migratio note -->

<div class="o_setting_left_pane">
<field name="auto_add_delivery_line" />
</div>