diff --git a/product_usability/models/product_product.py b/product_usability/models/product_product.py index 79681a2..c0f219b 100644 --- a/product_usability/models/product_product.py +++ b/product_usability/models/product_product.py @@ -1,21 +1,21 @@ -# Copyright 2015-2020 Akretion (http://www.akretion.com) +# Copyright 2015-2021 Akretion (http://www.akretion.com) # @author Alexis de Lattre # @author Raphaël Valyi # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). -from odoo import models, fields +from odoo import api, models, fields class ProductProduct(models.Model): _inherit = 'product.product' - default_code = fields.Char(copy=False) -# track_visibility='onchange', - -# barcode = fields.Char(track_visibility='onchange', - -# weight = fields.Float(track_visibility='onchange') -# active = fields.Boolean(track_visibility='onchange') + default_code = fields.Char(copy=False, tracking=10) + barcode = fields.Char(tracking=20) + weight = fields.Float(tracking=30) + active = fields.Boolean(tracking=40) + barcode_code128 = fields.Char( + compute='_compute_barcode_code128', + help="Barcode in Code128-B with start char, checksum and stop char") _sql_constraints = [( # Maybe it could be better to have a constrain per company @@ -26,3 +26,32 @@ class ProductProduct(models.Model): 'default_code_uniq', 'unique(default_code)', 'This internal reference already exists!')] + + @api.model + def _compute_code128_checksum(self, code): + # This is NOT a full implementation of code128 checksum + csum = 104 # Start B + i = 0 + for char in code: + i += 1 + char_val = ord(char) - 32 + csum += char_val * i + remainder = csum % 103 + checksum = chr(remainder + 32) + return checksum + + @api.depends('barcode') + def _compute_barcode_code128(self): + # We use Code128-B. Useful info on code128: + # https://boowiki.info/art/codes-a-barres/code-128.html + # Use code128.ttf and copy it in /usr/local/share/fonts/ + startb = chr(209) + stop = chr(211) + for product in self: + code128 = False + barcode = product.barcode + if barcode and all([32 <= ord(x) <= 127 for x in barcode]): + checksum = self._compute_code128_checksum(barcode) + if checksum: + code128 = startb + barcode + checksum + stop + product.barcode_code128 = code128 diff --git a/product_usability/models/product_template.py b/product_usability/models/product_template.py index 01d3458..833fe60 100644 --- a/product_usability/models/product_template.py +++ b/product_usability/models/product_template.py @@ -1,4 +1,4 @@ -# Copyright 2015-2020 Akretion (http://www.akretion.com) +# Copyright 2015-2021 Akretion (http://www.akretion.com) # @author Alexis de Lattre # @author Raphaël Valyi # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). @@ -21,9 +21,12 @@ class ProductTemplate(models.Model): # are only shown in the form view of product.template, not in the form # view of product.product name = fields.Char(tracking=10) - categ_id = fields.Many2one(tracking=20) - type = fields.Selection(tracking=30) - list_price = fields.Float(tracking=40) - sale_ok = fields.Boolean(tracking=50) - purchase_ok = fields.Boolean(tracking=60) - active = fields.Boolean(tracking=70) + barcode = fields.Char(tracking=20) + default_code = fields.Char(tracking=30) + categ_id = fields.Many2one(tracking=40) + type = fields.Selection(tracking=50) + list_price = fields.Float(tracking=60) + weight = fields.Float(tracking=70) + sale_ok = fields.Boolean(tracking=80) + purchase_ok = fields.Boolean(tracking=90) + active = fields.Boolean(tracking=100)