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::

Reply via email to