← Back to team overview

openerp-community-reviewer team mailing list archive

[Merge] lp:~camptocamp/carriers-deliveries/7.0-delivery_carrier_label_postlogistics-tracking_ids into lp:carriers-deliveries

 

Guewen Baconnier @ Camptocamp has proposed merging lp:~camptocamp/carriers-deliveries/7.0-delivery_carrier_label_postlogistics-tracking_ids into lp:carriers-deliveries.

Requested reviews:
  Stock and Logistic Core Editors (stock-logistic-core-editors)

For more details, see:
https://code.launchpad.net/~camptocamp/carriers-deliveries/7.0-delivery_carrier_label_postlogistics-tracking_ids/+merge/207202

Change the signature to be aligned with this change: https://code.launchpad.net/~camptocamp/carriers-deliveries/7.0-base_delivery_carrier_label-tracking_ids/+merge/207199 (so this one needs to be merged before...)

Now, if the caller gives a list of tracking_ids, it will only generate the labels of these packs.
-- 
https://code.launchpad.net/~camptocamp/carriers-deliveries/7.0-delivery_carrier_label_postlogistics-tracking_ids/+merge/207202
Your team Stock and Logistic Core Editors is requested to review the proposed merge of lp:~camptocamp/carriers-deliveries/7.0-delivery_carrier_label_postlogistics-tracking_ids into lp:carriers-deliveries.
=== modified file 'delivery_carrier_label_postlogistics/postlogistics/web_service.py'
--- delivery_carrier_label_postlogistics/postlogistics/web_service.py	2013-12-17 07:45:50 +0000
+++ delivery_carrier_label_postlogistics/postlogistics/web_service.py	2014-02-19 14:13:57 +0000
@@ -252,14 +252,11 @@
         codes = [name, pack_no]
         return "+".join(c for c in codes if c)
 
-    def _prepare_item_list(self, picking, recipient, attributes):
+    def _prepare_item_list(self, picking, recipient, attributes, trackings):
         """ Return a list of item made from the pickings """
         item_list = []
-        # A label will be generated per pack and if there is no pack only one
-        # label will be generated
-        packs = set([line.tracking_id.name for line in picking.move_lines])
-        for pack_no in packs:
-            itemid = self._get_itemid(picking, pack_no)
+        for pack in trackings:
+            itemid = self._get_itemid(picking, pack.name)
             item = {
                 'ItemID': itemid,
                 'Recipient': recipient,
@@ -310,11 +307,12 @@
             }
         return envelope
 
-    def generate_label(self, picking, user_lang='en_US'):
+    def generate_label(self, picking, trackings, user_lang='en_US'):
         """ Generate a label for a picking
 
         :param picking: picking browse record
-        :param lang: OpenERP language code
+        :param user_lang: OpenERP language code
+        :param trackings: list of ids of trackings to filter on
         :return: {
             value: [{item_id: pack id
                      binary: file returned by API
@@ -334,7 +332,8 @@
         attributes = self._prepare_attributes(picking)
 
         recipient = self._prepare_recipient(picking)
-        item_list = self._prepare_item_list(picking, recipient, attributes)
+        item_list = self._prepare_item_list(picking, recipient, attributes,
+                                            trackings)
         data = self._prepare_data(item_list)
 
         envelope = self._prepare_envelope(picking, post_customer, data)

=== modified file 'delivery_carrier_label_postlogistics/stock.py'
--- delivery_carrier_label_postlogistics/stock.py	2013-12-23 12:46:25 +0000
+++ delivery_carrier_label_postlogistics/stock.py	2014-02-19 14:13:57 +0000
@@ -18,6 +18,8 @@
 #    along with this program.  If not, see <http://www.gnu.org/licenses/>.
 #
 ##############################################################################
+from operator import attrgetter
+
 from openerp.osv import orm, fields
 
 from postlogistics.web_service import PostlogisticsWebService
@@ -27,7 +29,8 @@
     _inherit = 'stock.picking'
 
     def _generate_postlogistics_label(self, cr, uid, picking,
-                                      webservice_class=None, context=None):
+                                      webservice_class=None,
+                                      tracking_ids=None, context=None):
         """ Generate labels and write tracking numbers received """
         user_obj = self.pool.get('res.users')
         user = user_obj.browse(cr, uid, uid, context=context)
@@ -35,14 +38,27 @@
         if webservice_class is None:
             webservice_class = PostlogisticsWebService
 
+        if tracking_ids is None:
+            # get all the trackings of the picking
+            # no tracking_id wil return a False, meaning that
+            # we want a label for the picking
+            trackings = sorted(set(
+                line.tracking_id for line in picking.move_lines
+            ), key=attrgetter('name'))
+        else:
+            # restrict on the provided trackings
+            tracking_obj = self.pool['stock.tracking']
+            trackings = tracking_obj.browse(cr, uid, tracking_ids,
+                                            context=context)
+
         web_service = webservice_class(company)
-        res = web_service.generate_label(picking, user.lang)
+        res = web_service.generate_label(picking,
+                                         trackings,
+                                         user_lang=user.lang)
 
         if 'errors' in res:
             raise orm.except_orm('Error', '\n'.join(res['errors']))
 
-        trackings = set([line.tracking_id for line in picking.move_lines])
-
         labels = []
         # if there are no pack defined, write tracking_number on picking
         # otherwise, write it on serial field of each pack
@@ -50,6 +66,10 @@
             if not track:
                 # ignore lines without tracking when there is tracking
                 # in a picking
+                # Example: if I have 1 move with a tracking and 1
+                # without, I will have [False, a_tracking] in
+                # `trackings`. In that case, we are using packs, not the
+                # picking for the tracking numbers.
                 if len(trackings) > 1:
                     continue
                 label = res['value'][0]
@@ -65,7 +85,7 @@
                         tracking_number = label['tracking_number']
                         track.write({'serial': tracking_number})
                         break
-            labels.append({'tracking_id': track and track.id or False,
+            labels.append({'tracking_id': track.id if track else False,
                            'file': label['binary'].decode('base64'),
                            'file_type': label['file_type'],
                            'name': tracking_number,
@@ -73,17 +93,21 @@
 
         return labels
 
-    def generate_shipping_labels(self, cr, uid, ids, context=None):
+    def generate_shipping_labels(self, cr, uid, ids, tracking_ids=None,
+                                 context=None):
         """ Add label generation for Postlogistics """
         if isinstance(ids, (long, int)):
             ids = [ids]
         assert len(ids) == 1
         picking = self.browse(cr, uid, ids[0], context=context)
         if picking.carrier_id.type == 'postlogistics':
-            return self._generate_postlogistics_label(cr, uid, picking,
-                                                      context=context)
-        return super(stock_picking, self
-                     ).generate_shipping_labels(cr, uid, ids, context=context)
+            return self._generate_postlogistics_label(
+                cr, uid, picking,
+                tracking_ids=tracking_ids,
+                context=context)
+        return super(stock_picking, self).\
+            generate_shipping_labels(cr, uid, ids, tracking_ids=tracking_ids,
+                                     context=context)
 
 
 class ShippingLabel(orm.Model):


Follow ups