Skip to content
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.

Commit 16d5249

Browse files
committedFeb 20, 2025
[MIG] delivery_carrier_label_batch: Migration to 18.0
1 parent 7246395 commit 16d5249

8 files changed

+120
-81
lines changed
 

‎delivery_carrier_label_batch/__manifest__.py

+14-3
Original file line numberDiff line numberDiff line change
@@ -2,17 +2,28 @@
22
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl)
33
{
44
"name": "Carrier labels - Stock Batch Picking (link)",
5-
"version": "14.0.1.1.1",
5+
"version": "18.0.1.0.0",
66
"author": "Camptocamp,Odoo Community Association (OCA)",
77
"maintainer": "Camptocamp",
88
"category": "Carrier",
99
"complexity": "normal",
10-
"depends": ["base_delivery_carrier_label", "stock_picking_batch_extended"],
10+
"depends": [
11+
# OCA/delivery-carrier
12+
"delivery_carrier_option",
13+
"delivery_carrier_shipping_label",
14+
"delivery_postlogistics",
15+
# OCA/stock-logistics-workflow
16+
"stock_picking_batch_extended",
17+
],
1118
"website": "https://github.com/OCA/delivery-carrier",
1219
"data": [
20+
# Security
21+
"security/ir.model.access.csv",
22+
# Data
1323
"data/ir.config_parameter.xml",
24+
# Views
1425
"views/stock_batch_picking.xml",
15-
"security/ir.model.access.csv",
26+
# Wizard
1627
"wizard/generate_labels_view.xml",
1728
"wizard/apply_carrier_view.xml",
1829
],

‎delivery_carrier_label_batch/data/ir.config_parameter.xml

+6-2
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,14 @@
11
<?xml version="1.0" encoding="UTF-8" ?>
22
<odoo noupdate="1">
3-
<record id="zpl2_assembler_single_images" model="ir.config_parameter">
3+
<record
4+
forcecreate="True"
5+
id="zpl2_assembler_single_images"
6+
model="ir.config_parameter"
7+
>
48
<field name="key">zpl2.assembler.single.images</field>
59
<field name="value">False</field>
610
</record>
7-
<record id="zpl2_batch_merge" model="ir.config_parameter">
11+
<record forcecreate="True" id="zpl2_batch_merge" model="ir.config_parameter">
812
<field name="key">zpl2.batch.merge</field>
913
<field name="value">False</field>
1014
</record>

‎delivery_carrier_label_batch/models/stock_batch_picking.py

+42-34
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
# Copyright 2013-2019 Camptocamp SA
22
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl)
3-
from odoo import _, api, fields, models
3+
from odoo import Command, api, fields, models
4+
from odoo.exceptions import UserError
45

56

67
class StockBatchPicking(models.Model):
@@ -13,9 +14,24 @@ class StockBatchPicking(models.Model):
1314
_inherit = "stock.picking.batch"
1415

1516
carrier_id = fields.Many2one(
16-
"delivery.carrier", "Carrier", states={"done": [("readonly", True)]}
17+
comodel_name="delivery.carrier",
1718
)
18-
option_ids = fields.Many2many("delivery.carrier.option", string="Options")
19+
option_ids = fields.Many2many(
20+
comodel_name="delivery.carrier.option",
21+
)
22+
option_ids_domain = fields.Binary(
23+
string="Options domain",
24+
help="Dynamic domain used for the carrier options",
25+
compute="_compute_option_ids_domain",
26+
)
27+
28+
@api.depends("carrier_id")
29+
def _compute_option_ids_domain(self):
30+
for rec in self:
31+
options_domain = None
32+
if available_options := self.carrier_id.available_option_ids:
33+
options_domain = [("id", "in", available_options.ids)]
34+
rec.option_ids_domain = options_domain
1935

