Merge lp:~camptocamp/carriers-deliveries/7.0-delivery_carrier_label_dispatch-output-file-yvr into lp:~stock-logistic-core-editors/carriers-deliveries/7.0

Proposed by Yannick Vaucher @ Camptocamp
Status: Needs review
Proposed branch: lp:~camptocamp/carriers-deliveries/7.0-delivery_carrier_label_dispatch-output-file-yvr
Merge into: lp:~stock-logistic-core-editors/carriers-deliveries/7.0
Prerequisite: lp:~camptocamp/carriers-deliveries/7.0-add-delivery_carrier_label_dispatch-yvr
Diff against target: 503 lines (+180/-199)
7 files modified
delivery_carrier_label_dispatch/__init__.py (+0/-1)
delivery_carrier_label_dispatch/__openerp__.py (+7/-2)
delivery_carrier_label_dispatch/i18n/delivery_carrier_label_dispatch.pot (+76/-95)
delivery_carrier_label_dispatch/pdf_utils.py (+2/-0)
delivery_carrier_label_dispatch/stock.py (+0/-62)
delivery_carrier_label_dispatch/wizard/generate_labels.py (+91/-34)
delivery_carrier_label_dispatch/wizard/generate_labels_view.xml (+4/-5)
To merge this branch: bzr merge lp:~camptocamp/carriers-deliveries/7.0-delivery_carrier_label_dispatch-output-file-yvr
Reviewer Review Type Date Requested Status
Leonardo Pistone code review Approve
Stock and Logistic Core Editors Pending
Review via email: mp+202444@code.launchpad.net
To post a comment you must log in.
Revision history for this message
Leonardo Pistone (lepistone) wrote :

Hi Yannick,

#file_type='pdf'

is meant to be commented out?

I approve in any case because you are not really changing that line, justing indenting it a little :)

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

I have some work on my side on the same part of the code. I will merge your changes in my own branch because they will conflict a lot otherwise. I put your branch as WIP just to avoid people reviewing it meanwhile.

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

Merged Guewen's work

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

Resolved conflicts Needs reviews

21. By Yannick Vaucher @ Camptocamp

Add better exception message from dispatch to identify the pack with an error

22. By Yannick Vaucher @ Camptocamp

update pot file

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

This project is now hosted on https://github.com/OCA/carriers-deliveries. Please move your proposal there if you still want to merge it once fixed. This guide may help you https://github.com/OCA/maintainers-tools/wiki/How-to-move-a-Merge-Proposal-to-GitHub

Unmerged revisions

22. By Yannick Vaucher @ Camptocamp

update pot file

21. By Yannick Vaucher @ Camptocamp

Add better exception message from dispatch to identify the pack with an error

20. By Yannick Vaucher @ Camptocamp

merge main branch to resolve conflicts

19. By Yannick Vaucher @ Camptocamp

add file extension in file name for poor OS

18. By Yannick Vaucher @ Camptocamp

fix generation of picking shipping labels from picking dispatch when there are no pack defined in the pickings

17. By Guewen Baconnier @ Camptocamp

use the general method and not the one for the button

avoid utils.PdfReadError('Cannot read an empty file') error

16. By Yannick Vaucher @ Camptocamp

