Hi Harmut,
I recently did such wizard to print a label for a package with some custom fields.
Here’s my code. Hope this helps.
class ShippingPalletLabelReport(Report):
'Shipping Pallet Label Report'
__name__ = 'shipping.pallet.label.report'
@classmethod
def get_context(cls, records, header, data):
pool = Pool()
Date = pool.get('ir.date')
context = super().get_context(records, header, data)
context['today'] = Date.today()
return context
class PrintShippingPalletLabelAskDetails(ModelView):
'Print Shipping Pallet Label Ask Details'
__name__ = 'shipping.pallet.label.ask_details'
shipment_number = fields.Char("Shipment Number", readonly=True,
help="The main identifier for the shipment.")
marking = fields.Text("Marking", readonly=True)
package = fields.Many2One('stock.package', "Package", required=True,
domain=[('id', 'in', Eval('shipment_packages'))],
help="The package to print.")
primary_package_number = fields.Function(
fields.Char("Primary Package Number"),
'on_change_with_primary_package_number')
box_quantity = fields.Function(
fields.Integer("Box Quantity"), 'on_change_with_box_quantity')
primary_package_id = fields.Integer("Primary Package Id", required=True)
primary_packages_quantity = fields.Integer("Primary Packages Quantity")
display_logo = fields.Boolean("Display Logo")
shipping_date = fields.Date("Shipping Date")
shipment_packages = fields.Many2Many(
'stock.package', None, None, "Shipment Packages")
@fields.depends('package')
def on_change_with_primary_package_number(self, name=None):
if self.package and self.package.number:
return self.package.number
@fields.depends('package')
def on_change_with_box_quantity(self, name=None):
if self.package and self.package.box_quantity:
return self.package.box_quantity
@classmethod
def default_primary_package_id(cls):
return 1
@classmethod
def default_display_logo(cls):
return True
@classmethod
def set_primary_packages_quantity(cls):
pass
class PrintShippingPalletLabel(Wizard):
'Print Shipping Pallet Label'
__name__ = 'shipping.pallet.label.print'
start = StateTransition()
show = StateView(
'shipping.pallet.label.ask_details',
'preciball.'
'stock_shipping_pallet_label_print_ask_details', [
Button("Cancel", 'end', 'tryton-cancel'),
Button("Print Label", 'print_label', 'tryton-ok', default=True),
])
print_label = StateReport('shipping.pallet.label.report')
def transition_start(self):
if self.record.packages:
return 'show'
return 'end'
def default_show(self, fields):
Date = Pool().get('ir.date')
packages = self.record.packages
shipping_date = (self.record.effective_date
if self.record.effective_date else Date.today())
package_ids = [p.id for p in packages]
return {
'package': package_ids[0] if len(package_ids) == 1 else None,
'shipment_number': self.record.number,
'marking': self.record.reference, # en attendant marking
'primary_packages_quantity': len(packages),
'shipment_packages': package_ids,
'shipping_date': shipping_date,
}
def do_print_label(self, action):
pool = Pool()
StockPackage = pool.get('stock.package')
data = {
'ids': [self.show.package.id],
'model': StockPackage.__name__,
'display_logo': self.show.display_logo,
'shipping_date': self.show.shipping_date,
'primary_package_id': self.show.primary_package_id,
'primary_packages_quantity': self.show.primary_packages_quantity,
'box_quantity': self.show.box_quantity,
}
return action, data