product_print_zpl_barcode: Add field barcode_image for EAN13 and EAN8 on product.product

This commit is contained in:
Alexis de Lattre
2023-01-22 22:39:08 +01:00
parent 08db759977
commit 64f54a9389
3 changed files with 37 additions and 7 deletions

View File

@@ -41,6 +41,7 @@ This module has been written by Alexis de Lattre from Akretion
'barcodes', 'barcodes',
'base_report_to_printer', 'base_report_to_printer',
], ],
'external_dependencies': {'python': ['python-barcode>=0.14.0']},
'data': [ 'data': [
'security/ir.model.access.csv', 'security/ir.model.access.csv',
'wizard/product_print_zpl_barcode_view.xml', 'wizard/product_print_zpl_barcode_view.xml',

View File

@@ -1,11 +1,14 @@
# -*- coding: utf-8 -*- # Copyright 2020-2023 Akretion France (http://www.akretion.com/)
# Copyright 2020 Akretion France (http://www.akretion.com/)
# @author: Alexis de Lattre <alexis.delattre@akretion.com> # @author: Alexis de Lattre <alexis.delattre@akretion.com>
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
from odoo import api, fields, models, _ from odoo import api, fields, models, _
from odoo.exceptions import UserError from odoo.exceptions import UserError
from stdnum.ean import calc_check_digit from stdnum.ean import calc_check_digit, is_valid
from barcode import EAN13, EAN8
from barcode.writer import ImageWriter
import base64
import io
class ProductTemplate(models.Model): class ProductTemplate(models.Model):
@@ -34,8 +37,8 @@ class ProductTemplate(models.Model):
"print_zpl_barcode_from_product_template on product '%s' " "print_zpl_barcode_from_product_template on product '%s' "
"because it has %d variants and not just one.") "because it has %d variants and not just one.")
% (self.display_name, self.product_variant_count)) % (self.display_name, self.product_variant_count))
action = self.env.ref( action = self.env["ir.actions.actions"]._for_xml_id(
'product_print_zpl_barcode.product_print_zpl_barcode_action').sudo().read()[0] 'product_print_zpl_barcode.product_print_zpl_barcode_action')
action['context'] = { action['context'] = {
'active_id': self.product_variant_ids[0].id, 'active_id': self.product_variant_ids[0].id,
'active_model': 'product.product', 'active_model': 'product.product',
@@ -46,6 +49,30 @@ class ProductTemplate(models.Model):
class ProductProduct(models.Model): class ProductProduct(models.Model):
_inherit = 'product.product' _inherit = 'product.product'
# Not useful for ZPL, but it is often useful to have a barcode image field
barcode_image = fields.Binary(
compute='_compute_barcode_image',
string='Barcode Image')
@api.depends('barcode')
def _compute_barcode_image(self):
for product in self:
barcode = product.barcode
barcode_image = False
if barcode:
barcode_obj = False
if len(barcode) == 13 and is_valid(barcode):
barcode_obj = EAN13(barcode, writer=ImageWriter(), guardbar=True)
elif len(barcode) == 8 and is_valid(barcode):
barcode_obj = EAN8(barcode, writer=ImageWriter(), guardbar=True)
if barcode_obj:
barcode_file = io.BytesIO()
barcode_obj.write(barcode_file) # generate PNG
barcode_file.seek(0)
barcode_img = barcode_file.read()
barcode_image = base64.b64encode(barcode_img)
product.barcode_image = barcode_image
def generate_barcode_from_product_product(self): def generate_barcode_from_product_product(self):
self.ensure_one() self.ensure_one()
if self.barcode: if self.barcode:

View File

@@ -270,7 +270,8 @@ class ProductPrintZplBarcode(models.TransientModel):
'zpl_filename': 'barcode_%s.zpl' % vals['barcode'], 'zpl_filename': 'barcode_%s.zpl' % vals['barcode'],
}) })
self.write(vals) self.write(vals)
action = self.env.ref('product_print_zpl_barcode.product_print_zpl_barcode_action').sudo().read()[0] action = self.env["ir.actions.actions"]._for_xml_id(
'product_print_zpl_barcode.product_print_zpl_barcode_action')
action.update({ action.update({
'res_id': self.id, 'res_id': self.id,
'context': self._context, 'context': self._context,
@@ -285,7 +286,8 @@ class ProductPrintZplBarcode(models.TransientModel):
self.zpl_filename, base64.decodebytes(self.zpl_file), format='raw') self.zpl_filename, base64.decodebytes(self.zpl_file), format='raw')
action = True action = True
if self._context.get('print_and_new'): if self._context.get('print_and_new'):
action = self.env.ref('product_print_zpl_barcode.product_print_zpl_barcode_action').sudo().read()[0] action = self.env["ir.actions.actions"]._for_xml_id(
'product_print_zpl_barcode.product_print_zpl_barcode_action')
action.update({ action.update({
'views': False, 'views': False,
'context': self._context, 'context': self._context,