Add barcode_code128 on product.product
This commit is contained in:
@@ -1,21 +1,21 @@
|
|||||||
# Copyright 2015-2020 Akretion (http://www.akretion.com)
|
# Copyright 2015-2021 Akretion (http://www.akretion.com)
|
||||||
# @author Alexis de Lattre <alexis.delattre@akretion.com>
|
# @author Alexis de Lattre <alexis.delattre@akretion.com>
|
||||||
# @author Raphaël Valyi <rvalyi@akretion.com>
|
# @author Raphaël Valyi <rvalyi@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 models, fields
|
from odoo import api, models, fields
|
||||||
|
|
||||||
|
|
||||||
class ProductProduct(models.Model):
|
class ProductProduct(models.Model):
|
||||||
_inherit = 'product.product'
|
_inherit = 'product.product'
|
||||||
|
|
||||||
default_code = fields.Char(copy=False)
|
default_code = fields.Char(copy=False, tracking=10)
|
||||||
# track_visibility='onchange',
|
barcode = fields.Char(tracking=20)
|
||||||
|
weight = fields.Float(tracking=30)
|
||||||
# barcode = fields.Char(track_visibility='onchange',
|
active = fields.Boolean(tracking=40)
|
||||||
|
barcode_code128 = fields.Char(
|
||||||
# weight = fields.Float(track_visibility='onchange')
|
compute='_compute_barcode_code128',
|
||||||
# active = fields.Boolean(track_visibility='onchange')
|
help="Barcode in Code128-B with start char, checksum and stop char")
|
||||||
|
|
||||||
_sql_constraints = [(
|
_sql_constraints = [(
|
||||||
# Maybe it could be better to have a constrain per company
|
# Maybe it could be better to have a constrain per company
|
||||||
@@ -26,3 +26,32 @@ class ProductProduct(models.Model):
|
|||||||
'default_code_uniq',
|
'default_code_uniq',
|
||||||
'unique(default_code)',
|
'unique(default_code)',
|
||||||
'This internal reference already exists!')]
|
'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
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
# Copyright 2015-2020 Akretion (http://www.akretion.com)
|
# Copyright 2015-2021 Akretion (http://www.akretion.com)
|
||||||
# @author Alexis de Lattre <alexis.delattre@akretion.com>
|
# @author Alexis de Lattre <alexis.delattre@akretion.com>
|
||||||
# @author Raphaël Valyi <rvalyi@akretion.com>
|
# @author Raphaël Valyi <rvalyi@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).
|
||||||
@@ -21,9 +21,12 @@ class ProductTemplate(models.Model):
|
|||||||
# are only shown in the form view of product.template, not in the form
|
# are only shown in the form view of product.template, not in the form
|
||||||
# view of product.product
|
# view of product.product
|
||||||
name = fields.Char(tracking=10)
|
name = fields.Char(tracking=10)
|
||||||
categ_id = fields.Many2one(tracking=20)
|
barcode = fields.Char(tracking=20)
|
||||||
type = fields.Selection(tracking=30)
|
default_code = fields.Char(tracking=30)
|
||||||
list_price = fields.Float(tracking=40)
|
categ_id = fields.Many2one(tracking=40)
|
||||||
sale_ok = fields.Boolean(tracking=50)
|
type = fields.Selection(tracking=50)
|
||||||
purchase_ok = fields.Boolean(tracking=60)
|
list_price = fields.Float(tracking=60)
|
||||||
active = fields.Boolean(tracking=70)
|
weight = fields.Float(tracking=70)
|
||||||
|
sale_ok = fields.Boolean(tracking=80)
|
||||||
|
purchase_ok = fields.Boolean(tracking=90)
|
||||||
|
active = fields.Boolean(tracking=100)
|
||||||
|
|||||||
Reference in New Issue
Block a user