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 bd6834b

Browse files
committedMar 17, 2025·
[MIG] delivery_ups_oca: Migration to 17.0
1 parent c791c36 commit bd6834b

12 files changed

+108
-116
lines changed
 

‎delivery_ups_oca/README.rst

+2-2
Original file line numberDiff line numberDiff line change
@@ -49,8 +49,8 @@ Configuration
4949

5050
To configure this module, you need to:
5151

52-
1. Add a carrier account with delivery type ``ups`` and fill in your
53-
credentials (UPS Client and UPS Client Secret)
52+
1. Add a Shipping Method with Provider ``UPS`` and fill in your UPS
53+
credentials (Client ID and Client Secret)
5454
2. Configure in Odoo all required fields of the UPS tab with your
5555
account data https://wwwapps.ups.com/ppc/ppc.html (Shipper number,
5656
Default Packaging, Package Dimension Code, Package Weight Code and

‎delivery_ups_oca/__manifest__.py

+5-4
Original file line numberDiff line numberDiff line change
@@ -4,21 +4,22 @@
44
{
55
"name": "Delivery UPS OCA",
66
"summary": "Integrate UPS webservice",
7-
"version": "14.0.1.0.1",
7+
"version": "17.0.1.0.0",
88
"development_status": "Beta",
99
"category": "Delivery",
1010
"website": "https://github.com/OCA/delivery-carrier",
11-
"author": "Hunki Enterprises BV, Tecnativa, ForgeFlow, Odoo Community Association (OCA)",
11+
"author": """Hunki Enterprises BV, Tecnativa, ForgeFlow,
12+
Odoo Community Association (OCA)""",
1213
"license": "AGPL-3",
1314
"excludes": ["delivery_ups"],
1415
"depends": [
15-
"delivery",
16+
"stock_delivery",
1617
"delivery_package_number",
1718
"delivery_price_method",
1819
"delivery_state",
1920
],
2021
"data": [
21-
"data/product_packaging_data.xml",
22+
"data/stock_package_type_data.xml",
2223
"views/delivery_carrier_view.xml",
2324
"views/stock_picking_view.xml",
2425
],

‎delivery_ups_oca/data/product_packaging_data.xml ‎delivery_ups_oca/data/stock_package_type_data.xml

+23-23
Original file line numberDiff line numberDiff line change
@@ -2,117 +2,117 @@
22
<!-- Copyright 2021 Tecnativa - Víctor Martínez
33
License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). -->
44
<odoo>
5-
<record id="product_packaging_ups_01" model="product.packaging">
5+
<record id="product_packaging_ups_01" model="stock.package.type">
66
<field name="shipper_package_code">01</field>
77
<field name="name">UPS Letter</field>
88
<field name="package_carrier_type">ups</field>
99
</record>
10-
<record id="product_packaging_ups_02" model="product.packaging">
10+
<record id="product_packaging_ups_02" model="stock.package.type">
1111
<field name="shipper_package_code">02</field>
1212
<field name="name">Customer Supplied Package</field>
1313
<field name="package_carrier_type">ups</field>
1414
</record>
15-
<record id="product_packaging_ups_03" model="product.packaging">
15+
<record id="product_packaging_ups_03" model="stock.package.type">
1616
<field name="shipper_package_code">03</field>
1717
<field name="name">Tube</field>
1818
<field name="package_carrier_type">ups</field>
1919
</record>
20-
<record id="product_packaging_ups_04" model="product.packaging">
20+
<record id="product_packaging_ups_04" model="stock.package.type">
2121
<field name="shipper_package_code">04</field>
2222
<field name="name">PAK</field>
2323
<field name="package_carrier_type">ups</field>
2424
</record>
25-
<record id="product_packaging_ups_21" model="product.packaging">
25+
<record id="product_packaging_ups_21" model="stock.package.type">
2626
<field name="shipper_package_code">21</field>
2727
<field name="name">UPS Express Box</field>
2828
<field name="package_carrier_type">ups</field>
2929
</record>
30-
<record id="product_packaging_ups_24" model="product.packaging">
30+
<record id="product_packaging_ups_24" model="stock.package.type">
3131
<field name="shipper_package_code">24</field>
3232
<field name="name">UPS 25KG Box</field>
3333
<field name="package_carrier_type">ups</field>
3434
</record>
35-
<record id="product_packaging_ups_25" model="product.packaging">
35+
<record id="product_packaging_ups_25" model="stock.package.type">
3636
<field name="shipper_package_code">25</field>
3737
<field name="name">UPS 10KG Box</field>
3838
<field name="package_carrier_type">ups</field>
3939
</record>
40-
<record id="product_packaging_ups_30" model="product.packaging">
40+
<record id="product_packaging_ups_30" model="stock.package.type">
4141
<field name="shipper_package_code">30</field>
4242
<field name="name">Pallet</field>
4343
<field name="package_carrier_type">ups</field>
4444
</record>
45-
<record id="product_packaging_ups_2a" model="product.packaging">
45+
<record id="product_packaging_ups_2a" model="stock.package.type">
4646
<field name="shipper_package_code">2a</field>
4747
<field name="name">Small Express Box</field>
4848
<field name="package_carrier_type">ups</field>
4949
</record>
50-
<record id="product_packaging_ups_2b" model="product.packaging">
50+
<record id="product_packaging_ups_2b" model="stock.package.type">
5151
<field name="shipper_package_code">2b</field>
5252
<field name="name">Medium Express Box</field>
5353
<field name="package_carrier_type">ups</field>
5454
</record>
55-
<record id="product_packaging_ups_2c" model="product.packaging">
55+
<record id="product_packaging_ups_2c" model="stock.package.type">
5656
<field name="shipper_package_code">2c</field>
5757
<field name="name">Large Express Box</field>
5858
<field name="package_carrier_type">ups</field>
5959
</record>
60-
<record id="product_packaging_ups_56" model="product.packaging">
60+
<record id="product_packaging_ups_56" model="stock.package.type">
6161
<field name="shipper_package_code">56</field>
6262
<field name="name">Flats</field>
6363
<field name="package_carrier_type">ups</field>
6464
</record>
65-
<record id="product_packaging_ups_57" model="product.packaging">
65+
<record id="product_packaging_ups_57" model="stock.package.type">
6666
<field name="shipper_package_code">57</field>
6767
<field name="name">Parcels</field>
6868
<field name="package_carrier_type">ups</field>
6969
</record>
70-
<record id="product_packaging_ups_58" model="product.packaging">
70+
<record id="product_packaging_ups_58" model="stock.package.type">
7171
<field name="shipper_package_code">58</field>
7272
<field name="name">BPM</field>
7373
<field name="package_carrier_type">ups</field>
7474
</record>
75-
<record id="product_packaging_ups_59" model="product.packaging">
75+
<record id="product_packaging_ups_59" model="stock.package.type">
7676
<field name="shipper_package_code">59</field>
7777
<field name="name">First Class</field>
7878
<field name="package_carrier_type">ups</field>
7979
</record>
80-
<record id="product_packaging_ups_60" model="product.packaging">
80+
<record id="product_packaging_ups_60" model="stock.package.type">
8181
<field name="shipper_package_code">60</field>
8282
<field name="name">Priority</field>
8383
<field name="package_carrier_type">ups</field>
8484
</record>
85-
<record id="product_packaging_ups_61" model="product.packaging">
85+
<record id="product_packaging_ups_61" model="stock.package.type">
8686
<field name="shipper_package_code">61</field>
8787
<field name="name">Machineables</field>
8888
<field name="package_carrier_type">ups</field>
8989
</record>
90-
<record id="product_packaging_ups_62" model="product.packaging">
90+
<record id="product_packaging_ups_62" model="stock.package.type">
9191
<field name="shipper_package_code">62</field>
9292
<field name="name">Irregulars</field>
9393
<field name="package_carrier_type">ups</field>
9494
</record>
95-
<record id="product_packaging_ups_63" model="product.packaging">
95+
<record id="product_packaging_ups_63" model="stock.package.type">
9696
<field name="shipper_package_code">63</field>
9797
<field name="name">Parcel Post</field>
9898
<field name="package_carrier_type">ups</field>
9999
</record>
100-
<record id="product_packaging_ups_64" model="product.packaging">
100+
<record id="product_packaging_ups_64" model="stock.package.type">
101101
<field name="shipper_package_code">64</field>
102102
<field name="name">BPM Parcel</field>
103103
<field name="package_carrier_type">ups</field>
104104
</record>
105-
<record id="product_packaging_ups_65" model="product.packaging">
105+
<record id="product_packaging_ups_65" model="stock.package.type">
106106
<field name="shipper_package_code">65</field>
107107
<field name="name">Media Mail</field>
108108
<field name="package_carrier_type">ups</field>
109109
</record>
110-
<record id="product_packaging_ups_66" model="product.packaging">
110+
<record id="product_packaging_ups_66" model="stock.package.type">
111111
<field name="shipper_package_code">66</field>
112112
<field name="name">BPM Flat</field>
113113
<field name="package_carrier_type">ups</field>
114114
</record>
115-
<record id="product_packaging_ups_67" model="product.packaging">
115+
<record id="product_packaging_ups_67" model="stock.package.type">
116116
<field name="shipper_package_code">67</field>
117117
<field name="name">Standard Flat</field>
118118
<field name="package_carrier_type">ups</field>

