Skip to content

Commit 3a837dd

Browse files
[MIG] delivery_correos_express: Migration to 17.0
1 parent 867f17c commit 3a837dd

14 files changed

+136
-51
lines changed

delivery_correos_express/__manifest__.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
{
44
"name": "Delivery Correos Express",
55
"summary": "Delivery Carrier implementation for Correos Express using their API",
6-
"version": "16.0.1.0.0",
6+
"version": "17.0.1.0.0",
77
"category": "Stock",
88
"website": "https://github.com/OCA/delivery-carrier",
99
"author": "Studio73, Odoo Community Association (OCA)",

delivery_correos_express/models/correos_express_request.py

+4-3
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
_logger = logging.getLogger(__name__)
1212
CORREOS_EXPRESS_LABEL_TYPE = [("1", "PDF"), ("2", "ZPL")]
1313
CORREOS_EXPRESS_SERVICE = [
14+
("26", "ISLAS EXPRESS"),
1415
("61", "PAQ10"),
1516
("62", "PAQ14"),
1617
("63", "PAQ24"),
@@ -96,15 +97,15 @@ def _check_for_error(self, result):
9697
return_code = 999
9798
message = "Webservice ERROR."
9899
# shipment
99-
if type(result.get("codigoRetorno", "false")) != str:
100+
if not isinstance(result.get("codigoRetorno", "false"), str):
100101
return_code = result.get("codigoRetorno")
101102
message = result.get("mensajeRetorno") or ""
102103
# label
103-
if type(result.get("codErr", "false")) != str:
104+
if not isinstance(result.get("codErr", "false"), str):
104105
return_code = result.get("codErr")
105106
message = result.get("desErr") or ""
106107
# tracking
107-
if type(result.get("error", "false")) != str:
108+
if not isinstance(result.get("error", "false"), str):
108109
return_code = result.get("error")
109110
message = result.get("mensajeError") or ""
110111
return return_code, message

delivery_correos_express/models/delivery_carrier.py

+8-2
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,12 @@ def correos_express_get_tracking_link(self, picking):
4242
tracking_url = "https://s.correosexpress.com/c?n={}"
4343
return tracking_url.format(picking.carrier_tracking_ref)
4444

45+
def _format_correos_express_phone(self, phone):
46+
"""Switch international prefix + to 00, as it's the one accepted by Correos
47+
Express, and remove spaces in the string for not overpassing the 15 chars limit.
48+
"""
49+
return phone.replace("+", "00").replace(" ", "").replace("-", "")[:15]
50+
4551
def _get_partner_streets(self, partner):
4652
streets = []
4753
if partner.street:
@@ -66,7 +72,7 @@ def _get_correos_express_receiver_info(self, picking):
6672
"paisISODest": partner.country_id.code or "",
6773
"codPosIntDest": partner.zip if not national else "",
6874
"contacDest": partner.name[:40] if partner.name else "", # mandatory
69-
"telefDest": phone[:15] if phone else "", # mandatory
75+
"telefDest": self._format_correos_express_phone(phone), # mandatory
7076
"emailDest": partner.email[:75] if partner.email else "",
7177
}
7278

@@ -83,7 +89,7 @@ def _get_correos_express_sender_info(self, picking):
8389
"paisISORte": partner.country_id.code or "",
8490
"codPosIntRte": "",
8591
"contacRte": partner.name or "",
86-
"telefRte": partner.phone or "",
92+
"telefRte": self._format_correos_express_phone(partner.phone or ""),
8793
"emailRte": partner.email or "",
8894
}
8995

