From b7f6bc4c8e2996b7ffdb881835ccb0b9d4f556d1 Mon Sep 17 00:00:00 2001 From: "HDA (OpenERP)" Date: Wed, 21 Oct 2009 12:54:49 +0530 Subject: [PATCH] Remove sql injection problem lp bug: https://launchpad.net/bugs/429327 fixed bzr revid: hda@tinyerp.com-20091021072449-rc9usc422tb0kv2f --- addons/account/account.py | 12 +- addons/account/invoice.py | 4 +- addons/account/report/partner_balance.py | 2 +- addons/account/report/third_party_ledger.py | 2 +- .../wizard/wizard_open_closed_fiscalyear.py | 2 +- addons/account_payment/account_move_line.py | 2 +- addons/account_payment/payment.py | 2 +- addons/account_voucher/voucher.py | 2 +- .../analytic_journal_billing_rate/__terp__.py | 1 - addons/auction/auction.py | 6 +- addons/auction/barcode/__init__.py | 67 +- addons/auction/barcode/code128.py | 643 ++++---- addons/auction/barcode/code39.py | 511 +++--- addons/auction/barcode/code93.py | 465 +++--- addons/auction/barcode/common.py | 1411 +++++++++-------- addons/auction/barcode/fourstate.py | 163 +- addons/auction/barcode/test.py | 111 +- addons/auction/barcode/usps.py | 463 +++--- .../wizard/wizard_auction_invoice_buyer.py | 2 +- .../auction/wizard/wizard_auction_journal.py | 2 +- addons/base_module_quality/__init__.py | 2 +- addons/base_module_quality/__terp__.py | 2 +- .../base_module_quality.py | 2 +- .../wizard/tiny_sxw2rml/tiny_sxw2rml.py | 3 +- addons/crm/crm.py | 2 +- addons/crm/report/report_businessopp.py | 2 +- addons/document/document.py | 4 +- addons/hr/hr.py | 4 +- addons/hr/hr_department.py | 2 +- .../1.5/post-00-change-requests-signs.py | 20 + .../post-01-convert-limits-into-requests.py | 20 + .../wizard/wizard_timesheet_current.py | 2 +- addons/l10n_ch/account_move_line.py | 1 + addons/l10n_ch/bank.py | 2 +- addons/l10n_ch/report/tiny_sxw2rml.py | 5 +- addons/l10n_ch_chart_c2c_pcg/__init__.py | 1 + .../l10n_ch_chart_c2c_pcg/wizard/__init__.py | 1 + addons/membership/membership.py | 2 +- addons/mrp/mrp.py | 2 +- addons/product/product.py | 2 +- addons/project/project.py | 2 +- .../project_gtd/wizard/project_gtd_daily.py | 2 +- addons/purchase/purchase.py | 2 +- addons/sale/unit_test/test.py | 21 + addons/scrum/report/task_burndown.py | 4 +- addons/stock/wizard/stock_traceability.py | 2 +- 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 -# 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 +# 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 -# 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 +# 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 -# 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 +# 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 -# 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 +# 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 -# 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 +# 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 -# 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 +# 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 -# 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 +# 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 . # ############################################################################## - +#!/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 (). +# +# 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 . +# +############################################################################## __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 (). +# +# 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 . +# +############################################################################## __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 (). 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 . +# +############################################################################## 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']