‎delivery_ups_oca/models/__init__.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
22
from . import delivery_carrier
3-
from . import product_packaging
3+
from . import stock_package_type
44
from . import stock_picking
55
from . import ups_request

‎delivery_ups_oca/models/delivery_carrier.py

+2-6
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ class DeliveryCarrier(models.Model):
6060
string="Service code",
6161
)
6262
ups_default_packaging_id = fields.Many2one(
63-
comodel_name="product.packaging",
63+
comodel_name="stock.package.type",
6464
string="Default Packaging Type",
6565
domain=[("package_carrier_type", "=", "ups")],
6666
)
@@ -156,11 +156,7 @@ def _create_ups_label(self, picking, labels):
156156
val_list = []
157157
for label in labels:
158158
format_code = label["format_code"].upper()
159-
attachment_name = "%s-%s.%s" % (
160-
label["tracking_ref"],
161-
format_code,
162-
format_code,
163-
)
159+
attachment_name = f"{label['tracking_ref']}-{format_code}.{format_code}"
164160
val_list.append(
165161
self._prepare_ups_label_attachment(
166162
picking,

‎delivery_ups_oca/models/product_packaging.py ‎delivery_ups_oca/models/stock_package_type.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
from odoo import fields, models
44

55

6-
class ProductPackaging(models.Model):
7-
_inherit = "product.packaging"
6+
class PackageType(models.Model):
7+
_inherit = "stock.package.type"
88

99
package_carrier_type = fields.Selection(selection_add=[("ups", "UPS")])

‎delivery_ups_oca/models/ups_request.py

+11-10
Original file line numberDiff line numberDiff line change
@@ -36,8 +36,8 @@ def __init__(self, carrier):
3636
def _raise_for_status(self, status, skip_errors=True):
3737
errors = status.get("response", {}).get("errors")
3838
if errors:
39-
msg = _("Sending to UPS: %s") % (
40-
"\n".join("%(code)s %(message)s" % error for error in errors),
39+
msg = _("Sending to UPS: {}").format(
40+
"\n".join("{code} {message}".format(**error) for error in errors),
4141
)
4242
if skip_errors:
4343
_logger.info(msg)
@@ -55,7 +55,8 @@ def _get_new_token(self):
5555
if not (self.client_id and self.client_secret):
5656
raise UserError(
5757
_(
58-
"Both Client ID and Client Secret must be set in UPS delivery carriers."
58+
"Both Client ID and Client Secret"
59+
" must be set in UPS delivery carriers."
5960
)
6061
)
6162
url = "%s/security/v1/oauth/token" % self.url
@@ -111,7 +112,7 @@ def _quant_package_data_from_picking(self, package, picking, is_package=False):
111112
if is_package:
112113
NumOfPieces = sum(package.mapped("quant_ids.quantity"))
113114
PackageWeight = max(package.shipping_weight, package.weight)
114-
package = package.packaging_id
115+
package = package.package_type_id
115116
return {
116117
"Description": package.name,
117118
"NumOfPieces": str(NumOfPieces),
@@ -165,7 +166,7 @@ def _prepare_create_shipping(self, picking):
165166
for package in picking.package_ids
166167
]
167168
else:
168-
# modelo: product.packaging
169+
# modelo: stock.package.type
169170
packages = []
170171
package_info = self._quant_package_data_from_picking(
171172
self.default_packaging_id, picking, False
@@ -175,7 +176,7 @@ def _prepare_create_shipping(self, picking):
175176
)
176177
for i in range(0, picking.number_of_packages):
177178
package_item = package_info
178-
package_name = "%s (%s)" % (picking.name, i + 1)
179+
package_name = f"{picking.name} ({i+1})"
179180
package_item["Description"] = package_name
180181
package_item["NumOfPieces"] = "1"
181182
package_item["Packaging"]["Description"] = package_name
@@ -363,7 +364,7 @@ def tracking_state_update(self, picking):
363364
"M": "in_transit",
364365
}
365366
status = self._process_reply(
366-
url="%s/api/track/v1/details/%s" % (self.url, picking.carrier_tracking_ref),
367+
url=f"{self.url}/api/track/v1/details/{picking.carrier_tracking_ref}",
367368
method="get",
368369
headers_extra={
369370
"transId": f"{datetime.datetime.now().timestamp()}",
@@ -396,9 +397,9 @@ def tracking_state_update(self, picking):
396397
else:
397398
for warning in shipment.get("warnings"):
398399
states_list.append(
399-
_("{} - Warning: {}").format(
400-
datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S"),
401-
warning.get("message"),
400+
_("{date} - Warning: {warn}").format(
401+
date=datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S"),
402+
warn=warning.get("message"),
402403
)
403404
)
404405

‎delivery_ups_oca/readme/CONFIGURE.md

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
To configure this module, you need to:
22

3-
1. Add a carrier account with delivery type `ups` and fill in your
4-
credentials (UPS Client and UPS Client Secret)
3+
1. Add a Shipping Method with Provider ``UPS`` and fill in your UPS credentials
4+
(Client ID and Client Secret)
55
2. Configure in Odoo all required fields of the UPS tab with your
66
account data <https://wwwapps.ups.com/ppc/ppc.html> (Shipper number,
77
Default Packaging, Package Dimension Code, Package Weight Code and

‎delivery_ups_oca/static/description/index.html

+2-2
Original file line numberDiff line numberDiff line change
@@ -397,8 +397,8 @@ <h1 class="title">Delivery UPS OCA</h1>
397397
<h1><a class="toc-backref" href="#toc-entry-1">Configuration</a></h1>
398398
<p>To configure this module, you need to:</p>
399399
<ol class="arabic simple">
400-
<li>Add a carrier account with delivery type <tt class="docutils literal">ups</tt> and fill in your
401-
credentials (UPS Client and UPS Client Secret)</li>
400+
<li>Add a Shipping Method with Provider <tt class="docutils literal">UPS</tt> and fill in your UPS
401+
credentials (Client ID and Client Secret)</li>
402402
<li>Configure in Odoo all required fields of the UPS tab with your
403403
account data <a class="reference external" href="https://wwwapps.ups.com/ppc/ppc.html">https://wwwapps.ups.com/ppc/ppc.html</a> (Shipper number,
404404
Default Packaging, Package Dimension Code, Package Weight Code and

‎delivery_ups_oca/tests/test_delivery_ups.py

+42-46
Original file line numberDiff line numberDiff line change
@@ -6,14 +6,13 @@
66
import base64
77
from unittest import mock
88

9-
from odoo.modules import get_module_resource
109
from odoo.tests import Form, common
1110

1211
_module_ns = "odoo.addons.delivery_ups_oca"
1312
_provider_class = _module_ns + ".models.ups_request.UpsRequest"
1413

1514

16-
class TestDeliveryUpsBase(common.SavepointCase):
15+
class TestDeliveryUpsBase(common.TransactionCase):
1716
@classmethod
1817
def setUpClass(cls):
1918
super().setUpClass()
@@ -70,7 +69,7 @@
7069
sale = order_form.save()
7170
delivery_wizard = Form(
7271
self.env["choose.delivery.carrier"].with_context(
73-
{"default_order_id": sale.id, "default_carrier_id": self.carrier.id}
72+
**{"default_order_id": sale.id, "default_carrier_id": self.carrier.id}
7473
)
7574
).save()
7675
delivery_wizard.button_confirm()
@@ -83,7 +82,7 @@
8382
def setUpClass(cls):
8483
super().setUpClass()
8584
cls.picking = cls.sale.picking_ids[0]
86-
cls.picking.move_lines.quantity_done = 10
85+
cls.picking.move_ids.quantity = 10
8786

8887
def test_order_ups_rate_shipment(self):
8988
with mock.patch(
@@ -123,47 +122,44 @@
123122
def test_delivery_carrier_ups_integration(self):
124123
self.picking.action_confirm()
125124
self.picking.action_assign()
126-
dummy_pdf_path = get_module_resource(
127-
"delivery_carrier_label_batch", "tests", "dummy.pdf"
128-
)
129-
with open(dummy_pdf_path, "rb") as dummy_pdf:
130-
label = dummy_pdf.read()
131-
with mock.patch(
132-
_provider_class + "._send_shipping",
133-
return_value={
134-
"price": {"CurrencyCode": "USD", "MonetaryValue": "0.0"},
135-
"ShipmentIdentificationNumber": "123456",
136-
"labels": [
137-
{
138-
"tracking_ref": "123456",
139-
"format_code": "png",
140-
"datas": base64.b64encode(label),
141-
}
142-
],
143-
},
144-
):
145-
self.picking.send_to_shipper()
146-
self.assertEqual(self.picking.message_attachment_count, 1)
147-
self.assertTrue(self.picking.carrier_tracking_ref)
148-
self.assertFalse(self.picking.tracking_state_history)
149-
self.assertEqual(
150-
self.picking.delivery_state, "shipping_recorded_in_carrier"
151-
)
152-
if self.picking.carrier_id.ups_tracking_state_update_sync:
153-
with mock.patch(
154-
_provider_class + ".tracking_state_update",
155-
return_value={
156-
"delivery_state": "in_transit",
157-
"tracking_state_history": "history",
158-
},
159-
):
160-
self.picking.tracking_state_update()
161-
self.assertEqual(self.picking.delivery_state, "in_transit")
162-
self.assertTrue(self.picking.tracking_state_history)
125+
# Create a simple PDF-like bytes object for testing
126+
label = b"%PDF-1.4\n%EOF"
127+
with mock.patch(
128+
_provider_class + "._send_shipping",
129+
return_value={
130+
"price": {"CurrencyCode": "USD", "MonetaryValue": "0.0"},
131+
"ShipmentIdentificationNumber": "123456",
132+
"labels": [
133+
{
134+
"tracking_ref": "123456",
135+
"format_code": "png",
136+
"datas": base64.b64encode(label),
137+
}
138+
],
139+
},
140+
):
141+
self.picking.send_to_shipper()
142+
self.assertEqual(self.picking.message_attachment_count, 1)
143+
self.assertTrue(self.picking.carrier_tracking_ref)
144+
self.assertFalse(self.picking.tracking_state_history)
145+
self.assertEqual(
146+
self.picking.delivery_state, "shipping_recorded_in_carrier"
147+
)
148+
if self.picking.carrier_id.ups_tracking_state_update_sync:
163149
with mock.patch(
164-
_provider_class + ".cancel_shipment",
165-
return_value=True,
150+
_provider_class + ".tracking_state_update",
151+
return_value={
152+
"delivery_state": "in_transit",
153+
"tracking_state_history": "history",
154+
},
166155
):
167-
self.picking.cancel_shipment()
168-
self.assertFalse(self.picking.carrier_tracking_ref)
169-
self.assertEqual(self.picking.delivery_state, "canceled_shipment")
156+
self.picking.tracking_state_update()
157+
self.assertEqual(self.picking.delivery_state, "in_transit")
158+
self.assertTrue(self.picking.tracking_state_history)
159+
with mock.patch(
160+
_provider_class + ".cancel_shipment",
161+
return_value=True,
162+
):
163+
self.picking.cancel_shipment()
164+
self.assertFalse(self.picking.carrier_tracking_ref)
165+
self.assertEqual(self.picking.delivery_state, "canceled_shipment")

‎delivery_ups_oca/views/delivery_carrier_view.xml

+11-10
Original file line numberDiff line numberDiff line change
@@ -13,45 +13,45 @@ License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
1313
<page
1414
string="UPS"
1515
name="configuration_ups_oca"
16-
attrs="{'invisible': [('delivery_type', '!=', 'ups')]}"
16+
invisible="delivery_type != 'ups'"
1717
>
1818
<group>
1919
<group string="Service">
2020
<field
2121
name="ups_service_code"
22-
attrs="{'required': [('delivery_type', '=', 'ups')]}"
22+
required="delivery_type == 'ups'"
2323
/>
2424
</group>
2525
<group string="Misc">
2626
<field
2727
name="ups_shipper_number"
28-
attrs="{'required': [('delivery_type', '=', 'ups')]}"
28+
required="delivery_type == 'ups'"
2929
/>
3030
<field
3131
name="ups_default_packaging_id"
32-
attrs="{'required': [('delivery_type', '=', 'ups')]}"
32+
required="delivery_type == 'ups'"
3333
context="{'default_package_carrier_type': 'ups'}"
3434
/>
3535
<field name="ups_use_packages_from_picking" />
3636
<field
3737
name="ups_package_dimension_code"
38-
attrs="{'required': [('delivery_type', '=', 'ups')]}"
38+
required="delivery_type == 'ups'"
3939
/>
4040
<field
4141
name="ups_package_weight_code"
42-
attrs="{'required': [('delivery_type', '=', 'ups')]}"
42+
required="delivery_type == 'ups'"
4343
/>
4444
<field name="ups_tracking_state_update_sync" />
4545
</group>
4646
<group string="Credentials">
4747
<field
4848
name="ups_client_id"
49-
attrs="{'required': [('delivery_type', '=', 'ups')]}"
49+
required="delivery_type == 'ups'"
5050
/>
5151
<field
5252
name="ups_client_secret"
5353
password="True"
54-
attrs="{'required': [('delivery_type', '=', 'ups')]}"
54+
required="delivery_type == 'ups'"
5555
/>
5656
<button
5757
name="ups_update_token"
@@ -63,7 +63,7 @@ License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
6363
<group string="Label">
6464
<field
6565
name="ups_file_format"
66-
attrs="{'required': [('delivery_type', '=', 'ups')]}"
66+
required="delivery_type == 'ups'"
6767
/>
6868
</group>
6969
</group>
@@ -72,7 +72,8 @@ License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
7272
<field name="ups_cash_on_delivery" />
7373
<field
7474
name="ups_cod_funds_code"
75-
attrs="{'required': [('delivery_type', '=', 'ups'), ('ups_cash_on_delivery', '=', True)], 'invisible': [('ups_cash_on_delivery', '=', False)]}"
75+
invisible="not ups_cash_on_delivery"
76+
required="delivery_type == 'ups' and ups_cash_on_delivery"
7677
/>
7778
</group>
7879
</group>

‎delivery_ups_oca/views/stock_picking_view.xml

+5-8
Original file line numberDiff line numberDiff line change
@@ -6,20 +6,17 @@ License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
66
<odoo>
77
<record id="view_picking_withcarrier_out_form" model="ir.ui.view">
88
<field name="model">stock.picking</field>
9-
<field name="inherit_id" ref="delivery.view_picking_withcarrier_out_form" />
9+
<field
10+
name="inherit_id"
11+
ref="stock_delivery.view_picking_withcarrier_out_form"
12+
/>
1013
<field name="arch" type="xml">
1114
<xpath expr="//button[@name='print_return_label']/.." position='inside'>
1215
<button
1316
name="ups_get_label"
1417
string="UPS Label"
1518
type="object"
16-
attrs="{'invisible':[
17-
'|',
18-
'|',
19-
('carrier_tracking_ref', '=', False),
20-
('delivery_type', '!=', 'ups'),
21-
('state', '!=', 'done')
22-
]}"
19+
invisible="not carrier_tracking_ref or delivery_type != 'ups' or state != 'done'"
2320
/>
2421
</xpath>
2522
</field>

0 commit comments

Comments
 (0)
Please sign in to comment.