summaryrefslogtreecommitdiff
path: root/addons
diff options
context:
space:
mode:
authorHDA (OpenERP) <hda@tinyerp.com>2009-10-21 12:54:49 +0530
committerHDA (OpenERP) <hda@tinyerp.com>2009-10-21 12:54:49 +0530
commitb7f6bc4c8e2996b7ffdb881835ccb0b9d4f556d1 (patch)
tree162d1210beee282ca0837cfd9ed90a0edd29fdd9 /addons
parent251b6720cac31cc62b1e09544c317757fd274ef4 (diff)
Remove sql injection problem
lp bug: https://launchpad.net/bugs/429327 fixed bzr revid: hda@tinyerp.com-20091021072449-rc9usc422tb0kv2f
Diffstat (limited to 'addons')
-rw-r--r--addons/account/account.py12
-rw-r--r--addons/account/invoice.py4
-rwxr-xr-xaddons/account/report/partner_balance.py2
-rw-r--r--addons/account/report/third_party_ledger.py2
-rw-r--r--addons/account/wizard/wizard_open_closed_fiscalyear.py2
-rw-r--r--addons/account_payment/account_move_line.py2
-rw-r--r--addons/account_payment/payment.py2
-rwxr-xr-xaddons/account_voucher/voucher.py2
-rw-r--r--addons/analytic_journal_billing_rate/__terp__.py1
-rw-r--r--addons/auction/auction.py6
-rw-r--r--addons/auction/barcode/__init__.py67
-rw-r--r--addons/auction/barcode/code128.py643
-rw-r--r--addons/auction/barcode/code39.py511
-rw-r--r--addons/auction/barcode/code93.py465
-rw-r--r--addons/auction/barcode/common.py1411
-rw-r--r--addons/auction/barcode/fourstate.py163
-rw-r--r--addons/auction/barcode/test.py111
-rw-r--r--addons/auction/barcode/usps.py463
-rw-r--r--addons/auction/wizard/wizard_auction_invoice_buyer.py2
-rw-r--r--addons/auction/wizard/wizard_auction_journal.py2
-rw-r--r--addons/base_module_quality/__init__.py2
-rw-r--r--addons/base_module_quality/__terp__.py2
-rw-r--r--addons/base_module_quality/base_module_quality.py2
-rw-r--r--addons/base_report_designer/wizard/tiny_sxw2rml/tiny_sxw2rml.py3
-rw-r--r--addons/crm/crm.py2
-rw-r--r--addons/crm/report/report_businessopp.py2
-rw-r--r--addons/document/document.py4
-rw-r--r--addons/hr/hr.py4
-rw-r--r--addons/hr/hr_department.py2
-rw-r--r--addons/hr_holidays/migrations/1.5/post-00-change-requests-signs.py20
-rw-r--r--addons/hr_holidays/migrations/1.5/post-01-convert-limits-into-requests.py20
-rw-r--r--addons/hr_timesheet_sheet/wizard/wizard_timesheet_current.py2
-rwxr-xr-xaddons/l10n_ch/account_move_line.py1
-rwxr-xr-xaddons/l10n_ch/bank.py2
-rwxr-xr-xaddons/l10n_ch/report/tiny_sxw2rml.py5
-rw-r--r--addons/l10n_ch_chart_c2c_pcg/__init__.py1
-rwxr-xr-xaddons/l10n_ch_chart_c2c_pcg/wizard/__init__.py1
-rw-r--r--addons/membership/membership.py2
-rw-r--r--addons/mrp/mrp.py2
-rw-r--r--addons/product/product.py2
-rw-r--r--addons/project/project.py2
-rw-r--r--addons/project_gtd/wizard/project_gtd_daily.py2
-rw-r--r--addons/purchase/purchase.py2
-rw-r--r--addons/sale/unit_test/test.py21
-rw-r--r--addons/scrum/report/task_burndown.py4
-rw-r--r--addons/stock/wizard/stock_traceability.py2
46 files changed, 2027 insertions, 1960 deletions
diff --git a/addons/account/account.py b/addons/account/account.py
index 9c6a45da129..de837e2ea06 100644
--- a/addons/account/account.py
+++ b/addons/account/account.py
@@ -729,7 +729,7 @@ class account_move(osv.osv):
def _amount_compute(self, cr, uid, ids, name, args, context, where =''):
if not ids: return {}
- cr.execute('select move_id,sum(debit) from account_move_line where move_id in ('+','.join(map(str,ids))+') group by move_id')
+ cr.execute('select move_id,sum(debit) from account_move_line where move_id in ('+','.join(map(str,map(int, ids)))+') group by move_id')
result = dict(cr.fetchall())
for id in ids:
result.setdefault(id, 0.0)
@@ -807,7 +807,7 @@ class account_move(osv.osv):
if new_name:
self.write(cr, uid, [move.id], {'name':new_name})
- cr.execute('update account_move set state=%s where id in ('+','.join(map(str,ids))+')', ('posted',))
+ cr.execute('update account_move set state=%s where id in ('+','.join(map(str, ids))+')', ('posted',))
else:
raise osv.except_osv(_('Integrity Error !'), _('You can not validate a non-balanced entry !'))
return True
@@ -820,7 +820,7 @@ class account_move(osv.osv):
if not line.journal_id.update_posted:
raise osv.except_osv(_('Error !'), _('You can not modify a posted entry of this journal !\nYou should set the journal to allow cancelling entries if you want to do that.'))
if len(ids):
- cr.execute('update account_move set state=%s where id in ('+','.join(map(str,ids))+')', ('draft',))
+ cr.execute('update account_move set state=%s where id in ('+','.join(map(str, ids))+')', ('draft',))
return True
def write(self, cr, uid, ids, vals, context={}):
@@ -1177,7 +1177,7 @@ class account_tax_code(osv.osv):
def _check_recursion(self, cr, uid, ids):
level = 100
while len(ids):
- cr.execute('select distinct parent_id from account_tax_code where id in ('+','.join(map(str,ids))+')')
+ cr.execute('select distinct parent_id from account_tax_code where id in ('+','.join(map(str, ids))+')')
ids = filter(None, map(lambda x:x[0], cr.fetchall()))
if not level:
return False
@@ -1797,7 +1797,7 @@ class account_account_template(osv.osv):
def _check_recursion(self, cr, uid, ids):
level = 100
while len(ids):
- cr.execute('select parent_id from account_account_template where id in ('+','.join(map(str,ids))+')')
+ cr.execute('select parent_id from account_account_template where id in ('+','.join(map(str, ids))+')')
ids = filter(None, map(lambda x:x[0], cr.fetchall()))
if not level:
return False
@@ -1856,7 +1856,7 @@ class account_tax_code_template(osv.osv):
def _check_recursion(self, cr, uid, ids):
level = 100
while len(ids):
- cr.execute('select distinct parent_id from account_tax_code_template where id in ('+','.join(map(str,ids))+')')
+ cr.execute('select distinct parent_id from account_tax_code_template where id in ('+','.join(map(str, ids))+')')
ids = filter(None, map(lambda x:x[0], cr.fetchall()))
if not level:
return False
diff --git a/addons/account/invoice.py b/addons/account/invoice.py
index 7981f0fe3d2..e0b2a3cf863 100644
--- a/addons/account/invoice.py
+++ b/addons/account/invoice.py
@@ -397,7 +397,7 @@ class account_invoice(osv.osv):
l.id \
from account_move_line l \
left join account_invoice i on (i.move_id=l.move_id) \
- where i.id in ('+','.join(map(str,ids))+') and l.account_id=i.account_id')
+ where i.id in ('+','.join(map(str,map(int, ids)))+') and l.account_id=i.account_id')
res = map(lambda x: x[0], cr.fetchall())
return res
@@ -680,7 +680,7 @@ class account_invoice(osv.osv):
def action_number(self, cr, uid, ids, *args):
cr.execute('SELECT id, type, number, move_id, reference ' \
'FROM account_invoice ' \
- 'WHERE id IN ('+','.join(map(str,ids))+')')
+ 'WHERE id IN ('+','.join(map(str, ids))+')')
obj_inv = self.browse(cr, uid, ids)[0]
for (id, invtype, number, move_id, reference) in cr.fetchall():
if not number:
diff --git a/addons/account/report/partner_balance.py b/addons/account/report/partner_balance.py
index fd1fdd8fd80..02d8540e0b4 100755
--- a/addons/account/report/partner_balance.py
+++ b/addons/account/report/partner_balance.py
@@ -166,7 +166,7 @@ class partner_balance(report_sxw.rml_parse):
##
self.date_lst_string =''
if self.date_lst:
- self.date_lst_string = '\'' + '\',\''.join(map(str,self.date_lst)) + '\''
+ self.date_lst_string = '\'' + '\',\''.join(map(str, self.date_lst)) + '\''
## Compute Code
diff --git a/addons/account/report/third_party_ledger.py b/addons/account/report/third_party_ledger.py
index e3586e3f85d..7a64a6b52fe 100644
--- a/addons/account/report/third_party_ledger.py
+++ b/addons/account/report/third_party_ledger.py
@@ -162,7 +162,7 @@ class third_party_ledger(rml_parse.rml_parse):
self.date_lst_string = ''
if self.date_lst:
- self.date_lst_string = '\'' + '\',\''.join(map(str,self.date_lst)) + '\''
+ self.date_lst_string = '\'' + '\',\''.join(map(str, self.date_lst)) + '\''
#
#new_ids = [id for (id,) in self.cr.fetchall()]
if data['form']['result_selection'] == 'supplier':
diff --git a/addons/account/wizard/wizard_open_closed_fiscalyear.py b/addons/account/wizard/wizard_open_closed_fiscalyear.py
index ea2be932822..91201d9f85e 100644
--- a/addons/account/wizard/wizard_open_closed_fiscalyear.py
+++ b/addons/account/wizard/wizard_open_closed_fiscalyear.py
@@ -43,7 +43,7 @@ def _remove_entries(self, cr, uid, data, context):
period_journal = data_fyear.end_journal_period_id
ids_move = pool.get('account.move').search(cr,uid,[('journal_id','=',period_journal.journal_id.id),('period_id','=',period_journal.period_id.id)])
if ids_move:
- cr.execute('delete from account_move where id in ('+','.join(map(str,ids_move))+')')
+ cr.execute('delete from account_move where id in ('+','.join(map(str, ids_move))+')')
#cr.execute('UPDATE account_journal_period ' \
# 'SET state = %s ' \
# 'WHERE period_id IN (SELECT id FROM account_period WHERE fiscalyear_id = %s)',
diff --git a/addons/account_payment/account_move_line.py b/addons/account_payment/account_move_line.py
index d7965179b94..febaf80d8da 100644
--- a/addons/account_payment/account_move_line.py
+++ b/addons/account_payment/account_move_line.py
@@ -42,7 +42,7 @@ class account_move_line(osv.osv):
WHERE move_line_id = ml.id
AND po.state != 'cancel') as amount
FROM account_move_line ml
- WHERE id in (%s)""" % (",".join(map(str, ids))))
+ WHERE id in (%s)""" % (",".join(map(str,map(int, ids)))))
r=dict(cr.fetchall())
return r
diff --git a/addons/account_payment/payment.py b/addons/account_payment/payment.py
index c8874b9bca0..1b3392564bf 100644
--- a/addons/account_payment/payment.py
+++ b/addons/account_payment/payment.py
@@ -225,7 +225,7 @@ class payment_line(osv.osv):
inner join payment_line pl
on (ml.id = pl.move_line_id)
where pl.id in (%s)"""%
- (self.translate(name), ','.join(map(str,ids))) )
+ (self.translate(name), ','.join(map(str, ids))))
res = dict(cr.fetchall())
if name == 'partner_id':
diff --git a/addons/account_voucher/voucher.py b/addons/account_voucher/voucher.py
index 2f24f0ad108..c3cfd7c9d73 100755
--- a/addons/account_voucher/voucher.py
+++ b/addons/account_voucher/voucher.py
@@ -404,7 +404,7 @@ class account_voucher(osv.osv):
def action_number(self, cr, uid, ids, *args):
cr.execute('SELECT id, type, number, move_id, reference ' \
'FROM account_voucher ' \
- 'WHERE id IN ('+','.join(map(str,ids))+')')
+ 'WHERE id IN ('+','.join(map(str, ids))+')')
for (id, invtype, number, move_id, reference) in cr.fetchall():
if not number:
number = self.pool.get('ir.sequence').get(cr, uid, invtype)
diff --git a/addons/analytic_journal_billing_rate/__terp__.py b/addons/analytic_journal_billing_rate/__terp__.py
index a6db9997d93..634b4cc0562 100644
--- a/addons/analytic_journal_billing_rate/__terp__.py
+++ b/addons/analytic_journal_billing_rate/__terp__.py
@@ -19,7 +19,6 @@
#
##############################################################################
-
{
'name': 'Analytic Journal Billing Rate',
'version': '1.0',
diff --git a/addons/auction/auction.py b/addons/auction/auction.py
index 1f3e4ac7537..0c275578180 100644
--- a/addons/auction/auction.py
+++ b/addons/auction/auction.py
@@ -94,12 +94,12 @@ class auction_dates(osv.osv):
RETURN: True
"""
# objects vendus mais non factures
- cr.execute('select count(*) as c from auction_lots where auction_id in ('+','.join(map(str,ids))+') and state=%s and obj_price>0', ('draft',))
+ cr.execute('select count(*) as c from auction_lots where auction_id in ('+','.join(map(str, ids))+') and state=%s and obj_price>0', ('draft',))
nbr = cr.fetchone()[0]
ach_uids = {}
- cr.execute('select id from auction_lots where auction_id in ('+','.join(map(str,ids))+') and state=%s and obj_price>0', ('draft',))
+ cr.execute('select id from auction_lots where auction_id in ('+','.join(map(str, ids))+') and state=%s and obj_price>0', ('draft',))
r=self.pool.get('auction.lots').lots_invoice(cr, uid, [x[0] for x in cr.fetchall()],{},None)
- cr.execute('select id from auction_lots where auction_id in ('+','.join(map(str,ids))+') and obj_price>0')
+ cr.execute('select id from auction_lots where auction_id in ('+','.join(map(str, ids))+') and obj_price>0')
ids2 = [x[0] for x in cr.fetchall()]
# for auction in auction_ids:
c=self.pool.get('auction.lots').seller_trans_create(cr, uid, ids2,{})
diff --git a/addons/auction/barcode/__init__.py b/addons/auction/barcode/__init__.py
index bfa51978b0d..1f03cafa4a7 100644
--- a/addons/auction/barcode/__init__.py
+++ b/addons/auction/barcode/__init__.py
@@ -1,34 +1,35 @@
-#
-# Copyright (c) 1996-2000 Tyler C. Sarna <tsarna@sarna.org>
-# All rights reserved.
-#
-# Redistribution and use in source and binary forms, with or without
-# modification, are permitted provided that the following conditions
-# are met:
-# 1. Redistributions of source code must retain the above copyright
-# notice, this list of conditions and the following disclaimer.
-# 2. Redistributions in binary form must reproduce the above copyright
-# notice, this list of conditions and the following disclaimer in the
-# documentation and/or other materials provided with the distribution.
-# 3. All advertising materials mentioning features or use of this software
-# must display the following acknowledgement:
-# This product includes software developed by Tyler C. Sarna.
-# 4. Neither the name of the author nor the names of contributors
-# may be used to endorse or promote products derived from this software
-# without specific prior written permission.
-#
-# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
-# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
-# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS
-# BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
-# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
-# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
-# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
-# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-# POSSIBILITY OF SUCH DAMAGE.
-#
-
-__version__ = '0.9'
+# -*- coding: utf-8 -*-
+#
+# Copyright (c) 1996-2000 Tyler C. Sarna <tsarna@sarna.org>
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+# 1. Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# 2. Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in the
+# documentation and/or other materials provided with the distribution.
+# 3. All advertising materials mentioning features or use of this software
+# must display the following acknowledgement:
+# This product includes software developed by Tyler C. Sarna.
+# 4. Neither the name of the author nor the names of contributors
+# may be used to endorse or promote products derived from this software
+# without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS
+# BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+# POSSIBILITY OF SUCH DAMAGE.
+#
+
+__version__ = '0.9'
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/auction/barcode/code128.py b/addons/auction/barcode/code128.py
index 64ab5bc46d4..0cd75e2ddcc 100644
--- a/addons/auction/barcode/code128.py
+++ b/addons/auction/barcode/code128.py
@@ -1,322 +1,323 @@
-#
-# Copyright (c) 2000 Tyler C. Sarna <tsarna@sarna.org>
-# All rights reserved.
-#
-# Redistribution and use in source and binary forms, with or without
-# modification, are permitted provided that the following conditions
-# are met:
-# 1. Redistributions of source code must retain the above copyright
-# notice, this list of conditions and the following disclaimer.
-# 2. Redistributions in binary form must reproduce the above copyright
-# notice, this list of conditions and the following disclaimer in the
-# documentation and/or other materials provided with the distribution.
-# 3. All advertising materials mentioning features or use of this software
-# must display the following acknowledgement:
-# This product includes software developed by Tyler C. Sarna.
-# 4. Neither the name of the author nor the names of contributors
-# may be used to endorse or promote products derived from this software
-# without specific prior written permission.
-#
-# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
-# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
-# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS
-# BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
-# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
-# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
-# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
-# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-# POSSIBILITY OF SUCH DAMAGE.
-#
-
-from reportlab.lib.units import inch
-from common import MultiWidthBarcode
-from string import digits
-
-_patterns = {
- 0 : 'BaBbBb', 1 : 'BbBaBb', 2 : 'BbBbBa',
- 3 : 'AbAbBc', 4 : 'AbAcBb', 5 : 'AcAbBb',
- 6 : 'AbBbAc', 7 : 'AbBcAb', 8 : 'AcBbAb',
- 9 : 'BbAbAc', 10 : 'BbAcAb', 11 : 'BcAbAb',
- 12 : 'AaBbCb', 13 : 'AbBaCb', 14 : 'AbBbCa',
- 15 : 'AaCbBb', 16 : 'AbCaBb', 17 : 'AbCbBa',
- 18 : 'BbCbAa', 19 : 'BbAaCb', 20 : 'BbAbCa',
- 21 : 'BaCbAb', 22 : 'BbCaAb', 23 : 'CaBaCa',
- 24 : 'CaAbBb', 25 : 'CbAaBb', 26 : 'CbAbBa',
- 27 : 'CaBbAb', 28 : 'CbBaAb', 29 : 'CbBbAa',
- 30 : 'BaBaBc', 31 : 'BaBcBa', 32 : 'BcBaBa',
- 33 : 'AaAcBc', 34 : 'AcAaBc', 35 : 'AcAcBa',
- 36 : 'AaBcAc', 37 : 'AcBaAc', 38 : 'AcBcAa',
- 39 : 'BaAcAc', 40 : 'BcAaAc', 41 : 'BcAcAa',
- 42 : 'AaBaCc', 43 : 'AaBcCa', 44 : 'AcBaCa',
- 45 : 'AaCaBc', 46 : 'AaCcBa', 47 : 'AcCaBa',
- 48 : 'CaCaBa', 49 : 'BaAcCa', 50 : 'BcAaCa',
- 51 : 'BaCaAc', 52 : 'BaCcAa', 53 : 'BaCaCa',
- 54 : 'CaAaBc', 55 : 'CaAcBa', 56 : 'CcAaBa',
- 57 : 'CaBaAc', 58 : 'CaBcAa', 59 : 'CcBaAa',
- 60 : 'CaDaAa', 61 : 'BbAdAa', 62 : 'DcAaAa',
- 63 : 'AaAbBd', 64 : 'AaAdBb', 65 : 'AbAaBd',
- 66 : 'AbAdBa', 67 : 'AdAaBb', 68 : 'AdAbBa',
- 69 : 'AaBbAd', 70 : 'AaBdAb', 71 : 'AbBaAd',
- 72 : 'AbBdAa', 73 : 'AdBaAb', 74 : 'AdBbAa',
- 75 : 'BdAbAa', 76 : 'BbAaAd', 77 : 'DaCaAa',
- 78 : 'BdAaAb', 79 : 'AcDaAa', 80 : 'AaAbDb',
- 81 : 'AbAaDb', 82 : 'AbAbDa', 83 : 'AaDbAb',
- 84 : 'AbDaAb', 85 : 'AbDbAa', 86 : 'DaAbAb',
- 87 : 'DbAaAb', 88 : 'DbAbAa', 89 : 'BaBaDa',
- 90 : 'BaDaBa', 91 : 'DaBaBa', 92 : 'AaAaDc',
- 93 : 'AaAcDa', 94 : 'AcAaDa', 95 : 'AaDaAc',
- 96 : 'AaDcAa', 97 : 'DaAaAc', 98 : 'DaAcAa',
- 99 : 'AaCaDa', 100 : 'AaDaCa', 101 : 'CaAaDa',
- 102 : 'DaAaCa', 103 : 'BaAdAb', 104 : 'BaAbAd',
- 105 : 'BaAbCb', 106 : 'BcCaAaB'
-}
-
-starta, startb, startc, stop = 103, 104, 105, 106
-
-seta = {
- ' ' : 0, '!' : 1, '"' : 2, '#' : 3,
- '$' : 4, '%' : 5, '&' : 6, '\'' : 7,
- '(' : 8, ')' : 9, '*' : 10, '+' : 11,
- ',' : 12, '-' : 13, '.' : 14, '/' : 15,
- '0' : 16, '1' : 17, '2' : 18, '3' : 19,
- '4' : 20, '5' : 21, '6' : 22, '7' : 23,
- '8' : 24, '9' : 25, ':' : 26, ';' : 27,
- '<' : 28, '=' : 29, '>' : 30, '?' : 31,
- '@' : 32, 'A' : 33, 'B' : 34, 'C' : 35,
- 'D' : 36, 'E' : 37, 'F' : 38, 'G' : 39,
- 'H' : 40, 'I' : 41, 'J' : 42, 'K' : 43,
- 'L' : 44, 'M' : 45, 'N' : 46, 'O' : 47,
- 'P' : 48, 'Q' : 49, 'R' : 50, 'S' : 51,
- 'T' : 52, 'U' : 53, 'V' : 54, 'W' : 55,
- 'X' : 56, 'Y' : 57, 'Z' : 58, '[' : 59,
- '\\' : 60, ']' : 61, '^' : 62, '_' : 63,
- '\x00' : 64, '\x01' : 65, '\x02' : 66, '\x03' : 67,
- '\x04' : 68, '\x05' : 69, '\x06' : 70, '\x07' : 71,
- '\x08' : 72, '\x09' : 73, '\x0a' : 74, '\x0b' : 75,
- '\x0c' : 76, '\x0d' : 77, '\x0e' : 78, '\x0f' : 79,
- '\x10' : 80, '\x11' : 81, '\x12' : 82, '\x13' : 83,
- '\x14' : 84, '\x15' : 85, '\x16' : 86, '\x17' : 87,
- '\x18' : 88, '\x19' : 89, '\x1a' : 90, '\x1b' : 91,
- '\x1c' : 92, '\x1d' : 93, '\x1e' : 94, '\x1f' : 95,
- '\xf3' : 96, '\xf2' : 97, 'SHIFT' : 98, 'TO_C' : 99,
- 'TO_B' : 100, '\xf4' : 101, '\xf1' : 102
-}
-
-setb = {
- ' ' : 0, '!' : 1, '"' : 2, '#' : 3,
- '$' : 4, '%' : 5, '&' : 6, '\'' : 7,
- '(' : 8, ')' : 9, '*' : 10, '+' : 11,
- ',' : 12, '-' : 13, '.' : 14, '/' : 15,
- '0' : 16, '1' : 17, '2' : 18, '3' : 19,
- '4' : 20, '5' : 21, '6' : 22, '7' : 23,
- '8' : 24, '9' : 25, ':' : 26, ';' : 27,
- '<' : 28, '=' : 29, '>' : 30, '?' : 31,
- '@' : 32, 'A' : 33, 'B' : 34, 'C' : 35,
- 'D' : 36, 'E' : 37, 'F' : 38, 'G' : 39,
- 'H' : 40, 'I' : 41, 'J' : 42, 'K' : 43,
- 'L' : 44, 'M' : 45, 'N' : 46, 'O' : 47,
- 'P' : 48, 'Q' : 49, 'R' : 50, 'S' : 51,
- 'T' : 52, 'U' : 53, 'V' : 54, 'W' : 55,
- 'X' : 56, 'Y' : 57, 'Z' : 58, '[' : 59,
- '\\' : 60, ']' : 61, '^' : 62, '_' : 63,
- '`' : 64, 'a' : 65, 'b' : 66, 'c' : 67,
- 'd' : 68, 'e' : 69, 'f' : 70, 'g' : 71,
- 'h' : 72, 'i' : 73, 'j' : 74, 'k' : 75,
- 'l' : 76, 'm' : 77, 'n' : 78, 'o' : 79,
- 'p' : 80, 'q' : 81, 'r' : 82, 's' : 83,
- 't' : 84, 'u' : 85, 'v' : 86, 'w' : 87,
- 'x' : 88, 'y' : 89, 'z' : 90, '{' : 91,
- '|' : 92, '}' : 93, '~' : 94, '\x7f' : 95,
- '\xf3' : 96, '\xf2' : 97, 'SHIFT' : 98, 'TO_C' : 99,
- '\xf4' : 100, 'TO_A' : 101, '\xf1' : 102
-}
-
-setc = {
- '00': 0, '01': 1, '02': 2, '03': 3, '04': 4,
- '05': 5, '06': 6, '07': 7, '08': 8, '09': 9,
- '10':10, '11':11, '12':12, '13':13, '14':14,
- '15':15, '16':16, '17':17, '18':18, '19':19,
- '20':20, '21':21, '22':22, '23':23, '24':24,
- '25':25, '26':26, '27':27, '28':28, '29':29,
- '30':30, '31':31, '32':32, '33':33, '34':34,
- '35':35, '36':36, '37':37, '38':38, '39':39,
- '40':40, '41':41, '42':42, '43':43, '44':44,
- '45':45, '46':46, '47':47, '48':48, '49':49,
- '50':50, '51':51, '52':52, '53':53, '54':54,
- '55':55, '56':56, '57':57, '58':58, '59':59,
- '60':60, '61':61, '62':62, '63':63, '64':64,
- '65':65, '66':66, '67':67, '68':68, '69':69,
- '70':70, '71':71, '72':72, '73':73, '74':74,
- '75':75, '76':76, '77':77, '78':78, '79':79,
- '80':80, '81':81, '82':82, '83':83, '84':84,
- '85':85, '86':86, '87':87, '88':88, '89':89,
- '90':90, '91':91, '92':92, '93':93, '94':94,
- '95':95, '96':96, '97':97, '98':98, '99':99,
-
- 'TO_B' : 100, 'TO_A' : 101, '\xf1' : 102
-}
-
-setmap = {
- 'TO_A' : (seta, setb),
- 'TO_B' : (setb, seta),
- 'TO_C' : (setc, None),
- 'START_A' : (starta, seta, setb),
- 'START_B' : (startb, setb, seta),
- 'START_C' : (startc, setc, None),
-}
-tos = setmap.keys()
-
-class Code128(MultiWidthBarcode):
- """
- Code 128 is a very compact symbology that can encode the entire
- 128 character ASCII set, plus 4 special control codes,
- (FNC1-FNC4, expressed in the input string as \xf1 to \xf4).
- Code 128 can also encode digits at double density (2 per byte)
- and has a mandatory checksum. Code 128 is well supported and
- commonly used -- for example, by UPS for tracking labels.
-
- Because of these qualities, Code 128 is probably the best choice
- for a linear symbology today (assuming you have a choice).
-
- Options that may be passed to constructor:
-
- value (int, or numeric string. required.):
- The value to encode.
-
- xdim (float, default .0075):
- X-Dimension, or width of the smallest element
- Minumum is .0075 inch (7.5 mils).
-
- height (float, see default below):
- Height of the symbol. Default is the height of the two
- bearer bars (if they exist) plus the greater of .25 inch
- or .15 times the symbol's length.
-
- quiet (bool, default 1):
- Wether to include quiet zones in the symbol.
-
- lquiet (float, see default below):
- Quiet zone size to left of code, if quiet is true.
- Default is the greater of .25 inch, or 10 xdim
-
- rquiet (float, defaults as above):
- Quiet zone size to right left of code, if quiet is true.
-
- Sources of Information on Code 128:
-
- http://www.semiconductor.agilent.com/barcode/sg/Misc/code_128.html
- http://www.adams1.com/pub/russadam/128code.html
- http://www.barcodeman.com/c128.html
-
- Official Spec, "ANSI/AIM BC4-1999, ISS" is available for US$45 from
- http://www.aimglobal.org/aimstore/
- """
- def __init__(self, value='', **args):
- self.xdim = inch * 0.0075
- self.lquiet = None
- self.rquiet = None
- self.quiet = 1
- self.height = None
-
- if type(value) is type(1):
- value = str(value)
-
- for (k, v) in args.items():
- setattr(self, k, v)
-
- if self.quiet:
- if self.lquiet is None:
- self.lquiet = max(inch * 0.25, self.xdim * 10.0)
- self.rquiet = max(inch * 0.25, self.xdim * 10.0)
- else:
- self.lquiet = self.rquiet = 0.0
-
- MultiWidthBarcode.__init__(self, value)
-
- def validate(self):
- vval = ""
- self.valid = 1
- for c in self.value:
- if ord(c) > 127 and c not in '\xf1\xf2\xf3\xf4':
- self.valid = 0
- continue
- vval = vval + c
- self.validated = vval
- return vval
-
- def _trailingDigitsToC(self, l):
- # Optimization: trailing digits -> set C double-digits
- c = 1
- savings = -1 # the TO_C costs one character
- rl = ['STOP']
- while c < len(l):
- i = (-c - 1)
- if l[i] == '\xf1':
- c = c + 1
- rl.insert(0, '\xf1')
- continue
- elif len(l[i]) == 1 and l[i] in digits \
- and len(l[i-1]) == 1 and l[i-1] in digits:
- c = c + 2
- savings = savings + 1
- rl.insert(0, l[i-1] + l[i])
- continue
- else:
- break
- if savings > 0:
- return l[:-c] + ['TO_C'] + rl
- else:
- return l
-
- def encode(self):
- # First, encode using only B
- s = self.validated
- l = ['START_B']
- for c in s:
- if not setb.has_key(c):
- l = l + ['TO_A', c, 'TO_B']
- else:
- l.append(c)
- l.append('STOP')
-
- l = self._trailingDigitsToC(l)
-
- # Finally, replace START_X,TO_Y with START_Y
- if l[1] in tos:
- l[:2] = ['START_' + l[1][-1]]
-
-# print `l`
-
- # encode into numbers
- start, set, shset = setmap[l[0]]
- e = [start]
-
- l = l[1:-1]
- while l:
- c = l[0]
- if c == 'SHIFT':
- e = e + [set[c], shset[l[1]]]
- l = l[2:]
- elif c in tos:
- e.append(set[c])
- set, shset = setmap[c]
- l = l[1:]
- else:
- e.append(set[c])
- l = l[1:]
-
- c = e[0]
- for i in range(1, len(e)):
- c = c + i * e[i]
- self.encoded = e + [c % 103, stop]
- return self.encoded
-
- def decompose(self):
- dval = ''
- for c in self.encoded:
- dval = dval + _patterns[c]
- self.decomposed = dval
- return self.decomposed
+# -*- coding: utf-8 -*-
+#
+# Copyright (c) 2000 Tyler C. Sarna <tsarna@sarna.org>
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+# 1. Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# 2. Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in the
+# documentation and/or other materials provided with the distribution.
+# 3. All advertising materials mentioning features or use of this software
+# must display the following acknowledgement:
+# This product includes software developed by Tyler C. Sarna.
+# 4. Neither the name of the author nor the names of contributors
+# may be used to endorse or promote products derived from this software
+# without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS
+# BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+# POSSIBILITY OF SUCH DAMAGE.
+#
+
+from reportlab.lib.units import inch
+from common import MultiWidthBarcode
+from string import digits
+
+_patterns = {
+ 0 : 'BaBbBb', 1 : 'BbBaBb', 2 : 'BbBbBa',
+ 3 : 'AbAbBc', 4 : 'AbAcBb', 5 : 'AcAbBb',
+ 6 : 'AbBbAc', 7 : 'AbBcAb', 8 : 'AcBbAb',
+ 9 : 'BbAbAc', 10 : 'BbAcAb', 11 : 'BcAbAb',
+ 12 : 'AaBbCb', 13 : 'AbBaCb', 14 : 'AbBbCa',
+ 15 : 'AaCbBb', 16 : 'AbCaBb', 17 : 'AbCbBa',
+ 18 : 'BbCbAa', 19 : 'BbAaCb', 20 : 'BbAbCa',
+ 21 : 'BaCbAb', 22 : 'BbCaAb', 23 : 'CaBaCa',
+ 24 : 'CaAbBb', 25 : 'CbAaBb', 26 : 'CbAbBa',
+ 27 : 'CaBbAb', 28 : 'CbBaAb', 29 : 'CbBbAa',
+ 30 : 'BaBaBc', 31 : 'BaBcBa', 32 : 'BcBaBa',
+ 33 : 'AaAcBc', 34 : 'AcAaBc', 35 : 'AcAcBa',
+ 36 : 'AaBcAc', 37 : 'AcBaAc', 38 : 'AcBcAa',
+ 39 : 'BaAcAc', 40 : 'BcAaAc', 41 : 'BcAcAa',
+ 42 : 'AaBaCc', 43 : 'AaBcCa', 44 : 'AcBaCa',
+ 45 : 'AaCaBc', 46 : 'AaCcBa', 47 : 'AcCaBa',
+ 48 : 'CaCaBa', 49 : 'BaAcCa', 50 : 'BcAaCa',
+ 51 : 'BaCaAc', 52 : 'BaCcAa', 53 : 'BaCaCa',
+ 54 : 'CaAaBc', 55 : 'CaAcBa', 56 : 'CcAaBa',
+ 57 : 'CaBaAc', 58 : 'CaBcAa', 59 : 'CcBaAa',
+ 60 : 'CaDaAa', 61 : 'BbAdAa', 62 : 'DcAaAa',
+ 63 : 'AaAbBd', 64 : 'AaAdBb', 65 : 'AbAaBd',
+ 66 : 'AbAdBa', 67 : 'AdAaBb', 68 : 'AdAbBa',
+ 69 : 'AaBbAd', 70 : 'AaBdAb', 71 : 'AbBaAd',
+ 72 : 'AbBdAa', 73 : 'AdBaAb', 74 : 'AdBbAa',
+ 75 : 'BdAbAa', 76 : 'BbAaAd', 77 : 'DaCaAa',
+ 78 : 'BdAaAb', 79 : 'AcDaAa', 80 : 'AaAbDb',
+ 81 : 'AbAaDb', 82 : 'AbAbDa', 83 : 'AaDbAb',
+ 84 : 'AbDaAb', 85 : 'AbDbAa', 86 : 'DaAbAb',
+ 87 : 'DbAaAb', 88 : 'DbAbAa', 89 : 'BaBaDa',
+ 90 : 'BaDaBa', 91 : 'DaBaBa', 92 : 'AaAaDc',
+ 93 : 'AaAcDa', 94 : 'AcAaDa', 95 : 'AaDaAc',
+ 96 : 'AaDcAa', 97 : 'DaAaAc', 98 : 'DaAcAa',
+ 99 : 'AaCaDa', 100 : 'AaDaCa', 101 : 'CaAaDa',
+ 102 : 'DaAaCa', 103 : 'BaAdAb', 104 : 'BaAbAd',
+ 105 : 'BaAbCb', 106 : 'BcCaAaB'
+}
+
+starta, startb, startc, stop = 103, 104, 105, 106
+
+seta = {
+ ' ' : 0, '!' : 1, '"' : 2, '#' : 3,
+ '$' : 4, '%' : 5, '&' : 6, '\'' : 7,
+ '(' : 8, ')' : 9, '*' : 10, '+' : 11,
+ ',' : 12, '-' : 13, '.' : 14, '/' : 15,
+ '0' : 16, '1' : 17, '2' : 18, '3' : 19,
+ '4' : 20, '5' : 21, '6' : 22, '7' : 23,
+ '8' : 24, '9' : 25, ':' : 26, ';' : 27,
+ '<' : 28, '=' : 29, '>' : 30, '?' : 31,
+ '@' : 32, 'A' : 33, 'B' : 34, 'C' : 35,
+ 'D' : 36, 'E' : 37, 'F' : 38, 'G' : 39,
+ 'H' : 40, 'I' : 41, 'J' : 42, 'K' : 43,
+ 'L' : 44, 'M' : 45, 'N' : 46, 'O' : 47,
+ 'P' : 48, 'Q' : 49, 'R' : 50, 'S' : 51,
+ 'T' : 52, 'U' : 53, 'V' : 54, 'W' : 55,
+ 'X' : 56, 'Y' : 57, 'Z' : 58, '[' : 59,
+ '\\' : 60, ']' : 61, '^' : 62, '_' : 63,
+ '\x00' : 64, '\x01' : 65, '\x02' : 66, '\x03' : 67,
+ '\x04' : 68, '\x05' : 69, '\x06' : 70, '\x07' : 71,
+ '\x08' : 72, '\x09' : 73, '\x0a' : 74, '\x0b' : 75,
+ '\x0c' : 76, '\x0d' : 77, '\x0e' : 78, '\x0f' : 79,
+ '\x10' : 80, '\x11' : 81, '\x12' : 82, '\x13' : 83,
+ '\x14' : 84, '\x15' : 85, '\x16' : 86, '\x17' : 87,
+ '\x18' : 88, '\x19' : 89, '\x1a' : 90, '\x1b' : 91,
+ '\x1c' : 92, '\x1d' : 93, '\x1e' : 94, '\x1f' : 95,
+ '\xf3' : 96, '\xf2' : 97, 'SHIFT' : 98, 'TO_C' : 99,
+ 'TO_B' : 100, '\xf4' : 101, '\xf1' : 102
+}
+
+setb = {
+ ' ' : 0, '!' : 1, '"' : 2, '#' : 3,
+ '$' : 4, '%' : 5, '&' : 6, '\'' : 7,
+ '(' : 8, ')' : 9, '*' : 10, '+' : 11,
+ ',' : 12, '-' : 13, '.' : 14, '/' : 15,
+ '0' : 16, '1' : 17, '2' : 18, '3' : 19,
+ '4' : 20, '5' : 21, '6' : 22, '7' : 23,
+ '8' : 24, '9' : 25, ':' : 26, ';' : 27,
+ '<' : 28, '=' : 29, '>' : 30, '?' : 31,
+ '@' : 32, 'A' : 33, 'B' : 34, 'C' : 35,
+ 'D' : 36, 'E' : 37, 'F' : 38, 'G' : 39,
+ 'H' : 40, 'I' : 41, 'J' : 42, 'K' : 43,
+ 'L' : 44, 'M' : 45, 'N' : 46, 'O' : 47,
+ 'P' : 48, 'Q' : 49, 'R' : 50, 'S' : 51,
+ 'T' : 52, 'U' : 53, 'V' : 54, 'W' : 55,
+ 'X' : 56, 'Y' : 57, 'Z' : 58, '[' : 59,
+ '\\' : 60, ']' : 61, '^' : 62, '_' : 63,
+ '`' : 64, 'a' : 65, 'b' : 66, 'c' : 67,
+ 'd' : 68, 'e' : 69, 'f' : 70, 'g' : 71,
+ 'h' : 72, 'i' : 73, 'j' : 74, 'k' : 75,
+ 'l' : 76, 'm' : 77, 'n' : 78, 'o' : 79,
+ 'p' : 80, 'q' : 81, 'r' : 82, 's' : 83,
+ 't' : 84, 'u' : 85, 'v' : 86, 'w' : 87,
+ 'x' : 88, 'y' : 89, 'z' : 90, '{' : 91,
+ '|' : 92, '}' : 93, '~' : 94, '\x7f' : 95,
+ '\xf3' : 96, '\xf2' : 97, 'SHIFT' : 98, 'TO_C' : 99,
+ '\xf4' : 100, 'TO_A' : 101, '\xf1' : 102
+}
+
+setc = {
+ '00': 0, '01': 1, '02': 2, '03': 3, '04': 4,
+ '05': 5, '06': 6, '07': 7, '08': 8, '09': 9,
+ '10':10, '11':11, '12':12, '13':13, '14':14,
+ '15':15, '16':16, '17':17, '18':18, '19':19,
+ '20':20, '21':21, '22':22, '23':23, '24':24,
+ '25':25, '26':26, '27':27, '28':28, '29':29,
+ '30':30, '31':31, '32':32, '33':33, '34':34,
+ '35':35, '36':36, '37':37, '38':38, '39':39,
+ '40':40, '41':41, '42':42, '43':43, '44':44,
+ '45':45, '46':46, '47':47, '48':48, '49':49,
+ '50':50, '51':51, '52':52, '53':53, '54':54,
+ '55':55, '56':56, '57':57, '58':58, '59':59,
+ '60':60, '61':61, '62':62, '63':63, '64':64,
+ '65':65, '66':66, '67':67, '68':68, '69':69,
+ '70':70, '71':71, '72':72, '73':73, '74':74,
+ '75':75, '76':76, '77':77, '78':78, '79':79,
+ '80':80, '81':81, '82':82, '83':83, '84':84,
+ '85':85, '86':86, '87':87, '88':88, '89':89,
+ '90':90, '91':91, '92':92, '93':93, '94':94,
+ '95':95, '96':96, '97':97, '98':98, '99':99,
+
+ 'TO_B' : 100, 'TO_A' : 101, '\xf1' : 102
+}
+
+setmap = {
+ 'TO_A' : (seta, setb),
+ 'TO_B' : (setb, seta),
+ 'TO_C' : (setc, None),
+ 'START_A' : (starta, seta, setb),
+ 'START_B' : (startb, setb, seta),
+ 'START_C' : (startc, setc, None),
+}
+tos = setmap.keys()
+
+class Code128(MultiWidthBarcode):
+ """
+ Code 128 is a very compact symbology that can encode the entire
+ 128 character ASCII set, plus 4 special control codes,
+ (FNC1-FNC4, expressed in the input string as \xf1 to \xf4).
+ Code 128 can also encode digits at double density (2 per byte)
+ and has a mandatory checksum. Code 128 is well supported and
+ commonly used -- for example, by UPS for tracking labels.
+
+ Because of these qualities, Code 128 is probably the best choice
+ for a linear symbology today (assuming you have a choice).
+
+ Options that may be passed to constructor:
+
+ value (int, or numeric string. required.):
+ The value to encode.
+
+ xdim (float, default .0075):
+ X-Dimension, or width of the smallest element
+ Minumum is .0075 inch (7.5 mils).
+
+ height (float, see default below):
+ Height of the symbol. Default is the height of the two
+ bearer bars (if they exist) plus the greater of .25 inch
+ or .15 times the symbol's length.
+
+ quiet (bool, default 1):
+ Wether to include quiet zones in the symbol.
+
+ lquiet (float, see default below):
+ Quiet zone size to left of code, if quiet is true.
+ Default is the greater of .25 inch, or 10 xdim
+
+ rquiet (float, defaults as above):
+ Quiet zone size to right left of code, if quiet is true.
+
+ Sources of Information on Code 128:
+
+ http://www.semiconductor.agilent.com/barcode/sg/Misc/code_128.html
+ http://www.adams1.com/pub/russadam/128code.html
+ http://www.barcodeman.com/c128.html
+
+ Official Spec, "ANSI/AIM BC4-1999, ISS" is available for US$45 from
+ http://www.aimglobal.org/aimstore/
+ """
+ def __init__(self, value='', **args):
+ self.xdim = inch * 0.0075
+ self.lquiet = None
+ self.rquiet = None
+ self.quiet = 1
+ self.height = None
+
+ if type(value) is type(1):
+ value = str(value)
+
+ for (k, v) in args.items():
+ setattr(self, k, v)
+
+ if self.quiet:
+ if self.lquiet is None:
+ self.lquiet = max(inch * 0.25, self.xdim * 10.0)
+ self.rquiet = max(inch * 0.25, self.xdim * 10.0)
+ else:
+ self.lquiet = self.rquiet = 0.0
+
+ MultiWidthBarcode.__init__(self, value)
+
+ def validate(self):
+ vval = ""
+ self.valid = 1
+ for c in self.value:
+ if ord(c) > 127 and c not in '\xf1\xf2\xf3\xf4':
+ self.valid = 0
+ continue
+ vval = vval + c
+ self.validated = vval
+ return vval
+
+ def _trailingDigitsToC(self, l):
+ # Optimization: trailing digits -> set C double-digits
+ c = 1
+ savings = -1 # the TO_C costs one character
+ rl = ['STOP']
+ while c < len(l):
+ i = (-c - 1)
+ if l[i] == '\xf1':
+ c = c + 1
+ rl.insert(0, '\xf1')
+ continue
+ elif len(l[i]) == 1 and l[i] in digits \
+ and len(l[i-1]) == 1 and l[i-1] in digits:
+ c = c + 2
+ savings = savings + 1
+ rl.insert(0, l[i-1] + l[i])
+ continue
+ else:
+ break
+ if savings > 0:
+ return l[:-c] + ['TO_C'] + rl
+ else:
+ return l
+
+ def encode(self):
+ # First, encode using only B
+ s = self.validated
+ l = ['START_B']
+ for c in s:
+ if not setb.has_key(c):
+ l = l + ['TO_A', c, 'TO_B']
+ else:
+ l.append(c)
+ l.append('STOP')
+
+ l = self._trailingDigitsToC(l)
+
+ # Finally, replace START_X,TO_Y with START_Y
+ if l[1] in tos:
+ l[:2] = ['START_' + l[1][-1]]
+
+# print `l`
+
+ # encode into numbers
+ start, set, shset = setmap[l[0]]
+ e = [start]
+
+ l = l[1:-1]
+ while l:
+ c = l[0]
+ if c == 'SHIFT':
+ e = e + [set[c], shset[l[1]]]
+ l = l[2:]
+ elif c in tos:
+ e.append(set[c])
+ set, shset = setmap[c]
+ l = l[1:]
+ else:
+ e.append(set[c])
+ l = l[1:]
+
+ c = e[0]
+ for i in range(1, len(e)):
+ c = c + i * e[i]
+ self.encoded = e + [c % 103, stop]
+ return self.encoded
+
+ def decompose(self):
+ dval = ''
+ for c in self.encoded:
+ dval = dval + _patterns[c]
+ self.decomposed = dval
+ return self.decomposed
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/auction/barcode/code39.py b/addons/auction/barcode/code39.py
index 283f68244a4..a3926c6c48d 100644
--- a/addons/auction/barcode/code39.py
+++ b/addons/auction/barcode/code39.py
@@ -1,256 +1,257 @@
-#
-# Copyright (c) 1996-2000 Tyler C. Sarna <tsarna@sarna.org>
-# All rights reserved.
-#
-# Redistribution and use in source and binary forms, with or without
-# modification, are permitted provided that the following conditions
-# are met:
-# 1. Redistributions of source code must retain the above copyright
-# notice, this list of conditions and the following disclaimer.
-# 2. Redistributions in binary form must reproduce the above copyright
-# notice, this list of conditions and the following disclaimer in the
-# documentation and/or other materials provided with the distribution.
-# 3. All advertising materials mentioning features or use of this software
-# must display the following acknowledgement:
-# This product includes software developed by Tyler C. Sarna.
-# 4. Neither the name of the author nor the names of contributors
-# may be used to endorse or promote products derived from this software
-# without specific prior written permission.
-#
-# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
-# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
-# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS
-# BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
-# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
-# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
-# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
-# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-# POSSIBILITY OF SUCH DAMAGE.
-#
-
-from reportlab.lib.units import inch
-from common import Barcode
-import string
-
-_patterns = {
- '0': ("bsbSBsBsb", 0), '1': ("BsbSbsbsB", 1),
- '2': ("bsBSbsbsB", 2), '3': ("BsBSbsbsb", 3),
- '4': ("bsbSBsbsB", 4), '5': ("BsbSBsbsb", 5),
- '6': ("bsBSBsbsb", 6), '7': ("bsbSbsBsB", 7),
- '8': ("BsbSbsBsb", 8), '9': ("bsBSbsBsb", 9),
- 'A': ("BsbsbSbsB", 10), 'B': ("bsBsbSbsB", 11),
- 'C': ("BsBsbSbsb", 12), 'D': ("bsbsBSbsB", 13),
- 'E': ("BsbsBSbsb", 14), 'F': ("bsBsBSbsb", 15),
- 'G': ("bsbsbSBsB", 16), 'H': ("BsbsbSBsb", 17),
- 'I': ("bsBsbSBsb", 18), 'J': ("bsbsBSBsb", 19),
- 'K': ("BsbsbsbSB", 20), 'L': ("bsBsbsbSB", 21),
- 'M': ("BsBsbsbSb", 22), 'N': ("bsbsBsbSB", 23),
- 'O': ("BsbsBsbSb", 24), 'P': ("bsBsBsbSb", 25),
- 'Q': ("bsbsbsBSB", 26), 'R': ("BsbsbsBSb", 27),
- 'S': ("bsBsbsBSb", 28), 'T': ("bsbsBsBSb", 29),
- 'U': ("BSbsbsbsB", 30), 'V': ("bSBsbsbsB", 31),
- 'W': ("BSBsbsbsb", 32), 'X': ("bSbsBsbsB", 33),
- 'Y': ("BSbsBsbsb", 34), 'Z': ("bSBsBsbsb", 35),
- '-': ("bSbsbsBsB", 36), '.': ("BSbsbsBsb", 37),
- ' ': ("bSBsbsBsb", 38), '*': ("bSbsBsBsb", 39),
- '$': ("bSbSbSbsb", 40), '/': ("bSbSbsbSb", 41),
- '+': ("bSbsbSbSb", 42), '%': ("bsbSbSbSb", 43)
-}
-
-_valchars = [
- '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A',
- 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L',
- 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W',
- 'X', 'Y', 'Z', '-', '.', ' ', '*', '$', '/', '+', '%'
-]
-
-_extended = {
- '\0': "%U", '\01': "$A", '\02': "$B", '\03': "$C",
- '\04': "$D", '\05': "$E", '\06': "$F", '\07': "$G",
- '\010': "$H", '\011': "$I", '\012': "$J", '\013': "$K",
- '\014': "$L", '\015': "$M", '\016': "$N", '\017': "$O",
- '\020': "$P", '\021': "$Q", '\022': "$R", '\023': "$S",
- '\024': "$T", '\025': "$U", '\026': "$V", '\027': "$W",
- '\030': "$X", '\031': "$Y", '\032': "$Z", '\033': "%A",
- '\034': "%B", '\035': "%C", '\036': "%D", '\037': "%E",
- '!': "/A", '"': "/B", '#': "/C", '$': "/D",
- '%': "/E", '&': "/F", '\'': "/G", '(': "/H",
- ')': "/I", '*': "/J", '+': "/K", ',': "/L",
- '/': "/O", ':': "/Z", ';': "%F", '<': "%G",
- '=': "%H", '>': "%I", '?': "%J", '@': "%V",
- '[': "%K", '\\': "%L", ']': "%M", '^': "%N",
- '_': "%O", '`': "%W", 'a': "+A", 'b': "+B",
- 'c': "+C", 'd': "+D", 'e': "+E", 'f': "+F",
- 'g': "+G", 'h': "+H", 'i': "+I", 'j': "+J",
- 'k': "+K", 'l': "+L", 'm': "+M", 'n': "+N",
- 'o': "+O", 'p': "+P", 'q': "+Q", 'r': "+R",
- 's': "+S", 't': "+T", 'u': "+U", 'v': "+V",
- 'w': "+W", 'x': "+X", 'y': "+Y", 'z': "+Z",
- '{': "%P", '|': "%Q", '}': "%R", '~': "%S",
- '\177': "%T"
-}
-
-
-_stdchrs = string.digits + string.uppercase + "-. *$/+%"
-_extchrs = _stdchrs + string.lowercase + \
- "\000\001\002\003\004\005\006\007\010\011\012\013\014\015\016\017" + \
- "\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037" + \
- "!'#&\"(),:;<=>?@[\\]^_`{|}~\177"
-
-
-def _encode39(str, cksum):
- newval = "*"
- v = 0
- for c in str:
- v = v + _patterns[c][1]
- newval = newval + c
- v = v % 43
- if cksum:
- newval = newval + _valchars[v]
- return newval + '*'
-
-
-class _Code39Base(Barcode):
- def __init__(self, value = "", **args):
- self.xdim = inch * 0.0075
- self.lquiet = None
- self.rquiet = None
- self.quiet = 1
- self.gap = None
- self.height = None
- self.ratio = 2.2
- self.checksum = 0
- self.bearers = 0.0
-
- for (k, v) in args.items():
- setattr(self, k, v)
-
- if self.quiet:
- if self.lquiet is None:
- self.lquiet = max(inch * 0.25, self.xdim * 10.0)
- self.rquiet = max(inch * 0.25, self.xdim * 10.0)
- else:
- self.lquiet = self.rquiet = 0.0
-
- Barcode.__init__(self, value)
-
- def decompose(self):
- dval = ""
- for c in self.encoded:
- dval = dval + _patterns[c][0] + 'i'
- self.decomposed = dval[:-1]
- return self.decomposed
-
-
-class Standard39(_Code39Base):
- """
- Interleaved 2 of 5 is a numeric-only barcode. It encodes an even
- number of digits; if an odd number is given, a 0 is prepended.
-
- Options that may be passed to constructor:
-
- value (int, or numeric string. required.):
- The value to encode.
-
- xdim (float, default .0075):
- X-Dimension, or width of the smallest element
- Minumum is .0075 inch (7.5 mils).
-
- ratio (float, default 2.2):
- The ratio of wide elements to narrow elements.
- Must be between 2.0 and 3.0 (or 2.2 and 3.0 if the
- xdim is greater than 20 mils (.02 inch))
-
- gap (float or None, default None):
- width of intercharacter gap. None means "use xdim".
-
- height (float, see default below):
- Height of the symbol. Default is the height of the two
- bearer bars (if they exist) plus the greater of .25 inch
- or .15 times the symbol's length.
-
- checksum (bool, default 0):
- Wether to compute and include the check digit
-
- bearers (float, in units of xdim. default 0):
- Height of bearer bars (horizontal bars along the top and
- bottom of the barcode). Default is 0 (no bearers).
-
- quiet (bool, default 1):
- Wether to include quiet zones in the symbol.
-
- lquiet (float, see default below):
- Quiet zone size to left of code, if quiet is true.
- Default is the greater of .25 inch, or .15 times the symbol's
- length.
-
- rquiet (float, defaults as above):
- Quiet zone size to right left of code, if quiet is true.
-
- Sources of Information on Code 39:
-
- http://www.semiconductor.agilent.com/barcode/sg/Misc/code_39.html
- http://www.adams1.com/pub/russadam/39code.html
- http://www.barcodeman.com/c39_1.html
-
- Official Spec, "ANSI/AIM BC1-1995, USS" is available for US$45 from
- http://www.aimglobal.org/aimstore/
- """
-
- def validate(self):
- vval = ""
- self.valid = 1
- for c in self.value:
- if c in string.lowercase:
- c = string.upper(c)
- if c not in _stdchrs:
- self.valid = 0
- continue
- vval = vval + c
- self.validated = vval
- return vval
-
- def encode(self):
- self.encoded = _encode39(self.validated, self.checksum)
- return self.encoded
-
-
-class Extended39(_Code39Base):
- """
- Extended Code 39 is a convention for encoding additional characters
- not present in stanmdard Code 39 by using pairs of characters to
- represent the characters missing in Standard Code 39.
-
- See Standard39 for arguments.
-
- Sources of Information on Extended Code 39:
-
- http://www.semiconductor.agilent.com/barcode/sg/Misc/xcode_39.html
- http://www.barcodeman.com/c39_ext.html
- """
-
- def validate(self):
- vval = ""
- self.valid = 1
- for c in self.value:
- if c not in _extchrs:
- self.valid = 0
- continue
- vval = vval + c
- self.validated = vval
- return vval
-
- def encode(self):
- self.encoded = ""
- for c in self.validated:
- if _extended.has_key(c):
- self.encoded = self.encoded + _extended[c]
- elif c in _stdchrs:
- self.encoded = self.encoded + c
- else:
- raise ValueError
- self.encoded = _encode39(self.encoded, self.checksum)
- return self.encoded
+# -*- coding: utf-8 -*-
+#
+# Copyright (c) 1996-2000 Tyler C. Sarna <tsarna@sarna.org>
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+# 1. Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# 2. Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in the
+# documentation and/or other materials provided with the distribution.
+# 3. All advertising materials mentioning features or use of this software
+# must display the following acknowledgement:
+# This product includes software developed by Tyler C. Sarna.
+# 4. Neither the name of the author nor the names of contributors
+# may be used to endorse or promote products derived from this software
+# without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS
+# BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+# POSSIBILITY OF SUCH DAMAGE.
+#
+
+from reportlab.lib.units import inch
+from common import Barcode
+import string
+
+_patterns = {
+ '0': ("bsbSBsBsb", 0), '1': ("BsbSbsbsB", 1),
+ '2': ("bsBSbsbsB", 2), '3': ("BsBSbsbsb", 3),
+ '4': ("bsbSBsbsB", 4), '5': ("BsbSBsbsb", 5),
+ '6': ("bsBSBsbsb", 6), '7': ("bsbSbsBsB", 7),
+ '8': ("BsbSbsBsb", 8), '9': ("bsBSbsBsb", 9),
+ 'A': ("BsbsbSbsB", 10), 'B': ("bsBsbSbsB", 11),
+ 'C': ("BsBsbSbsb", 12), 'D': ("bsbsBSbsB", 13),
+ 'E': ("BsbsBSbsb", 14), 'F': ("bsBsBSbsb", 15),
+ 'G': ("bsbsbSBsB", 16), 'H': ("BsbsbSBsb", 17),
+ 'I': ("bsBsbSBsb", 18), 'J': ("bsbsBSBsb", 19),
+ 'K': ("BsbsbsbSB", 20), 'L': ("bsBsbsbSB", 21),
+ 'M': ("BsBsbsbSb", 22), 'N': ("bsbsBsbSB", 23),
+ 'O': ("BsbsBsbSb", 24), 'P': ("bsBsBsbSb", 25),
+ 'Q': ("bsbsbsBSB", 26), 'R': ("BsbsbsBSb", 27),
+ 'S': ("bsBsbsBSb", 28), 'T': ("bsbsBsBSb", 29),
+ 'U': ("BSbsbsbsB", 30), 'V': ("bSBsbsbsB", 31),
+ 'W': ("BSBsbsbsb", 32), 'X': ("bSbsBsbsB", 33),
+ 'Y': ("BSbsBsbsb", 34), 'Z': ("bSBsBsbsb", 35),
+ '-': ("bSbsbsBsB", 36), '.': ("BSbsbsBsb", 37),
+ ' ': ("bSBsbsBsb", 38), '*': ("bSbsBsBsb", 39),
+ '$': ("bSbSbSbsb", 40), '/': ("bSbSbsbSb", 41),
+ '+': ("bSbsbSbSb", 42), '%': ("bsbSbSbSb", 43)
+}
+
+_valchars = [
+ '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A',
+ 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L',
+ 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W',
+ 'X', 'Y', 'Z', '-', '.', ' ', '*', '$', '/', '+', '%'
+]
+
+_extended = {
+ '\0': "%U", '\01': "$A", '\02': "$B", '\03': "$C",
+ '\04': "$D", '\05': "$E", '\06': "$F", '\07': "$G",
+ '\010': "$H", '\011': "$I", '\012': "$J", '\013': "$K",
+ '\014': "$L", '\015': "$M", '\016': "$N", '\017': "$O",
+ '\020': "$P", '\021': "$Q", '\022': "$R", '\023': "$S",
+ '\024': "$T", '\025': "$U", '\026': "$V", '\027': "$W",
+ '\030': "$X", '\031': "$Y", '\032': "$Z", '\033': "%A",
+ '\034': "%B", '\035': "%C", '\036': "%D", '\037': "%E",
+ '!': "/A", '"': "/B", '#': "/C", '$': "/D",
+ '%': "/E", '&': "/F", '\'': "/G", '(': "/H",
+ ')': "/I", '*': "/J", '+': "/K", ',': "/L",
+ '/': "/O", ':': "/Z", ';': "%F", '<': "%G",
+ '=': "%H", '>': "%I", '?': "%J", '@': "%V",
+ '[': "%K", '\\': "%L", ']': "%M", '^': "%N",
+ '_': "%O", '`': "%W", 'a': "+A", 'b': "+B",
+ 'c': "+C", 'd': "+D", 'e': "+E", 'f': "+F",
+ 'g': "+G", 'h': "+H", 'i': "+I", 'j': "+J",
+ 'k': "+K", 'l': "+L", 'm': "+M", 'n': "+N",
+ 'o': "+O", 'p': "+P", 'q': "+Q", 'r': "+R",
+ 's': "+S", 't': "+T", 'u': "+U", 'v': "+V",
+ 'w': "+W", 'x': "+X", 'y': "+Y", 'z': "+Z",
+ '{': "%P", '|': "%Q", '}': "%R", '~': "%S",
+ '\177': "%T"
+}
+
+
+_stdchrs = string.digits + string.uppercase + "-. *$/+%"
+_extchrs = _stdchrs + string.lowercase + \
+ "\000\001\002\003\004\005\006\007\010\011\012\013\014\015\016\017" + \
+ "\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037" + \
+ "!'#&\"(),:;<=>?@[\\]^_`{|}~\177"
+
+
+def _encode39(str, cksum):
+ newval = "*"
+ v = 0
+ for c in str:
+ v = v + _patterns[c][1]
+ newval = newval + c
+ v = v % 43
+ if cksum:
+ newval = newval + _valchars[v]
+ return newval + '*'
+
+
+class _Code39Base(Barcode):
+ def __init__(self, value = "", **args):
+ self.xdim = inch * 0.0075
+ self.lquiet = None
+ self.rquiet = None
+ self.quiet = 1
+ self.gap = None
+ self.height = None
+ self.ratio = 2.2
+ self.checksum = 0
+ self.bearers = 0.0
+
+ for (k, v) in args.items():
+ setattr(self, k, v)
+
+ if self.quiet:
+ if self.lquiet is None:
+ self.lquiet = max(inch * 0.25, self.xdim * 10.0)
+ self.rquiet = max(inch * 0.25, self.xdim * 10.0)
+ else:
+ self.lquiet = self.rquiet = 0.0
+
+ Barcode.__init__(self, value)
+
+ def decompose(self):
+ dval = ""
+ for c in self.encoded:
+ dval = dval + _patterns[c][0] + 'i'
+ self.decomposed = dval[:-1]
+ return self.decomposed
+
+
+class Standard39(_Code39Base):
+ """
+ Interleaved 2 of 5 is a numeric-only barcode. It encodes an even
+ number of digits; if an odd number is given, a 0 is prepended.
+
+ Options that may be passed to constructor:
+
+ value (int, or numeric string. required.):
+ The value to encode.
+
+ xdim (float, default .0075):
+ X-Dimension, or width of the smallest element
+ Minumum is .0075 inch (7.5 mils).
+
+ ratio (float, default 2.2):
+ The ratio of wide elements to narrow elements.
+ Must be between 2.0 and 3.0 (or 2.2 and 3.0 if the
+ xdim is greater than 20 mils (.02 inch))
+
+ gap (float or None, default None):
+ width of intercharacter gap. None means "use xdim".
+
+ height (float, see default below):
+ Height of the symbol. Default is the height of the two
+ bearer bars (if they exist) plus the greater of .25 inch
+ or .15 times the symbol's length.
+
+ checksum (bool, default 0):
+ Wether to compute and include the check digit
+
+ bearers (float, in units of xdim. default 0):
+ Height of bearer bars (horizontal bars along the top and
+ bottom of the barcode). Default is 0 (no bearers).
+
+ quiet (bool, default 1):
+ Wether to include quiet zones in the symbol.
+
+ lquiet (float, see default below):
+ Quiet zone size to left of code, if quiet is true.
+ Default is the greater of .25 inch, or .15 times the symbol's
+ length.
+
+ rquiet (float, defaults as above):
+ Quiet zone size to right left of code, if quiet is true.
+
+ Sources of Information on Code 39:
+
+ http://www.semiconductor.agilent.com/barcode/sg/Misc/code_39.html
+ http://www.adams1.com/pub/russadam/39code.html
+ http://www.barcodeman.com/c39_1.html
+
+ Official Spec, "ANSI/AIM BC1-1995, USS" is available for US$45 from
+ http://www.aimglobal.org/aimstore/
+ """
+
+ def validate(self):
+ vval = ""
+ self.valid = 1
+ for c in self.value:
+ if c in string.lowercase:
+ c = string.upper(c)
+ if c not in _stdchrs:
+ self.valid = 0
+ continue
+ vval = vval + c
+ self.validated = vval
+ return vval
+
+ def encode(self):
+ self.encoded = _encode39(self.validated, self.checksum)
+ return self.encoded
+
+
+class Extended39(_Code39Base):
+ """
+ Extended Code 39 is a convention for encoding additional characters
+ not present in stanmdard Code 39 by using pairs of characters to
+ represent the characters missing in Standard Code 39.
+
+ See Standard39 for arguments.
+
+ Sources of Information on Extended Code 39:
+
+ http://www.semiconductor.agilent.com/barcode/sg/Misc/xcode_39.html
+ http://www.barcodeman.com/c39_ext.html
+ """
+
+ def validate(self):
+ vval = ""
+ self.valid = 1
+ for c in self.value:
+ if c not in _extchrs:
+ self.valid = 0
+ continue
+ vval = vval + c
+ self.validated = vval
+ return vval
+
+ def encode(self):
+ self.encoded = ""
+ for c in self.validated:
+ if _extended.has_key(c):
+ self.encoded = self.encoded + _extended[c]
+ elif c in _stdchrs:
+ self.encoded = self.encoded + c
+ else:
+ raise ValueError
+ self.encoded = _encode39(self.encoded, self.checksum)
+ return self.encoded
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/auction/barcode/code93.py b/addons/auction/barcode/code93.py
index bb556829687..697841092a1 100644
--- a/addons/auction/barcode/code93.py
+++ b/addons/auction/barcode/code93.py
@@ -1,233 +1,234 @@
-#
-# Copyright (c) 2000 Tyler C. Sarna <tsarna@sarna.org>
-# All rights reserved.
-#
-# Redistribution and use in source and binary forms, with or without
-# modification, are permitted provided that the following conditions
-# are met:
-# 1. Redistributions of source code must retain the above copyright
-# notice, this list of conditions and the following disclaimer.
-# 2. Redistributions in binary form must reproduce the above copyright
-# notice, this list of conditions and the following disclaimer in the
-# documentation and/or other materials provided with the distribution.
-# 3. All advertising materials mentioning features or use of this software
-# must display the following acknowledgement:
-# This product includes software developed by Tyler C. Sarna.
-# 4. Neither the name of the author nor the names of contributors
-# may be used to endorse or promote products derived from this software
-# without specific prior written permission.
-#
-# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
-# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
-# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS
-# BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
-# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
-# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
-# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
-# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-# POSSIBILITY OF SUCH DAMAGE.
-#
-
-from reportlab.lib.units import inch
-from common import MultiWidthBarcode
-import string
-
-_patterns = {
- '0' : ('AcAaAb', 0), '1' : ('AaAbAc', 1), '2' : ('AaAcAb', 2),
- '3' : ('AaAdAa', 3), '4' : ('AbAaAc', 4), '5' : ('AbAbAb', 5),
- '6' : ('AbAcAa', 6), '7' : ('AaAaAd', 7), '8' : ('AcAbAa', 8),
- '9' : ('AdAaAa', 9), 'A' : ('BaAaAc', 10), 'B' : ('BaAbAb', 11),
- 'C' : ('BaAcAa', 12), 'D' : ('BbAaAb', 13), 'E' : ('BbAbAa', 14),
- 'F' : ('BcAaAa', 15), 'G' : ('AaBaAc', 16), 'H' : ('AaBbAb', 17),
- 'I' : ('AaBcAa', 18), 'J' : ('AbBaAb', 19), 'K' : ('AcBaAa', 20),
- 'L' : ('AaAaBc', 21), 'M' : ('AaAbBb', 22), 'N' : ('AaAcBa', 23),
- 'O' : ('AbAaBb', 24), 'P' : ('AcAaBa', 25), 'Q' : ('BaBaAb', 26),
- 'R' : ('BaBbAa', 27), 'S' : ('BaAaBb', 28), 'T' : ('BaAbBa', 29),
- 'U' : ('BbAaBa', 30), 'V' : ('BbBaAa', 31), 'W' : ('AaBaBb', 32),
- 'X' : ('AaBbBa', 33), 'Y' : ('AbBaBa', 34), 'Z' : ('AbCaAa', 35),
- '-' : ('AbAaCa', 36), '.' : ('CaAaAb', 37), ' ' : ('CaAbAa', 38),
- '$' : ('CbAaAa', 39), '/' : ('AaBaCa', 40), '+' : ('AaCaBa', 41),
- '%' : ('BaAaCa', 42), '#' : ('AbAbBa', 43), '!' : ('CaBaAa', 44),
- '=' : ('CaAaBa', 45), '&' : ('AbBbAa', 46),
- 'start' : ('AaAaDa', -1), 'stop' : ('AaAaDaA', -2)
-}
-
-_charsbyval = {}
-for k, v in _patterns.items():
- _charsbyval[v[1]] = k
-
-_extended = {
- '\x00' : '!U', '\x01' : '#A', '\x02' : '#B', '\x03' : '#C',
- '\x04' : '#D', '\x05' : '#E', '\x06' : '#F', '\x07' : '#G',
- '\x08' : '#H', '\x09' : '#I', '\x0a' : '#J', '\x0b' : '#K',
- '\x0c' : '#L', '\x0d' : '#M', '\x0e' : '#N', '\x0f' : '#O',
- '\x10' : '#P', '\x11' : '#Q', '\x12' : '#R', '\x13' : '#S',
- '\x14' : '#T', '\x15' : '#U', '\x16' : '#V', '\x17' : '#W',
- '\x18' : '#X', '\x19' : '#Y', '\x1a' : '#Z', '\x1b' : '!A',
- '\x1c' : '!B', '\x1d' : '!C', '\x1e' : '!D', '\x1f' : '!E',
- '!' : '=A', '"' : '=B', '#' : '=C', '$' : '=D',
- '%' : '=E', '&' : '=F', '\'' : '=G', '(' : '=H',
- ')' : '=I', '*' : '=J', '+' : '=K', ',' : '=L',
- '/' : '=O', ':' : '=Z', ';' : '!F', '<' : '!G',
- '=' : '!H', '>' : '!I', '?' : '!J', '@' : '!V',
- '[' : '!K', '\\' : '!L', ']' : '!M', '^' : '!N',
- '_' : '!O', '`' : '!W', 'a' : '&A', 'b' : '&B',
- 'c' : '&C', 'd' : '&D', 'e' : '&E', 'f' : '&F',
- 'g' : '&G', 'h' : '&H', 'i' : '&I', 'j' : '&J',
- 'k' : '&K', 'l' : '&L', 'm' : '&M', 'n' : '&N',
- 'o' : '&O', 'p' : '&P', 'q' : '&Q', 'r' : '&R',
- 's' : '&S', 't' : '&T', 'u' : '&U', 'v' : '&V',
- 'w' : '&W', 'x' : '&X', 'y' : '&Y', 'z' : '&Z',
- '{' : '!P', '|' : '!Q', '}' : '!R', '~' : '!S',
- '\x7f' : '!T'
-}
-
-
-def _encode93(str):
- s = map(None, str)
- s.reverse()
-
- # compute 'C' checksum
- i = 0; v = 1; c = 0
- while i < len(s):
- c = c + v * _patterns[s[i]][1]
- i = i + 1; v = v + 1
- if v > 20:
- v = 1
- s.insert(0, _charsbyval[c % 47])
-
- # compute 'K' checksum
- i = 0; v = 1; c = 0
- while i < len(s):
- c = c + v * _patterns[s[i]][1]
- i = i + 1; v = v + 1
- if v > 15:
- v = 1
- s.insert(0, _charsbyval[c % 47])
-
- s.reverse()
-
- return string.join(s, '')
-
-
-class _Code93Base(MultiWidthBarcode):
- def __init__(self, value='', **args):
- self.xdim = inch * 0.0075
- self.lquiet = None
- self.rquiet = None
- self.quiet = 1
- self.height = None
-
- if type(value) is type(1):
- value = str(value)
-
- for (k, v) in args.items():
- setattr(self, k, v)
-
- if self.quiet:
- if self.lquiet is None:
- self.lquiet = max(inch * 0.25, self.xdim * 10.0)
- self.rquiet = max(inch * 0.25, self.xdim * 10.0)
- else:
- self.lquiet = self.rquiet = 0.0
-
- MultiWidthBarcode.__init__(self, value)
-
- def decompose(self):
- dval = _patterns['start'][0]
- for c in self.encoded:
- dval = dval + _patterns[c][0]
- self.decomposed = dval + _patterns['stop'][0]
- return self.decomposed
-
-
-class Standard93(_Code93Base):
- """
- Code 93 is a Uppercase alphanumeric symbology with some punctuation.
- See Extended Code 93 for a variant that can represent the entire
- 128 characrter ASCII set.
-
- Options that may be passed to constructor:
-
- value (int, or numeric string. required.):
- The value to encode.
-
- xdim (float, default .0075):
- X-Dimension, or width of the smallest element
- Minumum is .0075 inch (7.5 mils).
-
- height (float, see default below):
- Height of the symbol. Default is the height of the two
- bearer bars (if they exist) plus the greater of .25 inch
- or .15 times the symbol's length.
-
- quiet (bool, default 1):
- Wether to include quiet zones in the symbol.
-
- lquiet (float, see default below):
- Quiet zone size to left of code, if quiet is true.
- Default is the greater of .25 inch, or 10 xdim
-
- rquiet (float, defaults as above):
- Quiet zone size to right left of code, if quiet is true.
-
- Sources of Information on Code 93:
-
- http://www.semiconductor.agilent.com/barcode/sg/Misc/code_93.html
-
- Official Spec, "NSI/AIM BC5-1995, USS" is available for US$45 from
- http://www.aimglobal.org/aimstore/
- """
-
- def validate(self):
- vval = ""
- self.valid = 1
- for c in self.value:
- if c in string.lowercase:
- c = string.upper(c)
- if not _patterns.has_key(c):
- self.valid = 0
- continue
- vval = vval + c
- self.validated = vval
- return vval
-
- def encode(self):
- self.encoded = _encode93(self.validated)
- return self.encoded
-
-
-class Extended93(_Code93Base):
- """
- Extended Code 93 is a convention for encoding the entire 128 character
- set using pairs of characters to represent the characters missing in
- Standard Code 93. It is very much like Extended Code 39 in that way.
-
- See Standard93 for arguments.
- """
-
- def validate(self):
- vval = ""
- self.valid = 1
- for c in self.value:
- if not _patterns.has_key(c) and not _extended.has_key(c):
- self.valid = 0
- continue
- vval = vval + c
- self.validated = vval
- return vval
-
- def encode(self):
- self.encoded = ""
- for c in self.validated:
- if _patterns.has_key(c):
- self.encoded = self.encoded + c
- elif _extended.has_key(c):
- self.encoded = self.encoded + _extended[c]
- else:
- raise ValueError
- self.encoded = _encode93(self.encoded)
- return self.encoded
+# -*- coding: utf-8 -*-
+#
+# Copyright (c) 2000 Tyler C. Sarna <tsarna@sarna.org>
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+# 1. Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# 2. Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in the
+# documentation and/or other materials provided with the distribution.
+# 3. All advertising materials mentioning features or use of this software
+# must display the following acknowledgement:
+# This product includes software developed by Tyler C. Sarna.
+# 4. Neither the name of the author nor the names of contributors
+# may be used to endorse or promote products derived from this software
+# without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS
+# BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+# POSSIBILITY OF SUCH DAMAGE.
+#
+
+from reportlab.lib.units import inch
+from common import MultiWidthBarcode
+import string
+
+_patterns = {
+ '0' : ('AcAaAb', 0), '1' : ('AaAbAc', 1), '2' : ('AaAcAb', 2),
+ '3' : ('AaAdAa', 3), '4' : ('AbAaAc', 4), '5' : ('AbAbAb', 5),
+ '6' : ('AbAcAa', 6), '7' : ('AaAaAd', 7), '8' : ('AcAbAa', 8),
+ '9' : ('AdAaAa', 9), 'A' : ('BaAaAc', 10), 'B' : ('BaAbAb', 11),
+ 'C' : ('BaAcAa', 12), 'D' : ('BbAaAb', 13), 'E' : ('BbAbAa', 14),
+ 'F' : ('BcAaAa', 15), 'G' : ('AaBaAc', 16), 'H' : ('AaBbAb', 17),
+ 'I' : ('AaBcAa', 18), 'J' : ('AbBaAb', 19), 'K' : ('AcBaAa', 20),
+ 'L' : ('AaAaBc', 21), 'M' : ('AaAbBb', 22), 'N' : ('AaAcBa', 23),
+ 'O' : ('AbAaBb', 24), 'P' : ('AcAaBa', 25), 'Q' : ('BaBaAb', 26),
+ 'R' : ('BaBbAa', 27), 'S' : ('BaAaBb', 28), 'T' : ('BaAbBa', 29),
+ 'U' : ('BbAaBa', 30), 'V' : ('BbBaAa', 31), 'W' : ('AaBaBb', 32),
+ 'X' : ('AaBbBa', 33), 'Y' : ('AbBaBa', 34), 'Z' : ('AbCaAa', 35),
+ '-' : ('AbAaCa', 36), '.' : ('CaAaAb', 37), ' ' : ('CaAbAa', 38),
+ '$' : ('CbAaAa', 39), '/' : ('AaBaCa', 40), '+' : ('AaCaBa', 41),
+ '%' : ('BaAaCa', 42), '#' : ('AbAbBa', 43), '!' : ('CaBaAa', 44),
+ '=' : ('CaAaBa', 45), '&' : ('AbBbAa', 46),
+ 'start' : ('AaAaDa', -1), 'stop' : ('AaAaDaA', -2)
+}
+
+_charsbyval = {}
+for k, v in _patterns.items():
+ _charsbyval[v[1]] = k
+
+_extended = {
+ '\x00' : '!U', '\x01' : '#A', '\x02' : '#B', '\x03' : '#C',
+ '\x04' : '#D', '\x05' : '#E', '\x06' : '#F', '\x07' : '#G',
+ '\x08' : '#H', '\x09' : '#I', '\x0a' : '#J', '\x0b' : '#K',
+ '\x0c' : '#L', '\x0d' : '#M', '\x0e' : '#N', '\x0f' : '#O',
+ '\x10' : '#P', '\x11' : '#Q', '\x12' : '#R', '\x13' : '#S',
+ '\x14' : '#T', '\x15' : '#U', '\x16' : '#V', '\x17' : '#W',
+ '\x18' : '#X', '\x19' : '#Y', '\x1a' : '#Z', '\x1b' : '!A',
+ '\x1c' : '!B', '\x1d' : '!C', '\x1e' : '!D', '\x1f' : '!E',
+ '!' : '=A', '"' : '=B', '#' : '=C', '$' : '=D',
+ '%' : '=E', '&' : '=F', '\'' : '=G', '(' : '=H',
+ ')' : '=I', '*' : '=J', '+' : '=K', ',' : '=L',
+ '/' : '=O', ':' : '=Z', ';' : '!F', '<' : '!G',
+ '=' : '!H', '>' : '!I', '?' : '!J', '@' : '!V',
+ '[' : '!K', '\\' : '!L', ']' : '!M', '^' : '!N',
+ '_' : '!O', '`' : '!W', 'a' : '&A', 'b' : '&B',
+ 'c' : '&C', 'd' : '&D', 'e' : '&E', 'f' : '&F',
+ 'g' : '&G', 'h' : '&H', 'i' : '&I', 'j' : '&J',
+ 'k' : '&K', 'l' : '&L', 'm' : '&M', 'n' : '&N',
+ 'o' : '&O', 'p' : '&P', 'q' : '&Q', 'r' : '&R',
+ 's' : '&S', 't' : '&T', 'u' : '&U', 'v' : '&V',
+ 'w' : '&W', 'x' : '&X', 'y' : '&Y', 'z' : '&Z',
+ '{' : '!P', '|' : '!Q', '}' : '!R', '~' : '!S',
+ '\x7f' : '!T'
+}
+
+
+def _encode93(str):
+ s = map(None, str)
+ s.reverse()
+
+ # compute 'C' checksum
+ i = 0; v = 1; c = 0
+ while i < len(s):
+ c = c + v * _patterns[s[i]][1]
+ i = i + 1; v = v + 1
+ if v > 20:
+ v = 1
+ s.insert(0, _charsbyval[c % 47])
+
+ # compute 'K' checksum
+ i = 0; v = 1; c = 0
+ while i < len(s):
+ c = c + v * _patterns[s[i]][1]
+ i = i + 1; v = v + 1
+ if v > 15:
+ v = 1
+ s.insert(0, _charsbyval[c % 47])
+
+ s.reverse()
+
+ return string.join(s, '')
+
+
+class _Code93Base(MultiWidthBarcode):
+ def __init__(self, value='', **args):
+ self.xdim = inch * 0.0075
+ self.lquiet = None
+ self.rquiet = None
+ self.quiet = 1
+ self.height = None
+
+ if type(value) is type(1):
+ value = str(value)
+
+ for (k, v) in args.items():
+ setattr(self, k, v)
+
+ if self.quiet:
+ if self.lquiet is None:
+ self.lquiet = max(inch * 0.25, self.xdim * 10.0)
+ self.rquiet = max(inch * 0.25, self.xdim * 10.0)
+ else:
+ self.lquiet = self.rquiet = 0.0
+
+ MultiWidthBarcode.__init__(self, value)
+
+ def decompose(self):
+ dval = _patterns['start'][0]
+ for c in self.encoded:
+ dval = dval + _patterns[c][0]
+ self.decomposed = dval + _patterns['stop'][0]
+ return self.decomposed
+
+
+class Standard93(_Code93Base):
+ """
+ Code 93 is a Uppercase alphanumeric symbology with some punctuation.
+ See Extended Code 93 for a variant that can represent the entire
+ 128 characrter ASCII set.
+
+ Options that may be passed to constructor:
+
+ value (int, or numeric string. required.):
+ The value to encode.
+
+ xdim (float, default .0075):
+ X-Dimension, or width of the smallest element
+ Minumum is .0075 inch (7.5 mils).
+
+ height (float, see default below):
+ Height of the symbol. Default is the height of the two
+ bearer bars (if they exist) plus the greater of .25 inch
+ or .15 times the symbol's length.
+
+ quiet (bool, default 1):
+ Wether to include quiet zones in the symbol.
+
+ lquiet (float, see default below):
+ Quiet zone size to left of code, if quiet is true.
+ Default is the greater of .25 inch, or 10 xdim
+
+ rquiet (float, defaults as above):
+ Quiet zone size to right left of code, if quiet is true.
+
+ Sources of Information on Code 93:
+
+ http://www.semiconductor.agilent.com/barcode/sg/Misc/code_93.html
+
+ Official Spec, "NSI/AIM BC5-1995, USS" is available for US$45 from
+ http://www.aimglobal.org/aimstore/
+ """
+
+ def validate(self):
+ vval = ""
+ self.valid = 1
+ for c in self.value:
+ if c in string.lowercase:
+ c = string.upper(c)
+ if not _patterns.has_key(c):
+ self.valid = 0
+ continue
+ vval = vval + c
+ self.validated = vval
+ return vval
+
+ def encode(self):
+ self.encoded = _encode93(self.validated)
+ return self.encoded
+
+
+class Extended93(_Code93Base):
+ """
+ Extended Code 93 is a convention for encoding the entire 128 character
+ set using pairs of characters to represent the characters missing in
+ Standard Code 93. It is very much like Extended Code 39 in that way.
+
+ See Standard93 for arguments.
+ """
+
+ def validate(self):
+ vval = ""
+ self.valid = 1
+ for c in self.value:
+ if not _patterns.has_key(c) and not _extended.has_key(c):
+ self.valid = 0
+ continue
+ vval = vval + c
+ self.validated = vval
+ return vval
+
+ def encode(self):
+ self.encoded = ""
+ for c in self.validated:
+ if _patterns.has_key(c):
+ self.encoded = self.encoded + c
+ elif _extended.has_key(c):
+ self.encoded = self.encoded + _extended[c]
+ else:
+ raise ValueError
+ self.encoded = _encode93(self.encoded)
+ return self.encoded
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/auction/barcode/common.py b/addons/auction/barcode/common.py
index 0ef19a6e64f..e6933fd1673 100644
--- a/addons/auction/barcode/common.py
+++ b/addons/auction/barcode/common.py
@@ -1,706 +1,707 @@
-#
-# Copyright (c) 1996-2000 Tyler C. Sarna <tsarna@sarna.org>
-# All rights reserved.
-#
-# Redistribution and use in source and binary forms, with or without
-# modification, are permitted provided that the following conditions
-# are met:
-# 1. Redistributions of source code must retain the above copyright
-# notice, this list of conditions and the following disclaimer.
-# 2. Redistributions in binary form must reproduce the above copyright
-# notice, this list of conditions and the following disclaimer in the
-# documentation and/or other materials provided with the distribution.
-# 3. All advertising materials mentioning features or use of this software
-# must display the following acknowledgement:
-# This product includes software developed by Tyler C. Sarna.
-# 4. Neither the name of the author nor the names of contributors
-# may be used to endorse or promote products derived from this software
-# without specific prior written permission.
-#
-# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
-# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
-# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS
-# BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
-# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
-# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
-# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
-# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-# POSSIBILITY OF SUCH DAMAGE.
-#
-
-from reportlab.platypus.flowables import Flowable
-from reportlab.lib.units import inch
-import string
-
-class Barcode(Flowable):
- """Abstract Base for barcodes. Includes implementations of
- some methods suitable for the more primitive barcode types"""
-
- def __init__(self, value = ''):
- self.value = value
-
- if not hasattr(self, 'gap'):
- self.gap = None
-
- self.validate()
- self.encode()
- #print self.encoded
- self.decompose()
- #print self.decomposed
- self.computeSize()
-
- def validate(self):
- self.valid = 1
- self.validated = self.value
-
- def encode(self):
- self.encoded = self.validated
-
- def decompose(self):
- self.decomposed = self.encoded
-
- def computeSize(self, *args):
- xdim = self.xdim
- wx = xdim * self.ratio
-
- if self.gap == None:
- self.gap = xdim
-
- w = 0.0
-
- for c in self.decomposed:
- if c in 'sb':
- w = w + xdim
- elif c in 'SB':
- w = w + wx
- else: # 'i'
- w = w + self.gap
-
- if self.height is None:
- self.height = w * 0.15
- self.height = max(0.25 * inch, self.height)
- if self.bearers:
- self.height = self.height + self.bearers * 2.0 * xdim
-
- if self.quiet:
- w = w + self.lquiet + self.rquiet
- self.xo = self.lquiet
- else:
- self.xo = 0.0
-
- self.width = w
-
- def draw(self):
- xdim = self.xdim
- wx = xdim * self.ratio
-
- left = self.xo
- b = self.bearers * xdim
- bb = b * 0.5
- tb = self.height - (b * 1.5)
-
- for c in self.decomposed:
- if c == 'i':
- left = left + self.gap
- elif c == 's':
- left = left + xdim
- elif c == 'S':
- left = left + wx
- elif c == 'b':
- self.rect(left, bb, xdim, tb)
- left = left + xdim
- elif c == 'B':
- self.rect(left, bb, wx, tb)
- left = left + wx
-
- if self.bearers:
- self.rect(self.lquiet, 0.0, \
- self.width - (self.lquiet + self.rquiet), b)
- self.rect(self.lquiet, self.height - b, \
- self.width - (self.lquiet + self.rquiet), b)
-
- def rect(self, x, y, w, h):
- self.canv.rect(x, y, w, h, stroke=0, fill=1)
-
-
-class MultiWidthBarcode(Barcode):
- """Base for variable-bar-width codes like Code93 and Code128"""
-
- def computeSize(self, *args):
- xdim = self.xdim
- oa, oA = ord('a') - 1, ord('A') - 1
-
- w = 0.0
-
- for c in self.decomposed:
- oc = ord(c)
- if c in string.lowercase:
- w = w + xdim * (oc - oa)
- elif c in string.uppercase:
- w = w + xdim * (oc - oA)
-
- if self.height is None:
- self.height = w * 0.15
- self.height = max(0.25 * inch, self.height)
-
- if self.quiet:
- w = w + self.lquiet + self.rquiet
- self.xo = self.lquiet
- else:
- self.xo = 0.0
-
- self.width = w
-
- def draw(self):
- oa, oA = ord('a') - 1, ord('A') - 1
- xdim = self.xdim
- left = self.xo
-
- for c in self.decomposed:
- oc = ord(c)
- if c in string.lowercase:
- left = left + (oc - oa) * xdim
- elif c in string.uppercase:
- w = (oc - oA) * xdim
- self.rect(left, 0.0, w, self.height)
- left = left + w
-
-
-class I2of5(Barcode):
- """
- Interleaved 2 of 5 is a numeric-only barcode. It encodes an even
- number of digits; if an odd number is given, a 0 is prepended.
-
- Options that may be passed to constructor:
-
- value (int, or numeric string. required.):
- The value to encode.
-
- xdim (float, default .0075):
- X-Dimension, or width of the smallest element
- Minumum is .0075 inch (7.5 mils).
-
- ratio (float, default 2.2):
- The ratio of wide elements to narrow elements.
- Must be between 2.0 and 3.0 (or 2.2 and 3.0 if the
- xdim is greater than 20 mils (.02 inch))
-
- gap (float or None, default None):
- width of intercharacter gap. None means "use xdim".
-
- height (float, see default below):
- Height of the symbol. Default is the height of the two
- bearer bars (if they exist) plus the greater of .25 inch
- or .15 times the symbol's length.
-
- checksum (bool, default 1):
- Wether to compute and include the check digit
-
- bearers (float, in units of xdim. default 3.0):
- Height of bearer bars (horizontal bars along the top and
- bottom of the barcode). Default is 3 x-dimensions.
- Set to zero for no bearer bars. (Bearer bars help detect
- misscans, so it is suggested to leave them on).
-
- quiet (bool, default 1):
- Wether to include quiet zones in the symbol.
-
- lquiet (float, see default below):
- Quiet zone size to left of code, if quiet is true.
- Default is the greater of .25 inch, or .15 times the symbol's
- length.
-
- rquiet (float, defaults as above):
- Quiet zone size to right left of code, if quiet is true.
-
- Sources of Information on Interleaved 2 of 5:
-
- http://www.semiconductor.agilent.com/barcode/sg/Misc/i_25.html
- http://www.adams1.com/pub/russadam/i25code.html
-
- Official Spec, "ANSI/AIM BC2-1995, USS" is available for US$45 from
- http://www.aimglobal.org/aimstore/
- """
-
- patterns = {
- 'start' : 'bsbs',
- 'stop' : 'Bsb',
-
- 'B0' : 'bbBBb', 'S0' : 'ssSSs',
- 'B1' : 'BbbbB', 'S1' : 'SsssS',
- 'B2' : 'bBbbB', 'S2' : 'sSssS',
- 'B3' : 'BBbbb', 'S3' : 'SSsss',
- 'B4' : 'bbBbB', 'S4' : 'ssSsS',
- 'B5' : 'BbBbb', 'S5' : 'SsSss',
- 'B6' : 'bBBbb', 'S6' : 'sSSss',
- 'B7' : 'bbbBB', 'S7' : 'sssSS',
- 'B8' : 'BbbBb', 'S8' : 'SssSs',
- 'B9' : 'bBbBb', 'S9' : 'sSsSs'
- }
-
- def __init__(self, value='', **args):
- self.height = None
- self.xdim = inch * 0.0075
- self.ratio = 2.2
- self.checksum = 1
- self.bearers = 3.0
- self.quiet = 1
- self.lquiet = self.rquiet = None
-
- if type(value) == type(1):
- value = str(value)
-
- for (k, v) in args.items():
- setattr(self, k, v)
-
- if self.quiet:
- if self.lquiet is None:
- self.lquiet = min(inch * 0.25, self.xdim * 10.0)
- self.rquiet = min(inch * 0.25, self.xdim * 10.0)
- else:
- self.lquiet = self.rquiet = 0.0
-
- Barcode.__init__(self, value)
-
- def validate(self):
- vval = ""
- self.valid = 1
- for c in string.strip(self.value):
- if c not in string.digits:
- self.valid = 0
- continue
- vval = vval + c
- self.validated = vval
- return vval
-
- def encode(self):
- s = self.validated
-
- # make sure result will be a multiple of 2 digits long,
- # checksum included
- if ((len(self.validated) % 2 == 0) and self.checksum) \
- or ((len(self.validated) % 2 == 1) and not self.checksum):
- s = '0' + s
-
- if self.checksum:
- c = 0
- cm = 3
-
- for d in s:
- c = c + cm * int(d)
- if cm == 3:
- cm = 1
- else:
- cm = 3
-
- d = 10 - (int(d) % 10)
- s = s + `d`
-
- self.encoded = s
-
- def decompose(self):
- dval = self.patterns['start']
-
- for i in range(0, len(self.encoded), 2):
- b = self.patterns['B' + self.encoded[i]]
- s = self.patterns['S' + self.encoded[i+1]]
-
- for i in range(0, len(b)):
- dval = dval + b[i] + s[i]
-
- self.decomposed = dval + self.patterns['stop']
- return self.decomposed
-
-
-
-class MSI(Barcode):
- """
- MSI is a numeric-only barcode.
-
- Options that may be passed to constructor:
-
- value (int, or numeric string. required.):
- The value to encode.
-
- xdim (float, default .0075):
- X-Dimension, or width of the smallest element
-
- ratio (float, default 2.2):
- The ratio of wide elements to narrow elements.
-
- gap (float or None, default None):
- width of intercharacter gap. None means "use xdim".
-
- height (float, see default below):
- Height of the symbol. Default is the height of the two
- bearer bars (if they exist) plus the greater of .25 inch
- or .15 times the symbol's length.
-
- checksum (bool, default 1):
- Wether to compute and include the check digit
-
- bearers (float, in units of xdim. default 0):
- Height of bearer bars (horizontal bars along the top and
- bottom of the barcode). Default is 0 (no bearers).
-
- lquiet (float, see default below):
- Quiet zone size to left of code, if quiet is true.
- Default is the greater of .25 inch, or 10 xdims.
-
- rquiet (float, defaults as above):
- Quiet zone size to right left of code, if quiet is true.
-
- Sources of Information on MSI Bar Code:
-
- http://www.semiconductor.agilent.com/barcode/sg/Misc/msi_code.html
- http://www.adams1.com/pub/russadam/plessy.html
- """
-
- patterns = {
- 'start' : 'Bs', 'stop' : 'bSb',
-
- '0' : 'bSbSbSbS', '1' : 'bSbSbSBs',
- '2' : 'bSbSBsbS', '3' : 'bSbSBsBs',
- '4' : 'bSBsbSbS', '5' : 'bSBsbSBs',
- '6' : 'bSBsBsbS', '7' : 'bSBsBsBs',
- '8' : 'BsbSbSbS', '9' : 'BsbSbSBs'
- }
-
- def __init__(self, value="", **args):
- self.height = None
- self.xdim = inch * 0.0075
- self.ratio = 2.2
- self.checksum = 1
- self.bearers = 0.0
- self.quiet = 1
- self.lquiet = self.rquiet = None
-
- if type(value) == type(1):
- value = str(value)
-
- for (k, v) in args.items():
- setattr(self, k, v)
-
- if self.quiet:
- if self.lquiet is None:
- self.lquiet = max(inch * 0.25, self.xdim * 10.0)
- self.rquiet = max(inch * 0.25, self.xdim * 10.0)
- else:
- self.lquiet = self.rquiet = 0.0
-
- Barcode.__init__(self, value)
-
- def validate(self):
- vval = ""
- self.valid = 1
- for c in string.strip(self.value):
- if c not in string.digits:
- self.valid = 0
- continue
- vval = vval + c
- self.validated = vval
- return vval
-
- def encode(self):
- s = self.validated
-
- if self.checksum:
- c = ''
- for i in range(1, len(s), 2):
- c = c + s[i]
- d = str(int(c) * 2)
- t = 0
- for c in d:
- t = t + int(c)
- for i in range(0, len(s), 2):
- t = t + int(s[i])
- c = 10 - (t % 10)
-
- s = s + str(c)
-
- self.encoded = s
-
- def decompose(self):
- dval = self.patterns['start']
-
- for c in self.encoded:
- dval = dval + self.patterns[c]
-
- self.decomposed = dval + self.patterns['stop']
- return self.decomposed
-
-
-
-class Codabar(Barcode):
- """
- Codabar is a numeric plus some puntuation ("-$:/.+") barcode
- with four start/stop characters (A, B, C, and D).
-
- Options that may be passed to constructor:
-
- value (string. required.):
- The value to encode.
-
- xdim (float, default .0065):
- X-Dimension, or width of the smallest element
- minimum is 6.5 mils (.0065 inch)
-
- ratio (float, default 2.0):
- The ratio of wide elements to narrow elements.
-
- gap (float or None, default None):
- width of intercharacter gap. None means "use xdim".
-
- height (float, see default below):
- Height of the symbol. Default is the height of the two
- bearer bars (if they exist) plus the greater of .25 inch
- or .15 times the symbol's length.
-
- checksum (bool, default 0):
- Wether to compute and include the check digit
-
- bearers (float, in units of xdim. default 0):
- Height of bearer bars (horizontal bars along the top and
- bottom of the barcode). Default is 0 (no bearers).
-
- quiet (bool, default 1):
- Wether to include quiet zones in the symbol.
-
- lquiet (float, see default below):
- Quiet zone size to left of code, if quiet is true.
- Default is the greater of .25 inch, or 10 xdim
-
- rquiet (float, defaults as above):
- Quiet zone size to right left of code, if quiet is true.
-
- Sources of Information on Codabar
-
- http://www.semiconductor.agilent.com/barcode/sg/Misc/codabar.html
- http://www.barcodeman.com/codabar.html
-
- Official Spec, "ANSI/AIM BC3-1995, USS" is available for US$45 from
- http://www.aimglobal.org/aimstore/
- """
-
- patterns = {
- '0': 'bsbsbSB', '1': 'bsbsBSb', '2': 'bsbSbsB',
- '3': 'BSbsbsb', '4': 'bsBsbSb', '5': 'BsbsbSb',
- '6': 'bSbsbsB', '7': 'bSbsBsb', '8': 'bSBsbsb',
- '9': 'BsbSbsb', '-': 'bsbSBsb', '$': 'bsBSbsb',
- ':': 'BsbsBsB', '/': 'BsBsbsB', '.': 'BsBsBsb',
- '+': 'bsBsBsB', 'A': 'bsBSbSb', 'B': 'bSbSbsB',
- 'C': 'bsbSbSB', 'D': 'bsbSBSb'
- }
-
- values = {
- '0' : 0, '1' : 1, '2' : 2, '3' : 3, '4' : 4,
- '5' : 5, '6' : 6, '7' : 7, '8' : 8, '9' : 9,
- '-' : 10, '$' : 11, ':' : 12, '/' : 13, '.' : 14,
- '+' : 15, 'A' : 16, 'B' : 17, 'C' : 18, 'D' : 19
- }
-
- chars = string.digits + "-$:/.+"
-
- def __init__(self, value='', **args):
- self.height = None
- self.xdim = inch * 0.0065
- self.ratio = 2.0 # XXX ?
- self.checksum = 0
- self.bearers = 0.0
- self.quiet = 1
- self.lquiet = self.rquiet = None
-
- if type(value) == type(1):
- value = str(value)
-
- for (k, v) in args.items():
- setattr(self, k, v)
-
- if self.quiet:
- if self.lquiet is None:
- self.lquiet = min(inch * 0.25, self.xdim * 10.0)
- self.rquiet = min(inch * 0.25, self.xdim * 10.0)
- else:
- self.lquiet = self.rquiet = 0.0
-
- Barcode.__init__(self, value)
-
- def validate(self):
- vval = ""
- self.valid = 1
- s = string.strip(self.value)
- for i in range(0, len(s)):
- c = s[i]
- if c not in self.chars:
- if ((i != 0) and (i != len(s) - 1)) or (c not in 'ABCD'):
- self.Valid = 0
- continue
- vval = vval + c
-
- if vval[0] not in 'ABCD':
- vval = 'A' + vval
- if vval[-1] not in 'ABCD':
- vval = vval + vval[0]
-
- self.validated = vval
- return vval
-
- def encode(self):
- s = self.validated
-
- if self.checksum:
- v = 0
- for c in s:
- v = v + self.values[v]
- v = 16 - (v % 16)
- s = s + self.chars[v]
-
- self.encoded = s
-
- def decompose(self):
- dval = ""
- for c in self.encoded:
- dval = dval + self.patterns[c] + 'i'
- self.decomposed = dval[:-1]
- return self.decomposed
-
-
-
-class Code11(Barcode):
- """
- Code 11 is an almost-numeric barcode. It encodes the digits 0-9 plus
- dash ("-"). 11 characters total, hence the name.
-
- value (int or string. required.):
- The value to encode.
-
- xdim (float, default .0075):
- X-Dimension, or width of the smallest element
-
- ratio (float, default 2.2):
- The ratio of wide elements to narrow elements.
-
- gap (float or None, default None):
- width of intercharacter gap. None means "use xdim".
-
- height (float, see default below):
- Height of the symbol. Default is the height of the two
- bearer bars (if they exist) plus the greater of .25 inch
- or .15 times the symbol's length.
-
- checksum (0 none, 1 1-digit, 2 2-digit, -1 auto, default -1):
- How many checksum digits to include. -1 ("auto") means
- 1 if the number of digits is 10 or less, else 2.
-
- bearers (float, in units of xdim. default 0):
- Height of bearer bars (horizontal bars along the top and
- bottom of the barcode). Default is 0 (no bearers).
-
- quiet (bool, default 1):
- Wether to include quiet zones in the symbol.
-
- lquiet (float, see default below):
- Quiet zone size to left of code, if quiet is true.
- Default is the greater of .25 inch, or 10 xdim
-
- rquiet (float, defaults as above):
- Quiet zone size to right left of code, if quiet is true.
-
- Sources of Information on Code 11:
-
- http://www.cwi.nl/people/dik/english/codes/barcodes.html
- """
-
- chars = string.digits + '-'
-
- patterns = {
- '0' : 'bsbsB', '1' : 'BsbsB', '2' : 'bSbsB',
- '3' : 'BSbsb', '4' : 'bsBsB', '5' : 'BsBsb',
- '6' : 'bSBsb', '7' : 'bsbSB', '8' : 'BsbSb',
- '9' : 'Bsbsb', '-' : 'bsBsb', 'S' : 'bsBSb' # Start/Stop
- }
-
- values = {
- '0' : 0, '1' : 1, '2' : 2, '3' : 3, '4' : 4,
- '5' : 5, '6' : 6, '7' : 7, '8' : 8, '9' : 9,
- '-' : 10,
- }
-
- def __init__(self, value='', **args):
- self.height = None
- self.xdim = inch * 0.0075
- self.ratio = 2.2 # XXX ?
- self.checksum = -1 # Auto
- self.bearers = 0.0
- self.quiet = 1
- self.lquiet = self.rquiet = None
-
- if type(value) == type(1):
- value = str(value)
-
- for (k, v) in args.items():
- setattr(self, k, v)
-
- if self.quiet:
- if self.lquiet is None:
- self.lquiet = min(inch * 0.25, self.xdim * 10.0)
- self.rquiet = min(inch * 0.25, self.xdim * 10.0)
- else:
- self.lquiet = self.rquiet = 0.0
-
- Barcode.__init__(self, value)
-
- def validate(self):
- vval = ""
- self.valid = 1
- s = string.strip(self.value)
- for i in range(0, len(s)):
- c = s[i]
- if c not in self.chars:
- self.Valid = 0
- continue
- vval = vval + c
-
- self.validated = vval
- return vval
-
- def encode(self):
- s = self.validated
-
- if self.checksum == -1:
- if len(s) <= 10:
- self.checksum = 1
- else:
- self.checksum = 2
-
- if self.checksum > 0:
- # compute first checksum
- i = 0; v = 1; c = 0
- while i < len(s):
- c = c + v * string.index(self.chars, s[-(i+1)])
- i = i + 1; v = v + 1
- if v > 10:
- v = 1
- s = s + self.chars[c % 11]
-
- if self.checksum > 1:
- # compute second checksum
- i = 0; v = 1; c = 0
- while i < len(s):
- c = c + v * string.index(self.chars, s[-(i+1)])
- i = i + 1; v = v + 1
- if v > 9:
- v = 1
- s = s + self.chars[c % 10]
-
- self.encoded = 'S' + s + 'S'
-
- def decompose(self):
- dval = ""
- for c in self.encoded:
- dval = dval + self.patterns[c] + 'i'
- self.decomposed = dval[:-1]
- return self.decomposed
+# -*- coding: utf-8 -*-
+#
+# Copyright (c) 1996-2000 Tyler C. Sarna <tsarna@sarna.org>
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+# 1. Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# 2. Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in the
+# documentation and/or other materials provided with the distribution.
+# 3. All advertising materials mentioning features or use of this software
+# must display the following acknowledgement:
+# This product includes software developed by Tyler C. Sarna.
+# 4. Neither the name of the author nor the names of contributors
+# may be used to endorse or promote products derived from this software
+# without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS
+# BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+# POSSIBILITY OF SUCH DAMAGE.
+#
+
+from reportlab.platypus.flowables import Flowable
+from reportlab.lib.units import inch
+import string
+
+class Barcode(Flowable):
+ """Abstract Base for barcodes. Includes implementations of
+ some methods suitable for the more primitive barcode types"""
+
+ def __init__(self, value = ''):
+ self.value = value
+
+ if not hasattr(self, 'gap'):
+ self.gap = None
+
+ self.validate()
+ self.encode()
+ #print self.encoded
+ self.decompose()
+ #print self.decomposed
+ self.computeSize()
+
+ def validate(self):
+ self.valid = 1
+ self.validated = self.value
+
+ def encode(self):
+ self.encoded = self.validated
+
+ def decompose(self):
+ self.decomposed = self.encoded
+
+ def computeSize(self, *args):
+ xdim = self.xdim
+ wx = xdim * self.ratio
+
+ if self.gap == None:
+ self.gap = xdim
+
+ w = 0.0
+
+ for c in self.decomposed:
+ if c in 'sb':
+ w = w + xdim
+ elif c in 'SB':
+ w = w + wx
+ else: # 'i'
+ w = w + self.gap
+
+ if self.height is None:
+ self.height = w * 0.15
+ self.height = max(0.25 * inch, self.height)
+ if self.bearers:
+ self.height = self.height + self.bearers * 2.0 * xdim
+
+ if self.quiet:
+ w = w + self.lquiet + self.rquiet
+ self.xo = self.lquiet
+ else:
+ self.xo = 0.0
+
+ self.width = w
+
+ def draw(self):
+ xdim = self.xdim
+ wx = xdim * self.ratio
+
+ left = self.xo
+ b = self.bearers * xdim
+ bb = b * 0.5
+ tb = self.height - (b * 1.5)
+
+ for c in self.decomposed:
+ if c == 'i':
+ left = left + self.gap
+ elif c == 's':
+ left = left + xdim
+ elif c == 'S':
+ left = left + wx
+ elif c == 'b':
+ self.rect(left, bb, xdim, tb)
+ left = left + xdim
+ elif c == 'B':
+ self.rect(left, bb, wx, tb)
+ left = left + wx
+
+ if self.bearers:
+ self.rect(self.lquiet, 0.0, \
+ self.width - (self.lquiet + self.rquiet), b)
+ self.rect(self.lquiet, self.height - b, \
+ self.width - (self.lquiet + self.rquiet), b)
+
+ def rect(self, x, y, w, h):
+ self.canv.rect(x, y, w, h, stroke=0, fill=1)
+
+
+class MultiWidthBarcode(Barcode):
+ """Base for variable-bar-width codes like Code93 and Code128"""
+
+ def computeSize(self, *args):
+ xdim = self.xdim
+ oa, oA = ord('a') - 1, ord('A') - 1
+
+ w = 0.0
+
+ for c in self.decomposed:
+ oc = ord(c)
+ if c in string.lowercase:
+ w = w + xdim * (oc - oa)
+ elif c in string.uppercase:
+ w = w + xdim * (oc - oA)
+
+ if self.height is None:
+ self.height = w * 0.15
+ self.height = max(0.25 * inch, self.height)
+
+ if self.quiet:
+ w = w + self.lquiet + self.rquiet
+ self.xo = self.lquiet
+ else:
+ self.xo = 0.0
+
+ self.width = w
+
+ def draw(self):
+ oa, oA = ord('a') - 1, ord('A') - 1
+ xdim = self.xdim
+ left = self.xo
+
+ for c in self.decomposed:
+ oc = ord(c)
+ if c in string.lowercase:
+ left = left + (oc - oa) * xdim
+ elif c in string.uppercase:
+ w = (oc - oA) * xdim
+ self.rect(left, 0.0, w, self.height)
+ left = left + w
+
+
+class I2of5(Barcode):
+ """
+ Interleaved 2 of 5 is a numeric-only barcode. It encodes an even
+ number of digits; if an odd number is given, a 0 is prepended.
+
+ Options that may be passed to constructor:
+
+ value (int, or numeric string. required.):
+ The value to encode.
+
+ xdim (float, default .0075):
+ X-Dimension, or width of the smallest element
+ Minumum is .0075 inch (7.5 mils).
+
+ ratio (float, default 2.2):
+ The ratio of wide elements to narrow elements.
+ Must be between 2.0 and 3.0 (or 2.2 and 3.0 if the
+ xdim is greater than 20 mils (.02 inch))
+
+ gap (float or None, default None):
+ width of intercharacter gap. None means "use xdim".
+
+ height (float, see default below):
+ Height of the symbol. Default is the height of the two
+ bearer bars (if they exist) plus the greater of .25 inch
+ or .15 times the symbol's length.
+
+ checksum (bool, default 1):
+ Wether to compute and include the check digit
+
+ bearers (float, in units of xdim. default 3.0):
+ Height of bearer bars (horizontal bars along the top and
+ bottom of the barcode). Default is 3 x-dimensions.
+ Set to zero for no bearer bars. (Bearer bars help detect
+ misscans, so it is suggested to leave them on).
+
+ quiet (bool, default 1):
+ Wether to include quiet zones in the symbol.
+
+ lquiet (float, see default below):
+ Quiet zone size to left of code, if quiet is true.
+ Default is the greater of .25 inch, or .15 times the symbol's
+ length.
+
+ rquiet (float, defaults as above):
+ Quiet zone size to right left of code, if quiet is true.
+
+ Sources of Information on Interleaved 2 of 5:
+
+ http://www.semiconductor.agilent.com/barcode/sg/Misc/i_25.html
+ http://www.adams1.com/pub/russadam/i25code.html
+
+ Official Spec, "ANSI/AIM BC2-1995, USS" is available for US$45 from
+ http://www.aimglobal.org/aimstore/
+ """
+
+ patterns = {
+ 'start' : 'bsbs',
+ 'stop' : 'Bsb',
+
+ 'B0' : 'bbBBb', 'S0' : 'ssSSs',
+ 'B1' : 'BbbbB', 'S1' : 'SsssS',
+ 'B2' : 'bBbbB', 'S2' : 'sSssS',
+ 'B3' : 'BBbbb', 'S3' : 'SSsss',
+ 'B4' : 'bbBbB', 'S4' : 'ssSsS',
+ 'B5' : 'BbBbb', 'S5' : 'SsSss',
+ 'B6' : 'bBBbb', 'S6' : 'sSSss',
+ 'B7' : 'bbbBB', 'S7' : 'sssSS',
+ 'B8' : 'BbbBb', 'S8' : 'SssSs',
+ 'B9' : 'bBbBb', 'S9' : 'sSsSs'
+ }
+
+ def __init__(self, value='', **args):
+ self.height = None
+ self.xdim = inch * 0.0075
+ self.ratio = 2.2
+ self.checksum = 1
+ self.bearers = 3.0
+ self.quiet = 1
+ self.lquiet = self.rquiet = None
+
+ if type(value) == type(1):
+ value = str(value)
+
+ for (k, v) in args.items():
+ setattr(self, k, v)
+
+ if self.quiet:
+ if self.lquiet is None:
+ self.lquiet = min(inch * 0.25, self.xdim * 10.0)
+ self.rquiet = min(inch * 0.25, self.xdim * 10.0)
+ else:
+ self.lquiet = self.rquiet = 0.0
+
+ Barcode.__init__(self, value)
+
+ def validate(self):
+ vval = ""
+ self.valid = 1
+ for c in string.strip(self.value):
+ if c not in string.digits:
+ self.valid = 0
+ continue
+ vval = vval + c
+ self.validated = vval
+ return vval
+
+ def encode(self):
+ s = self.validated
+
+ # make sure result will be a multiple of 2 digits long,
+ # checksum included
+ if ((len(self.validated) % 2 == 0) and self.checksum) \
+ or ((len(self.validated) % 2 == 1) and not self.checksum):
+ s = '0' + s
+
+ if self.checksum:
+ c = 0
+ cm = 3
+
+ for d in s:
+ c = c + cm * int(d)
+ if cm == 3:
+ cm = 1
+ else:
+ cm = 3
+
+ d = 10 - (int(d) % 10)
+ s = s + `d`
+
+ self.encoded = s
+
+ def decompose(self):
+ dval = self.patterns['start']
+
+ for i in range(0, len(self.encoded), 2):
+ b = self.patterns['B' + self.encoded[i]]
+ s = self.patterns['S' + self.encoded[i+1]]
+
+ for i in range(0, len(b)):
+ dval = dval + b[i] + s[i]
+
+ self.decomposed = dval + self.patterns['stop']
+ return self.decomposed
+
+
+
+class MSI(Barcode):
+ """
+ MSI is a numeric-only barcode.
+
+ Options that may be passed to constructor:
+
+ value (int, or numeric string. required.):
+ The value to encode.
+
+ xdim (float, default .0075):
+ X-Dimension, or width of the smallest element
+
+ ratio (float, default 2.2):
+ The ratio of wide elements to narrow elements.
+
+ gap (float or None, default None):
+ width of intercharacter gap. None means "use xdim".
+
+ height (float, see default below):
+ Height of the symbol. Default is the height of the two
+ bearer bars (if they exist) plus the greater of .25 inch
+ or .15 times the symbol's length.
+
+ checksum (bool, default 1):
+ Wether to compute and include the check digit
+
+ bearers (float, in units of xdim. default 0):
+ Height of bearer bars (horizontal bars along the top and
+ bottom of the barcode). Default is 0 (no bearers).
+
+ lquiet (float, see default below):
+ Quiet zone size to left of code, if quiet is true.
+ Default is the greater of .25 inch, or 10 xdims.
+
+ rquiet (float, defaults as above):
+ Quiet zone size to right left of code, if quiet is true.
+
+ Sources of Information on MSI Bar Code:
+
+ http://www.semiconductor.agilent.com/barcode/sg/Misc/msi_code.html
+ http://www.adams1.com/pub/russadam/plessy.html
+ """
+
+ patterns = {
+ 'start' : 'Bs', 'stop' : 'bSb',
+
+ '0' : 'bSbSbSbS', '1' : 'bSbSbSBs',
+ '2' : 'bSbSBsbS', '3' : 'bSbSBsBs',
+ '4' : 'bSBsbSbS', '5' : 'bSBsbSBs',
+ '6' : 'bSBsBsbS', '7' : 'bSBsBsBs',
+ '8' : 'BsbSbSbS', '9' : 'BsbSbSBs'
+ }
+
+ def __init__(self, value="", **args):
+ self.height = None
+ self.xdim = inch * 0.0075
+ self.ratio = 2.2
+ self.checksum = 1
+ self.bearers = 0.0
+ self.quiet = 1
+ self.lquiet = self.rquiet = None
+
+ if type(value) == type(1):
+ value = str(value)
+
+ for (k, v) in args.items():
+ setattr(self, k, v)
+
+ if self.quiet:
+ if self.lquiet is None:
+ self.lquiet = max(inch * 0.25, self.xdim * 10.0)
+ self.rquiet = max(inch * 0.25, self.xdim * 10.0)
+ else:
+ self.lquiet = self.rquiet = 0.0
+
+ Barcode.__init__(self, value)
+
+ def validate(self):
+ vval = ""
+ self.valid = 1
+ for c in string.strip(self.value):
+ if c not in string.digits:
+ self.valid = 0
+ continue
+ vval = vval + c
+ self.validated = vval
+ return vval
+
+ def encode(self):
+ s = self.validated
+
+ if self.checksum:
+ c = ''
+ for i in range(1, len(s), 2):
+ c = c + s[i]
+ d = str(int(c) * 2)
+ t = 0
+ for c in d:
+ t = t + int(c)
+ for i in range(0, len(s), 2):
+ t = t + int(s[i])
+ c = 10 - (t % 10)
+
+ s = s + str(c)
+
+ self.encoded = s
+
+ def decompose(self):
+ dval = self.patterns['start']
+
+ for c in self.encoded:
+ dval = dval + self.patterns[c]
+
+ self.decomposed = dval + self.patterns['stop']
+ return self.decomposed
+
+
+
+class Codabar(Barcode):
+ """
+ Codabar is a numeric plus some puntuation ("-$:/.+") barcode
+ with four start/stop characters (A, B, C, and D).
+
+ Options that may be passed to constructor:
+
+ value (string. required.):
+ The value to encode.
+
+ xdim (float, default .0065):
+ X-Dimension, or width of the smallest element
+ minimum is 6.5 mils (.0065 inch)
+
+ ratio (float, default 2.0):
+ The ratio of wide elements to narrow elements.
+
+ gap (float or None, default None):
+ width of intercharacter gap. None means "use xdim".
+
+ height (float, see default below):
+ Height of the symbol. Default is the height of the two
+ bearer bars (if they exist) plus the greater of .25 inch
+ or .15 times the symbol's length.
+
+ checksum (bool, default 0):
+ Wether to compute and include the check digit
+
+ bearers (float, in units of xdim. default 0):
+ Height of bearer bars (horizontal bars along the top and
+ bottom of the barcode). Default is 0 (no bearers).
+
+ quiet (bool, default 1):
+ Wether to include quiet zones in the symbol.
+
+ lquiet (float, see default below):
+ Quiet zone size to left of code, if quiet is true.
+ Default is the greater of .25 inch, or 10 xdim
+
+ rquiet (float, defaults as above):
+ Quiet zone size to right left of code, if quiet is true.
+
+ Sources of Information on Codabar
+
+ http://www.semiconductor.agilent.com/barcode/sg/Misc/codabar.html
+ http://www.barcodeman.com/codabar.html
+
+ Official Spec, "ANSI/AIM BC3-1995, USS" is available for US$45 from
+ http://www.aimglobal.org/aimstore/
+ """
+
+ patterns = {
+ '0': 'bsbsbSB', '1': 'bsbsBSb', '2': 'bsbSbsB',
+ '3': 'BSbsbsb', '4': 'bsBsbSb', '5': 'BsbsbSb',
+ '6': 'bSbsbsB', '7': 'bSbsBsb', '8': 'bSBsbsb',
+ '9': 'BsbSbsb', '-': 'bsbSBsb', '$': 'bsBSbsb',
+ ':': 'BsbsBsB', '/': 'BsBsbsB', '.': 'BsBsBsb',
+ '+': 'bsBsBsB', 'A': 'bsBSbSb', 'B': 'bSbSbsB',
+ 'C': 'bsbSbSB', 'D': 'bsbSBSb'
+ }
+
+ values = {
+ '0' : 0, '1' : 1, '2' : 2, '3' : 3, '4' : 4,
+ '5' : 5, '6' : 6, '7' : 7, '8' : 8, '9' : 9,
+ '-' : 10, '$' : 11, ':' : 12, '/' : 13, '.' : 14,
+ '+' : 15, 'A' : 16, 'B' : 17, 'C' : 18, 'D' : 19
+ }
+
+ chars = string.digits + "-$:/.+"
+
+ def __init__(self, value='', **args):
+ self.height = None
+ self.xdim = inch * 0.0065
+ self.ratio = 2.0 # XXX ?
+ self.checksum = 0
+ self.bearers = 0.0
+ self.quiet = 1
+ self.lquiet = self.rquiet = None
+
+ if type(value) == type(1):
+ value = str(value)
+
+ for (k, v) in args.items():
+ setattr(self, k, v)
+
+ if self.quiet:
+ if self.lquiet is None:
+ self.lquiet = min(inch * 0.25, self.xdim * 10.0)
+ self.rquiet = min(inch * 0.25, self.xdim * 10.0)
+ else:
+ self.lquiet = self.rquiet = 0.0
+
+ Barcode.__init__(self, value)
+
+ def validate(self):
+ vval = ""
+ self.valid = 1
+ s = string.strip(self.value)
+ for i in range(0, len(s)):
+ c = s[i]
+ if c not in self.chars:
+ if ((i != 0) and (i != len(s) - 1)) or (c not in 'ABCD'):
+ self.Valid = 0
+ continue
+ vval = vval + c
+
+ if vval[0] not in 'ABCD':
+ vval = 'A' + vval
+ if vval[-1] not in 'ABCD':
+ vval = vval + vval[0]
+
+ self.validated = vval
+ return vval
+
+ def encode(self):
+ s = self.validated
+
+ if self.checksum:
+ v = 0
+ for c in s:
+ v = v + self.values[v]
+ v = 16 - (v % 16)
+ s = s + self.chars[v]
+
+ self.encoded = s
+
+ def decompose(self):
+ dval = ""
+ for c in self.encoded:
+ dval = dval + self.patterns[c] + 'i'
+ self.decomposed = dval[:-1]
+ return self.decomposed
+
+
+
+class Code11(Barcode):
+ """
+ Code 11 is an almost-numeric barcode. It encodes the digits 0-9 plus
+ dash ("-"). 11 characters total, hence the name.
+
+ value (int or string. required.):
+ The value to encode.
+
+ xdim (float, default .0075):
+ X-Dimension, or width of the smallest element
+
+ ratio (float, default 2.2):
+ The ratio of wide elements to narrow elements.
+
+ gap (float or None, default None):
+ width of intercharacter gap. None means "use xdim".
+
+ height (float, see default below):
+ Height of the symbol. Default is the height of the two
+ bearer bars (if they exist) plus the greater of .25 inch
+ or .15 times the symbol's length.
+
+ checksum (0 none, 1 1-digit, 2 2-digit, -1 auto, default -1):
+ How many checksum digits to include. -1 ("auto") means
+ 1 if the number of digits is 10 or less, else 2.
+
+ bearers (float, in units of xdim. default 0):
+ Height of bearer bars (horizontal bars along the top and
+ bottom of the barcode). Default is 0 (no bearers).
+
+ quiet (bool, default 1):
+ Wether to include quiet zones in the symbol.
+
+ lquiet (float, see default below):
+ Quiet zone size to left of code, if quiet is true.
+ Default is the greater of .25 inch, or 10 xdim
+
+ rquiet (float, defaults as above):
+ Quiet zone size to right left of code, if quiet is true.
+
+ Sources of Information on Code 11:
+
+ http://www.cwi.nl/people/dik/english/codes/barcodes.html
+ """
+
+ chars = string.digits + '-'
+
+ patterns = {
+ '0' : 'bsbsB', '1' : 'BsbsB', '2' : 'bSbsB',
+ '3' : 'BSbsb', '4' : 'bsBsB', '5' : 'BsBsb',
+ '6' : 'bSBsb', '7' : 'bsbSB', '8' : 'BsbSb',
+ '9' : 'Bsbsb', '-' : 'bsBsb', 'S' : 'bsBSb' # Start/Stop
+ }
+
+ values = {
+ '0' : 0, '1' : 1, '2' : 2, '3' : 3, '4' : 4,
+ '5' : 5, '6' : 6, '7' : 7, '8' : 8, '9' : 9,
+ '-' : 10,
+ }
+
+ def __init__(self, value='', **args):
+ self.height = None
+ self.xdim = inch * 0.0075
+ self.ratio = 2.2 # XXX ?
+ self.checksum = -1 # Auto
+ self.bearers = 0.0
+ self.quiet = 1
+ self.lquiet = self.rquiet = None
+
+ if type(value) == type(1):
+ value = str(value)
+
+ for (k, v) in args.items():
+ setattr(self, k, v)
+
+ if self.quiet:
+ if self.lquiet is None:
+ self.lquiet = min(inch * 0.25, self.xdim * 10.0)
+ self.rquiet = min(inch * 0.25, self.xdim * 10.0)
+ else:
+ self.lquiet = self.rquiet = 0.0
+
+ Barcode.__init__(self, value)
+
+ def validate(self):
+ vval = ""
+ self.valid = 1
+ s = string.strip(self.value)
+ for i in range(0, len(s)):
+ c = s[i]
+ if c not in self.chars:
+ self.Valid = 0
+ continue
+ vval = vval + c
+
+ self.validated = vval
+ return vval
+
+ def encode(self):
+ s = self.validated
+
+ if self.checksum == -1:
+ if len(s) <= 10:
+ self.checksum = 1
+ else:
+ self.checksum = 2
+
+ if self.checksum > 0:
+ # compute first checksum
+ i = 0; v = 1; c = 0
+ while i < len(s):
+ c = c + v * string.index(self.chars, s[-(i+1)])
+ i = i + 1; v = v + 1
+ if v > 10:
+ v = 1
+ s = s + self.chars[c % 11]
+
+ if self.checksum > 1:
+ # compute second checksum
+ i = 0; v = 1; c = 0
+ while i < len(s):
+ c = c + v * string.index(self.chars, s[-(i+1)])
+ i = i + 1; v = v + 1
+ if v > 9:
+ v = 1
+ s = s + self.chars[c % 10]
+
+ self.encoded = 'S' + s + 'S'
+
+ def decompose(self):
+ dval = ""
+ for c in self.encoded:
+ dval = dval + self.patterns[c] + 'i'
+ self.decomposed = dval[:-1]
+ return self.decomposed
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/auction/barcode/fourstate.py b/addons/auction/barcode/fourstate.py
index b83e7378f9b..831c878b9d1 100644
--- a/addons/auction/barcode/fourstate.py
+++ b/addons/auction/barcode/fourstate.py
@@ -1,82 +1,83 @@
-#
-# Copyright (c) 2000 Tyler C. Sarna <tsarna@sarna.org>
-# All rights reserved.
-#
-# Redistribution and use in source and binary forms, with or without
-# modification, are permitted provided that the following conditions
-# are met:
-# 1. Redistributions of source code must retain the above copyright
-# notice, this list of conditions and the following disclaimer.
-# 2. Redistributions in binary form must reproduce the above copyright
-# notice, this list of conditions and the following disclaimer in the
-# documentation and/or other materials provided with the distribution.
-# 3. All advertising materials mentioning features or use of this software
-# must display the following acknowledgement:
-# This product includes software developed by Tyler C. Sarna.
-# 4. Neither the name of the author nor the names of contributors
-# may be used to endorse or promote products derived from this software
-# without specific prior written permission.
-#
-# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
-# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
-# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS
-# BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
-# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
-# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
-# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
-# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-# POSSIBILITY OF SUCH DAMAGE.
-#
-
-from reportlab.lib.units import inch
-from common import Barcode
-import string
-
-# . 3 T Tracker
-# , 2 D Descender
-# ' 1 A Ascender
-# | 0 H Ascender/Descender
-
-_rm_patterns = {
- "0" : "--||", "1" : "-',|", "2" : "-'|,", "3" : "'-,|",
- "4" : "'-|,", "5" : "'',,", "6" : "-,'|", "7" : "-|-|",
- "8" : "-|',", "9" : "',-|", "A" : "',',", "B" : "'|-,",
- "C" : "-,|'", "D" : "-|,'", "E" : "-||-", "F" : "',,'",
- "G" : "',|-", "H" : "'|,-", "I" : ",-'|", "J" : ",'-|",
- "K" : ",'',", "L" : "|--|", "M" : "|-',", "N" : "|'-,",
- "O" : ",-|'", "P" : ",','", "Q" : ",'|-", "R" : "|-,'",
- "S" : "|-|-", "T" : "|',-", "U" : ",,''", "V" : ",|-'",
- "W" : ",|'-", "X" : "|,-'", "Y" : "|,'-", "Z" : "||--",
-
- # start, stop
- "(" : "'-,'", ")" : "'|,|"
-}
-
-_ozN_patterns = {
- "0" : "||", "1" : "|'", "2" : "|,", "3" : "'|", "4" : "''",
- "5" : "',", "6" : ",|", "7" : ",'", "8" : ",,", "9" : ".|"
-}
-
-_ozC_patterns = {
- "A" : "|||", "B" : "||'", "C" : "||,", "D" : "|'|",
- "E" : "|''", "F" : "|',", "G" : "|,|", "H" : "|,'",
- "I" : "|,,", "J" : "'||", "K" : "'|'", "L" : "'|,",
- "M" : "''|", "N" : "'''", "O" : "'',", "P" : "',|",
- "Q" : "','", "R" : "',,", "S" : ",||", "T" : ",|'",
- "U" : ",|,", "V" : ",'|", "W" : ",''", "X" : ",',",
- "Y" : ",,|", "Z" : ",,'", "a" : "|,.", "b" : "|.|",
- "c" : "|.'", "d" : "|.,", "e" : "|..", "f" : "'|.",
- "g" : "''.", "h" : "',.", "i" : "'.|", "j" : "'.'",
- "k" : "'.,", "l" : "'..", "m" : ",|.", "n" : ",'.",
- "o" : ",,.", "p" : ",.|", "q" : ",.'", "r" : ",.,",
- "s" : ",..", "t" : ".|.", "u" : ".'.", "v" : ".,.",
- "w" : "..|", "x" : "..'", "y" : "..,", "z" : "...",
- "0" : ",,,", "1" : ".||", "2" : ".|'", "3" : ".|,",
- "4" : ".'|", "5" : ".''", "6" : ".',", "7" : ".,|",
- "8" : ".,'", "9" : ".,,", " " : "||.", "#" : "|'.",
-}
-
-#http://www.auspost.com.au/futurepost/
+# -*- coding: utf-8 -*-
+#
+# Copyright (c) 2000 Tyler C. Sarna <tsarna@sarna.org>
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+# 1. Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# 2. Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in the
+# documentation and/or other materials provided with the distribution.
+# 3. All advertising materials mentioning features or use of this software
+# must display the following acknowledgement:
+# This product includes software developed by Tyler C. Sarna.
+# 4. Neither the name of the author nor the names of contributors
+# may be used to endorse or promote products derived from this software
+# without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS
+# BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+# POSSIBILITY OF SUCH DAMAGE.
+#
+
+from reportlab.lib.units import inch
+from common import Barcode
+import string
+
+# . 3 T Tracker
+# , 2 D Descender
+# ' 1 A Ascender
+# | 0 H Ascender/Descender
+
+_rm_patterns = {
+ "0" : "--||", "1" : "-',|", "2" : "-'|,", "3" : "'-,|",
+ "4" : "'-|,", "5" : "'',,", "6" : "-,'|", "7" : "-|-|",
+ "8" : "-|',", "9" : "',-|", "A" : "',',", "B" : "'|-,",
+ "C" : "-,|'", "D" : "-|,'", "E" : "-||-", "F" : "',,'",
+ "G" : "',|-", "H" : "'|,-", "I" : ",-'|", "J" : ",'-|",
+ "K" : ",'',", "L" : "|--|", "M" : "|-',", "N" : "|'-,",
+ "O" : ",-|'", "P" : ",','", "Q" : ",'|-", "R" : "|-,'",
+ "S" : "|-|-", "T" : "|',-", "U" : ",,''", "V" : ",|-'",
+ "W" : ",|'-", "X" : "|,-'", "Y" : "|,'-", "Z" : "||--",
+
+ # start, stop
+ "(" : "'-,'", ")" : "'|,|"
+}
+
+_ozN_patterns = {
+ "0" : "||", "1" : "|'", "2" : "|,", "3" : "'|", "4" : "''",
+ "5" : "',", "6" : ",|", "7" : ",'", "8" : ",,", "9" : ".|"
+}
+
+_ozC_patterns = {
+ "A" : "|||", "B" : "||'", "C" : "||,", "D" : "|'|",
+ "E" : "|''", "F" : "|',", "G" : "|,|", "H" : "|,'",
+ "I" : "|,,", "J" : "'||", "K" : "'|'", "L" : "'|,",
+ "M" : "''|", "N" : "'''", "O" : "'',", "P" : "',|",
+ "Q" : "','", "R" : "',,", "S" : ",||", "T" : ",|'",
+ "U" : ",|,", "V" : ",'|", "W" : ",''", "X" : ",',",
+ "Y" : ",,|", "Z" : ",,'", "a" : "|,.", "b" : "|.|",
+ "c" : "|.'", "d" : "|.,", "e" : "|..", "f" : "'|.",
+ "g" : "''.", "h" : "',.", "i" : "'.|", "j" : "'.'",
+ "k" : "'.,", "l" : "'..", "m" : ",|.", "n" : ",'.",
+ "o" : ",,.", "p" : ",.|", "q" : ",.'", "r" : ",.,",
+ "s" : ",..", "t" : ".|.", "u" : ".'.", "v" : ".,.",
+ "w" : "..|", "x" : "..'", "y" : "..,", "z" : "...",
+ "0" : ",,,", "1" : ".||", "2" : ".|'", "3" : ".|,",
+ "4" : ".'|", "5" : ".''", "6" : ".',", "7" : ".,|",
+ "8" : ".,'", "9" : ".,,", " " : "||.", "#" : "|'.",
+}
+
+#http://www.auspost.com.au/futurepost/
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/auction/barcode/test.py b/addons/auction/barcode/test.py
index 93a8c2e6d9c..135f4ae2641 100644
--- a/addons/auction/barcode/test.py
+++ b/addons/auction/barcode/test.py
@@ -1,56 +1,57 @@
-#!/usr/bin/python
-from common import *
-from code39 import *
-from code93 import *
-from code128 import *
-from usps import *
-
-from reportlab.pdfgen.canvas import Canvas
-from reportlab.lib.styles import getSampleStyleSheet
-from reportlab.platypus import Paragraph, Frame
-from reportlab.platypus.flowables import XBox
-def run():
- styles = getSampleStyleSheet()
- styleN = styles['Normal']
- styleH = styles['Heading1']
- story = []
-
- story.append(Paragraph('I2of5', styleN))
- story.append(I2of5(1234, xdim = inch*0.02, checksum=0))
- story.append(Paragraph('MSI', styleN))
- story.append(MSI(1234, xdim = inch*0.02))
- story.append(Paragraph('Codabar', styleN))
- story.append(Codabar("A012345B", xdim = inch*0.02))
- story.append(Paragraph('Code 11', styleN))
- story.append(Code11("01234545634563"))
- story.append(Paragraph('Code 39', styleN))
- story.append(Standard39("A012345B%R"))
- story.append(Paragraph('Extended Code 39', styleN))
- story.append(Extended39("A012345B}"))
- story.append(Paragraph('Code93', styleN))
- story.append(Standard93("CODE 93"))
- story.append(Paragraph('Extended Code93', styleN))
- story.append(Extended93("L@@K! Code 93 :-)")) #, xdim=0.005 * inch))
- story.append(Paragraph('Code 128', styleN))
- c=Code128("AB-12345678") #, xdim=0.005 * inch)
- #print 'WIDTH =', (c.width / inch), 'XDIM =', (c.xdim / inch)
- #print 'LQ =', (c.lquiet / inch), 'RQ =', (c.rquiet / inch)
- story.append(c)
- story.append(Paragraph('USPS FIM', styleN))
- story.append(FIM("A"))
- story.append(Paragraph('USPS POSTNET', styleN))
- story.append(POSTNET('78247-1043'))
- story.append(Paragraph('Label Size', styleN))
- story.append(XBox((2.0 + 5.0/8.0)*inch, 1 * inch, '1x2-5/8"'))
- story.append(Paragraph('Label Size', styleN))
- story.append(XBox((1.75)*inch, .5 * inch, '1/2x1-3/4"'))
- c = Canvas('out.pdf')
- f = Frame(inch, inch, 6*inch, 9*inch, showBoundary=1)
- f.addFromList(story, c)
- c.save()
-
-if __name__=='__main__':
- run()
-
-
+# -*- coding: utf-8 -*-
+#!/usr/bin/python
+from common import *
+from code39 import *
+from code93 import *
+from code128 import *
+from usps import *
+
+from reportlab.pdfgen.canvas import Canvas
+from reportlab.lib.styles import getSampleStyleSheet
+from reportlab.platypus import Paragraph, Frame
+from reportlab.platypus.flowables import XBox
+def run():
+ styles = getSampleStyleSheet()
+ styleN = styles['Normal']
+ styleH = styles['Heading1']
+ story = []
+
+ story.append(Paragraph('I2of5', styleN))
+ story.append(I2of5(1234, xdim = inch*0.02, checksum=0))
+ story.append(Paragraph('MSI', styleN))
+ story.append(MSI(1234, xdim = inch*0.02))
+ story.append(Paragraph('Codabar', styleN))
+ story.append(Codabar("A012345B", xdim = inch*0.02))
+ story.append(Paragraph('Code 11', styleN))
+ story.append(Code11("01234545634563"))
+ story.append(Paragraph('Code 39', styleN))
+ story.append(Standard39("A012345B%R"))
+ story.append(Paragraph('Extended Code 39', styleN))
+ story.append(Extended39("A012345B}"))
+ story.append(Paragraph('Code93', styleN))
+ story.append(Standard93("CODE 93"))
+ story.append(Paragraph('Extended Code93', styleN))
+ story.append(Extended93("L@@K! Code 93 :-)")) #, xdim=0.005 * inch))
+ story.append(Paragraph('Code 128', styleN))
+ c=Code128("AB-12345678") #, xdim=0.005 * inch)
+ #print 'WIDTH =', (c.width / inch), 'XDIM =', (c.xdim / inch)
+ #print 'LQ =', (c.lquiet / inch), 'RQ =', (c.rquiet / inch)
+ story.append(c)
+ story.append(Paragraph('USPS FIM', styleN))
+ story.append(FIM("A"))
+ story.append(Paragraph('USPS POSTNET', styleN))
+ story.append(POSTNET('78247-1043'))
+ story.append(Paragraph('Label Size', styleN))
+ story.append(XBox((2.0 + 5.0/8.0)*inch, 1 * inch, '1x2-5/8"'))
+ story.append(Paragraph('Label Size', styleN))
+ story.append(XBox((1.75)*inch, .5 * inch, '1/2x1-3/4"'))
+ c = Canvas('out.pdf')
+ f = Frame(inch, inch, 6*inch, 9*inch, showBoundary=1)
+ f.addFromList(story, c)
+ c.save()
+
+if __name__=='__main__':
+ run()
+
+
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/auction/barcode/usps.py b/addons/auction/barcode/usps.py
index 1dc2e89d91e..9235f42a1ce 100644
--- a/addons/auction/barcode/usps.py
+++ b/addons/auction/barcode/usps.py
@@ -1,232 +1,233 @@
-#
-# Copyright (c) 1996-2000 Tyler C. Sarna <tsarna@sarna.org>
-# All rights reserved.
-#
-# Redistribution and use in source and binary forms, with or without
-# modification, are permitted provided that the following conditions
-# are met:
-# 1. Redistributions of source code must retain the above copyright
-# notice, this list of conditions and the following disclaimer.
-# 2. Redistributions in binary form must reproduce the above copyright
-# notice, this list of conditions and the following disclaimer in the
-# documentation and/or other materials provided with the distribution.
-# 3. All advertising materials mentioning features or use of this software
-# must display the following acknowledgement:
-# This product includes software developed by Tyler C. Sarna.
-# 4. Neither the name of the author nor the names of contributors
-# may be used to endorse or promote products derived from this software
-# without specific prior written permission.
-#
-# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
-# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
-# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS
-# BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
-# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
-# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
-# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
-# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-# POSSIBILITY OF SUCH DAMAGE.
-#
-
-from reportlab.lib.units import inch
-from common import Barcode
-import string
-
-_fim_patterns = {
- 'A' : "|| | ||",
- 'B' : "| || || |",
- 'C' : "|| | | ||",
- 'D' : "||| | |||",
- # XXX There is an E.
- # The below has been seen, but dunno if it is E or not:
- # 'E' : '|||| ||||'
-}
-
-_postnet_patterns = {
- '1' : "...||", '2' : "..|.|", '3' : "..||.", '4' : ".|..|",
- '5' : ".|.|.", '6' : ".||..", '7' : "|...|", '8' : "|..|.",
- '9' : "|.|..", '0' : "||...", 'S' : "|",
-}
-
-
-class FIM(Barcode):
- """"
- FIM (Facing ID Marks) encode only one letter.
- There are currently four defined:
-
- A Courtesy reply mail with pre-printed POSTNET
- B Business reply mail without pre-printed POSTNET
- C Business reply mail with pre-printed POSTNET
- D OCR Readable mail without pre-printed POSTNET
-
- Interleaved 2 of 5 is a numeric-only barcode. It encodes an even
- number of digits; if an odd number is given, a 0 is prepended.
-
- Options that may be passed to constructor:
-
- value (single character string from the set A - D. required.):
- The value to encode.
-
- quiet (bool, default 1):
- Wether to include quiet zones in the symbol.
-
- The following may also be passed, but doing so will generate nonstandard
- symbols which should not be used. This is mainly documented here to
- show the defaults:
-
- height (float, default 5/8 inch):
- Height of the code. This might legitimately be overriden to make
- a taller symbol that will 'bleed' off the edge of the paper,
- leaving 5/8 inch remaining.
-
- lquiet (float, default 1/4 inch):
- Quiet zone size to left of code, if quiet is true.
- Default is the greater of .25 inch, or .15 times the symbol's
- length.
-
- rquiet (float, default 15/32 inch):
- Quiet zone size to right left of code, if quiet is true.
-
- Sources of information on FIM:
-
- USPS Publication 25, A Guide to Business Mail Preparation
- http://new.usps.com/cpim/ftp/pubs/pub25.pdf
- """
-
- def __init__(self, value='', **args):
- self.barwidth = inch * (1.0/32.0)
- self.barspace = inch * (1.0/16.0)
- self.height = inch * (5.0/8.0)
- self.rquiet = inch * (0.25)
- self.lquiet = inch * (15.0/32.0)
- self.quiet = 0
-
- for (k, v) in args.items():
- setattr(self, k, v)
-
- Barcode.__init__(self, value)
-
- def validate(self):
- self.valid = 1
- self.validated = ''
- for c in self.value:
- if c in string.whitespace:
- continue
- elif c in "abcdABCD":
- self.validated = self.validated + string.upper(c)
- else:
- self.valid = 0
-
- if len(self.validated) != 1:
- raise ValueError, "Input must be exactly one character"
-
- return self.validated
-
- def decompose(self):
- self.decomposed = ''
- for c in self.encoded:
- self.decomposed = self.decomposed + _fim_patterns[c]
-
- return self.decomposed
-
- def computeSize(self):
- self.width = (len(self.decomposed) - 1) * self.barspace + self.barwidth
- if self.quiet:
- self.xo = self.lquiet
- self.width = self.lquiet + self.width + self.rquiet
- else:
- self.xo = 0.0
-
- def draw(self):
- left = self.xo
- for c in self.decomposed:
- if c == '|':
- self.rect(left, 0.0, self.barwidth, self.height)
- left = left + self.barspace
-
-
-class POSTNET(Barcode):
- """"
- POSTNET is used in the US to encode "zip codes" (postal codes) on
- mail. It can encode 5, 9, or 11 digit codes. I've read that it's
- pointless to do 5 digits, since USPS will just have to re-print
- them with 9 or 11 digits.
-
- Sources of information on POSTNET:
-
- USPS Publication 25, A Guide to Business Mail Preparation
- http://new.usps.com/cpim/ftp/pubs/pub25.pdf
- """
-
- def __init__(self, value='', **args):
- self.sbarheight = inch * 0.050
- self.fbarheight = inch * 0.125
- self.barwide = inch * 0.018
- self.spacewide = inch * 0.0275
-
- for (k, v) in args.items():
- setattr(self, k, v)
-
- Barcode.__init__(self, value)
-
- def validate(self):
- self.validated = ''
- self.valid = 1
- count = 0
- for c in self.value:
- if c in (string.whitespace + '-'):
- pass
- elif c in string.digits:
- count = count + 1
- if count == 6:
- self.validated = self.validated + '-'
- self.validated = self.validated + c
- else:
- self.valid = 0
-
- if len(self.validated) not in [5, 10, 12]:
- self.valid = 0
-
- return self.validated
-
- def encode(self):
- self.encoded = "S"
- check = 0
- for c in self.validated:
- if c in string.digits:
- self.encoded = self.encoded + c
- check = check + string.atoi(c)
- elif c == '-':
- pass
- else:
- raise ValueError, "Invalid character in input"
- check = (10 - (check % 10)) % 10
- self.encoded = self.encoded + `check` + 'S'
- return self.encoded
-
- def decompose(self):
- self.decomposed = ''
- for c in self.encoded:
- self.decomposed = self.decomposed + _postnet_patterns[c]
- return self.decomposed
-
- def computeSize(self):
- self.width = len(self.decomposed) * self.barwide
- self.width = self.width + (len(self.decomposed) - 1) * self.spacewide
- self.height = self.fbarheight
- self.xo = 0.0
-
- def draw(self):
- sdown = self.fbarheight - self.sbarheight
- left = self.xo
-
- for c in self.decomposed:
- if c == '.':
- h = self.sbarheight
- else:
- h = self.fbarheight
- self.rect(left, 0.0, self.barwide, h)
- left = left + self.barwide + self.spacewide
+# -*- coding: utf-8 -*-
+#
+# Copyright (c) 1996-2000 Tyler C. Sarna <tsarna@sarna.org>
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+# 1. Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# 2. Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in the
+# documentation and/or other materials provided with the distribution.
+# 3. All advertising materials mentioning features or use of this software
+# must display the following acknowledgement:
+# This product includes software developed by Tyler C. Sarna.
+# 4. Neither the name of the author nor the names of contributors
+# may be used to endorse or promote products derived from this software
+# without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS
+# BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+# POSSIBILITY OF SUCH DAMAGE.
+#
+
+from reportlab.lib.units import inch
+from common import Barcode
+import string
+
+_fim_patterns = {
+ 'A' : "|| | ||",
+ 'B' : "| || || |",
+ 'C' : "|| | | ||",
+ 'D' : "||| | |||",
+ # XXX There is an E.
+ # The below has been seen, but dunno if it is E or not:
+ # 'E' : '|||| ||||'
+}
+
+_postnet_patterns = {
+ '1' : "...||", '2' : "..|.|", '3' : "..||.", '4' : ".|..|",
+ '5' : ".|.|.", '6' : ".||..", '7' : "|...|", '8' : "|..|.",
+ '9' : "|.|..", '0' : "||...", 'S' : "|",
+}
+
+
+class FIM(Barcode):
+ """"
+ FIM (Facing ID Marks) encode only one letter.
+ There are currently four defined:
+
+ A Courtesy reply mail with pre-printed POSTNET
+ B Business reply mail without pre-printed POSTNET
+ C Business reply mail with pre-printed POSTNET
+ D OCR Readable mail without pre-printed POSTNET
+
+ Interleaved 2 of 5 is a numeric-only barcode. It encodes an even
+ number of digits; if an odd number is given, a 0 is prepended.
+
+ Options that may be passed to constructor:
+
+ value (single character string from the set A - D. required.):
+ The value to encode.
+
+ quiet (bool, default 1):
+ Wether to include quiet zones in the symbol.
+
+ The following may also be passed, but doing so will generate nonstandard
+ symbols which should not be used. This is mainly documented here to
+ show the defaults:
+
+ height (float, default 5/8 inch):
+ Height of the code. This might legitimately be overriden to make
+ a taller symbol that will 'bleed' off the edge of the paper,
+ leaving 5/8 inch remaining.
+
+ lquiet (float, default 1/4 inch):
+ Quiet zone size to left of code, if quiet is true.
+ Default is the greater of .25 inch, or .15 times the symbol's
+ length.
+
+ rquiet (float, default 15/32 inch):
+ Quiet zone size to right left of code, if quiet is true.
+
+ Sources of information on FIM:
+
+ USPS Publication 25, A Guide to Business Mail Preparation
+ http://new.usps.com/cpim/ftp/pubs/pub25.pdf
+ """
+
+ def __init__(self, value='', **args):
+ self.barwidth = inch * (1.0/32.0)
+ self.barspace = inch * (1.0/16.0)
+ self.height = inch * (5.0/8.0)
+ self.rquiet = inch * (0.25)
+ self.lquiet = inch * (15.0/32.0)
+ self.quiet = 0
+
+ for (k, v) in args.items():
+ setattr(self, k, v)
+
+ Barcode.__init__(self, value)
+
+ def validate(self):
+ self.valid = 1
+ self.validated = ''
+ for c in self.value:
+ if c in string.whitespace:
+ continue
+ elif c in "abcdABCD":
+ self.validated = self.validated + string.upper(c)
+ else:
+ self.valid = 0
+
+ if len(self.validated) != 1:
+ raise ValueError, "Input must be exactly one character"
+
+ return self.validated
+
+ def decompose(self):
+ self.decomposed = ''
+ for c in self.encoded:
+ self.decomposed = self.decomposed + _fim_patterns[c]
+
+ return self.decomposed
+
+ def computeSize(self):
+ self.width = (len(self.decomposed) - 1) * self.barspace + self.barwidth
+ if self.quiet:
+ self.xo = self.lquiet
+ self.width = self.lquiet + self.width + self.rquiet
+ else:
+ self.xo = 0.0
+
+ def draw(self):
+ left = self.xo
+ for c in self.decomposed:
+ if c == '|':
+ self.rect(left, 0.0, self.barwidth, self.height)
+ left = left + self.barspace
+
+
+class POSTNET(Barcode):
+ """"
+ POSTNET is used in the US to encode "zip codes" (postal codes) on
+ mail. It can encode 5, 9, or 11 digit codes. I've read that it's
+ pointless to do 5 digits, since USPS will just have to re-print
+ them with 9 or 11 digits.
+
+ Sources of information on POSTNET:
+
+ USPS Publication 25, A Guide to Business Mail Preparation
+ http://new.usps.com/cpim/ftp/pubs/pub25.pdf
+ """
+
+ def __init__(self, value='', **args):
+ self.sbarheight = inch * 0.050
+ self.fbarheight = inch * 0.125
+ self.barwide = inch * 0.018
+ self.spacewide = inch * 0.0275
+
+ for (k, v) in args.items():
+ setattr(self, k, v)
+
+ Barcode.__init__(self, value)
+
+ def validate(self):
+ self.validated = ''
+ self.valid = 1
+ count = 0
+ for c in self.value:
+ if c in (string.whitespace + '-'):
+ pass
+ elif c in string.digits:
+ count = count + 1
+ if count == 6:
+ self.validated = self.validated + '-'
+ self.validated = self.validated + c
+ else:
+ self.valid = 0
+
+ if len(self.validated) not in [5, 10, 12]:
+ self.valid = 0
+
+ return self.validated
+
+ def encode(self):
+ self.encoded = "S"
+ check = 0
+ for c in self.validated:
+ if c in string.digits:
+ self.encoded = self.encoded + c
+ check = check + string.atoi(c)
+ elif c == '-':
+ pass
+ else:
+ raise ValueError, "Invalid character in input"
+ check = (10 - (check % 10)) % 10
+ self.encoded = self.encoded + `check` + 'S'
+ return self.encoded
+
+ def decompose(self):
+ self.decomposed = ''
+ for c in self.encoded:
+ self.decomposed = self.decomposed + _postnet_patterns[c]
+ return self.decomposed
+
+ def computeSize(self):
+ self.width = len(self.decomposed) * self.barwide
+ self.width = self.width + (len(self.decomposed) - 1) * self.spacewide
+ self.height = self.fbarheight
+ self.xo = 0.0
+
+ def draw(self):
+ sdown = self.fbarheight - self.sbarheight
+ left = self.xo
+
+ for c in self.decomposed:
+ if c == '.':
+ h = self.sbarheight
+ else:
+ h = self.fbarheight
+ self.rect(left, 0.0, self.barwide, h)
+ left = left + self.barwide + self.spacewide
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/auction/wizard/wizard_auction_invoice_buyer.py b/addons/auction/wizard/wizard_auction_invoice_buyer.py
index c2e21e9ca8a..1754c093db8 100644
--- a/addons/auction/wizard/wizard_auction_invoice_buyer.py
+++ b/addons/auction/wizard/wizard_auction_invoice_buyer.py
@@ -79,7 +79,7 @@ def _makeInvoices(self, cr, uid, data, context):
# ids = order_obj.lots_invoice(cr, uid, data['ids'],context,invoice_number)
cr.commit()
return {
- 'domain': "[('id','in', ["+','.join(map(str,ids))+"])]",
+ 'domain': "[('id','in', ["+','.join(map(str, ids))+"])]",
'name': 'Buyer invoices',
'view_type': 'form',
'view_mode': 'tree,form',
diff --git a/addons/auction/wizard/wizard_auction_journal.py b/addons/auction/wizard/wizard_auction_journal.py
index 7a2807b9c27..220c61d379f 100644
--- a/addons/auction/wizard/wizard_auction_journal.py
+++ b/addons/auction/wizard/wizard_auction_journal.py
@@ -72,7 +72,7 @@ def _makeInvoices(self, cr, uid, data, context):
ids = order_obj.seller_trans_create(cr, uid, data['ids'],context)
cr.commit()
return {
- 'domain': "[('id','in', ["+','.join(map(str,ids))+"])]",
+ 'domain': "[('id','in', ["+','.join(map(str, ids))+"])]",
'name': 'Seller invoices',
'view_type': 'form',
'view_mode': 'tree,form',
diff --git a/addons/base_module_quality/__init__.py b/addons/base_module_quality/__init__.py
index b3a3980f120..25e9b2ae4f3 100644
--- a/addons/base_module_quality/__init__.py
+++ b/addons/base_module_quality/__init__.py
@@ -1,4 +1,4 @@
-# -*- encoding: utf-8 -*-
+# -*- coding: utf-8 -*-
##############################################################################
#
# OpenERP, Open Source Management Solution
diff --git a/addons/base_module_quality/__terp__.py b/addons/base_module_quality/__terp__.py
index 5c01ad860ad..b09df81254a 100644
--- a/addons/base_module_quality/__terp__.py
+++ b/addons/base_module_quality/__terp__.py
@@ -1,4 +1,4 @@
-# -*- encoding: utf-8 -*-
+# -*- coding: utf-8 -*-
##############################################################################
#
# OpenERP, Open Source Management Solution
diff --git a/addons/base_module_quality/base_module_quality.py b/addons/base_module_quality/base_module_quality.py
index 36ab9915468..8c404c27cfc 100644
--- a/addons/base_module_quality/base_module_quality.py
+++ b/addons/base_module_quality/base_module_quality.py
@@ -1,4 +1,4 @@
-# -*- encoding: utf-8 -*-
+# -*- coding: utf-8 -*-
##############################################################################
#
# OpenERP, Open Source Management Solution
diff --git a/addons/base_report_designer/wizard/tiny_sxw2rml/tiny_sxw2rml.py b/addons/base_report_designer/wizard/tiny_sxw2rml/tiny_sxw2rml.py
index bf022e52b5e..3ff81bee311 100644
--- a/addons/base_report_designer/wizard/tiny_sxw2rml/tiny_sxw2rml.py
+++ b/addons/base_report_designer/wizard/tiny_sxw2rml/tiny_sxw2rml.py
@@ -1,4 +1,3 @@
-#!/usr/bin/python
# -*- coding: utf-8 -*-
##############################################################################
#
@@ -21,7 +20,7 @@
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
##############################################################################
-
+#!/usr/bin/python
"""
Tiny SXW2RML - The Open ERP's report engine
diff --git a/addons/crm/crm.py b/addons/crm/crm.py
index e73aafbdbd6..4b6b831935d 100644
--- a/addons/crm/crm.py
+++ b/addons/crm/crm.py
@@ -81,7 +81,7 @@ class crm_case_section(osv.osv):
def _check_recursion(self, cr, uid, ids):
level = 100
while len(ids):
- cr.execute('select distinct parent_id from crm_case_section where id in ('+','.join(map(str,ids))+')')
+ cr.execute('select distinct parent_id from crm_case_section where id in ('+','.join(map(str, ids))+')')
ids = filter(None, map(lambda x:x[0], cr.fetchall()))
if not level:
return False
diff --git a/addons/crm/report/report_businessopp.py b/addons/crm/report/report_businessopp.py
index c618151da7c..fb54dc88b18 100644
--- a/addons/crm/report/report_businessopp.py
+++ b/addons/crm/report/report_businessopp.py
@@ -55,7 +55,7 @@ class report_custom(report_int):
minbenef = 999999999999999999999
maxbenef = 0
- cr.execute('select probability, planned_revenue, planned_cost, user_id, res_users.name as name from crm_case left join res_users on (crm_case.user_id=res_users.id) where crm_case.id in ('+','.join(map(str,ids))+') order by user_id')
+ cr.execute('select probability, planned_revenue, planned_cost, user_id, res_users.name as name from crm_case left join res_users on (crm_case.user_id=res_users.id) where crm_case.id in ('+','.join(map(str, ids))+') order by user_id')
res = cr.dictfetchall()
for row in res:
diff --git a/addons/document/document.py b/addons/document/document.py
index 8c88be59858..10b49ecabe9 100644
--- a/addons/document/document.py
+++ b/addons/document/document.py
@@ -301,7 +301,7 @@ class document_directory(osv.osv):
def _check_recursion(self, cr, uid, ids):
level = 100
while len(ids):
- cr.execute('select distinct parent_id from document_directory where id in ('+','.join(map(str,ids))+')')
+ cr.execute('select distinct parent_id from document_directory where id in ('+','.join(map(str, ids))+')')
ids = filter(None, map(lambda x:x[0], cr.fetchall()))
if not level:
return False
@@ -523,7 +523,7 @@ class document_file(osv.osv):
def _data_get(self, cr, uid, ids, name, arg, context):
result = {}
- cr.execute('select id,store_fname,link from ir_attachment where id in ('+','.join(map(str,ids))+')')
+ cr.execute('select id,store_fname,link from ir_attachment where id in ('+','.join(map(str, ids))+')')
for id,r,l in cr.fetchall():
try:
value = file(os.path.join(self._get_filestore(cr), r), 'rb').read()
diff --git a/addons/hr/hr.py b/addons/hr/hr.py
index 88877383438..896a2047eda 100644
--- a/addons/hr/hr.py
+++ b/addons/hr/hr.py
@@ -101,7 +101,7 @@ class hr_employee_category(osv.osv):
def _check_recursion(self, cr, uid, ids):
level = 100
while len(ids):
- cr.execute('select distinct parent_id from hr_employee_category where id in ('+','.join(map(str,ids))+')')
+ cr.execute('select distinct parent_id from hr_employee_category where id in ('+','.join(map(str, ids))+')')
ids = filter(None, map(lambda x:x[0], cr.fetchall()))
if not level:
return False
@@ -150,7 +150,7 @@ class hr_employee(osv.osv):
def _check_recursion(self, cr, uid, ids):
level = 100
while len(ids):
- cr.execute('select distinct parent_id from hr_employee where id in ('+','.join(map(str,ids))+')')
+ cr.execute('select distinct parent_id from hr_employee where id in ('+','.join(map(str, ids))+')')
ids = filter(None, map(lambda x:x[0], cr.fetchall()))
if not level:
return False
diff --git a/addons/hr/hr_department.py b/addons/hr/hr_department.py
index 9a795401d38..7c7c812d823 100644
--- a/addons/hr/hr_department.py
+++ b/addons/hr/hr_department.py
@@ -43,7 +43,7 @@ class hr_department(osv.osv):
def _check_recursion(self, cr, uid, ids):
level = 100
while len(ids):
- cr.execute('select distinct parent_id from hr_department where id in ('+','.join(map(str,ids))+')')
+ cr.execute('select distinct parent_id from hr_department where id in ('+','.join(map(str, ids))+')')
ids = filter(None, map(lambda x:x[0], cr.fetchall()))
if not level:
return False
diff --git a/addons/hr_holidays/migrations/1.5/post-00-change-requests-signs.py b/addons/hr_holidays/migrations/1.5/post-00-change-requests-signs.py
index 637d0383ef2..a1d7a4f3826 100644
--- a/addons/hr_holidays/migrations/1.5/post-00-change-requests-signs.py
+++ b/addons/hr_holidays/migrations/1.5/post-00-change-requests-signs.py
@@ -1,3 +1,23 @@
+# -*- coding: utf-8 -*-
+##############################################################################
+#
+# OpenERP, Open Source Management Solution
+# Copyright (C) 2004-2009 Tiny SPRL (<http://tiny.be>).
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+#
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+#
+##############################################################################
__name__ = "Change signs of old holiday requests"
def migrate(cr, version):
diff --git a/addons/hr_holidays/migrations/1.5/post-01-convert-limits-into-requests.py b/addons/hr_holidays/migrations/1.5/post-01-convert-limits-into-requests.py
index ce067f8f98f..1d074a6f979 100644
--- a/addons/hr_holidays/migrations/1.5/post-01-convert-limits-into-requests.py
+++ b/addons/hr_holidays/migrations/1.5/post-01-convert-limits-into-requests.py
@@ -1,3 +1,23 @@
+# -*- coding: utf-8 -*-
+##############################################################################
+#
+# OpenERP, Open Source Management Solution
+# Copyright (C) 2004-2009 Tiny SPRL (<http://tiny.be>).
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+#
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+#
+##############################################################################
__name__ = "Convert the Holidays Per User limits into positive leave request"
def migrate(cr, version):
diff --git a/addons/hr_timesheet_sheet/wizard/wizard_timesheet_current.py b/addons/hr_timesheet_sheet/wizard/wizard_timesheet_current.py
index 7dfe5f4e2b5..d5a7a00e082 100644
--- a/addons/hr_timesheet_sheet/wizard/wizard_timesheet_current.py
+++ b/addons/hr_timesheet_sheet/wizard/wizard_timesheet_current.py
@@ -38,7 +38,7 @@ class wiz_timesheet_open(wizard.interface):
view_type = 'form,tree'
if len(ids) > 1:
view_type = 'tree,form'
- domain = "[('id','in',["+','.join(map(str,ids))+"]),('user_id', '=', uid)]"
+ domain = "[('id','in',["+','.join(map(str, ids))+"]),('user_id', '=', uid)]"
elif len(ids)==1:
ts.write(cr, uid, ids, {'date_current': time.strftime('%Y-%m-%d')})
domain = "[('user_id', '=', uid)]"
diff --git a/addons/l10n_ch/account_move_line.py b/addons/l10n_ch/account_move_line.py
index e602d6bbdb8..dabd4345938 100755
--- a/addons/l10n_ch/account_move_line.py
+++ b/addons/l10n_ch/account_move_line.py
@@ -1,3 +1,4 @@
+# -*- coding: utf-8 -*-
#
# account_move_line.py
# l10n_ch
diff --git a/addons/l10n_ch/bank.py b/addons/l10n_ch/bank.py
index 32310eb00ee..cd30dde6bb4 100755
--- a/addons/l10n_ch/bank.py
+++ b/addons/l10n_ch/bank.py
@@ -1,4 +1,4 @@
-#
+# -*- coding: utf-8 -*-
# bank.py
# l10n_ch
#
diff --git a/addons/l10n_ch/report/tiny_sxw2rml.py b/addons/l10n_ch/report/tiny_sxw2rml.py
index e7a5422b6ec..bb5e06e8ce7 100755
--- a/addons/l10n_ch/report/tiny_sxw2rml.py
+++ b/addons/l10n_ch/report/tiny_sxw2rml.py
@@ -1,6 +1,3 @@
-
-
-#!/usr/bin/python
#coding: latin-1
##############################################################################
@@ -32,7 +29,7 @@
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
#
##############################################################################
-
+#!/usr/bin/python
"""
Tiny SXW2RML - The Tiny ERP's report engine
diff --git a/addons/l10n_ch_chart_c2c_pcg/__init__.py b/addons/l10n_ch_chart_c2c_pcg/__init__.py
index 6c39925500a..6785a497df7 100644
--- a/addons/l10n_ch_chart_c2c_pcg/__init__.py
+++ b/addons/l10n_ch_chart_c2c_pcg/__init__.py
@@ -1,3 +1,4 @@
+# -*- coding: utf-8 -*-
#
# __init__.py
#
diff --git a/addons/l10n_ch_chart_c2c_pcg/wizard/__init__.py b/addons/l10n_ch_chart_c2c_pcg/wizard/__init__.py
index 9110a52dd0c..249f473e6b7 100755
--- a/addons/l10n_ch_chart_c2c_pcg/wizard/__init__.py
+++ b/addons/l10n_ch_chart_c2c_pcg/wizard/__init__.py
@@ -1,3 +1,4 @@
+# -*- coding: utf-8 -*-
#
# config.py
#
diff --git a/addons/membership/membership.py b/addons/membership/membership.py
index dea77259eee..bb0afe71845 100644
--- a/addons/membership/membership.py
+++ b/addons/membership/membership.py
@@ -401,7 +401,7 @@ class Partner(osv.osv):
def _check_recursion(self, cr, uid, ids):
level = 100
while len(ids):
- cr.execute('select distinct associate_member from res_partner where id in ('+','.join(map(str,ids))+')')
+ cr.execute('select distinct associate_member from res_partner where id in ('+','.join(map(str, ids))+')')
ids = filter(None, map(lambda x:x[0], cr.fetchall()))
if not level:
return False
diff --git a/addons/mrp/mrp.py b/addons/mrp/mrp.py
index 9519a7c93ec..423121eb64f 100644
--- a/addons/mrp/mrp.py
+++ b/addons/mrp/mrp.py
@@ -217,7 +217,7 @@ class mrp_bom(osv.osv):
def _check_recursion(self, cr, uid, ids):
level = 500
while len(ids):
- cr.execute('select distinct bom_id from mrp_bom where id in ('+','.join(map(str,ids))+')')
+ cr.execute('select distinct bom_id from mrp_bom where id in ('+','.join(map(str, ids))+')')
ids = filter(None, map(lambda x:x[0], cr.fetchall()))
if not level:
return False
diff --git a/addons/product/product.py b/addons/product/product.py
index 7e83bfa02f4..509bd61c373 100644
--- a/addons/product/product.py
+++ b/addons/product/product.py
@@ -208,7 +208,7 @@ class product_category(osv.osv):
def _check_recursion(self, cr, uid, ids):
level = 100
while len(ids):
- cr.execute('select distinct parent_id from product_category where id in ('+','.join(map(str,ids))+')')
+ cr.execute('select distinct parent_id from product_category where id in ('+','.join(map(str, ids))+')')
ids = filter(None, map(lambda x:x[0], cr.fetchall()))
if not level:
return False
diff --git a/addons/project/project.py b/addons/project/project.py
index 384db8f8f55..b9488a86cb9 100644
--- a/addons/project/project.py
+++ b/addons/project/project.py
@@ -165,7 +165,7 @@ class project(osv.osv):
default['name'] = proj.name+_(' (copy)')
res = super(project, self).copy(cr, uid, id, default, context)
ids = self.search(cr, uid, [('parent_id','child_of', [res])])
- cr.execute('update project_task set active=True where project_id in ('+','.join(map(str,ids))+')')
+ cr.execute('update project_task set active=True where project_id in ('+','.join(map(str, ids))+')')
return res
def duplicate_template(self, cr, uid, ids,context={}):
diff --git a/addons/project_gtd/wizard/project_gtd_daily.py b/addons/project_gtd/wizard/project_gtd_daily.py
index d1371a5d037..9c02b1fd4a0 100644
--- a/addons/project_gtd/wizard/project_gtd_daily.py
+++ b/addons/project_gtd/wizard/project_gtd_daily.py
@@ -36,7 +36,7 @@ class wiz_timebox_open(wizard.interface):
raise wizard.except_wizard(_('Error !'), _('No timebox of the type "%s" defined !') % (tbtype,))
view_type = 'form,tree'
if len(ids) >= 1:
- domain = "[('id','in',["+','.join(map(str,ids))+"])]"
+ domain = "[('id','in',["+','.join(map(str, ids))+"])]"
else:
domain = "[('user_id', '=', uid)]"
value = {
diff --git a/addons/purchase/purchase.py b/addons/purchase/purchase.py
index 9ff4be36f0b..cc6ba2f690d 100644
--- a/addons/purchase/purchase.py
+++ b/addons/purchase/purchase.py
@@ -111,7 +111,7 @@ class purchase_order(osv.osv):
LEFT JOIN
stock_picking p on (p.id=m.picking_id)
WHERE
- p.purchase_id in ('''+','.join(map(str,ids))+''')
+ p.purchase_id in ('''+','.join(map(str, ids))+''')
GROUP BY m.state, p.purchase_id''')
for oid,nbr,state in cr.fetchall():
if state=='cancel':
diff --git a/addons/sale/unit_test/test.py b/addons/sale/unit_test/test.py
index 6567e0e9f6b..ccc747033e3 100644
--- a/addons/sale/unit_test/test.py
+++ b/addons/sale/unit_test/test.py
@@ -1,3 +1,24 @@
+# -*- coding: utf-8 -*-
+##############################################################################
+#
+# OpenERP, Open Source Management Solution
+# Copyright (C) 2004-2009 Tiny SPRL (<http://tiny.be>). All Rights Reserved
+# $Id$
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+#
+##############################################################################
import unittest
import pooler
import netsvc
diff --git a/addons/scrum/report/task_burndown.py b/addons/scrum/report/task_burndown.py
index f4ecc7e1d1a..977d8fe9e6c 100644
--- a/addons/scrum/report/task_burndown.py
+++ b/addons/scrum/report/task_burndown.py
@@ -71,14 +71,14 @@ class report_tasks(report_int):
io = StringIO.StringIO()
if 'date_start' not in datas:
- cr.execute('select min(date_start) from project_task where id in ('+','.join(map(str,ids))+')')
+ cr.execute('select min(date_start) from project_task where id in ('+','.join(map(str, ids))+')')
dt = cr.fetchone()[0]
if dt:
datas['date_start'] = dt[:10]
else:
datas['date_start'] = time.strftime('%Y-%m-%d')
if 'date_stop' not in datas:
- cr.execute('select max(date_start),max(date_close) from project_task where id in ('+','.join(map(str,ids))+')')
+ cr.execute('select max(date_start),max(date_close) from project_task where id in ('+','.join(map(str, ids))+')')
res = cr.fetchone()
datas['date_stop'] = (res[0] and res[0][:10]) or time.strftime('%Y-%m-%d')
if res[1] and datas['date_stop']<res[1]:
diff --git a/addons/stock/wizard/stock_traceability.py b/addons/stock/wizard/stock_traceability.py
index 2b8920c9a4d..c44ef548d5b 100644
--- a/addons/stock/wizard/stock_traceability.py
+++ b/addons/stock/wizard/stock_traceability.py
@@ -33,7 +33,7 @@ def action_traceability(type='move_history_ids', field='tracking_id'):
cr.execute('select id from ir_ui_view where model=%s and field_parent=%s and type=%s', ('stock.move', type, 'tree'))
view_id = cr.fetchone()[0]
value = {
- 'domain': "[('id','in',["+','.join(map(str,ids))+"])]",
+ 'domain': "[('id','in',["+','.join(map(str, ids))+"])]",
'name': ((type=='move_history_ids') and 'Upstream Traceability') or 'Downstream Traceability',
'view_type': 'tree',
'res_model': 'stock.move',