Original file line numberDiff line numberDiff line change
@@ -1 +1,2 @@
11
from . import test_delivery_correos_express
2+
from . import test_correos_express_request
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,108 @@
1+
# Copyright 2025 Studio73 - Pablo Cortés <pablo.cortes@studio73.es>
2+
# License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl).
3+
4+
from unittest import mock
5+
6+
import requests
7+
8+
from odoo.exceptions import UserError
9+
from odoo.tests import common
10+
11+
from odoo.addons.delivery_correos_express.models.correos_express_request import (
12+
CorreosExpressRequest,
13+
)
14+
15+
request_model = (
16+
"odoo.addons.delivery_correos_express.models."
17+
"correos_express_request.CorreosExpressRequest"
18+
)
19+
20+
21+
class TestCorreosExpressRequest(common.SingleTransactionCase):
22+
@classmethod
23+
def setUpClass(cls):
24+
super().setUpClass()
25+
cls.shipping_product = cls.env["product.product"].create(
26+
{"type": "service", "name": "Test Shipping Product", "list_price": 10}
27+
)
28+
cls.carrier_correos_express = cls.env["delivery.carrier"].create(
29+
{
30+
"name": "Correos Express",
31+
"delivery_type": "correos_express",
32+
"correos_express_username": "test_user",
33+
"correos_express_password": "test_password",
34+
"product_id": cls.shipping_product.id,
35+
}
36+
)
37+
38+
cls.correos_express_request = CorreosExpressRequest(cls.carrier_correos_express)
39+
40+
@mock.patch("requests.post")
41+
def test_01_send_api_request_success(self, mock_post):
42+
mock_post.return_value.json.return_value = {
43+
"codigoRetorno": 0,
44+
"mensajeRetorno": "OK",
45+
}
46+
mock_post.return_value.raise_for_status.return_value = None
47+
response = self.correos_express_request._send_api_request(
48+
"POST", "https://test.url", data={"test": "data"}
49+
)
50+
self.assertEqual(response.json(), {"codigoRetorno": 0, "mensajeRetorno": "OK"})
51+
52+
@mock.patch("requests.post")
53+
def test_02_send_api_request_timeout(self, mock_post):
54+
mock_post.side_effect = requests.exceptions.Timeout()
55+
with self.assertRaises(UserError):
56+
self.correos_express_request._send_api_request(
57+
"POST", "https://test.url", data={"test": "data"}
58+
)
59+
60+
@mock.patch("requests.post")
61+
def test_03_send_api_request_error(self, mock_post):
62+
mock_post.side_effect = Exception("Test Error")
63+
with self.assertRaises(UserError):
64+
self.correos_express_request._send_api_request(
65+
"POST", "https://test.url", data={"test": "data"}
66+
)
67+
68+
def test_04_check_for_error_shipment_success(self):
69+
result = {"codigoRetorno": 0, "mensajeRetorno": ""}
70+
return_code, message = self.correos_express_request._check_for_error(result)
71+
self.assertEqual(return_code, 0)
72+
self.assertEqual(message, "")
73+
74+
def test_05_check_for_error_shipment_error(self):
75+
result = {"codigoRetorno": 1, "mensajeRetorno": "Test Error"}
76+
return_code, message = self.correos_express_request._check_for_error(result)
77+
self.assertEqual(return_code, 1)
78+
self.assertEqual(message, "Test Error")
79+
80+
def test_06_check_for_error_label_success(self):
81+
result = {"codErr": 0, "desErr": ""}
82+
return_code, message = self.correos_express_request._check_for_error(result)
83+
self.assertEqual(return_code, 0)
84+
self.assertEqual(message, "")
85+
86+
def test_07_check_for_error_label_error(self):
87+
result = {"codErr": 1, "desErr": "Test Error"}
88+
return_code, message = self.correos_express_request._check_for_error(result)
89+
self.assertEqual(return_code, 1)
90+
self.assertEqual(message, "Test Error")
91+
92+
def test_08_check_for_error_tracking_success(self):
93+
result = {"error": 0, "mensajeError": ""}
94+
return_code, message = self.correos_express_request._check_for_error(result)
95+
self.assertEqual(return_code, 0)
96+
self.assertEqual(message, "")
97+
98+
def test_09_check_for_error_tracking_error(self):
99+
result = {"error": 1, "mensajeError": "Test Error"}
100+
return_code, message = self.correos_express_request._check_for_error(result)
101+
self.assertEqual(return_code, 1)
102+
self.assertEqual(message, "Test Error")
103+
104+
def test_check_for_error_no_error_codes(self):
105+
result = {}
106+
return_code, message = self.correos_express_request._check_for_error(result)
107+
self.assertEqual(return_code, 999)
108+
self.assertEqual(message, "Webservice ERROR.")