[FIX] delivery_carrier_label_dispatch - save picking dispatch label pdf file as attachement of the picking

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== modified file 'delivery_carrier_label_dispatch/__init__.py'
--- delivery_carrier_label_dispatch/__init__.py 2014-01-09 13:54:55 +0000
+++ delivery_carrier_label_dispatch/__init__.py 2014-04-10 14:10:35 +0000
@@ -18,6 +18,5 @@
18# along with this program. If not, see <http://www.gnu.org/licenses/>.18# along with this program. If not, see <http://www.gnu.org/licenses/>.
19#19#
20##############################################################################20##############################################################################
21from . import stock
22from . import picking_dispatch21from . import picking_dispatch
23from . import wizard22from . import wizard
2423
=== modified file 'delivery_carrier_label_dispatch/__openerp__.py'
--- delivery_carrier_label_dispatch/__openerp__.py 2014-01-09 13:54:55 +0000
+++ delivery_carrier_label_dispatch/__openerp__.py 2014-04-10 14:10:35 +0000
@@ -29,8 +29,13 @@
29[Link module] Carrier labels - Picking dispatch29[Link module] Carrier labels - Picking dispatch
30==============================30==============================
3131
32This module adds a wizard on picking dispatch to generate related picking32This module adds a wizard on picking dispatch to generate the labels
33labels33of the packs. The labels are merged in one PDF file.
34
35If you want multiple labels for one picking, all the moves should have been
36put in a pack before the labels can be printed.
37
38If you don't define your pack it will be considered a picking is a single pack.
3439
35Contributors40Contributors
36------------41------------
3742
=== modified file 'delivery_carrier_label_dispatch/i18n/delivery_carrier_label_dispatch.pot'
--- delivery_carrier_label_dispatch/i18n/delivery_carrier_label_dispatch.pot 2014-01-09 13:54:55 +0000
+++ delivery_carrier_label_dispatch/i18n/delivery_carrier_label_dispatch.pot 2014-04-10 14:10:35 +0000
@@ -6,58 +6,75 @@
6msgstr ""6msgstr ""
7"Project-Id-Version: OpenERP Server 7.0\n"7"Project-Id-Version: OpenERP Server 7.0\n"
8"Report-Msgid-Bugs-To: \n"8"Report-Msgid-Bugs-To: \n"
9"POT-Creation-Date: 2014-01-09 13:29+0000\n"9"POT-Creation-Date: 2014-04-10 14:03+0000\n"
10"PO-Revision-Date: 2014-01-09 14:30+0100\n"10"PO-Revision-Date: 2014-04-10 14:03+0000\n"
11"Last-Translator: Yannick Vaucher <yannick.vaucher@camptocamp.com>\n"11"Last-Translator: <>\n"
12"Language-Team: \n"12"Language-Team: \n"
13"MIME-Version: 1.0\n"13"MIME-Version: 1.0\n"
14"Content-Type: text/plain; charset=UTF-8\n"14"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Transfer-Encoding: 8bit\n"15"Content-Transfer-Encoding: \n"
16"Plural-Forms: \n"16"Plural-Forms: \n"
1717
18#. module: delivery_carrier_label_dispatch18#. module: delivery_carrier_label_dispatch
19#: model:ir.model.fields,field_description:delivery_carrier_label_dispatch.field_picking_dispatch_carrier_id
20#: field:picking.dispatch,carrier_id:0
21msgid "Carrier"
22msgstr ""
23
24#. module: delivery_carrier_label_dispatch
19#: view:picking.dispatch:025#: view:picking.dispatch:0
20msgid "Carrier Info"26msgid "Carrier Info"
21msgstr ""27msgstr ""
2228
23#. module: delivery_carrier_label_dispatch29#. module: delivery_carrier_label_dispatch
30#: view:delivery.carrier.label.generate:0
31msgid "Close"
32msgstr ""
33
34#. module: delivery_carrier_label_dispatch
35#: view:picking.dispatch:0
36msgid "Delivery"
37msgstr ""
38
39#. module: delivery_carrier_label_dispatch
40#: code:_description:0
41#: model:ir.model,name:delivery_carrier_label_dispatch.model_picking_dispatch
42#, python-format
43msgid "Dispatch Picking Order"
44msgstr ""
45
46#. module: delivery_carrier_label_dispatch
24#: model:ir.actions.act_window,name:delivery_carrier_label_dispatch.action_delivery_carrier_label_generate47#: model:ir.actions.act_window,name:delivery_carrier_label_dispatch.action_delivery_carrier_label_generate
25msgid "Generate Carrier Labels"48msgid "Generate Carrier Labels"
26msgstr ""49msgstr ""
2750
28#. module: delivery_carrier_label_dispatch51#. module: delivery_carrier_label_dispatch
29#: model:ir.model,name:delivery_carrier_label_dispatch.model_stock_picking52#: view:delivery.carrier.label.generate:0
30msgid "Picking List"53msgid "Generate Carriers Labels"
31msgstr ""54msgstr ""
3255
33#. module: delivery_carrier_label_dispatch56#. module: delivery_carrier_label_dispatch
34#: code:addons/delivery_carrier_label_dispatch/picking_dispatch.py:10057#: view:delivery.carrier.label.generate:0
35#, python-format58msgid "Generate Labels"
36msgid ""59msgstr ""
37"You can not remove a mandatory option.\n"60
38"Options are reset to default."61#. module: delivery_carrier_label_dispatch
39msgstr ""62#: field:delivery.carrier.label.generate,generate_new_labels:0
4063#: model:ir.model.fields,field_description:delivery_carrier_label_dispatch.field_delivery_carrier_label_generate_generate_new_labels
41#. module: delivery_carrier_label_dispatch64msgid "Generate new labels"
42#: model:ir.model,name:delivery_carrier_label_dispatch.model_picking_dispatch65msgstr ""
43msgid "Dispatch Picking Order"66
44msgstr ""67#. module: delivery_carrier_label_dispatch
4568#: help:delivery.carrier.label.generate,generate_new_labels:0
46#. module: delivery_carrier_label_dispatch69msgid "If this option is used, new labels will be generated for the packs even if they already have one.\n"
70"The default is to use the existing label."
71msgstr ""
72
73#. module: delivery_carrier_label_dispatch
74#: model:ir.model.fields,field_description:delivery_carrier_label_dispatch.field_picking_dispatch_option_ids
47#: view:picking.dispatch:075#: view:picking.dispatch:0
48msgid "Delivery"76#: field:picking.dispatch,option_ids:0
49msgstr ""77msgid "Options"
50
51#. module: delivery_carrier_label_dispatch
52#: code:addons/delivery_carrier_label_dispatch/wizard/generate_labels.py:58
53#, python-format
54msgid "No picking dispatch selected"
55msgstr ""
56
57#. module: delivery_carrier_label_dispatch
58#: field:delivery.carrier.label.generate,label_pdf_file:0
59#: model:ir.model.fields,field_description:delivery_carrier_label_dispatch.field_delivery_carrier_label_generate_label_pdf_file
60msgid "Labels file"
61msgstr ""78msgstr ""
6279
63#. module: delivery_carrier_label_dispatch80#. module: delivery_carrier_label_dispatch
@@ -67,71 +84,35 @@
67msgstr ""84msgstr ""
6885
69#. module: delivery_carrier_label_dispatch86#. module: delivery_carrier_label_dispatch
87#: code:_description:0
88#: model:ir.model,name:delivery_carrier_label_dispatch.model_stock_picking
89#, python-format
90msgid "Picking List"
91msgstr ""
92
93#. module: delivery_carrier_label_dispatch
94#: view:picking.dispatch:0
95msgid "Set Options"
96msgstr ""
97
98#. module: delivery_carrier_label_dispatch
99#: view:delivery.carrier.label.generate:0
100msgid "This wizard creates an attachement on each selected dispatch containing picking labels"
101msgstr ""
102
103#. module: delivery_carrier_label_dispatch
104#: view:picking.dispatch:0
105msgid "Warning, setting options will erase existing ones in pickings"
106msgstr ""
107
108#. module: delivery_carrier_label_dispatch
109#: code:_description:0
70#: model:ir.model,name:delivery_carrier_label_dispatch.model_delivery_carrier_label_generate110#: model:ir.model,name:delivery_carrier_label_dispatch.model_delivery_carrier_label_generate
111#, python-format
71msgid "delivery.carrier.label.generate"112msgid "delivery.carrier.label.generate"
72msgstr ""113msgstr ""
73114
74#. module: delivery_carrier_label_dispatch115#. module: delivery_carrier_label_dispatch
75#: view:picking.dispatch:0
76msgid "Set Options"
77msgstr ""
78
79#. module: delivery_carrier_label_dispatch
80#: model:ir.model.fields,field_description:delivery_carrier_label_dispatch.field_picking_dispatch_carrier_id
81#: field:picking.dispatch,carrier_id:0
82msgid "Carrier"
83msgstr ""
84
85#. module: delivery_carrier_label_dispatch
86#: code:addons/delivery_carrier_label_dispatch/wizard/generate_labels.py:58
87#, python-format
88msgid "Error"
89msgstr ""
90
91#. module: delivery_carrier_label_dispatch
92#: view:picking.dispatch:0
93msgid "Warning, setting options will erase existing ones in pickings"
94msgstr ""
95
96#. module: delivery_carrier_label_dispatch
97#: model:ir.model.fields,field_description:delivery_carrier_label_dispatch.field_picking_dispatch_option_ids
98#: view:picking.dispatch:0
99#: field:picking.dispatch,option_ids:0
100msgid "Options"
101msgstr ""
102
103#. module: delivery_carrier_label_dispatch
104#: view:delivery.carrier.label.generate:0
105msgid "Generate Labels"
106msgstr ""
107
108#. module: delivery_carrier_label_dispatch
109#: view:delivery.carrier.label.generate:0
110msgid "Labels"
111msgstr ""
112
113#. module: delivery_carrier_label_dispatch
114#: view:delivery.carrier.label.generate:0
115msgid "Generate Carriers Labels"
116msgstr ""
117
118#. module: delivery_carrier_label_dispatch
119#: view:delivery.carrier.label.generate:0
120msgid "Close"
121msgstr ""
122
123#. module: delivery_carrier_label_dispatch
124#: code:addons/delivery_carrier_label_dispatch/picking_dispatch.py:99
125#, python-format
126msgid "User Error !"
127msgstr ""
128
129#. module: delivery_carrier_label_dispatch
130#: model:ir.model,name:delivery_carrier_label_dispatch.model_stock_picking_out
131msgid "Delivery Orders"
132msgstr ""
133
134#. module: delivery_carrier_label_dispatch
135#: view:delivery.carrier.label.generate:0116#: view:delivery.carrier.label.generate:0
136msgid "or"117msgid "or"
137msgstr ""118msgstr ""
138119
=== modified file 'delivery_carrier_label_dispatch/pdf_utils.py'
--- delivery_carrier_label_dispatch/pdf_utils.py 2013-12-17 07:55:56 +0000
+++ delivery_carrier_label_dispatch/pdf_utils.py 2014-04-10 14:10:35 +0000
@@ -39,6 +39,8 @@
3939
40 output = PdfFileWriter()40 output = PdfFileWriter()
41 for pdf in pdf_list:41 for pdf in pdf_list:
42 if not pdf:
43 continue
42 reader = PdfFileReader(StringIO(pdf))44 reader = PdfFileReader(StringIO(pdf))
4345
44 for page in range(reader.getNumPages()):46 for page in range(reader.getNumPages()):
4547
=== removed file 'delivery_carrier_label_dispatch/stock.py'
--- delivery_carrier_label_dispatch/stock.py 2013-12-17 07:42:04 +0000
+++ delivery_carrier_label_dispatch/stock.py 1970-01-01 00:00:00 +0000
@@ -1,62 +0,0 @@
1# -*- coding: utf-8 -*-
2##############################################################################
3#
4# Author: Yannick Vaucher
5# Copyright 2013 Camptocamp SA
6#
7# This program is free software: you can redistribute it and/or modify
8# it under the terms of the GNU Affero General Public License as
9# published by the Free Software Foundation, either version 3 of the
10# License, or (at your option) any later version.
11#
12# This program is distributed in the hope that it will be useful,
13# but WITHOUT ANY WARRANTY; without even the implied warranty of
14# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15# GNU Affero General Public License for more details.
16#
17# You should have received a copy of the GNU Affero General Public License
18# along with this program. If not, see <http://www.gnu.org/licenses/>.
19#
20##############################################################################
21from pdf_utils import assemble_pdf
22from openerp.osv import orm
23
24
25class stock_picking(orm.Model):
26 _inherit = 'stock.picking'
27
28 def get_pdf_label(self, cr, uid, ids, context=None):
29 """ Return a single pdf of labels for a stock picking
30
31 If more than one label is found for a picking we merge one label per
32 tracking in a single pdf
33
34 :return: a list of pdf file data
35 """
36 res = dict.fromkeys(ids, False)
37 label_obj = self.pool.get('shipping.label')
38 for picking_id in ids:
39 label_ids = label_obj.search(cr, uid,
40 [('file_type', '=', 'pdf'),
41 ('res_id', '=', picking_id)],
42 order='create_date',
43 context=context)
44 if label_ids:
45 all_picking_labels = label_obj.browse(cr, uid,
46 label_ids,
47 context=context)
48
49 tracking_ids = [l.tracking_id for l in all_picking_labels]
50
51 # filter for newest created label for each trackings
52 label_datas = []
53 tracking_ids = set(tracking_ids)
54 while tracking_ids:
55 tracking_id = tracking_ids.pop()
56 for label in all_picking_labels:
57 if label.tracking_id.id == tracking_id.id:
58 label_datas.append(label.datas.decode('base64'))
59
60 label_pdf = assemble_pdf(label_datas)
61 res[picking_id] = label_pdf.encode('base64')
62 return res
630
=== modified file 'delivery_carrier_label_dispatch/wizard/generate_labels.py'
--- delivery_carrier_label_dispatch/wizard/generate_labels.py 2013-12-17 07:42:04 +0000
+++ delivery_carrier_label_dispatch/wizard/generate_labels.py 2014-04-10 14:10:35 +0000
@@ -18,11 +18,14 @@
18# along with this program. If not, see <http://www.gnu.org/licenses/>.18# along with this program. If not, see <http://www.gnu.org/licenses/>.
19#19#
20##############################################################################20##############################################################################
21from operator import attrgetter
22from itertools import groupby
23
24from openerp.osv import orm, fields
25from openerp.tools.translate import _
26
21from ..pdf_utils import assemble_pdf27from ..pdf_utils import assemble_pdf
2228
23from openerp.osv import orm, fields
24from tools.translate import _
25
2629
27class DeliveryCarrierLabelGenerate(orm.TransientModel):30class DeliveryCarrierLabelGenerate(orm.TransientModel):
2831
@@ -40,52 +43,106 @@
40 _columns = {43 _columns = {
41 'dispatch_ids': fields.many2many('picking.dispatch',44 'dispatch_ids': fields.many2many('picking.dispatch',
42 string='Picking Dispatch'),45 string='Picking Dispatch'),
43 'label_pdf_file': fields.binary('Labels file'),46 'generate_new_labels': fields.boolean(
47 'Generate new labels',
48 help="If this option is used, new labels will be "
49 "generated for the packs even if they already have one.\n"
50 "The default is to use the existing label."),
44 }51 }
4552
46 _defaults = {53 _defaults = {
47 'dispatch_ids': _get_dispatch_ids,54 'dispatch_ids': _get_dispatch_ids,
55 'generate_new_labels': False,
48 }56 }
4957
58 def _get_packs(self, cr, uid, wizard, dispatch, context=None):
59 moves = sorted(dispatch.move_ids, key=attrgetter('tracking_id.name'))
60 for pack, moves in groupby(moves, key=attrgetter('tracking_id')):
61 pack_label = self._find_pack_label(cr, uid, wizard, pack,
62 context=context)
63 yield pack, list(moves), pack_label
64
65 def _find_picking_label(self, cr, uid, wizard, picking, context=None):
66 label_obj = self.pool['shipping.label']
67 domain = [('file_type', '=', 'pdf'),
68 ('res_id', '=', picking.id),
69 ('tracking_id', '=', False),
70 ]
71 label_id = label_obj.search(cr, uid, domain, order='create_date DESC',
72 limit=1, context=context)
73 if not label_id:
74 return None
75 return label_obj.browse(cr, uid, label_id[0], context=context)
76
77 def _find_pack_label(self, cr, uid, wizard, pack, context=None):
78 label_obj = self.pool['shipping.label']
79 domain = [('file_type', '=', 'pdf'),
80 ('tracking_id', '=', pack.id),
81 ]
82 label_id = label_obj.search(cr, uid, domain, order='create_date DESC',
83 limit=1, context=context)
84 if not label_id:
85 return None
86 return label_obj.browse(cr, uid, label_id[0], context=context)
87
88 def _get_all_pdf(self, cr, uid, wizard, dispatch, context=None):
89 for pack, moves, label in self._get_packs(cr, uid, wizard, dispatch,
90 context=context):
91 if not label or wizard.generate_new_labels:
92 picking_out_obj = self.pool['stock.picking.out']
93 picking = moves[0].picking_id
94 # generate the label of the pack
95 if pack:
96 tracking_ids = [pack.id]
97 else:
98 tracking_ids = None
99 try:
100 picking_out_obj.generate_labels(
101 cr, uid, [picking.id],
102 tracking_ids=tracking_ids,
103 context=context)
104 except orm.except_orm as e:
105 picking_name = _('Picking: %s') % picking.name
106 pack_num = _('Pack: %s') % pack.name if pack else ''
107 raise orm.except_orm(
108 e.name,
109 _('%s %s - %s') % (picking_name, pack_num, e.value))
110 if pack:
111 label = self._find_pack_label(cr, uid, wizard, pack,
112 context=context)
113 else:
114 label = self._find_picking_label(cr, uid, wizard, picking,
115 context=context)
116 if not label:
117 continue # no label could be generated
118 yield label
119
50 def action_generate_labels(self, cr, uid, ids, context=None):120 def action_generate_labels(self, cr, uid, ids, context=None):
51 """121 """
52 Call the creation of the delivery carrier label122 Call the creation of the delivery carrier label
53 of the missing labels and get the existing ones123 of the missing labels and get the existing ones
54 Then merge all of them in a single PDF124 Then merge all of them in a single PDF
125
55 """126 """
56 this = self.browse(cr, uid, ids, context=context)[0]127 this = self.browse(cr, uid, ids, context=context)[0]
57 if not this.dispatch_ids:128 if not this.dispatch_ids:
58 raise orm.except_orm(_('Error'), _('No picking dispatch selected'))129 raise orm.except_orm(_('Error'), _('No picking dispatch selected'))
59130
60 picking_out_obj = self.pool.get('stock.picking.out')131 attachment_obj = self.pool.get('ir.attachment')
61132
62 # flatten all picking in one list to keep the order in case133 for dispatch in this.dispatch_ids:
63 # there are multiple dispatch or if pickings134 labels = self._get_all_pdf(cr, uid, this, dispatch,
64 # have been ordered to ease packaging135 context=context)
65 pickings = [(pick, pick.get_pdf_label()[pick.id])136 labels = (label.datas for label in labels)
66 for dispatch in this.dispatch_ids137 labels = (label.decode('base64') for label in labels if labels)
67 for pick in dispatch.related_picking_ids]138 data = {
68 # get picking ids for which we want to generate pdf label139 'name': dispatch.name + '.pdf',
69 picking_ids = [pick.id for pick, pdf in pickings140 'res_id': dispatch.id,
70 if not pdf]141 'res_model': 'picking.dispatch',
71 # generate missing picking labels142 'datas': assemble_pdf(labels).encode('base64'),
72 picking_out_obj.action_generate_carrier_label(cr, uid,143 }
73 picking_ids,144 attachment_obj.create(cr, uid, data, context=context)
74 #file_type='pdf',145
75 context=context)
76
77 # Get all pdf files adding the newly generated ones
78 data_list = [pdf or pick.get_pdf_label()[pick.id]
79 for pick, pdf in pickings]
80 pdf_list = [data.decode('base64') for data in data_list if data]
81 pdf_file = assemble_pdf(pdf_list)
82 this.write({'label_pdf_file': pdf_file.encode('base64')})
83 return {146 return {
84 'type': 'ir.actions.act_window',147 'type': 'ir.actions.act_window_close',
85 'res_model': 'delivery.carrier.label.generate',
86 'view_mode': 'form',
87 'view_type': 'form',
88 'res_id': this.id,
89 'views': [(False, 'form')],
90 'target': 'new',
91 }148 }
92149
=== modified file 'delivery_carrier_label_dispatch/wizard/generate_labels_view.xml'
--- delivery_carrier_label_dispatch/wizard/generate_labels_view.xml 2013-12-06 12:51:58 +0000
+++ delivery_carrier_label_dispatch/wizard/generate_labels_view.xml 2014-04-10 14:10:35 +0000
@@ -7,13 +7,12 @@
7 <field name="model">delivery.carrier.label.generate</field>7 <field name="model">delivery.carrier.label.generate</field>
8 <field name="arch" type="xml">8 <field name="arch" type="xml">
9 <form string="Generate Carriers Labels" version="7.0">9 <form string="Generate Carriers Labels" version="7.0">
1010 <group>
11 <label string="This wizard creates an attachement on each selected dispatch containing picking labels"/>
12 </group>
11 <group>13 <group>
12 <field name="dispatch_ids"/>14 <field name="dispatch_ids"/>
13 </group>15 <field name="generate_new_labels"/>
14 <separator string="Labels"/>
15 <group>
16 <field name="label_pdf_file" filename="picking_labels.pdf"/>
17 </group>16 </group>
18 <footer>17 <footer>
19 <button name="action_generate_labels" string="Generate Labels" type="object" icon="gtk-execute" class="oe_highlight"/>18 <button name="action_generate_labels" string="Generate Labels" type="object" icon="gtk-execute" class="oe_highlight"/>

Subscribers

People subscribed via source and target branches