1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
# -*- coding: utf-8 -*-
# Copyright (C) 2014 GRAP (http://www.grap.coop)
# Copyright (C) 2016-Today GRAP (http://www.lalouve.net)
# @author: Sylvain LE GAL (https://twitter.com/legalsylvain)
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
import logging
from openerp import models, fields, api, exceptions, _
from openerp.addons.barcodes_generate.models.barcode_rule import\
_GENERATE_TYPE
_logger = logging.getLogger(__name__)
try:
import barcode
except ImportError:
_logger.debug("Cannot import 'barcode' python Librairy.")
barcode = None
class barcode_generate_mixin(models.AbstractModel):
_name = 'barcode.generate.mixin'
# Column Section
barcode_rule_id = fields.Many2one(
string='Barcode Rule', comodel_name='barcode.rule')
barcode_base = fields.Integer(string='Barcode Base')
generate_type = fields.Selection(
string='Generate Type', selection=_GENERATE_TYPE, readonly=True,
related='barcode_rule_id.generate_type')
# View Section
@api.multi
def generate_base(self):
for item in self:
if item.generate_type != 'sequence':
raise exceptions.UserError(_(
"Generate Base can be used only with barcode rule with"
" 'Generate Type' set to 'Base managed by Sequence'"))
else:
item.barcode_base =\
item.barcode_rule_id.sequence_id.next_by_id()
return True
@api.multi
def generate_barcode(self):
for item in self:
padding = item.barcode_rule_id.padding
str_base = str(item.barcode_base).rjust(padding, '0')
custom_code = self._get_custom_barcode(item)
if custom_code:
custom_code = custom_code.replace('.' * padding, str_base)
barcode_class = barcode.get_barcode_class(
item.barcode_rule_id.encoding)
item.barcode = barcode_class(custom_code)
return True
# Custom Section
@api.model
def _get_custom_barcode(self, item):
"""
if the pattern is '23.....{NNNDD}'
this function will return '23.....00000'
Note : Overload _get_replacement_char to have another char
instead that replace 'N' and 'D' char.
"""
if not item.barcode_rule_id:
return False
# Define barcode
custom_code = item.barcode_rule_id.pattern
custom_code = custom_code.replace('{', '').replace('}', '')
custom_code = custom_code.replace(
'D', self._get_replacement_char('D'))
return custom_code.replace(
'N', self._get_replacement_char('N'))
@api.model
def _get_replacement_char(self, char):
"""
Can be overload by inheritance
Define wich character will be used instead of the 'N' or the 'D'
char, present in the pattern of the barcode_rule_id
"""
return '0'