delivery_correos_express/tests/test_delivery_correos_express.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ def setUpClass(cls):
4848
cls.sale_order.carrier_id = cls.carrier_correos_express.id
4949
cls.sale_order.action_confirm()
5050
cls.picking = cls.sale_order.picking_ids[0]
51-
cls.picking.move_ids.quantity_done = 20
51+
cls.picking.move_ids.quantity = 20
5252

5353
@mock.patch(
5454
"%s.create_shipment" % request_model,

delivery_correos_express/views/delivery_carrier_view.xml

+8-36
Original file line numberDiff line numberDiff line change
@@ -7,66 +7,38 @@
77
<xpath expr="//notebook/page[1]" position='before'>
88
<page
99
string="Correos Express Configuration"
10-
attrs="{'invisible': [('delivery_type', '!=', 'correos_express')]}"
10+
invisible="delivery_type != 'correos_express'"
1111
>
1212
<group>
1313
<group>
1414
<field
1515
name="correos_express_username"
16-
attrs="{
17-
'required': [
18-
('delivery_type', '=', 'correos_express')
19-
]
20-
}"
16+
required="delivery_type == 'correos_express'"
2117
/>
2218
<field
2319
name="correos_express_password"
2420
password="True"
25-
attrs="{
26-
'required': [
27-
('delivery_type', '=', 'correos_express')
28-
]
29-
}"
21+
required="delivery_type == 'correos_express'"
3022
/>
3123
<field
3224
name="correos_express_customer_code"
33-
attrs="{
34-
'required': [
35-
('delivery_type', '=', 'correos_express')
36-
]
37-
}"
25+
required="delivery_type == 'correos_express'"
3826
/>
3927
<field
4028
name="correos_express_sender_code"
41-
attrs="{
42-
'required': [
43-
('delivery_type', '=', 'correos_express')
44-
]
45-
}"
29+
required="delivery_type == 'correos_express'"
4630
/>
4731
<field
4832
name="correos_express_label_type"
49-
attrs="{
50-
'required': [
51-
('delivery_type', '=', 'correos_express')
52-
]
53-
}"
33+
required="delivery_type == 'correos_express'"
5434
/>
5535
<field
5636
name="correos_express_product"
57-
attrs="{
58-
'required': [
59-
('delivery_type', '=', 'correos_express')
60-
]
61-
}"
37+
required="delivery_type == 'correos_express'"
6238
/>
6339
<field
6440
name="correos_express_transport"
65-
attrs="{
66-
'required': [
67-
('delivery_type', '=', 'correos_express')
68-
]
69-
}"
41+
required="delivery_type == 'correos_express'"
7042
/>
7143
</group>
7244
</group>

delivery_correos_express/views/stock_picking_views.xml

+5-8
Original file line numberDiff line numberDiff line change
@@ -2,20 +2,17 @@
22
<odoo>
33
<record id="view_picking_withcarrier_out_form" model="ir.ui.view">
44
<field name="model">stock.picking</field>
5-
<field name="inherit_id" ref="delivery.view_picking_withcarrier_out_form" />
5+
<field
6+
name="inherit_id"
7+
ref="stock_delivery.view_picking_withcarrier_out_form"
8+
/>
69
<field name="arch" type="xml">
710
<xpath expr="//button[@name='print_return_label']/.." position='inside'>
811
<button
912
name="correos_express_get_label"
1013
string="Print Correos Express Label"
1114
type="object"
12-
attrs="{'invisible':[
13-
'|',
14-
'|',
15-
('carrier_tracking_ref', '=', False),
16-
('delivery_type', '!=', 'correos_express'),
17-
('state', '!=', 'done')
18-
]}"
15+
invisible="carrier_tracking_ref == False or delivery_type != 'correos_express' or state != 'done'"
1916
/>
2017
</xpath>
2118
</field>

0 commit comments

Comments
 (0)