2036
def action_set_options(self):
2137
"""Apply options to picking of the batch
@@ -26,7 +42,7 @@ def action_set_options(self):
2642
for rec in self:
2743
options_datas = {
2844
"carrier_id": rec.carrier_id.id,
29-
"option_ids": [(6, 0, rec.option_ids.ids)],
45+
"option_ids": [Command.set(rec.option_ids.ids)],
3046
}
3147
rec.picking_ids.write(options_datas)
3248

@@ -36,38 +52,29 @@ def _get_options_to_add(self, carrier=None):
3652
return options.filtered(lambda rec: rec.mandatory or rec.by_default)
3753

3854
@api.onchange("carrier_id")
39-
def carrier_id_change(self):
55+
def onchange_carrier_id(self):
4056
"""Inherit this method in your module"""
41-
if self.carrier_id:
42-
available_options = self.carrier_id.available_option_ids
43-
default_options = self._get_options_to_add()
44-
self.option_ids = [(6, 0, default_options.ids)]
45-
self.carrier_code = self.carrier_id.code
46-
return {
47-
"domain": {
48-
"option_ids": [("id", "in", available_options.ids)],
49-
}
50-
}
51-
return {}
57+
if not self.carrier_id:
58+
return
59+
default_options = self._get_options_to_add()
60+
self.option_ids = [Command.set(default_options.ids)]
61+
self.carrier_code = self.carrier_id.code
5262

5363
@api.onchange("option_ids")
54-
def option_ids_change(self):
55-
res = {}
64+
def onchange_option_ids(self):
5665
if not self.carrier_id:
57-
return res
66+
return
67+
5868
for available_option in self.carrier_id.available_option_ids:
5969
if available_option.mandatory and available_option not in self.option_ids:
60-
res["warning"] = {
61-
"title": _("User Error !"),
62-
"message": _(
63-
"You can not remove a mandatory option."
70+
# Optionally, reset the options to the default values.
71+
self.option_ids = self._get_options_to_add()
72+
raise UserError(
73+
self.env._(
74+
"You cannot remove a mandatory option. "
6475
"\nPlease reset options to default."
65-
),
66-
}
67-
# Due to https://github.com/odoo/odoo/issues/2693 we cannot
68-
# reset options
69-
# self.option_ids = self._get_options_to_add()
70-
return res
76+
)
77+
)
7178

7279
def _values_with_carrier_options(self, values):
7380
values = values.copy()
@@ -77,7 +84,7 @@ def _values_with_carrier_options(self, values):
7784
carrier = self.env["delivery.carrier"].browse(carrier_id)
7885
options = self._get_options_to_add(carrier)
7986
if options:
80-
values.update(option_ids=[(6, 0, options.ids)])
87+
values.update(option_ids=[Command.set(options.ids)])
8188
return values
8289

8390
def write(self, values):
@@ -93,16 +100,17 @@ def write(self, values):
93100
self.purge_tracking_references()
94101
return result
95102

96-
@api.model
97-
def create(self, values):
103+
@api.model_create_multi
104+
def create(self, vals_list):
98105
"""Set the default options when the delivery method is set on creation
99106
100107
So we are sure that the options are always in line with the
101108
current delivery method.
102109
103110
"""
104-
values = self._values_with_carrier_options(values)
105-
return super().create(values)
111+
for values in vals_list:
112+
self._values_with_carrier_options(values)
113+
return super().create(vals_list)
106114

107115
def purge_tracking_references(self):
108116
"""Purge tracking for each picking and destination package"""

‎delivery_carrier_label_batch/tests/test_generate_labels.py

+20-15
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,13 @@
33
import base64
44
from unittest.mock import patch
55

6-
import odoo.tests.common as common
7-
from odoo import exceptions
6+
from odoo import Command, exceptions
87
from odoo.modules import get_module_resource
98

9+
from odoo.addons.base.tests.common import BaseCommon
1010

11-
class TestGenerateLabels(common.SavepointCase):
11+
12+
class TestGenerateLabels(BaseCommon):
1213
"""Test the wizard for delivery carrier label generation"""
1314

1415
@classmethod
@@ -25,10 +26,10 @@ def setUpClass(cls):
2526
cls.customer_location = cls.env.ref("stock.stock_location_customers")
2627

2728
cls.productA = cls.env["product.product"].create(
28-
{"name": "Product A", "type": "product"}
29+
{"name": "Product A", "is_storable": True}
2930
)
3031
cls.productB = cls.env["product.product"].create(
31-
{"name": "Product B", "type": "product"}
32+
{"name": "Product B", "is_storable": True}
3233
)
3334
cls.env["stock.quant"]._update_available_quantity(
3435
cls.productA, cls.stock_location, 20.0
@@ -110,16 +111,19 @@ def setUpClass(cls):
110111
cls.batch = BatchPicking.create(
111112
{
112113
"name": "demo_prep001",
113-
"picking_ids": [(4, cls.picking_out_1.id), (4, cls.picking_out_2.id)],
114+
"picking_ids": [
115+
Command.link(cls.picking_out_1.id),
116+
Command.link(cls.picking_out_2.id),
117+
],
114118
"use_oca_batch_validation": True,
115119
}
116120
)
117121

118122
cls.batch.action_confirm()
119123
cls.batch.action_assign()
120124

121-
move1.move_line_ids[0].qty_done = 2
122-
move2.move_line_ids[0].qty_done = 2
125+
move1.move_line_ids[0].write({"quantity": 2, "picked": True})
126+
move2.move_line_ids[0].write({"quantity": 2, "picked": True})
123127

124128
cls.picking_out_1._set_a_default_package()
125129
cls.picking_out_2._set_a_default_package()
@@ -151,7 +155,7 @@ def setUpClass(cls):
151155
}
152156
)
153157

154-
def test_action_generate_labels(self):
158+
def test_00_action_generate_labels(self):
155159
"""Check merging of pdf labels
156160
157161
Test pdf generation without multiple threading
@@ -172,20 +176,21 @@ def test_action_generate_labels(self):
172176
self.assertTrue(attachment.name, "demo_prep001.pdf")
173177
self.assertTrue(attachment.mimetype, "application/pdf")
174178

