delivery_carrier_partner_account: fix and refactoring
- Fix: partners can no longer have default carrier accounts that are archived. - Refactor: remove write/create overrides to replace them with computed/stored fields.
This commit is contained in:
parent
b437a82a70
commit
2164e2be54
4 changed files with 146 additions and 46 deletions
|
|
@ -19,7 +19,7 @@
|
||||||
#
|
#
|
||||||
{
|
{
|
||||||
"name": "Carrier Accounts by Partner",
|
"name": "Carrier Accounts by Partner",
|
||||||
"version": "18.0.0.1.3",
|
"version": "18.0.0.1.4",
|
||||||
"summary": "Add one or many carrier accounts per partner",
|
"summary": "Add one or many carrier accounts per partner",
|
||||||
"category": "Delivery",
|
"category": "Delivery",
|
||||||
"author": "Bemade Inc.",
|
"author": "Bemade Inc.",
|
||||||
|
|
|
||||||
|
|
@ -38,19 +38,3 @@ class DeliveryCarrierAccount(models.Model):
|
||||||
def _compute_display_name(self):
|
def _compute_display_name(self):
|
||||||
for record in self:
|
for record in self:
|
||||||
record.display_name = record.account_number
|
record.display_name = record.account_number
|
||||||
|
|
||||||
def write(self, vals):
|
|
||||||
res = super().write(vals)
|
|
||||||
for partner in self.partner_id.filtered(
|
|
||||||
lambda partner: not partner.default_carrier_account_id
|
|
||||||
):
|
|
||||||
partner.default_carrier_account_id = partner.carrier_account_ids[0]
|
|
||||||
return res
|
|
||||||
|
|
||||||
@api.model_create_multi
|
|
||||||
def create(self, vals_list):
|
|
||||||
res = super().create(vals_list)
|
|
||||||
for rec in res:
|
|
||||||
if not rec.partner_id.default_carrier_account_id:
|
|
||||||
rec.partner_id.default_carrier_account_id = rec
|
|
||||||
return res
|
|
||||||
|
|
|
||||||
|
|
@ -13,29 +13,77 @@ class Partner(models.Model):
|
||||||
|
|
||||||
default_carrier_account_id = fields.Many2one(
|
default_carrier_account_id = fields.Many2one(
|
||||||
comodel_name="delivery.carrier.account",
|
comodel_name="delivery.carrier.account",
|
||||||
|
compute="_compute_logistic_defaults",
|
||||||
|
inverse="_inverse_default_carrier_account_id",
|
||||||
|
store=True,
|
||||||
tracking=1,
|
tracking=1,
|
||||||
ondelete="restrict",
|
ondelete="restrict",
|
||||||
)
|
)
|
||||||
|
|
||||||
def write(self, vals):
|
property_delivery_carrier_id = fields.Many2one(
|
||||||
update_default_carrier = (
|
compute="_compute_logistic_defaults",
|
||||||
"carrier_account_ids" in vals and not self.default_carrier_account_id
|
inverse="_inverse_property_delivery_carrier_id",
|
||||||
)
|
store=True,
|
||||||
res = super().write(vals)
|
)
|
||||||
if update_default_carrier and self.carrier_account_ids:
|
|
||||||
self.default_carrier_account_id = self.carrier_account_ids[0]
|
|
||||||
self.property_delivery_carrier_id = (
|
|
||||||
self.default_carrier_account_id.delivery_carrier_id
|
|
||||||
)
|
|
||||||
return res
|
|
||||||
|
|
||||||
@api.model_create_multi
|
def _inverse_default_carrier_account_id(self):
|
||||||
def create(self, vals_list):
|
pass
|
||||||
res = super().create(vals_list)
|
|
||||||
for rec in res:
|
def _inverse_property_delivery_carrier_id(self):
|
||||||
if not rec.default_carrier_account_id and rec.carrier_account_ids:
|
pass
|
||||||
rec.default_carrier_account_id = rec.carrier_account_ids[0]
|
|
||||||
return res
|
@api.depends(
|
||||||
|
"carrier_account_ids",
|
||||||
|
"carrier_account_ids.active",
|
||||||
|
"carrier_account_ids.delivery_carrier_id",
|
||||||
|
)
|
||||||
|
def _compute_logistic_defaults(self):
|
||||||
|
# Unset default carrier account if it is archived
|
||||||
|
for partner in self.filtered(
|
||||||
|
lambda partner: partner.default_carrier_account_id
|
||||||
|
and not partner.default_carrier_account_id.active
|
||||||
|
):
|
||||||
|
partner.default_carrier_account_id = False
|
||||||
|
|
||||||
|
# Unset the default carrier if no accounts are available
|
||||||
|
for partner in self.filtered(
|
||||||
|
lambda partner: partner.property_delivery_carrier_id
|
||||||
|
).filtered(
|
||||||
|
lambda partner: not partner.carrier_account_ids.filtered(
|
||||||
|
lambda account: account.delivery_carrier_id
|
||||||
|
== partner.property_delivery_carrier_id
|
||||||
|
and account.active
|
||||||
|
)
|
||||||
|
):
|
||||||
|
partner.property_delivery_carrier_id = False
|
||||||
|
|
||||||
|
# Set default carrier account if not set and accounts available
|
||||||
|
for partner in self.filtered(
|
||||||
|
lambda partner: not partner.default_carrier_account_id
|
||||||
|
and partner.carrier_account_ids.filtered("active")
|
||||||
|
):
|
||||||
|
partner.default_carrier_account_id = partner.carrier_account_ids.filtered(
|
||||||
|
"active"
|
||||||
|
)[0]
|
||||||
|
|
||||||
|
# Set default carrier if not set and default account is set
|
||||||
|
for partner in self.filtered(
|
||||||
|
lambda partner: not partner.property_delivery_carrier_id
|
||||||
|
and partner.default_carrier_account_id
|
||||||
|
):
|
||||||
|
partner.property_delivery_carrier_id = (
|
||||||
|
partner.default_carrier_account_id.delivery_carrier_id
|
||||||
|
)
|
||||||
|
|
||||||
|
# Reset default carrier if account is set and doesn't match
|
||||||
|
for partner in self.filtered(
|
||||||
|
lambda partner: partner.default_carrier_account_id
|
||||||
|
and partner.default_carrier_account_id.delivery_carrier_id
|
||||||
|
!= partner.property_delivery_carrier_id
|
||||||
|
):
|
||||||
|
partner.property_delivery_carrier_id = (
|
||||||
|
partner.default_carrier_account_id.delivery_carrier_id
|
||||||
|
)
|
||||||
|
|
||||||
def get_carrier_account(self, carrier):
|
def get_carrier_account(self, carrier):
|
||||||
self.ensure_one()
|
self.ensure_one()
|
||||||
|
|
@ -52,3 +100,22 @@ class Partner(models.Model):
|
||||||
if commercial_patner_accounts:
|
if commercial_patner_accounts:
|
||||||
return commercial_patner_accounts[0]
|
return commercial_patner_accounts[0]
|
||||||
return self.env["delivery.carrier.account"]
|
return self.env["delivery.carrier.account"]
|
||||||
|
|
||||||
|
def process_carrier_account_archiving(self):
|
||||||
|
for partner in self:
|
||||||
|
# Unset default carrier account if it is archived
|
||||||
|
if (
|
||||||
|
partner.default_carrier_account_id
|
||||||
|
and not partner.default_carrier_account_id.active
|
||||||
|
):
|
||||||
|
partner.default_carrier_account_id = False
|
||||||
|
# Unset default carrier if not more accounts available
|
||||||
|
if (
|
||||||
|
partner.property_delivery_carrier_id
|
||||||
|
and not partner.carrier_account_ids.filtered(
|
||||||
|
lambda account: account.delivery_carrier_id
|
||||||
|
== partner.property_delivery_carrier_id
|
||||||
|
and account.active
|
||||||
|
)
|
||||||
|
):
|
||||||
|
partner.property_delivery_carrier_id = False
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
from odoo.tests import TransactionCase, tagged
|
from odoo.tests import TransactionCase, tagged, Form
|
||||||
from odoo import Command
|
from odoo import Command
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -12,16 +12,15 @@ class TestResPartner(TransactionCase):
|
||||||
partner = self.env["res.partner"].create(
|
partner = self.env["res.partner"].create(
|
||||||
{
|
{
|
||||||
"name": "Test Partner",
|
"name": "Test Partner",
|
||||||
"carrier_account_ids": [
|
}
|
||||||
Command.create(
|
)
|
||||||
{
|
account = self.env["delivery.carrier.account"].create(
|
||||||
"delivery_carrier_id": self.env.ref(
|
{
|
||||||
"delivery.free_delivery_carrier"
|
"partner_id": partner.id,
|
||||||
).id,
|
"delivery_carrier_id": self.env.ref(
|
||||||
"account_number": "1234567890",
|
"delivery.free_delivery_carrier"
|
||||||
}
|
).id,
|
||||||
)
|
"account_number": "1234567890",
|
||||||
],
|
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
@ -97,3 +96,53 @@ class TestResPartner(TransactionCase):
|
||||||
)
|
)
|
||||||
|
|
||||||
self.assertEqual(partner.default_carrier_account_id, new_account)
|
self.assertEqual(partner.default_carrier_account_id, new_account)
|
||||||
|
|
||||||
|
def test_no_archived_default_carrier_account(self):
|
||||||
|
partner = self.env["res.partner"].create(
|
||||||
|
{
|
||||||
|
"name": "Test Partner",
|
||||||
|
}
|
||||||
|
)
|
||||||
|
account = self.env["delivery.carrier.account"].create(
|
||||||
|
{
|
||||||
|
"partner_id": partner.id,
|
||||||
|
"delivery_carrier_id": self.env.ref(
|
||||||
|
"delivery.free_delivery_carrier"
|
||||||
|
).id,
|
||||||
|
"account_number": "1234567890",
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
with Form(account) as account_form:
|
||||||
|
account_form.active = False
|
||||||
|
|
||||||
|
self.assertFalse(partner.default_carrier_account_id)
|
||||||
|
|
||||||
|
def test_multiple_carrier_accounts_reset_default_on_archive(self):
|
||||||
|
partner = self.env["res.partner"].create(
|
||||||
|
{
|
||||||
|
"name": "Test Partner",
|
||||||
|
}
|
||||||
|
)
|
||||||
|
account1 = self.env["delivery.carrier.account"].create(
|
||||||
|
{
|
||||||
|
"partner_id": partner.id,
|
||||||
|
"delivery_carrier_id": self.env.ref(
|
||||||
|
"delivery.free_delivery_carrier"
|
||||||
|
).id,
|
||||||
|
"account_number": "1234567890",
|
||||||
|
}
|
||||||
|
)
|
||||||
|
account2 = self.env["delivery.carrier.account"].create(
|
||||||
|
{
|
||||||
|
"partner_id": partner.id,
|
||||||
|
"delivery_carrier_id": self.env.ref(
|
||||||
|
"delivery.free_delivery_carrier"
|
||||||
|
).id,
|
||||||
|
"account_number": "1234567891",
|
||||||
|
}
|
||||||
|
)
|
||||||
|
self.assertEqual(partner.default_carrier_account_id, account1)
|
||||||
|
with Form(account1) as account_form:
|
||||||
|
account_form.active = False
|
||||||
|
self.assertEqual(partner.default_carrier_account_id, account2)
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue