Merge lp:~camptocamp/carriers-deliveries/7.0-delivery_carrier_label_postlogistics-tracking_ids into lp:~stock-logistic-core-editors/carriers-deliveries/7.0

Proposed by Guewen Baconnier @ Camptocamp
Status: Merged
Approved by: Yannick Vaucher @ Camptocamp
Approved revision: 13
Merged at revision: 31
Proposed branch: lp:~camptocamp/carriers-deliveries/7.0-delivery_carrier_label_postlogistics-tracking_ids
Merge into: lp:~stock-logistic-core-editors/carriers-deliveries/7.0
Diff against target: 153 lines (+45/-19)
2 files modified
delivery_carrier_label_postlogistics/postlogistics/web_service.py (+11/-9)
delivery_carrier_label_postlogistics/stock.py (+34/-10)
To merge this branch: bzr merge lp:~camptocamp/carriers-deliveries/7.0-delivery_carrier_label_postlogistics-tracking_ids
Reviewer Review Type Date Requested Status
Lorenzo Battistini (community) code review Approve
Yannick Vaucher @ Camptocamp code review, no tests Approve
Review via email: mp+207202@code.launchpad.net

Description of the change

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.

To post a comment you must log in.
11. By Guewen Baconnier @ Camptocamp

use the name of the picking when there is no pack

Revision history for this message
Yannick Vaucher @ Camptocamp (yvaucher-c2c) wrote :

LGTM Thanks !

review: Approve (code review, no tests)
12. By Yannick Vaucher @ Camptocamp

[FIX] make sure pack number (which can be picking name) has no unallowed character for item id of postlogistics label

Revision history for this message
Yannick Vaucher @ Camptocamp (yvaucher-c2c) wrote :

Tested and patched a little things. Otherwise it works.

Revision history for this message
Lorenzo Battistini (elbati) wrote :

Hello Guewen,
just a little fix
line 39: trackings is actually a list of browse records

Thanks

review: Needs Fixing
13. By Guewen Baconnier @ Camptocamp

wrong docstring, trackings expects a list of browse record

Revision history for this message
Guewen Baconnier @ Camptocamp (gbaconnier-c2c) wrote :

> Hello Guewen,
> just a little fix
> line 39: trackings is actually a list of browse records
>
> Thanks

Hello,

Nice catch. That's changed.

Thanks for your review

Revision history for this message
Lorenzo Battistini (elbati) :
review: Approve (code review)

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'delivery_carrier_label_postlogistics/postlogistics/web_service.py'
2--- delivery_carrier_label_postlogistics/postlogistics/web_service.py 2014-03-21 16:09:52 +0000
3+++ delivery_carrier_label_postlogistics/postlogistics/web_service.py 2014-03-28 11:50:22 +0000
4@@ -267,17 +267,17 @@
5
6 """
7 name = _compile_itemid.sub('', picking.name)
8+ if pack_no:
9+ pack_no = _compile_itemid.sub('', pack_no)
10 codes = [name, pack_no]
11 return "+".join(c for c in codes if c)
12
13- def _prepare_item_list(self, picking, recipient, attributes):
14+ def _prepare_item_list(self, picking, recipient, attributes, trackings):
15 """ Return a list of item made from the pickings """
16 item_list = []
17- # A label will be generated per pack and if there is no pack only one
18- # label will be generated
19- packs = set([line.tracking_id.name for line in picking.move_lines])
20- for pack_no in packs:
21- itemid = self._get_itemid(picking, pack_no)
22+ for pack in trackings:
23+ name = pack.name if pack else picking.name
24+ itemid = self._get_itemid(picking, name)
25 item = {
26 'ItemID': itemid,
27 'Recipient': recipient,
28@@ -328,11 +328,12 @@
29 }
30 return envelope
31
32- def generate_label(self, picking, user_lang='en_US'):
33+ def generate_label(self, picking, trackings, user_lang='en_US'):
34 """ Generate a label for a picking
35
36 :param picking: picking browse record
37- :param lang: OpenERP language code
38+ :param user_lang: OpenERP language code
39+ :param trackings: list of browse records of trackings to filter on
40 :return: {
41 value: [{item_id: pack id
42 binary: file returned by API
43@@ -352,7 +353,8 @@
44 attributes = self._prepare_attributes(picking)
45
46 recipient = self._prepare_recipient(picking)
47- item_list = self._prepare_item_list(picking, recipient, attributes)
48+ item_list = self._prepare_item_list(picking, recipient, attributes,
49+ trackings)
50 data = self._prepare_data(item_list)
51
52 envelope = self._prepare_envelope(picking, post_customer, data)
53
54=== modified file 'delivery_carrier_label_postlogistics/stock.py'
55--- delivery_carrier_label_postlogistics/stock.py 2014-02-25 14:28:29 +0000
56+++ delivery_carrier_label_postlogistics/stock.py 2014-03-28 11:50:22 +0000
57@@ -18,6 +18,8 @@
58 # along with this program. If not, see <http://www.gnu.org/licenses/>.
59 #
60 ##############################################################################
61+from operator import attrgetter
62+
63 from openerp.osv import orm, fields
64
65 from postlogistics.web_service import PostlogisticsWebService
66@@ -27,7 +29,8 @@
67 _inherit = 'stock.picking'
68
69 def _generate_postlogistics_label(self, cr, uid, picking,
70- webservice_class=None, context=None):
71+ webservice_class=None,
72+ tracking_ids=None, context=None):
73 """ Generate labels and write tracking numbers received """
74 user_obj = self.pool.get('res.users')
75 user = user_obj.browse(cr, uid, uid, context=context)
76@@ -35,14 +38,27 @@
77 if webservice_class is None:
78 webservice_class = PostlogisticsWebService
79
80+ if tracking_ids is None:
81+ # get all the trackings of the picking
82+ # no tracking_id wil return a False, meaning that
83+ # we want a label for the picking
84+ trackings = sorted(set(
85+ line.tracking_id for line in picking.move_lines
86+ ), key=attrgetter('name'))
87+ else:
88+ # restrict on the provided trackings
89+ tracking_obj = self.pool['stock.tracking']
90+ trackings = tracking_obj.browse(cr, uid, tracking_ids,
91+ context=context)
92+
93 web_service = webservice_class(company)
94- res = web_service.generate_label(picking, user.lang)
95+ res = web_service.generate_label(picking,
96+ trackings,
97+ user_lang=user.lang)
98
99 if 'errors' in res:
100 raise orm.except_orm('Error', '\n'.join(res['errors']))
101
102- trackings = set([line.tracking_id for line in picking.move_lines])
103-
104 labels = []
105 # if there are no pack defined, write tracking_number on picking
106 # otherwise, write it on serial field of each pack
107@@ -50,6 +66,10 @@
108 if not track:
109 # ignore lines without tracking when there is tracking
110 # in a picking
111+ # Example: if I have 1 move with a tracking and 1
112+ # without, I will have [False, a_tracking] in
113+ # `trackings`. In that case, we are using packs, not the
114+ # picking for the tracking numbers.
115 if len(trackings) > 1:
116 continue
117 label = res['value'][0]
118@@ -65,7 +85,7 @@
119 tracking_number = label['tracking_number']
120 track.write({'serial': tracking_number})
121 break
122- labels.append({'tracking_id': track and track.id or False,
123+ labels.append({'tracking_id': track.id if track else False,
124 'file': label['binary'].decode('base64'),
125 'file_type': label['file_type'],
126 'name': tracking_number,
127@@ -73,17 +93,21 @@
128
129 return labels
130
131- def generate_shipping_labels(self, cr, uid, ids, context=None):
132+ def generate_shipping_labels(self, cr, uid, ids, tracking_ids=None,
133+ context=None):
134 """ Add label generation for Postlogistics """
135 if isinstance(ids, (long, int)):
136 ids = [ids]
137 assert len(ids) == 1
138 picking = self.browse(cr, uid, ids[0], context=context)
139 if picking.carrier_id.type == 'postlogistics':
140- return self._generate_postlogistics_label(cr, uid, picking,
141- context=context)
142- return super(stock_picking, self
143- ).generate_shipping_labels(cr, uid, ids, context=context)
144+ return self._generate_postlogistics_label(
145+ cr, uid, picking,
146+ tracking_ids=tracking_ids,
147+ context=context)
148+ return super(stock_picking, self).\
149+ generate_shipping_labels(cr, uid, ids, tracking_ids=tracking_ids,
150+ context=context)
151
152
153 class ShippingLabel(orm.Model):

Subscribers

People subscribed via source and target branches