Skip to content

Commit e33d9f0

Browse files
committed
[MIG] delivery_carrier_label_batch: Migration to 18.0
1 parent ce2599a commit e33d9f0

8 files changed

+122
-86
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

+22-20
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
8-
from odoo.modules import get_module_resource
6+
from odoo import Command, exceptions
7+
from odoo.tools.misc import file_path
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,23 +111,23 @@ 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()
126-
127-
dummy_pdf_path = get_module_resource(
128-
"delivery_carrier_label_batch", "tests", "dummy.pdf"
129-
)
130+
dummy_pdf_path = file_path("delivery_carrier_label_batch/tests/dummy.pdf")
130131
with open(dummy_pdf_path, "rb") as dummy_pdf:
131132
label = dummy_pdf.read()
132133
cls.shipping_label_1 = ShippingLabel.create(
@@ -151,7 +152,7 @@ def setUpClass(cls):
151152
}
152153
)
153154

154-
def test_action_generate_labels(self):
155+
def test_00_action_generate_labels(self):
155156
"""Check merging of pdf labels
156157
157158
Test pdf generation without multiple threading
@@ -172,20 +173,21 @@ def test_action_generate_labels(self):
172173
self.assertTrue(attachment.name, "demo_prep001.pdf")
173174
self.assertTrue(attachment.mimetype, "application/pdf")
174175

175-
def test_action_generate_labels_no_pack(self):
176+
def test_01_action_generate_labels_no_pack(self):
176177
"""Check merging of pdf labels
177178
178179
It shouldn't be possible to print labels when packages are missing
179180
"""
180-
domain = [("picking_id", "in", self.batch.picking_ids.ids)]
181-
self.env["stock.package_level"].search(domain).unlink()
181+
self.batch.picking_ids.move_line_ids.write(
182+
{"result_package_id": False, "package_id": False}
183+
)
182184
wizard = self.DeliveryCarrierLabelGenerate.with_context(
183185
active_ids=self.batch.ids, active_model="stock.picking.batch"
184186
).create({})
185187
with self.assertRaises(exceptions.UserError):
186188
wizard.action_generate_labels()
187189

188-
def test_action_regenerate_labels(self):
190+
def test_02_action_regenerate_labels(self):
189191
"""Check re-generating labels"""
190192
wizard = self.DeliveryCarrierLabelGenerate.with_context(
191193
active_ids=self.batch.ids, active_model="stock.picking.batch"
@@ -219,7 +221,7 @@ def test_action_regenerate_labels(self):
219221
self.assertEqual(self.picking_out_1.carrier_tracking_ref, "TEST00001")
220222
self.assertEqual(self.picking_out_2.carrier_tracking_ref, "TEST00001")
221223

222-
def test_batch_purge_tracking_reference(self):
224+
def test_03_batch_purge_tracking_reference(self):
223225
"""Unittest: check that tracking reference purge work as expected"""
224226
self.batch.purge_tracking_references()
225227
self.assertTrue(
@@ -233,7 +235,7 @@ def test_batch_purge_tracking_reference(self):
233235
pickings = [self.picking_out_1, self.picking_out_2]
234236
self.assertTrue(all([not p.carrier_tracking_ref for p in pickings]))
235237

236-
def test_action_change_carrier_purge_tracking_reference(self):
238+
def test_04_action_change_carrier_purge_tracking_reference(self):
237239
"""Functional: Check purge_tracking_reference is called as carrier is
238240
changed from wizard"""
239241
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)