175-
def test_action_generate_labels_no_pack(self):
179+
def test_01_action_generate_labels_no_pack(self):
176180
"""Check merging of pdf labels
177181
178182
It shouldn't be possible to print labels when packages are missing
179183
"""
180-
domain = [("picking_id", "in", self.batch.picking_ids.ids)]
181-
self.env["stock.package_level"].search(domain).unlink()
184+
self.batch.picking_ids.move_line_ids.write(
185+
{"result_package_id": False, "package_id": False}
186+
)
182187
wizard = self.DeliveryCarrierLabelGenerate.with_context(
183188
active_ids=self.batch.ids, active_model="stock.picking.batch"
184189
).create({})
185190
with self.assertRaises(exceptions.UserError):
186191
wizard.action_generate_labels()
187192

188-
def test_action_regenerate_labels(self):
193+
def test_02_action_regenerate_labels(self):
189194
"""Check re-generating labels"""
190195
wizard = self.DeliveryCarrierLabelGenerate.with_context(
191196
active_ids=self.batch.ids, active_model="stock.picking.batch"
@@ -219,7 +224,7 @@ def test_action_regenerate_labels(self):
219224
self.assertEqual(self.picking_out_1.carrier_tracking_ref, "TEST00001")
220225
self.assertEqual(self.picking_out_2.carrier_tracking_ref, "TEST00001")
221226

222-
def test_batch_purge_tracking_reference(self):
227+
def test_03_batch_purge_tracking_reference(self):
223228
"""Unittest: check that tracking reference purge work as expected"""
224229
self.batch.purge_tracking_references()
225230
self.assertTrue(
@@ -233,7 +238,7 @@ def test_batch_purge_tracking_reference(self):
233238
pickings = [self.picking_out_1, self.picking_out_2]
234239
self.assertTrue(all([not p.carrier_tracking_ref for p in pickings]))
235240

236-
def test_action_change_carrier_purge_tracking_reference(self):
241+
def test_04_action_change_carrier_purge_tracking_reference(self):
237242
"""Functional: Check purge_tracking_reference is called as carrier is
238243
changed from wizard"""
239244
wizard = self.PickingBatchApplyCarrier.with_context(

‎delivery_carrier_label_batch/views/stock_batch_picking.xml

+5-4
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,22 @@
11
<?xml version="1.0" encoding="utf-8" ?>
22
<odoo>
3-
<record model="ir.ui.view" id="stock_batch_picking_form">
3+
<record model="ir.ui.view" id="stock_picking_batch_form">
44
<field name="name">stock.picking.batch.form</field>
55
<field name="model">stock.picking.batch</field>
66
<field
77
name="inherit_id"
8-
ref="stock_picking_batch_extended.stock_batch_picking_form"
8+
ref="stock_picking_batch_extended.stock_picking_batch_form"
99
/>
1010
<field name="arch" type="xml">
1111
<notebook position="inside">
1212
<page name="carrier" string="Carrier Info">
1313
<separator string="Delivery" />
1414
<group>
15-
<field name="carrier_id" />
15+
<field name="carrier_id" readonly="state == 'done'" />
1616
</group>
1717
<separator string="Options" />
18-
<field name="option_ids" nolabel="1" />
18+
<field name="option_ids_domain" invisible="1" />
19+
<field name="option_ids" nolabel="1" domain="option_ids_domain" />
1920
<label
2021
for="action_set_options"
2122
string="Warning, setting options will erase the existing ones in delivery orders"

0 commit comments

Comments
 (0)
Please sign in to comment.