changeset 6e4a1b91a0a1 in modules/stock_package_shipping_ups:default
details:
https://hg.tryton.org/modules/stock_package_shipping_ups?cmd=changeset;node=6e4a1b91a0a1
description:
Add tracking URL
issue10136
review341531002
diffstat:
__init__.py | 1 +
stock.py | 35 +++++++++++++++++++++++++++++++++++
tests/scenario_shipping_ups.rst | 4 ++++
3 files changed, 40 insertions(+), 0 deletions(-)
diffs (84 lines):
diff -r 1d532fc00818 -r 6e4a1b91a0a1 __init__.py
--- a/__init__.py Mon Mar 01 09:08:18 2021 +0100
+++ b/__init__.py Sat Mar 13 23:16:32 2021 +0100
@@ -10,6 +10,7 @@
def register():
Pool.register(
stock.PackageType,
+ stock.Package,
stock.ShipmentOut,
stock.ShipmentInReturn,
carrier.CredentialUPS,
diff -r 1d532fc00818 -r 6e4a1b91a0a1 stock.py
--- a/stock.py Mon Mar 01 09:08:18 2021 +0100
+++ b/stock.py Sat Mar 13 23:16:32 2021 +0100
@@ -5,6 +5,7 @@
import base64
import requests
import ssl
+import urllib.parse
from itertools import zip_longest
from trytond.config import config
@@ -23,6 +24,7 @@
'testing': 'https://wwwcie.ups.com/json/Ship',
'production': 'https://onlinetools.ups.com/json/Ship',
}
+TRACKING_URL = 'https://www.ups.com/track'
class PackageType(metaclass=PoolMeta):
@@ -60,6 +62,39 @@
return None
+class Package(metaclass=PoolMeta):
+ __name__ = 'stock.package'
+
+ def get_shipping_tracking_url(self, name):
+ pool = Pool()
+ ShipmentOut = pool.get('stock.shipment.out')
+ ShipmentInReturn = pool.get('stock.shipment.in.return')
+ url = super().get_shipping_tracking_url(name)
+ if (self.shipping_reference
+ and self.shipment
+ and self.shipment.id >= 0
+ and self.shipment.carrier
+ and self.shipment.carrier.shipping_service == 'ups'):
+ party = address = None
+ if isinstance(self.shipment, ShipmentOut):
+ party = self.shipment.customer
+ address = self.shipment.delivery_address
+ elif isinstance(self.shipment, ShipmentInReturn):
+ party = self.shipment.supplier
+ address = self.shipment.delivery_address
+ parts = urllib.parse.urlsplit(TRACKING_URL)
+ query = urllib.parse.parse_qsl(parts.query)
+ if party and party.lang and address and address.country:
+ loc = '_'.join(
+ (party.lang.code.split('_')[0], address.country.code))
+ query.append(('loc', loc))
+ query.append(('tracknum', self.shipping_reference))
+ parts = list(parts)
+ parts[3] = urllib.parse.urlencode(query)
+ url = urllib.parse.urlunsplit(parts)
+ return url
+
+
class ShippingUPSMixin:
def validate_packing_ups(self):
diff -r 1d532fc00818 -r 6e4a1b91a0a1 tests/scenario_shipping_ups.rst
--- a/tests/scenario_shipping_ups.rst Mon Mar 01 09:08:18 2021 +0100
+++ b/tests/scenario_shipping_ups.rst Sat Mar 13 23:16:32 2021 +0100
@@ -224,6 +224,10 @@
True
>>> pack.shipping_reference is not None
True
+ >>> pack.shipping_tracking_url.startswith('https://www.ups.com/track?')
+ True
+ >>> pack.shipping_reference in pack.shipping_tracking_url
+ True
Because there is only one box, the pack shipping number is also the shipment
identification number::